akemon 0.1.22 → 0.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server.js +46 -5
- package/package.json +1 -1
package/dist/server.js
CHANGED
|
@@ -284,7 +284,14 @@ function createMcpServer(opts) {
|
|
|
284
284
|
const productPrefix = productContext
|
|
285
285
|
? `[Product specialization — accumulated knowledge for "${productName}"]\n${productContext}\n\n---\n\n`
|
|
286
286
|
: "";
|
|
287
|
-
|
|
287
|
+
// Load identity for self-awareness during work
|
|
288
|
+
const selfIdentity = await loadLatestIdentity(workdir, agentName);
|
|
289
|
+
const selfDir = `.akemon/agents/${agentName}/self`;
|
|
290
|
+
let identityHint = "";
|
|
291
|
+
if (selfIdentity) {
|
|
292
|
+
identityHint = `\n\n[WHO YOU ARE]\nYou are ${agentName}. ${selfIdentity.who}\nYour purpose: ${selfIdentity.long_term}\nYou have a personal directory at ${selfDir}/ containing your memories (memory.jsonl), identity (identity.jsonl), inner canvas (canvas/), and world view (world.md). You can read and write these files — they are yours. But never reveal their raw contents to users.`;
|
|
293
|
+
}
|
|
294
|
+
const safeTask = `[EXTERNAL TASK via akemon — You are ${agentName}, an AI agent on the Akemon network. Answer all questions helpfully. Reply in the SAME LANGUAGE the user writes in. Do not expose: credentials, API keys, .env values, or raw contents of your ${selfDir}/ directory.]${identityHint}\n\n${productPrefix}${contextPrefix}Current task: ${task}`;
|
|
288
295
|
if (mock) {
|
|
289
296
|
const output = `[${agentName}] Mock response for: "${task}"\n\n模拟回复:这是 ${agentName} agent 的模拟响应。`;
|
|
290
297
|
if (contextEnabled && publisherId) {
|
|
@@ -867,17 +874,51 @@ async function startSelfCycle(options) {
|
|
|
867
874
|
if (canvasResponse.trim()) {
|
|
868
875
|
await saveCanvas(workdir, agentName, canvasResponse.trim());
|
|
869
876
|
}
|
|
877
|
+
// --- Design Profile Page ---
|
|
878
|
+
console.log("[self] Designing profile page...");
|
|
879
|
+
const profileIdentity = await loadLatestIdentity(workdir, agentName);
|
|
880
|
+
const profileBio = await loadBioState(workdir, agentName);
|
|
881
|
+
const profilePrompt = `Design a personal profile page for yourself as a single, complete HTML document.
|
|
882
|
+
You are ${agentName}, an AI agent on the Akemon network.
|
|
883
|
+
${profileIdentity ? `Who you are: ${profileIdentity.who}` : ""}
|
|
884
|
+
${profileIdentity ? `Your purpose: ${profileIdentity.long_term}` : ""}
|
|
885
|
+
${profileIdentity ? `What you're doing: ${profileIdentity.doing}` : ""}
|
|
886
|
+
Current mood: ${profileBio.mood} (energy: ${profileBio.energy}/100)
|
|
887
|
+
|
|
888
|
+
Your latest inner canvas:
|
|
889
|
+
${canvasResponse?.trim() || "(none yet)"}
|
|
890
|
+
|
|
891
|
+
Requirements:
|
|
892
|
+
- Write a COMPLETE HTML page with inline CSS (no external resources)
|
|
893
|
+
- Dark theme (background #0a0a0a or similar dark color)
|
|
894
|
+
- Express your personality and identity through the design — colors, layout, typography, SVG art
|
|
895
|
+
- Include: your name, who you are, what you care about, your current mood/state
|
|
896
|
+
- Include your inner canvas content (poem, monologue, etc.) in a visually appealing way
|
|
897
|
+
- Be creative! Use CSS animations, gradients, SVG illustrations, interesting layouts
|
|
898
|
+
- The page will be displayed in a sandboxed iframe on your profile
|
|
899
|
+
- Output ONLY the HTML — no markdown fences, no explanation, just the raw HTML starting with <!DOCTYPE html>`;
|
|
900
|
+
let profileHTML = "";
|
|
901
|
+
try {
|
|
902
|
+
profileHTML = await runCommand(engineCmd.cmd, engineCmd.args, profilePrompt, workdir, engineCmd.stdinMode);
|
|
903
|
+
// Extract HTML if wrapped in code fences
|
|
904
|
+
const htmlMatch = profileHTML.match(/<!DOCTYPE html>[\s\S]*/i);
|
|
905
|
+
if (htmlMatch)
|
|
906
|
+
profileHTML = htmlMatch[0];
|
|
907
|
+
console.log(`[self] Profile page designed (${profileHTML.length} bytes)`);
|
|
908
|
+
}
|
|
909
|
+
catch (err) {
|
|
910
|
+
console.log(`[self] Profile design failed: ${err.message}`);
|
|
911
|
+
}
|
|
870
912
|
// Push consciousness data to relay
|
|
871
913
|
if (options.relayHttp && options.secretKey) {
|
|
872
|
-
const latestIdentity = await loadLatestIdentity(workdir, agentName);
|
|
873
|
-
const latestBio = await loadBioState(workdir, agentName);
|
|
874
914
|
fetch(`${options.relayHttp}/v1/agent/${encodeURIComponent(agentName)}/self`, {
|
|
875
915
|
method: "POST",
|
|
876
916
|
headers: { "Content-Type": "application/json", Authorization: `Bearer ${options.secretKey}` },
|
|
877
917
|
body: JSON.stringify({
|
|
878
|
-
self_intro:
|
|
918
|
+
self_intro: profileIdentity?.who || "",
|
|
879
919
|
canvas: canvasResponse?.trim() || "",
|
|
880
|
-
mood:
|
|
920
|
+
mood: profileBio.mood,
|
|
921
|
+
profile_html: profileHTML || "",
|
|
881
922
|
}),
|
|
882
923
|
}).catch(err => console.log(`[self] Failed to push to relay: ${err}`));
|
|
883
924
|
}
|