@bolloon/bolloon-agent 0.4.3 → 0.4.5

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.
Files changed (212) hide show
  1. package/README.md +135 -135
  2. package/bin/bolloon-cli.cjs +183 -183
  3. package/bin/bolloon-daemon.sh +207 -0
  4. package/bin/bolloon.cjs +0 -0
  5. package/dist/agents/constraint-layer.js +19 -19
  6. package/dist/agents/judgment-protocol.js +14 -14
  7. package/dist/agents/pi-sdk-types.js +12 -12
  8. package/dist/agents/pi-sdk.js +90 -90
  9. package/dist/agents/skill-organizer.js +19 -19
  10. package/dist/agents/workflow-pivot-loop.js +2 -2
  11. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  12. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  13. package/dist/bollharness-integration/context-router.js +292 -292
  14. package/dist/bollharness-integration/gate-state-machine.js +13 -13
  15. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  16. package/dist/bollharness-integration/skill-adapter.js +21 -21
  17. package/dist/bootstrap/chat-archiver.js +14 -14
  18. package/dist/bootstrap/context-os.js +24 -24
  19. package/dist/bootstrap/memory-compressor.js +13 -13
  20. package/dist/cli-entry.js +36 -36
  21. package/dist/constraint-runtime/reference_data/archive_surface_snapshot.json +63 -0
  22. package/dist/constraint-runtime/reference_data/commands_snapshot.json +1037 -0
  23. package/dist/constraint-runtime/reference_data/subsystems/assistant.json +8 -0
  24. package/dist/constraint-runtime/reference_data/subsystems/bootstrap.json +8 -0
  25. package/dist/constraint-runtime/reference_data/subsystems/bridge.json +32 -0
  26. package/dist/constraint-runtime/reference_data/subsystems/buddy.json +13 -0
  27. package/dist/constraint-runtime/reference_data/subsystems/cli.json +26 -0
  28. package/dist/constraint-runtime/reference_data/subsystems/components.json +32 -0
  29. package/dist/constraint-runtime/reference_data/subsystems/constants.json +28 -0
  30. package/dist/constraint-runtime/reference_data/subsystems/coordinator.json +8 -0
  31. package/dist/constraint-runtime/reference_data/subsystems/entrypoints.json +15 -0
  32. package/dist/constraint-runtime/reference_data/subsystems/hooks.json +32 -0
  33. package/dist/constraint-runtime/reference_data/subsystems/keybindings.json +21 -0
  34. package/dist/constraint-runtime/reference_data/subsystems/memdir.json +15 -0
  35. package/dist/constraint-runtime/reference_data/subsystems/migrations.json +18 -0
  36. package/dist/constraint-runtime/reference_data/subsystems/moreright.json +8 -0
  37. package/dist/constraint-runtime/reference_data/subsystems/native_ts.json +11 -0
  38. package/dist/constraint-runtime/reference_data/subsystems/outputStyles.json +8 -0
  39. package/dist/constraint-runtime/reference_data/subsystems/plugins.json +9 -0
  40. package/dist/constraint-runtime/reference_data/subsystems/remote.json +11 -0
  41. package/dist/constraint-runtime/reference_data/subsystems/schemas.json +8 -0
  42. package/dist/constraint-runtime/reference_data/subsystems/screens.json +10 -0
  43. package/dist/constraint-runtime/reference_data/subsystems/server.json +10 -0
  44. package/dist/constraint-runtime/reference_data/subsystems/services.json +32 -0
  45. package/dist/constraint-runtime/reference_data/subsystems/skills.json +27 -0
  46. package/dist/constraint-runtime/reference_data/subsystems/state.json +13 -0
  47. package/dist/constraint-runtime/reference_data/subsystems/types.json +18 -0
  48. package/dist/constraint-runtime/reference_data/subsystems/upstreamproxy.json +9 -0
  49. package/dist/constraint-runtime/reference_data/subsystems/utils.json +32 -0
  50. package/dist/constraint-runtime/reference_data/subsystems/vim.json +12 -0
  51. package/dist/constraint-runtime/reference_data/subsystems/voice.json +8 -0
  52. package/dist/constraint-runtime/reference_data/tools_snapshot.json +922 -0
  53. package/dist/context-compaction/auto-compact.js +7 -7
  54. package/dist/electron/config.js.map +1 -0
  55. package/dist/electron/dialogs.js.map +1 -0
  56. package/dist/electron/first-run.js +54 -54
  57. package/dist/electron/first-run.js.map +1 -0
  58. package/dist/electron/ipc.js.map +1 -0
  59. package/dist/electron/logger.js.map +1 -0
  60. package/dist/electron/main.js.map +1 -0
  61. package/dist/electron/menu.js.map +1 -0
  62. package/dist/electron/paths.js.map +1 -0
  63. package/dist/electron/server.js.map +1 -0
  64. package/dist/electron/tray.js.map +1 -0
  65. package/dist/electron/window.js.map +1 -0
  66. package/dist/electron-build/electron/config.js.map +1 -1
  67. package/dist/electron-build/electron/dialogs.js.map +1 -1
  68. package/dist/electron-build/electron/first-run.js +54 -54
  69. package/dist/electron-build/electron/first-run.js.map +1 -1
  70. package/dist/electron-build/electron/ipc.js.map +1 -1
  71. package/dist/electron-build/electron/logger.js.map +1 -1
  72. package/dist/electron-build/electron/menu.js.map +1 -1
  73. package/dist/electron-build/electron/paths.js.map +1 -1
  74. package/dist/electron-build/electron/server.js.map +1 -1
  75. package/dist/electron-build/electron/tray.js.map +1 -1
  76. package/dist/electron-build/electron/window.js.map +1 -1
  77. package/dist/electron-build/utils/auto-update.js.map +1 -1
  78. package/dist/electron-preload.js.map +1 -1
  79. package/dist/electron.js.map +1 -1
  80. package/dist/index.js +112 -112
  81. package/dist/llm/llm-judgment-client.js +102 -102
  82. package/dist/llm/pi-ai.js +48 -48
  83. package/dist/llm/system-prompt/layers/channel/human-async.md +41 -41
  84. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  85. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  86. package/dist/llm/system-prompt/layers/channel/p2p-peer-sync.md +51 -51
  87. package/dist/llm/system-prompt/layers/channel/p2p-proactive.md +43 -43
  88. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  89. package/dist/llm/system-prompt/layers/channel/session-handoff.md +61 -61
  90. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  91. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  92. package/dist/llm/system-prompt/layers/core/external-engagement.md +73 -73
  93. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  94. package/dist/llm/system-prompt/layers/core/identity.md +48 -48
  95. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  96. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  97. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  98. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  99. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  100. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  101. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  102. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  103. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  104. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  105. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  106. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  107. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  108. package/dist/llm/system-prompt/layers/tool/goal_handoff.md +77 -77
  109. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  110. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  111. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  112. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  113. package/dist/llm/system-prompt/layers/tool/p2p_request.md +61 -61
  114. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  115. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  116. package/dist/llm/tool-manifest/bash.js +3 -3
  117. package/dist/llm/tool-manifest/create_file.js +4 -4
  118. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  119. package/dist/llm/tool-manifest/image_search.js +2 -2
  120. package/dist/llm/tool-manifest/index.js +59 -0
  121. package/dist/llm/tool-manifest/mcp.js +2 -2
  122. package/dist/llm/tool-manifest/message_compose.js +3 -3
  123. package/dist/llm/tool-manifest/places.js +2 -2
  124. package/dist/llm/tool-manifest/present_files.js +1 -1
  125. package/dist/llm/tool-manifest/recipe.js +2 -2
  126. package/dist/llm/tool-manifest/str_replace.js +5 -5
  127. package/dist/llm/tool-manifest/view.js +3 -3
  128. package/dist/llm/tool-manifest/weather.js +4 -4
  129. package/dist/llm/tool-manifest/web.js +4 -4
  130. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  131. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  132. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  133. package/dist/pi-ecosystem-judgment/human-value-store.js +1 -1
  134. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  135. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  136. package/dist/pi-ecosystem-mcp/index.js +146 -5
  137. package/dist/security/context-router-tool.js +15 -15
  138. package/dist/utils/auto-update.js.map +1 -0
  139. package/dist/web/api-config.html +779 -779
  140. package/dist/web/client-hearth.js +10 -10
  141. package/dist/web/client.js.map +7 -0
  142. package/dist/web/components/wallet-viem.mjs +118 -118
  143. package/dist/web/edge-auth-client.js +120 -0
  144. package/dist/web/index.html +472 -472
  145. package/dist/web/manifest.json +20 -20
  146. package/dist/web/server.js +34 -67
  147. package/dist/web/style.css +4946 -4946
  148. package/package.json +195 -195
  149. package/scripts/build-cli.js +215 -215
  150. package/scripts/build-web.ts +130 -130
  151. package/scripts/postinstall.js +152 -152
  152. package/bin/bolloon.js +0 -157
  153. package/dist/pi-ecosystem-colony/index.js +0 -365
  154. package/dist/social/ant-colony/AdaptiveHeartbeat.js +0 -101
  155. package/dist/social/ant-colony/PheromoneEngine.js +0 -227
  156. package/dist/social/ant-colony/index.js +0 -6
  157. package/dist/social/ant-colony/types.js +0 -24
  158. package/dist/storage/trajectory.js +0 -101
  159. package/dist/test/ai-judgment-test.js +0 -80
  160. package/dist/test/bollharness-integration.test.js +0 -318
  161. package/dist/test/channel-agent-multi-dialogue.js +0 -205
  162. package/dist/test/channel-heartbeat-agent-test.js +0 -201
  163. package/dist/test/constraint-layer.test.js +0 -164
  164. package/dist/test/diap-identity-test.js +0 -172
  165. package/dist/test/diap-quick-test.js +0 -62
  166. package/dist/test/global-shared-context.test.js +0 -315
  167. package/dist/test/harness-judgment-injection.test.js +0 -246
  168. package/dist/test/harness-workflow-integrator-test.js +0 -228
  169. package/dist/test/human-value-store.test.js +0 -243
  170. package/dist/test/hybrid-integration-test.js +0 -118
  171. package/dist/test/hybrid-messenger-verify.js +0 -55
  172. package/dist/test/iroh-bistream-debug.js +0 -38
  173. package/dist/test/iroh-communication.test.js +0 -66
  174. package/dist/test/iroh-debug-test.js +0 -57
  175. package/dist/test/iroh-diap-test.js +0 -71
  176. package/dist/test/iroh-direct-connect.js +0 -55
  177. package/dist/test/iroh-e2e-fixed.js +0 -89
  178. package/dist/test/iroh-e2e-same-process.js +0 -63
  179. package/dist/test/iroh-e2e.js +0 -66
  180. package/dist/test/iroh-final-e2e.js +0 -72
  181. package/dist/test/iroh-relay-test.js +0 -37
  182. package/dist/test/iroh-simple-test.js +0 -41
  183. package/dist/test/iroh-transport-verify.js +0 -54
  184. package/dist/test/iroh-transport.test.js +0 -37
  185. package/dist/test/iroh-two-nodes.js +0 -70
  186. package/dist/test/iroh-verify.js +0 -44
  187. package/dist/test/judgment-decision.test.js +0 -219
  188. package/dist/test/llm-judgment-integration.test.js +0 -220
  189. package/dist/test/p2p-agent-complex-dialogue.js +0 -385
  190. package/dist/test/p2p-agent-dialogue.js +0 -341
  191. package/dist/test/p2p-agent-full-bidirectional.js +0 -510
  192. package/dist/test/p2p-agent-harness-flow.js +0 -437
  193. package/dist/test/p2p-agent-harness-single.js +0 -143
  194. package/dist/test/p2p-ai-dialogue-test.js +0 -318
  195. package/dist/test/p2p-cid-connect-test.js +0 -195
  196. package/dist/test/p2p-connect-receiver.js +0 -69
  197. package/dist/test/p2p-doc-transfer.js +0 -110
  198. package/dist/test/p2p-identity-page-test.js +0 -77
  199. package/dist/test/p2p-iroh-test.js +0 -171
  200. package/dist/test/p2p-minimal-test.js +0 -241
  201. package/dist/test/p2p-node-1.js +0 -148
  202. package/dist/test/p2p-node-2.js +0 -148
  203. package/dist/test/p2p-server.js +0 -281
  204. package/dist/test/p2p-two-nodes-test.js +0 -438
  205. package/dist/test/pi-sdk.test.js +0 -44
  206. package/dist/test/set-persona.js +0 -40
  207. package/dist/test/simple.test.js +0 -9
  208. package/dist/test/storage-integration.test.js +0 -150
  209. package/dist/test/subagent-manager.test.js +0 -276
  210. package/dist/test/test-gate-flow.test.js +0 -81
  211. package/dist/test/workflow-engine.test.js +0 -87
  212. package/dist/test/workflow-pivot-loop.test.js +0 -246
