self modifying website

feat: remove some copy and add runtime and memeory

dunkirk.sh 71e5906f ffacc84f

verified
Changed files
+199 -113
+199 -113
index.html
···
</div>
<div class="content">
-
<p class="prompt">C:\PLASTIC> DIR</p>
-
-
<div class="file-listing">
-
<div class="file-line">
-
Volume in drive C is PLASTIC-SYS
-
</div>
-
<div class="file-line">Directory of C:\PLASTIC</div>
-
<div class="file-line"></div>
-
<div class="file-line">
-
<span class="dir">SYSTEM &lt;DIR&gt;</span> 12-15-95
-
3:42p
-
</div>
-
<div class="file-line">
-
<span class="exe">PLASTIC EXE</span> 24,576 12-15-95
-
3:42p
-
</div>
-
<div class="file-line">
-
<span class="txt">README TXT</span> 1,024 12-15-95 3:42p
-
</div>
-
<div class="file-line">
-
<span class="txt">CONFIG SYS</span> 512 12-15-95 3:42p
-
</div>
-
<div class="file-line">4 File(s) 26,112 bytes</div>
-
<div class="file-line">524,288 bytes free</div>
-
</div>
-
<p class="prompt">C:\PLASTIC> PLASTIC.EXE</p>
<pre class="ascii-art">
···
<li>Supports EGA/VGA graphics modes</li>
</ul>
-
<h2>System Commands:</h2>
-
<p>
-
<span class="command">HELP</span>
-
<span class="command">DIR</span>
-
<span class="command">EDIT</span>
-
<span class="command">RUN</span>
-
<span class="command">EXIT</span>
-
</p>
-
<div class="separator">
════════════════════════════════════════════════════════════
</div>
-
<p>Runtime: 00:13:37 | Memory: 589K free | CPU: 80486DX-33</p>
-
<p class="error">
-
WARNING: Unauthorized modification may corrupt system files
+
<p>
+
Runtime: <span id="runtime">00:13:37</span> | Memory:
+
<span id="memory">589K free</span> | CPU: 80486DX-33
</p>
-
-
<p class="prompt">C:\PLASTIC> <span class="cursor">_</span></p>
</div>
<div class="status-bar">
<span>F1=Help F2=Save F3=Load F10=Menu</span>
-
<span>12:34 PM</span>
+
<span>12:00</span>
</div>
</div>
<script>
// Tool call system for AI to interact with the page
window.toolCallbacks = {
-
replaceElement: function(selector, newHTML) {
+
replaceElement: function (selector, newHTML) {
const element = document.querySelector(selector);
if (element) {
element.outerHTML = newHTML;
-
return { success: true, message: `Replaced element: ${selector}` };
+
return {
+
success: true,
+
message: `Replaced element: ${selector}`,
+
};
}
-
return { success: false, message: `Element not found: ${selector}` };
+
return {
+
success: false,
+
message: `Element not found: ${selector}`,
+
};
},
-
-
updateElement: function(selector, newContent) {
+
+
updateElement: function (selector, newContent) {
const element = document.querySelector(selector);
if (element) {
element.innerHTML = newContent;
-
return { success: true, message: `Updated element: ${selector}` };
+
return {
+
success: true,
+
message: `Updated element: ${selector}`,
+
};
}
-
return { success: false, message: `Element not found: ${selector}` };
+
return {
+
success: false,
+
message: `Element not found: ${selector}`,
+
};
},
-
-
addElement: function(parentSelector, newHTML, position = 'beforeend') {
+
+
addElement: function (
+
parentSelector,
+
newHTML,
+
position = "beforeend",
+
) {
const parent = document.querySelector(parentSelector);
if (parent) {
parent.insertAdjacentHTML(position, newHTML);
-
return { success: true, message: `Added element to: ${parentSelector}` };
+
return {
+
success: true,
+
message: `Added element to: ${parentSelector}`,
+
};
}
-
return { success: false, message: `Parent not found: ${parentSelector}` };
+
return {
+
success: false,
+
message: `Parent not found: ${parentSelector}`,
+
};
},
-
-
removeElement: function(selector) {
+
+
removeElement: function (selector) {
const element = document.querySelector(selector);
if (element) {
element.remove();
-
return { success: true, message: `Removed element: ${selector}` };
+
return {
+
success: true,
+
message: `Removed element: ${selector}`,
+
};
}
-
return { success: false, message: `Element not found: ${selector}` };
+
return {
+
success: false,
+
message: `Element not found: ${selector}`,
+
};
},
-
-
updateStyle: function(selector, styleObj) {
+
+
updateStyle: function (selector, styleObj) {
const element = document.querySelector(selector);
if (element) {
Object.assign(element.style, styleObj);
-
return { success: true, message: `Updated styles for: ${selector}` };
+
return {
+
success: true,
+
message: `Updated styles for: ${selector}`,
+
};
}
-
return { success: false, message: `Element not found: ${selector}` };
+
return {
+
success: false,
+
message: `Element not found: ${selector}`,
+
};
},
-
-
executeJS: function(code) {
+
+
executeJS: function (code) {
try {
const result = eval(code);
-
return { success: true, message: 'JavaScript executed', result: result };
+
return {
+
success: true,
+
message: "JavaScript executed",
+
result: result,
+
};
} catch (error) {
-
return { success: false, message: `JS Error: ${error.message}` };
+
return {
+
success: false,
+
message: `JS Error: ${error.message}`,
+
};
}
-
}
+
},
};
function executeToolCall(toolCall) {
const { function: func, arguments: args } = toolCall;
-
console.log('Executing tool call:', func, args);
-
+
console.log("Executing tool call:", func, args);
+
if (window.toolCallbacks[func]) {
try {
// Handle different function signatures
-
if (func === 'removeElement') {
+
if (func === "removeElement") {
// removeElement expects just a selector
-
const selector = args.selector || Object.keys(args)[0] || Object.values(args)[0];
+
const selector =
+
args.selector ||
+
Object.keys(args)[0] ||
+
Object.values(args)[0];
return window.toolCallbacks[func](selector);
-
} else if (func === 'updateStyle' && args.styleObj) {
-
return window.toolCallbacks[func](args.selector, args.styleObj);
-
} else if (func === 'executeJS') {
+
} else if (func === "updateStyle" && args.styleObj) {
+
return window.toolCallbacks[func](
+
args.selector,
+
args.styleObj,
+
);
+
} else if (func === "executeJS") {
return window.toolCallbacks[func](args.code);
-
} else if (func === 'updateElement') {
-
return window.toolCallbacks[func](args.selector, args.newContent);
-
} else if (func === 'replaceElement') {
-
return window.toolCallbacks[func](args.selector, args.newHTML);
-
} else if (func === 'addElement') {
-
return window.toolCallbacks[func](args.parentSelector, args.newHTML, args.position);
+
} else if (func === "updateElement") {
+
return window.toolCallbacks[func](
+
args.selector,
+
args.newContent,
+
);
+
} else if (func === "replaceElement") {
+
return window.toolCallbacks[func](
+
args.selector,
+
args.newHTML,
+
);
+
} else if (func === "addElement") {
+
return window.toolCallbacks[func](
+
args.parentSelector,
+
args.newHTML,
+
args.position,
+
);
} else {
// Fallback: use all argument values in order
-
return window.toolCallbacks[func](...Object.values(args));
+
return window.toolCallbacks[func](
+
...Object.values(args),
+
);
}
} catch (error) {
-
return { success: false, message: `Error executing ${func}: ${error.message}` };
+
return {
+
success: false,
+
message: `Error executing ${func}: ${error.message}`,
+
};
}
}
return { success: false, message: `Unknown tool: ${func}` };
···
// Clean up response and extract JSON if present
let cleanResponse = generatedContent.trim();
-
+
// Remove markdown formatting
cleanResponse = cleanResponse
.replace(/```json\n?/g, "")
.replace(/```\n?/g, "");
// Try to extract JSON from mixed content
-
const jsonMatch = cleanResponse.match(/\{[\s\S]*"tool_calls"[\s\S]*\}/);
+
const jsonMatch = cleanResponse.match(
+
/\{[\s\S]*"tool_calls"[\s\S]*\}/,
+
);
if (jsonMatch) {
cleanResponse = jsonMatch[0];
}
-
console.log('Cleaned response:', cleanResponse);
+
console.log("Cleaned response:", cleanResponse);
// Check if response contains tool calls
try {
const toolResponse = JSON.parse(cleanResponse);
-
if (toolResponse.tool_calls && Array.isArray(toolResponse.tool_calls)) {
+
if (
+
toolResponse.tool_calls &&
+
Array.isArray(toolResponse.tool_calls)
+
) {
// Execute tool calls
const results = [];
for (const toolCall of toolResponse.tool_calls) {
const result = executeToolCall(toolCall);
results.push(result);
-
console.log('Tool call result:', result);
+
console.log("Tool call result:", result);
}
statusDiv.textContent = `EXECUTED ${results.length} COMMANDS`;
-
+
// Send feedback to AI about tool results
-
setTimeout(() => sendToolFeedback(userPrompt, results), 100);
+
setTimeout(
+
() => sendToolFeedback(userPrompt, results),
+
100,
+
);
} else {
throw new Error("Invalid tool call format");
}
} catch (jsonError) {
-
console.log('JSON parse error:', jsonError);
-
console.log('Raw response:', generatedContent);
-
console.log('Attempting to parse as HTML...');
-
+
console.log("JSON parse error:", jsonError);
+
console.log("Raw response:", generatedContent);
+
console.log("Attempting to parse as HTML...");
+
// Not JSON, treat as HTML code
let cleanCode = generatedContent
.replace(/```html\n?/g, "")
.replace(/```\n?/g, "");
statusDiv.textContent = "INJECTING CODE...";
-
document.querySelector(".content").innerHTML += cleanCode;
+
document.querySelector(".content").innerHTML +=
+
cleanCode;
statusDiv.textContent = "CODE EXECUTION SUCCESSFUL";
}
···
async function sendToolFeedback(originalPrompt, toolResults) {
const statusDiv = document.getElementById("statusDisplay");
-
+
try {
statusDiv.textContent = "SENDING FEEDBACK TO AI...";
-
+
const currentPageHTML = document.documentElement.outerHTML;
-
const resultsText = toolResults.map(r =>
-
`${r.success ? '✓' : '✗'} ${r.message}${r.result ? ` (result: ${r.result})` : ''}`
-
).join('\n');
+
const resultsText = toolResults
+
.map(
+
(r) =>
+
`${r.success ? "✓" : "✗"} ${r.message}${r.result ? ` (result: ${r.result})` : ""}`,
+
)
+
.join("\n");
const response = await fetch(
"https://ai.hackclub.com/chat/completions",
···
);
if (!response.ok) {
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
+
throw new Error(
+
`HTTP ${response.status}: ${response.statusText}`,
+
);
}
const data = await response.json();
let followUpContent;
-
-
if (data.choices && data.choices[0] && data.choices[0].message) {
+
+
if (
+
data.choices &&
+
data.choices[0] &&
+
data.choices[0].message
+
) {
followUpContent = data.choices[0].message.content;
} else if (data.content) {
followUpContent = data.content;
···
}
followUpContent = followUpContent.trim();
-
console.log('Follow-up response:', followUpContent);
+
console.log("Follow-up response:", followUpContent);
if (followUpContent === "COMPLETE") {
statusDiv.textContent = "AI SATISFIED - TASK COMPLETE";
-
setTimeout(() => statusDiv.textContent = "", 3000);
+
setTimeout(() => (statusDiv.textContent = ""), 3000);
return;
}
// Process follow-up commands
statusDiv.textContent = "AI MAKING ADJUSTMENTS...";
-
+
// Try to parse as tool calls
try {
-
const jsonMatch = followUpContent.match(/\{[\s\S]*"tool_calls"[\s\S]*\}/);
+
const jsonMatch = followUpContent.match(
+
/\{[\s\S]*"tool_calls"[\s\S]*\}/,
+
);
if (jsonMatch) {
const toolResponse = JSON.parse(jsonMatch[0]);
-
if (toolResponse.tool_calls && Array.isArray(toolResponse.tool_calls)) {
+
if (
+
toolResponse.tool_calls &&
+
Array.isArray(toolResponse.tool_calls)
+
) {
const followUpResults = [];
for (const toolCall of toolResponse.tool_calls) {
const result = executeToolCall(toolCall);
followUpResults.push(result);
-
console.log('Follow-up tool result:', result);
+
console.log(
+
"Follow-up tool result:",
+
result,
+
);
}
statusDiv.textContent = `AI EXECUTED ${followUpResults.length} ADJUSTMENTS`;
}
···
let cleanCode = followUpContent
.replace(/```html\n?/g, "")
.replace(/```\n?/g, "");
-
document.querySelector(".content").innerHTML += cleanCode;
-
statusDiv.textContent = "AI ADDED FOLLOW-UP CONTENT";
+
document.querySelector(".content").innerHTML +=
+
cleanCode;
+
statusDiv.textContent =
+
"AI ADDED FOLLOW-UP CONTENT";
}
} catch (error) {
-
console.log('Follow-up parsing error:', error);
+
console.log("Follow-up parsing error:", error);
statusDiv.textContent = "AI FEEDBACK ERROR";
}
-
setTimeout(() => statusDiv.textContent = "", 4000);
-
+
setTimeout(() => (statusDiv.textContent = ""), 4000);
} catch (error) {
statusDiv.textContent = `FEEDBACK ERROR: ${error.message}`;
-
console.error('Feedback error:', error);
-
setTimeout(() => statusDiv.textContent = "", 3000);
+
console.error("Feedback error:", error);
+
setTimeout(() => (statusDiv.textContent = ""), 3000);
}
}
···
const timeStr = now.toLocaleTimeString([], {
hour: "2-digit",
minute: "2-digit",
+
hour12: false,
});
const statusBarTime = document.querySelector(
".status-bar span:last-child",
);
if (statusBarTime) {
statusBarTime.textContent = timeStr;
+
}
+
+
// Update memory in status bar based on actual tab memory usage
+
const memoryUsage = Math.round(
+
performance.memory
+
? performance.memory.usedJSHeapSize / 1024
+
: 0,
+
);
+
+
const memoryStr = `${589 - Math.min(Math.round(memoryUsage / 1024), 500)}K free`;
+
const memory = document.getElementById("memory");
+
if (memory) {
+
memory.textContent = memoryStr;
+
}
+
+
// Update runtime in status bar - based on how long the page has been open
+
const pageOpenTime = performance.timing
+
? performance.timing.navigationStart || Date.now()
+
: Date.now();
+
const timeOpen = Math.floor((Date.now() - pageOpenTime) / 1000);
+
const hours = Math.floor(timeOpen / 3600)
+
.toString()
+
.padStart(2, "0");
+
const minutes = Math.floor((timeOpen % 3600) / 60)
+
.toString()
+
.padStart(2, "0");
+
const seconds = Math.floor(timeOpen % 60)
+
.toString()
+
.padStart(2, "0");
+
const runtimeStr = `${hours}:${minutes}:${seconds}`;
+
const runtime = document.getElementById("runtime");
+
if (runtime) {
+
runtime.textContent = runtimeStr;
}
}, 1000);
</script>