package/bin/bolloon.js DELETED
@@ -1,157 +0,0 @@
1
- #!/usr/bin/env node
2
- const path = require("path");
3
- const { spawn } = require("child_process");
4
- const fs = require("fs");
5
-
6
- const RESET = "\x1b[0m";
7
- const BOLD = "\x1b[1m";
8
- const CYAN = "\x1b[36m";
9
- const GREEN = "\x1b[32m";
10
- const MAGENTA = "\x1b[35m";
11
-
12
- function log(msg, color) {
13
- console.log((color || RESET) + msg + RESET);
14
- }
15
-
16
- function printBanner() {
17
- console.log("\n" + CYAN + BOLD + [
18
- " ╔═══════════════════════════════════════════╗",
19
- " ║ 🤖 Bolloon Agent ║",
20
- " ║ P2P AI Document Processor ║",
21
- " ╚═══════════════════════════════════════════╝"
22
- ].join("\n") + RESET + "\n");
23
- }
24
-
25
- function getMainEntry() {
26
- const distDir = path.dirname(require.main.filename);
27
- const distIndex = path.join(distDir, "index.js");
28
- if (fs.existsSync(distIndex)) {
29
- return distIndex;
30
- }
31
- return path.join(process.cwd(), "src", "index.ts");
32
- }
33
-
34
- function parseArgs() {
35
- const args = process.argv.slice(2);
36
- if (args.length === 0) {
37
- return { mode: "gui", args: [] };
38
- }
39
- const first = args[0];
40
- switch (first) {
41
- case "-v":
42
- case "--version":
43
- return { mode: "version", args: [] };
44
- case "-h":
45
- case "--help":
46
- return { mode: "help", args: [] };
47
- case "-g":
48
- case "--gui":
49
- return { mode: "gui", args: args.slice(1) };
50
- case "-w":
51
- case "--web":
52
- return { mode: "web", args: args.slice(1) };
53
- case "-c":
54
- case "--cli":
55
- return { mode: "cli", args: args.slice(1) };
56
- default:
57
- return { mode: "passthrough", args };
58
- }
59
- }
60
-
61
- async function startElectron(additionalArgs) {
62
- try {
63
- const electron = require("electron");
64
- const distDir = path.dirname(require.main.filename);
65
- let mainPath = path.join(distDir, "electron.js");
66
- if (!fs.existsSync(mainPath)) {
67
- mainPath = path.join(process.cwd(), "src", "electron.ts");
68
- }
69
- log("启动 Electron...", CYAN);
70
- const child = spawn(electron, [mainPath, ...additionalArgs], {
71
- stdio: "inherit",
72
- env: { ...process.env, NODE_ENV: "development" }
73
- });
74
- child.on("error", (err) => {
75
- log("Electron 启动失败: " + err.message, MAGENTA);
76
- process.exit(1);
77
- });
78
- child.on("exit", (code) => process.exit(code || 0));
79
- } catch (err) {
80
- log("Electron 不可用,切换到 Web 模式...", CYAN);
81
- await startWebServer(additionalArgs);
82
- }
83
- }
84
-
85
- async function startWebServer(additionalArgs) {
86
- const mainPath = getMainEntry();
87
- const webArgs = ["--web", ...additionalArgs];
88
- log("启动 Web 服务...", CYAN);
89
- const child = spawn(process.execPath, [mainPath, ...webArgs], { stdio: "inherit" });
90
- child.on("error", (err) => {
91
- log("Web 服务启动失败: " + err.message, MAGENTA);
92
- process.exit(1);
93
- });
94
- child.on("exit", (code) => process.exit(code || 0));
95
- }
96
-
97
- async function startCLI(additionalArgs) {
98
- const mainPath = getMainEntry();
99
- log("启动命令行界面...", CYAN);
100
- const child = spawn(process.execPath, [mainPath, ...additionalArgs], { stdio: "inherit" });
101
- child.on("error", (err) => {
102
- log("CLI 启动失败: " + err.message, MAGENTA);
103
- process.exit(1);
104
- });
105
- child.on("exit", (code) => process.exit(code || 0));
106
- }
107
-
108
- async function main() {
109
- const { mode, args } = parseArgs();
110
- switch (mode) {
111
- case "version":
112
- console.log("Bolloon Agent v0.1.1");
113
- break;
114
- case "help":
115
- printBanner();
116
- console.log(BOLD + "用法:" + RESET + " bolloon [选项] [命令] [参数]");
117
- console.log(BOLD + "选项:" + RESET + " --gui, -g 启动图形界面");
118
- console.log(" --web, -w 启动 Web UI");
119
- console.log(" --cli, -c 启动命令行界面");
120
- console.log(" --version, -v 显示版本");
121
- console.log(" --help, -h 显示帮助");
122
- console.log(BOLD + "示例:" + RESET + " bolloon # 启动图形界面");
123
- console.log(" bolloon --web # 启动 Web UI");
124
- console.log(" bolloon --read file # 读取文档");
125
- break;
126
- case "gui":
127
- printBanner();
128
- await startElectron(args);
129
- break;
130
- case "web":
131
- printBanner();
132
- await startWebServer(args);
133
- break;
134
- case "cli":
135
- await startCLI(args);
136
- break;
137
- case "passthrough":
138
- const mainPath = getMainEntry();
139
- const child = spawn(process.execPath, [mainPath, ...args], { stdio: "inherit" });
140
- child.on("error", (err) => {
141
- log("执行失败: " + err.message, MAGENTA);
142
- process.exit(1);
143
- });
144
- child.on("exit", (code) => process.exit(code || 0));
145
- break;
146
- default:
147
- log("未知模式: " + mode, MAGENTA);
148
- printBanner();
149
- console.log("输入 --help 查看帮助");
150
- process.exit(1);
151
- }
152
- }
153
-
154
- main().catch((err) => {
155
- console.error("Fatal error:", err);
156
- process.exit(1);
157
- });
@@ -1,365 +0,0 @@
1
- /**
2
- * Pi Ant Colony Integration for Bolloon
3
- *
4
- * Multi-agent collaboration system with white-box signal protocol.
5
- * Based on oh-pi's ant colony system: COLONY_SIGNAL protocol for agent coordination.
6
- *
7
- * Signal Protocol:
8
- * COLONY_SIGNAL:LAUNCHED → SCOUTING → WORKING → REVIEWING → COMPLETE
9
- *
10
- * Key features:
11
- * - Fully visible signal protocol (no black boxes)
12
- * - Per-ant turn limits, cost tracking, concurrent scheduling
13
- * - White-box design: no "what is it doing in the background" anxiety
14
- */
15
- import { EventEmitter } from 'events';
16
- import * as fs from 'fs/promises';
17
- import * as path from 'path';
18
- // Colony state
19
- const ants = new Map();
20
- const tasks = new Map();
21
- const signalHistory = [];
22
- const STATE_DIR = path.join(process.env.HOME || '/tmp', '.bolloon', 'colony');
23
- // Event emitter
24
- class ColonyEventEmitter extends EventEmitter {
25
- }
26
- const colonyEvents = new ColonyEventEmitter();
27
- /**
28
- * Generate a unique ant ID
29
- */
30
- function generateAntId() {
31
- return `ant-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
32
- }
33
- /**
34
- * Register a new ant in the colony
35
- */
36
- export function registerAnt(name, role, maxTurns = 10, tokenBudget = 50000) {
37
- const id = generateAntId();
38
- const ant = {
39
- id,
40
- name,
41
- role,
42
- signal: 'LAUNCHED',
43
- turnCount: 0,
44
- maxTurns,
45
- tokenBudget,
46
- tokensUsed: 0,
47
- createdAt: new Date().toISOString(),
48
- updatedAt: new Date().toISOString(),
49
- };
50
- ants.set(id, ant);
51
- emitSignal(id, 'LAUNCHED');
52
- console.log(`[Colony] Registered ant: ${name} (${role})`);
53
- return ant;
54
- }
55
- /**
56
- * Emit a signal transition
57
- */
58
- function emitSignal(antId, newSignal, details) {
59
- const ant = ants.get(antId);
60
- if (!ant)
61
- return;
62
- const event = {
63
- antId,
64
- antName: ant.name,
65
- fromSignal: ant.signal,
66
- toSignal: newSignal,
67
- timestamp: new Date().toISOString(),
68
- details,
69
- };
70
- signalHistory.push(event);
71
- if (signalHistory.length > 100) {
72
- signalHistory.shift();
73
- }
74
- ant.signal = newSignal;
75
- ant.updatedAt = new Date().toISOString();
76
- ants.set(antId, ant);
77
- colonyEvents.emit('signal', event);
78
- console.log(`[Colony] ${ant.name}: ${event.fromSignal} → ${event.toSignal}${details ? ` (${details})` : ''}`);
79
- }
80
- /**
81
- * Transition ant to SCOUTING
82
- */
83
- export function antScouting(antId, task) {
84
- const ant = ants.get(antId);
85
- if (!ant)
86
- return;
87
- ant.task = task;
88
- ants.set(antId, ant);
89
- emitSignal(antId, 'SCOUTING', `Task: ${task.substring(0, 50)}...`);
90
- }
91
- /**
92
- * Transition ant to WORKING
93
- */
94
- export function antWorking(antId) {
95
- const ant = ants.get(antId);
96
- if (!ant)
97
- return;
98
- emitSignal(antId, 'WORKING');
99
- }
100
- /**
101
- * Transition ant to REVIEWING
102
- */
103
- export function antReviewing(antId) {
104
- emitSignal(antId, 'REVIEWING');
105
- }
106
- /**
107
- * Complete ant work
108
- */
109
- export function antComplete(antId, result) {
110
- const ant = ants.get(antId);
111
- if (!ant)
112
- return;
113
- ant.result = result;
114
- ants.set(antId, ant);
115
- emitSignal(antId, 'COMPLETE', `Result: ${result.substring(0, 50)}...`);
116
- }
117
- /**
118
- * Fail ant work
119
- */
120
- export function antFail(antId, error) {
121
- const ant = ants.get(antId);
122
- if (!ant)
123
- return;
124
- ant.result = error;
125
- ants.set(antId, ant);
126
- emitSignal(antId, 'FAILED', error);
127
- }
128
- /**
129
- * Abort ant work
130
- */
131
- export function antAbort(antId, reason) {
132
- emitSignal(antId, 'ABORTED', reason);
133
- }
134
- /**
135
- * Increment turn count
136
- */
137
- export function antTick(antId, tokensUsed = 0) {
138
- const ant = ants.get(antId);
139
- if (!ant)
140
- return;
141
- ant.turnCount++;
142
- ant.tokensUsed += tokensUsed;
143
- ant.updatedAt = new Date().toISOString();
144
- ants.set(antId, ant);
145
- // Check if exceeded limits
146
- if (ant.turnCount >= ant.maxTurns) {
147
- antAbort(antId, 'Max turns exceeded');
148
- }
149
- else if (ant.tokensUsed >= ant.tokenBudget) {
150
- antAbort(antId, 'Token budget exceeded');
151
- }
152
- }
153
- /**
154
- * Create a colony task
155
- */
156
- export function createTask(description) {
157
- const id = `task-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
158
- const task = {
159
- id,
160
- description,
161
- status: 'pending',
162
- assignedAnts: [],
163
- results: new Map(),
164
- createdAt: new Date().toISOString(),
165
- };
166
- tasks.set(id, task);
167
- console.log(`[Colony] Created task: ${id} - ${description.substring(0, 50)}...`);
168
- return task;
169
- }
170
- /**
171
- * Dispatch task to ants
172
- */
173
- export function dispatchTask(taskId, antIds) {
174
- const task = tasks.get(taskId);
175
- if (!task)
176
- return;
177
- task.status = 'dispatched';
178
- task.assignedAnts = antIds;
179
- tasks.set(taskId, task);
180
- for (const antId of antIds) {
181
- const ant = ants.get(antId);
182
- if (ant) {
183
- antScouting(antId, task.description);
184
- }
185
- }
186
- console.log(`[Colony] Dispatched task ${taskId} to ${antIds.length} ants`);
187
- }
188
- /**
189
- * Record ant result for a task
190
- */
191
- export function recordResult(taskId, antId, result) {
192
- const task = tasks.get(taskId);
193
- if (!task)
194
- return;
195
- task.results.set(antId, result);
196
- // Check if all ants completed
197
- if (task.results.size === task.assignedAnts.length) {
198
- task.status = 'completed';
199
- task.completedAt = new Date().toISOString();
200
- for (const id of task.assignedAnts) {
201
- antReviewing(id);
202
- }
203
- }
204
- tasks.set(taskId, task);
205
- }
206
- /**
207
- * Get ant by ID
208
- */
209
- export function getAnt(antId) {
210
- return ants.get(antId);
211
- }
212
- /**
213
- * List all ants
214
- */
215
- export function listAnts() {
216
- return Array.from(ants.values());
217
- }
218
- /**
219
- * List ants by role
220
- */
221
- export function listAntsByRole(role) {
222
- return Array.from(ants.values()).filter((a) => a.role === role);
223
- }
224
- /**
225
- * Get ants by signal state
226
- */
227
- export function listAntsBySignal(signal) {
228
- return Array.from(ants.values()).filter((a) => a.signal === signal);
229
- }
230
- /**
231
- * Get active ants (not complete/failed/aborted)
232
- */
233
- export function getActiveAnts() {
234
- return Array.from(ants.values()).filter((a) => !['COMPLETE', 'FAILED', 'ABORTED'].includes(a.signal));
235
- }
236
- /**
237
- * Get task by ID
238
- */
239
- export function getTask(taskId) {
240
- return tasks.get(taskId);
241
- }
242
- /**
243
- * List all tasks
244
- */
245
- export function listTasks() {
246
- return Array.from(tasks.values());
247
- }
248
- /**
249
- * Get signal history
250
- */
251
- export function getSignalHistory() {
252
- return [...signalHistory];
253
- }
254
- /**
255
- * Get colony status
256
- */
257
- export function getColonyStatus() {
258
- const antList = Array.from(ants.values());
259
- const taskList = Array.from(tasks.values());
260
- const signalDistribution = {
261
- LAUNCHED: 0,
262
- SCOUTING: 0,
263
- WORKING: 0,
264
- REVIEWING: 0,
265
- COMPLETE: 0,
266
- FAILED: 0,
267
- ABORTED: 0,
268
- };
269
- for (const ant of antList) {
270
- signalDistribution[ant.signal]++;
271
- }
272
- return {
273
- antCount: antList.length,
274
- activeAnts: antList.filter((a) => !['COMPLETE', 'FAILED', 'ABORTED'].includes(a.signal)).length,
275
- taskCount: taskList.length,
276
- activeTasks: taskList.filter((t) => t.status === 'in_progress' || t.status === 'dispatched').length,
277
- signalDistribution,
278
- };
279
- }
280
- /**
281
- * Subscribe to colony events
282
- */
283
- export function onColonyEvent(event, callback) {
284
- colonyEvents.on(event, callback);
285
- }
286
- /**
287
- * Unsubscribe from colony events
288
- */
289
- export function offColonyEvent(event, callback) {
290
- colonyEvents.off(event, callback);
291
- }
292
- /**
293
- * Get formatted colony dump for debugging
294
- */
295
- export function getColonyDump() {
296
- const status = getColonyStatus();
297
- const active = getActiveAnts();
298
- let dump = '# Colony Status\n\n';
299
- dump += `Ants: ${status.antCount} total, ${status.activeAnts} active\n`;
300
- dump += `Tasks: ${status.taskCount} total, ${status.activeTasks} active\n\n`;
301
- dump += '## Signal Distribution\n';
302
- for (const [signal, count] of Object.entries(status.signalDistribution)) {
303
- if (count > 0) {
304
- dump += `- ${signal}: ${count}\n`;
305
- }
306
- }
307
- dump += '\n## Active Ants\n';
308
- for (const ant of active) {
309
- dump += `- ${ant.name} (${ant.role}): ${ant.signal} [${ant.turnCount}/${ant.maxTurns} turns, ${ant.tokensUsed}/${ant.tokenBudget} tokens]\n`;
310
- if (ant.task) {
311
- dump += ` Task: ${ant.task.substring(0, 60)}...\n`;
312
- }
313
- }
314
- dump += '\n## Recent Signals\n';
315
- const recent = signalHistory.slice(-10);
316
- for (const event of recent.reverse()) {
317
- dump += `- ${event.timestamp}: ${event.antName}: ${event.fromSignal} → ${event.toSignal}\n`;
318
- }
319
- return dump;
320
- }
321
- /**
322
- * Persist colony state
323
- */
324
- export async function persistColony() {
325
- try {
326
- await fs.mkdir(STATE_DIR, { recursive: true });
327
- const state = {
328
- ants: Array.from(ants.values()),
329
- tasks: Array.from(tasks.entries()).map(([id, t]) => ({
330
- ...t,
331
- results: Array.from(t.results.entries()),
332
- })),
333
- signalHistory: signalHistory.slice(-50),
334
- persistedAt: new Date().toISOString(),
335
- };
336
- await fs.writeFile(path.join(STATE_DIR, 'colony.json'), JSON.stringify(state, null, 2));
337
- console.log('[Colony] Persisted state');
338
- }
339
- catch (e) {
340
- console.warn('[Colony] Failed to persist:', e);
341
- }
342
- }
343
- /**
344
- * Load colony state
345
- */
346
- export async function loadColony() {
347
- try {
348
- const data = await fs.readFile(path.join(STATE_DIR, 'colony.json'), 'utf-8');
349
- const state = JSON.parse(data);
350
- ants.clear();
351
- for (const a of state.ants) {
352
- ants.set(a.id, a);
353
- }
354
- tasks.clear();
355
- for (const t of state.tasks) {
356
- tasks.set(t.id, { ...t, results: new Map(t.results) });
357
- }
358
- signalHistory.length = 0;
359
- signalHistory.push(...state.signalHistory);
360
- console.log(`[Colony] Loaded ${ants.size} ants, ${tasks.size} tasks`);
361
- }
362
- catch {
363
- // No persisted state
364
- }
365
- }
@@ -1,101 +0,0 @@
1
- /**
2
- * AdaptiveHeartbeat - 动态心跳策略
3
- *
4
- * 基于活跃度、信息素密度等因子动态调整心跳间隔
5
- */
6
- import { DEFAULT_ADAPTIVE_CONFIG, } from './types.js';
7
- export class AdaptiveHeartbeat {
8
- config;
9
- lastActivityTime = Date.now();
10
- activityHistory = [];
11
- recentDiscoveries = 0;
12
- pheromoneDensity = 0;
13
- discoveryBoost = 0;
14
- activityTimer = null;
15
- constructor(config) {
16
- this.config = { ...DEFAULT_ADAPTIVE_CONFIG, ...config };
17
- this.startActivityTracking();
18
- }
19
- /**
20
- * 获取下一次心跳的决策
21
- */
22
- decide() {
23
- const now = Date.now();
24
- const timeSinceLastActivity = now - this.lastActivityTime;
25
- const activityRate = this.calculateActivityRate();
26
- const pheromoneFactor = this.pheromoneDensity;
27
- const discoveryFactor = this.calculateDiscoveryFactor();
28
- const combinedFactor = activityRate * 0.2 +
29
- pheromoneFactor * this.config.pheromoneBoostFactor +
30
- discoveryFactor * this.config.discoveryBoostFactor;
31
- const interval = Math.max(this.config.minInterval, Math.min(this.config.maxInterval, this.config.baseInterval * (1 - combinedFactor * 0.7)));
32
- let priority = 'normal';
33
- if (discoveryFactor > 0.5 || this.discoveryBoost > 0.6) {
34
- priority = 'high';
35
- }
36
- else if (this.discoveryBoost > 0.8) {
37
- priority = 'urgent';
38
- }
39
- else if (activityRate < this.config.lowActivityThreshold) {
40
- priority = 'low';
41
- }
42
- return {
43
- interval: Math.round(interval),
44
- shouldExplore: discoveryFactor > 0.3 || pheromoneFactor > 0.5,
45
- shouldBroadcast: priority !== 'low' || timeSinceLastActivity > this.config.baseInterval,
46
- priorityLevel: priority,
47
- };
48
- }
49
- /**
50
- * 记录活跃事件
51
- */
52
- recordActivity(type) {
53
- const now = Date.now();
54
- this.lastActivityTime = now;
55
- this.activityHistory.push(now);
56
- if (type === 'discovery') {
57
- this.recentDiscoveries++;
58
- this.discoveryBoost = Math.min(1, this.discoveryBoost + 0.2);
59
- }
60
- this.discoveryBoost = Math.max(0, this.discoveryBoost - 0.05);
61
- }
62
- /**
63
- * 设置信息素密度
64
- */
65
- setPheromoneDensity(density) {
66
- this.pheromoneDensity = Math.max(0, Math.min(1, density));
67
- }
68
- /**
69
- * 获取当前配置
70
- */
71
- getConfig() {
72
- return { ...this.config };
73
- }
74
- /**
75
- * 更新配置
76
- */
77
- updateConfig(updates) {
78
- this.config = { ...this.config, ...updates };
79
- }
80
- calculateActivityRate() {
81
- const now = Date.now();
82
- const recentActivity = this.activityHistory.filter((t) => now - t < 60000).length;
83
- return recentActivity / 60;
84
- }
85
- calculateDiscoveryFactor() {
86
- return Math.min(1, this.recentDiscoveries / 5);
87
- }
88
- startActivityTracking() {
89
- this.activityTimer = setInterval(() => {
90
- const cutoff = Date.now() - 5 * 60 * 1000;
91
- this.activityHistory = this.activityHistory.filter((t) => t > cutoff);
92
- this.recentDiscoveries = Math.max(0, this.recentDiscoveries - 1);
93
- this.discoveryBoost = Math.max(0, this.discoveryBoost - 0.1);
94
- }, 60000);
95
- }
96
- shutdown() {
97
- if (this.activityTimer) {
98
- clearInterval(this.activityTimer);
99
- }
100
- }
101
- }