@bolloon/bolloon-agent 0.2.9 → 0.2.10

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 (268) hide show
  1. package/README.md +467 -467
  2. package/bin/bolloon-cli.cjs +183 -183
  3. package/bin/bolloon.cjs +0 -0
  4. package/bin/bolloon.js +157 -0
  5. package/dist/agents/agent-manifest-protocol.js +0 -52
  6. package/dist/agents/constraint-layer.js +19 -19
  7. package/dist/agents/pi-sdk.js +287 -1213
  8. package/dist/agents/shell-guard.js +2 -2
  9. package/dist/agents/workflow-pivot-loop.js +2 -81
  10. package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
  11. package/dist/bollharness-integration/context-router-judgment.js +4 -4
  12. package/dist/bollharness-integration/context-router.js +292 -292
  13. package/dist/bollharness-integration/gate-state-machine.js +13 -26
  14. package/dist/bollharness-integration/integration.js +0 -71
  15. package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
  16. package/dist/bollharness-integration/skill-adapter.js +127 -52
  17. package/dist/bootstrap/context-collector.js +3 -6
  18. package/dist/bootstrap/lifecycle-hooks.js +1 -15
  19. package/dist/cli-entry.js +35 -39
  20. package/dist/constraint-runtime/src/_archive_helper.js +9 -0
  21. package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
  22. package/dist/constraint-runtime/src/agent/index.js +1 -0
  23. package/dist/constraint-runtime/src/assistant/index.js +12 -0
  24. package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
  25. package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
  26. package/dist/constraint-runtime/src/bridge/index.js +12 -0
  27. package/dist/constraint-runtime/src/buddy/index.js +12 -0
  28. package/dist/constraint-runtime/src/cli/index.js +12 -0
  29. package/dist/constraint-runtime/src/command_graph.js +10 -0
  30. package/dist/constraint-runtime/src/commands.js +60 -0
  31. package/dist/constraint-runtime/src/components/index.js +12 -0
  32. package/dist/constraint-runtime/src/constants/index.js +12 -0
  33. package/dist/constraint-runtime/src/constraint/budget.js +22 -0
  34. package/dist/constraint-runtime/src/constraint/index.js +2 -0
  35. package/dist/constraint-runtime/src/constraint/permission.js +20 -0
  36. package/dist/constraint-runtime/src/context.js +30 -0
  37. package/dist/constraint-runtime/src/coordinator/index.js +12 -0
  38. package/dist/constraint-runtime/src/cost_hook.js +4 -0
  39. package/dist/constraint-runtime/src/cost_tracker.js +8 -0
  40. package/dist/constraint-runtime/src/deferred_init.js +10 -0
  41. package/dist/constraint-runtime/src/direct_modes.js +6 -0
  42. package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
  43. package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
  44. package/dist/constraint-runtime/src/execution_registry.js +44 -0
  45. package/dist/constraint-runtime/src/history.js +9 -0
  46. package/dist/constraint-runtime/src/hooks/index.js +12 -0
  47. package/dist/constraint-runtime/src/index.js +26 -0
  48. package/dist/constraint-runtime/src/ink.js +4 -0
  49. package/dist/constraint-runtime/src/keybindings/index.js +12 -0
  50. package/dist/constraint-runtime/src/memdir/index.js +12 -0
  51. package/dist/constraint-runtime/src/migrations/index.js +12 -0
  52. package/dist/constraint-runtime/src/models.js +1 -0
  53. package/dist/constraint-runtime/src/moreright/index.js +12 -0
  54. package/dist/constraint-runtime/src/native_ts/index.js +12 -0
  55. package/dist/constraint-runtime/src/output_styles/index.js +12 -0
  56. package/dist/constraint-runtime/src/parity_audit.js +12 -0
  57. package/dist/constraint-runtime/src/plugins/index.js +12 -0
  58. package/dist/constraint-runtime/src/port_manifest.js +11 -0
  59. package/dist/constraint-runtime/src/prefetch.js +9 -0
  60. package/dist/constraint-runtime/src/query.js +1 -0
  61. package/dist/constraint-runtime/src/remote/index.js +12 -0
  62. package/dist/constraint-runtime/src/remote_runtime.js +9 -0
  63. package/dist/constraint-runtime/src/runtime/index.js +1 -0
  64. package/dist/constraint-runtime/src/runtime/session.js +35 -0
  65. package/dist/constraint-runtime/src/schemas/index.js +12 -0
  66. package/dist/constraint-runtime/src/screens/index.js +12 -0
  67. package/dist/constraint-runtime/src/server/index.js +12 -0
  68. package/dist/constraint-runtime/src/services/index.js +12 -0
  69. package/dist/constraint-runtime/src/session_store.js +22 -0
  70. package/dist/constraint-runtime/src/setup.js +30 -0
  71. package/dist/constraint-runtime/src/skills/index.js +1 -0
  72. package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
  73. package/dist/constraint-runtime/src/state/index.js +12 -0
  74. package/dist/constraint-runtime/src/system_init.js +20 -0
  75. package/dist/constraint-runtime/src/thinking/engine.js +42 -0
  76. package/dist/constraint-runtime/src/thinking/index.js +1 -0
  77. package/dist/constraint-runtime/src/tool_pool.js +8 -0
  78. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
  79. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
  80. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
  81. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
  82. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
  83. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
  84. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
  85. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
  86. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
  87. package/dist/constraint-runtime/src/tools.js +80 -0
  88. package/dist/constraint-runtime/src/transcript.js +19 -0
  89. package/dist/constraint-runtime/src/types/index.js +12 -0
  90. package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
  91. package/dist/constraint-runtime/src/utils/index.js +12 -0
  92. package/dist/constraint-runtime/src/vim/index.js +12 -0
  93. package/dist/constraint-runtime/src/voice/index.js +12 -0
  94. package/dist/constraint-runtime/tests/agent.test.js +16 -0
  95. package/dist/constraint-runtime/tests/constraint.test.js +41 -0
  96. package/dist/constraint-runtime/tests/skill.test.js +19 -0
  97. package/dist/constraint-runtime/tests/thinking.test.js +22 -0
  98. package/dist/context-compaction/auto-compact.js +7 -7
  99. package/dist/electron-preload.js +1 -18
  100. package/dist/electron-preload.js.map +1 -1
  101. package/dist/electron.js +168 -3
  102. package/dist/electron.js.map +1 -1
  103. package/dist/index.js +116 -136
  104. package/dist/llm/config-store.js +8 -24
  105. package/dist/llm/llm-judgment-client.js +102 -102
  106. package/dist/llm/pi-ai.js +85 -126
  107. package/dist/llm/system-prompt/layers/channel/local.md +14 -14
  108. package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
  109. package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
  110. package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
  111. package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
  112. package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
  113. package/dist/llm/system-prompt/layers/core/identity.md +37 -37
  114. package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
  115. package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
  116. package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
  117. package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
  118. package/dist/llm/system-prompt/layers/core/tone.md +31 -31
  119. package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
  120. package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
  121. package/dist/llm/system-prompt/layers/role/architect.md +20 -20
  122. package/dist/llm/system-prompt/layers/role/expert.md +19 -19
  123. package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
  124. package/dist/llm/system-prompt/layers/role/security.md +15 -15
  125. package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
  126. package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
  127. package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
  128. package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
  129. package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
  130. package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
  131. package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
  132. package/dist/llm/tool-manifest/ask_user_input.js +1 -1
  133. package/dist/llm/tool-manifest/bash.js +3 -3
  134. package/dist/llm/tool-manifest/create_file.js +4 -4
  135. package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
  136. package/dist/llm/tool-manifest/image_search.js +2 -2
  137. package/dist/llm/tool-manifest/mcp.js +2 -2
  138. package/dist/llm/tool-manifest/message_compose.js +3 -3
  139. package/dist/llm/tool-manifest/places.js +2 -2
  140. package/dist/llm/tool-manifest/present_files.js +1 -1
  141. package/dist/llm/tool-manifest/recipe.js +2 -2
  142. package/dist/llm/tool-manifest/str_replace.js +5 -5
  143. package/dist/llm/tool-manifest/view.js +3 -3
  144. package/dist/llm/tool-manifest/weather.js +4 -4
  145. package/dist/llm/tool-manifest/web.js +4 -4
  146. package/dist/pi-ecosystem-colony/index.js +365 -0
  147. package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
  148. package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
  149. package/dist/pi-ecosystem-judgment/distillation.js +14 -14
  150. package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
  151. package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
  152. package/dist/security/context-router-tool.js +15 -15
  153. package/dist/security/tool-gate.js +0 -11
  154. package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
  155. package/dist/social/ant-colony/PheromoneEngine.js +227 -0
  156. package/dist/social/ant-colony/index.js +6 -0
  157. package/dist/social/ant-colony/types.js +24 -0
  158. package/dist/test/ai-judgment-test.js +80 -0
  159. package/dist/test/bollharness-integration.test.js +318 -0
  160. package/dist/test/channel-agent-multi-dialogue.js +205 -0
  161. package/dist/test/channel-heartbeat-agent-test.js +201 -0
  162. package/dist/test/constraint-layer.test.js +164 -0
  163. package/dist/test/diap-identity-test.js +172 -0
  164. package/dist/test/diap-quick-test.js +62 -0
  165. package/dist/test/global-shared-context.test.js +315 -0
  166. package/dist/test/harness-judgment-injection.test.js +246 -0
  167. package/dist/test/harness-workflow-integrator-test.js +228 -0
  168. package/dist/test/human-value-store.test.js +243 -0
  169. package/dist/test/hybrid-integration-test.js +118 -0
  170. package/dist/test/hybrid-messenger-verify.js +55 -0
  171. package/dist/test/iroh-bistream-debug.js +38 -0
  172. package/dist/test/iroh-communication.test.js +66 -0
  173. package/dist/test/iroh-debug-test.js +57 -0
  174. package/dist/test/iroh-diap-test.js +71 -0
  175. package/dist/test/iroh-direct-connect.js +55 -0
  176. package/dist/test/iroh-e2e-fixed.js +89 -0
  177. package/dist/test/iroh-e2e-same-process.js +63 -0
  178. package/dist/test/iroh-e2e.js +66 -0
  179. package/dist/test/iroh-final-e2e.js +72 -0
  180. package/dist/test/iroh-relay-test.js +37 -0
  181. package/dist/test/iroh-simple-test.js +41 -0
  182. package/dist/test/iroh-transport-verify.js +54 -0
  183. package/dist/test/iroh-transport.test.js +37 -0
  184. package/dist/test/iroh-two-nodes.js +70 -0
  185. package/dist/test/iroh-verify.js +44 -0
  186. package/dist/test/judgment-decision.test.js +219 -0
  187. package/dist/test/llm-judgment-integration.test.js +220 -0
  188. package/dist/test/p2p-agent-complex-dialogue.js +385 -0
  189. package/dist/test/p2p-agent-dialogue.js +341 -0
  190. package/dist/test/p2p-agent-full-bidirectional.js +510 -0
  191. package/dist/test/p2p-agent-harness-flow.js +437 -0
  192. package/dist/test/p2p-agent-harness-single.js +143 -0
  193. package/dist/test/p2p-ai-dialogue-test.js +318 -0
  194. package/dist/test/p2p-cid-connect-test.js +195 -0
  195. package/dist/test/p2p-connect-receiver.js +69 -0
  196. package/dist/test/p2p-doc-transfer.js +110 -0
  197. package/dist/test/p2p-identity-page-test.js +77 -0
  198. package/dist/test/p2p-iroh-test.js +171 -0
  199. package/dist/test/p2p-minimal-test.js +241 -0
  200. package/dist/test/p2p-node-1.js +148 -0
  201. package/dist/test/p2p-node-2.js +148 -0
  202. package/dist/test/p2p-server.js +281 -0
  203. package/dist/test/p2p-two-nodes-test.js +438 -0
  204. package/dist/test/pi-sdk.test.js +44 -0
  205. package/dist/test/set-persona.js +40 -0
  206. package/dist/test/simple.test.js +9 -0
  207. package/dist/test/storage-integration.test.js +150 -0
  208. package/dist/test/subagent-manager.test.js +276 -0
  209. package/dist/test/test-gate-flow.test.js +81 -0
  210. package/dist/test/workflow-engine.test.js +87 -0
  211. package/dist/test/workflow-pivot-loop.test.js +246 -0
  212. package/dist/web/api-config.html +520 -520
  213. package/dist/web/client.js +2917 -3791
  214. package/dist/web/components/p2p/index.js +234 -276
  215. package/dist/web/components/wallet-viem.mjs +118 -118
  216. package/dist/web/index.html +374 -373
  217. package/dist/web/manifest.json +20 -20
  218. package/dist/web/server.js +23 -775
  219. package/dist/web/style.css +4737 -4737
  220. package/dist/web/ui/message-renderer.js +373 -451
  221. package/dist/web/ui/step-timeline.js +255 -351
  222. package/package.json +160 -160
  223. package/scripts/build-cli.js +215 -215
  224. package/scripts/build-web.ts +125 -125
  225. package/scripts/postinstall.js +152 -152
  226. package/bin/bolloon-daemon.sh +0 -207
  227. package/bin/ipfs +0 -0
  228. package/dist/agents/chat-segmenter.js +0 -298
  229. package/dist/agents/judgment-protocol.js +0 -479
  230. package/dist/agents/parse-tool-call.js +0 -304
  231. package/dist/agents/peer-manifest-loader.js +0 -210
  232. package/dist/agents/react-loop.js +0 -120
  233. package/dist/agents/session-store.js +0 -171
  234. package/dist/agents/tool-registry.js +0 -136
  235. package/dist/bootstrap/chat-archiver.js +0 -276
  236. package/dist/bootstrap/memory-compressor.js +0 -170
  237. package/dist/bootstrap/persona-loader.js +0 -94
  238. package/dist/electron/config.js +0 -16
  239. package/dist/electron/config.js.map +0 -1
  240. package/dist/electron/dialogs.js +0 -71
  241. package/dist/electron/dialogs.js.map +0 -1
  242. package/dist/electron/first-run.js +0 -129
  243. package/dist/electron/first-run.js.map +0 -1
  244. package/dist/electron/ipc.js +0 -16
  245. package/dist/electron/ipc.js.map +0 -1
  246. package/dist/electron/logger.js +0 -77
  247. package/dist/electron/logger.js.map +0 -1
  248. package/dist/electron/main.js +0 -60
  249. package/dist/electron/main.js.map +0 -1
  250. package/dist/electron/menu.js +0 -140
  251. package/dist/electron/menu.js.map +0 -1
  252. package/dist/electron/paths.js +0 -33
  253. package/dist/electron/paths.js.map +0 -1
  254. package/dist/electron/server.js +0 -74
  255. package/dist/electron/server.js.map +0 -1
  256. package/dist/electron/tray.js +0 -73
  257. package/dist/electron/tray.js.map +0 -1
  258. package/dist/electron/window.js +0 -69
  259. package/dist/electron/window.js.map +0 -1
  260. package/dist/network/local-inbox-bus.js +0 -73
  261. package/dist/network/p2p-outbox.js +0 -161
  262. package/dist/network/peer-fs.js +0 -420
  263. package/dist/network/peer-resource-bridge.js +0 -216
  264. package/dist/web/components/p2p/P2PModal.js +0 -188
  265. package/dist/web/components/p2p/p2p-modal.js +0 -664
  266. package/dist/web/components/p2p/p2p-tools.js +0 -248
  267. package/dist/web/input-validator.js +0 -103
  268. package/dist/web/util/safe-name.js +0 -32
@@ -9,7 +9,6 @@ import * as os from 'os';
9
9
  import * as path from 'path';
10
10
  import { getCachedBolloonContext, clearBolloonContextCache } from './context-collector.js';
11
11
  import { formatContextForSystemPrompt } from './project-context.js';
12
- import { loadPersonaDocs, formatPersonaForSystemPrompt } from './persona-loader.js';
13
12
  let lastSessionStartAt = 0;
14
13
  const MIN_INTERVAL_MS = 5000; // 同一进程 5s 内最多触发一次, 防止循环
15
14
  export async function onSessionStart(opts = {}) {
@@ -26,23 +25,10 @@ export async function onSessionStart(opts = {}) {
26
25
  if (opts.channelId) {
27
26
  systemAddition = `# 当前 channel: ${opts.channelId}\n\n` + systemAddition;
28
27
  }
29
- // 在头部最前拼 persona 文档 (如果 agentId 存在)
30
- if (opts.agentId) {
31
- try {
32
- const docs = await loadPersonaDocs(opts.agentId);
33
- const personaText = formatPersonaForSystemPrompt(docs);
34
- if (personaText) {
35
- systemAddition = personaText + '\n\n' + systemAddition;
36
- }
37
- }
38
- catch (err) {
39
- console.warn('[lifecycle-hooks] loadPersonaDocs failed (silent):', err);
40
- }
41
- }
42
28
  return {
43
29
  systemAddition,
44
30
  collectMs: Date.now() - start,
45
- truncated: systemAddition.length > 0 && systemAddition.includes('截断'),
31
+ truncated: systemAddition.length > 0 && systemAddition.includes('截断模式'),
46
32
  };
47
33
  }
48
34
  catch (err) {
package/dist/cli-entry.js CHANGED
@@ -13,7 +13,6 @@
13
13
  import { spawn } from 'child_process';
14
14
  import * as path from 'path';
15
15
  import * as fs from 'fs';
16
- import { fileURLToPath } from 'url';
17
16
  const isWindows = process.platform === 'win32';
18
17
  // ANSI 颜色
19
18
  const RESET = '\x1b[0m';
@@ -28,50 +27,47 @@ function log(msg, color = RESET) {
28
27
  console.log(`${color}${msg}${RESET}`);
29
28
  }
30
29
  function printBanner() {
31
- console.log(`
32
- ${CYAN}${BOLD}
33
- ╔═══════════════════════════════════════════╗
34
- ║ 🤖 Bolloon Agent ${VERSION} ║
35
- ║ P2P AI Document Processor ║
36
- ╚═══════════════════════════════════════════╝${RESET}
30
+ console.log(`
31
+ ${CYAN}${BOLD}
32
+ ╔═══════════════════════════════════════════╗
33
+ ║ 🤖 Bolloon Agent ${VERSION} ║
34
+ ║ P2P AI Document Processor ║
35
+ ╚═══════════════════════════════════════════╝${RESET}
37
36
  `);
38
37
  }
39
38
  function printHelp() {
40
- console.log(`
41
- ${BOLD}用法:${RESET}
42
- bolloon [选项] [命令] [参数]
43
-
44
- ${BOLD}选项:${RESET}
45
- --gui, -g 启动图形界面 (Electron)
46
- --web, -w 启动 Web UI (浏览器)
47
- --cli, -c 启动命令行界面
48
- --version, -v 显示版本信息
49
- --help, -h 显示帮助信息
50
-
51
- ${BOLD}命令:${RESET}
52
- bolloon --read <file> 读取文档
53
- bolloon --summarize <file> 总结文档
54
- bolloon --improve <file> <req> 改进文档
55
-
56
- ${BOLD}示例:${RESET}
57
- bolloon # 启动图形界面
58
- bolloon --web # 启动 Web UI
59
- bolloon --read 想法.md # 读取文档
60
- bolloon --cli # 命令行模式
61
-
62
- ${BOLD}环境变量:${RESET}
63
- MINIMAX_API_KEY MiniMax API 密钥
64
- OPENAI_API_KEY OpenAI API 密钥
65
- ANTHROPIC_API_KEY Anthropic API 密钥
66
- PORT Web 服务端口 (默认 54188)
39
+ console.log(`
40
+ ${BOLD}用法:${RESET}
41
+ bolloon [选项] [命令] [参数]
42
+
43
+ ${BOLD}选项:${RESET}
44
+ --gui, -g 启动图形界面 (Electron)
45
+ --web, -w 启动 Web UI (浏览器)
46
+ --cli, -c 启动命令行界面
47
+ --version, -v 显示版本信息
48
+ --help, -h 显示帮助信息
49
+
50
+ ${BOLD}命令:${RESET}
51
+ bolloon --read <file> 读取文档
52
+ bolloon --summarize <file> 总结文档
53
+ bolloon --improve <file> <req> 改进文档
54
+
55
+ ${BOLD}示例:${RESET}
56
+ bolloon # 启动图形界面
57
+ bolloon --web # 启动 Web UI
58
+ bolloon --read 想法.md # 读取文档
59
+ bolloon --cli # 命令行模式
60
+
61
+ ${BOLD}环境变量:${RESET}
62
+ MINIMAX_API_KEY MiniMax API 密钥
63
+ OPENAI_API_KEY OpenAI API 密钥
64
+ ANTHROPIC_API_KEY Anthropic API 密钥
65
+ PORT Web 服务端口 (默认 54188)
67
66
  `);
68
67
  }
69
68
  function getDistDir() {
70
- // 2026-07-01: ESM 模块无 __dirname, import.meta.url + path.dirname 拿当前文件所在目录.
71
- // 对于打包后的应用, 这是 dist 目录; 对于 tsx 跑 src/index.ts 时, 是 src/ 目录
72
- // (后续 getMainScript 会优先用 dist/cli-entry.js, 不依赖这里的返回值)
73
- const __filename_esm = fileURLToPath(import.meta.url);
74
- return path.dirname(__filename_esm);
69
+ // 对于打包后的应用,__dirname dist 目录
70
+ return __dirname;
75
71
  }
76
72
  function getMainScript() {
77
73
  const distDir = getDistDir();
@@ -0,0 +1,9 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = path.dirname(__filename);
6
+ export function loadArchiveMetadata(packageName) {
7
+ const snapshotPath = path.join(__dirname, 'reference_data', 'subsystems', `${packageName}.json`);
8
+ return JSON.parse(fs.readFileSync(snapshotPath, 'utf-8'));
9
+ }
@@ -0,0 +1,48 @@
1
+ import { DeepThinkingEngine } from '../thinking/engine.js';
2
+ export class AgentCoordinator {
3
+ engine;
4
+ constructor(maxDepth = 3) {
5
+ this.engine = new DeepThinkingEngine(maxDepth);
6
+ }
7
+ async dispatch(prompt, parallelCount = 3) {
8
+ const tasks = this.splitTask(prompt, parallelCount);
9
+ const results = await Promise.all(tasks.map(task => this.executeTask(task)));
10
+ return this.aggregate(results);
11
+ }
12
+ splitTask(prompt, count) {
13
+ const words = prompt.split(/\s+/);
14
+ const chunkSize = Math.ceil(words.length / count);
15
+ const chunks = [];
16
+ for (let i = 0; i < count; i++) {
17
+ const chunk = words.slice(i * chunkSize, (i + 1) * chunkSize).join(' ');
18
+ if (chunk) {
19
+ chunks.push({
20
+ id: `task-${i}`,
21
+ description: chunk,
22
+ priority: i
23
+ });
24
+ }
25
+ }
26
+ return chunks;
27
+ }
28
+ async executeTask(task) {
29
+ try {
30
+ const thinkResult = await this.engine.think(task.description);
31
+ return {
32
+ taskId: task.id,
33
+ output: thinkResult.finalOutput,
34
+ success: true
35
+ };
36
+ }
37
+ catch (error) {
38
+ return {
39
+ taskId: task.id,
40
+ output: String(error),
41
+ success: false
42
+ };
43
+ }
44
+ }
45
+ aggregate(results) {
46
+ return results.sort((a, b) => a.taskId.localeCompare(b.taskId));
47
+ }
48
+ }
@@ -0,0 +1 @@
1
+ export { AgentCoordinator } from './coordinator.js';
@@ -0,0 +1,12 @@
1
+ import { loadArchiveMetadata } from '../_archive_helper.js';
2
+ const SNAPSHOT = loadArchiveMetadata('assistant');
3
+ export const ARCHIVE_NAME = SNAPSHOT['archive_name'];
4
+ export const MODULE_COUNT = SNAPSHOT['module_count'];
5
+ export const SAMPLE_FILES = SNAPSHOT['sample_files'];
6
+ export const PORTING_NOTE = `Python placeholder package for '${ARCHIVE_NAME}' with ${MODULE_COUNT} archived module references.`;
7
+ export default {
8
+ ARCHIVE_NAME,
9
+ MODULE_COUNT,
10
+ PORTING_NOTE,
11
+ SAMPLE_FILES,
12
+ };
@@ -0,0 +1,12 @@
1
+ import { loadArchiveMetadata } from '../_archive_helper.js';
2
+ const SNAPSHOT = loadArchiveMetadata('bootstrap');
3
+ export const ARCHIVE_NAME = SNAPSHOT['archive_name'];
4
+ export const MODULE_COUNT = SNAPSHOT['module_count'];
5
+ export const SAMPLE_FILES = SNAPSHOT['sample_files'];
6
+ export const PORTING_NOTE = `Python placeholder package for '${ARCHIVE_NAME}' with ${MODULE_COUNT} archived module references.`;
7
+ export default {
8
+ ARCHIVE_NAME,
9
+ MODULE_COUNT,
10
+ PORTING_NOTE,
11
+ SAMPLE_FILES,
12
+ };
@@ -0,0 +1,13 @@
1
+ export function buildBootstrapGraph() {
2
+ return {
3
+ stages: [
4
+ 'top-level prefetch side effects',
5
+ 'warning handler and environment guards',
6
+ 'CLI parser and pre-action trust gate',
7
+ 'setup() + commands/agents parallel load',
8
+ 'deferred init after trust',
9
+ 'mode routing: local / remote / ssh / teleport / direct-connect / deep-link',
10
+ 'query engine submit loop',
11
+ ],
12
+ };
13
+ }
@@ -0,0 +1,12 @@
1
+ import { loadArchiveMetadata } from '../_archive_helper.js';
2
+ const SNAPSHOT = loadArchiveMetadata('bridge');
3
+ export const ARCHIVE_NAME = SNAPSHOT['archive_name'];
4
+ export const MODULE_COUNT = SNAPSHOT['module_count'];
5
+ export const SAMPLE_FILES = SNAPSHOT['sample_files'];
6
+ export const PORTING_NOTE = `Python placeholder package for '${ARCHIVE_NAME}' with ${MODULE_COUNT} archived module references.`;
7
+ export default {
8
+ ARCHIVE_NAME,
9
+ MODULE_COUNT,
10
+ PORTING_NOTE,
11
+ SAMPLE_FILES,
12
+ };
@@ -0,0 +1,12 @@
1
+ import { loadArchiveMetadata } from '../_archive_helper.js';
2
+ const SNAPSHOT = loadArchiveMetadata('buddy');
3
+ export const ARCHIVE_NAME = SNAPSHOT['archive_name'];
4
+ export const MODULE_COUNT = SNAPSHOT['module_count'];
5
+ export const SAMPLE_FILES = SNAPSHOT['sample_files'];
6
+ export const PORTING_NOTE = `Python placeholder package for '${ARCHIVE_NAME}' with ${MODULE_COUNT} archived module references.`;
7
+ export default {
8
+ ARCHIVE_NAME,
9
+ MODULE_COUNT,
10
+ PORTING_NOTE,
11
+ SAMPLE_FILES,
12
+ };
@@ -0,0 +1,12 @@
1
+ import { loadArchiveMetadata } from '../_archive_helper.js';
2
+ const SNAPSHOT = loadArchiveMetadata('cli');
3
+ export const ARCHIVE_NAME = SNAPSHOT['archive_name'];
4
+ export const MODULE_COUNT = SNAPSHOT['module_count'];
5
+ export const SAMPLE_FILES = SNAPSHOT['sample_files'];
6
+ export const PORTING_NOTE = `Python placeholder package for '${ARCHIVE_NAME}' with ${MODULE_COUNT} archived module references.`;
7
+ export default {
8
+ ARCHIVE_NAME,
9
+ MODULE_COUNT,
10
+ PORTING_NOTE,
11
+ SAMPLE_FILES,
12
+ };
@@ -0,0 +1,10 @@
1
+ import { getCommands } from './commands.js';
2
+ export function buildCommandGraph() {
3
+ const commands = getCommands();
4
+ return {
5
+ builtins: commands.filter(m => !m.sourceHint.toLowerCase().includes('plugin') &&
6
+ !m.sourceHint.toLowerCase().includes('skills')),
7
+ pluginLike: commands.filter(m => m.sourceHint.toLowerCase().includes('plugin')),
8
+ skillLike: commands.filter(m => m.sourceHint.toLowerCase().includes('skills')),
9
+ };
10
+ }
@@ -0,0 +1,60 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = path.dirname(__filename);
6
+ const SNAPSHOT_PATH = path.join(__dirname, 'reference_data', 'commands_snapshot.json');
7
+ function loadCommandSnapshot() {
8
+ try {
9
+ if (!fs.existsSync(SNAPSHOT_PATH)) {
10
+ console.warn(`[commands] Snapshot not found: ${SNAPSHOT_PATH}, using empty list`);
11
+ return [];
12
+ }
13
+ const raw = JSON.parse(fs.readFileSync(SNAPSHOT_PATH, 'utf-8'));
14
+ return raw.map((e) => ({
15
+ name: e.name,
16
+ responsibility: e.responsibility,
17
+ sourceHint: e.source_hint,
18
+ status: 'mirrored',
19
+ }));
20
+ }
21
+ catch (error) {
22
+ console.warn(`[commands] Failed to load snapshot: ${error}, using empty list`);
23
+ return [];
24
+ }
25
+ }
26
+ export const PORTED_COMMANDS = loadCommandSnapshot();
27
+ export function builtInCommandNames() {
28
+ return new Set(PORTED_COMMANDS.map(m => m.name));
29
+ }
30
+ export function getCommand(name) {
31
+ const needle = name.toLowerCase();
32
+ return PORTED_COMMANDS.find(m => m.name.toLowerCase() === needle);
33
+ }
34
+ export function getCommands(includePluginCommands = true, includeSkillCommands = true) {
35
+ let commands = [...PORTED_COMMANDS];
36
+ if (!includePluginCommands) {
37
+ commands = commands.filter(m => !m.sourceHint.toLowerCase().includes('plugin'));
38
+ }
39
+ if (!includeSkillCommands) {
40
+ commands = commands.filter(m => !m.sourceHint.toLowerCase().includes('skills'));
41
+ }
42
+ return commands;
43
+ }
44
+ export function findCommands(query, limit = 20) {
45
+ const needle = query.toLowerCase();
46
+ return PORTED_COMMANDS.filter(m => m.name.toLowerCase().includes(needle) || m.sourceHint.toLowerCase().includes(needle)).slice(0, limit);
47
+ }
48
+ export function executeCommand(name, prompt = '') {
49
+ const module = getCommand(name);
50
+ if (!module) {
51
+ return { name, sourceHint: '', prompt, handled: false, message: `Unknown mirrored command: ${name}` };
52
+ }
53
+ return {
54
+ name: module.name,
55
+ sourceHint: module.sourceHint,
56
+ prompt,
57
+ handled: true,
58
+ message: `Mirrored command '${module.name}' from ${module.sourceHint} would handle prompt.`,
59
+ };
60
+ }
@@ -0,0 +1,12 @@
1
+ import { loadArchiveMetadata } from '../_archive_helper.js';
2
+ const SNAPSHOT = loadArchiveMetadata('components');
3
+ export const ARCHIVE_NAME = SNAPSHOT['archive_name'];
4
+ export const MODULE_COUNT = SNAPSHOT['module_count'];
5
+ export const SAMPLE_FILES = SNAPSHOT['sample_files'];
6
+ export const PORTING_NOTE = `Python placeholder package for '${ARCHIVE_NAME}' with ${MODULE_COUNT} archived module references.`;
7
+ export default {
8
+ ARCHIVE_NAME,
9
+ MODULE_COUNT,
10
+ PORTING_NOTE,
11
+ SAMPLE_FILES,
12
+ };
@@ -0,0 +1,12 @@
1
+ import { loadArchiveMetadata } from '../_archive_helper.js';
2
+ const SNAPSHOT = loadArchiveMetadata('constants');
3
+ export const ARCHIVE_NAME = SNAPSHOT['archive_name'];
4
+ export const MODULE_COUNT = SNAPSHOT['module_count'];
5
+ export const SAMPLE_FILES = SNAPSHOT['sample_files'];
6
+ export const PORTING_NOTE = `Python placeholder package for '${ARCHIVE_NAME}' with ${MODULE_COUNT} archived module references.`;
7
+ export default {
8
+ ARCHIVE_NAME,
9
+ MODULE_COUNT,
10
+ PORTING_NOTE,
11
+ SAMPLE_FILES,
12
+ };
@@ -0,0 +1,22 @@
1
+ export class BudgetTracker {
2
+ maxBudgetTokens;
3
+ maxTurns;
4
+ compactAfterTurns;
5
+ constructor(maxBudgetTokens = 2000, maxTurns = 8, compactAfterTurns = 12) {
6
+ this.maxBudgetTokens = maxBudgetTokens;
7
+ this.maxTurns = maxTurns;
8
+ this.compactAfterTurns = compactAfterTurns;
9
+ }
10
+ addTurn(inputTokens, outputTokens) {
11
+ return { inputTokens, outputTokens };
12
+ }
13
+ isBudgetExceeded(usage) {
14
+ return usage.inputTokens + usage.outputTokens > this.maxBudgetTokens;
15
+ }
16
+ isTurnLimitExceeded(currentTurns) {
17
+ return currentTurns >= this.maxTurns;
18
+ }
19
+ shouldCompact(turnCount) {
20
+ return turnCount > this.compactAfterTurns;
21
+ }
22
+ }
@@ -0,0 +1,2 @@
1
+ export { ToolPermissionContext } from './permission.js';
2
+ export { BudgetTracker } from './budget.js';
@@ -0,0 +1,20 @@
1
+ export class ToolPermissionContext {
2
+ denyTools;
3
+ denyPrefixes;
4
+ constructor(denyTools, denyPrefixes) {
5
+ this.denyTools = denyTools;
6
+ this.denyPrefixes = denyPrefixes;
7
+ }
8
+ static fromIterables(denyTools = [], denyPrefixes = []) {
9
+ return new ToolPermissionContext(new Set(denyTools.map(t => t.toLowerCase())), denyPrefixes);
10
+ }
11
+ blocks(name) {
12
+ const lower = name.toLowerCase();
13
+ if (this.denyTools.has(lower))
14
+ return true;
15
+ return this.denyPrefixes.some(p => lower.startsWith(p.toLowerCase()));
16
+ }
17
+ createDenial(toolName, reason) {
18
+ return { toolName, reason };
19
+ }
20
+ }
@@ -0,0 +1,30 @@
1
+ import * as path from 'path';
2
+ import { fileURLToPath } from 'url';
3
+ const __filename = fileURLToPath(import.meta.url);
4
+ const __dirname = path.dirname(__filename);
5
+ export function buildPortContext(base) {
6
+ const root = base || __dirname;
7
+ const srcRoot = path.join(root, 'src');
8
+ const testsRoot = path.join(root, 'tests');
9
+ const assetsRoot = path.join(root, 'assets');
10
+ const archiveRoot = path.join(root, 'archive');
11
+ return {
12
+ sourceRoot: srcRoot,
13
+ testsRoot: testsRoot,
14
+ assetsRoot: assetsRoot,
15
+ archiveRoot: archiveRoot,
16
+ pythonFileCount: 0,
17
+ testFileCount: 0,
18
+ assetFileCount: 0,
19
+ archiveAvailable: false,
20
+ };
21
+ }
22
+ export function renderContext(context) {
23
+ return [
24
+ `Source root: ${context.sourceRoot}`,
25
+ `Test root: ${context.testsRoot}`,
26
+ `Assets root: ${context.assetsRoot}`,
27
+ `Archive root: ${context.archiveRoot}`,
28
+ `Archive available: ${context.archiveAvailable}`,
29
+ ].join('\n');
30
+ }
@@ -0,0 +1,12 @@
1
+ import { loadArchiveMetadata } from '../_archive_helper.js';
2
+ const SNAPSHOT = loadArchiveMetadata('coordinator');
3
+ export const ARCHIVE_NAME = SNAPSHOT['archive_name'];
4
+ export const MODULE_COUNT = SNAPSHOT['module_count'];
5
+ export const SAMPLE_FILES = SNAPSHOT['sample_files'];
6
+ export const PORTING_NOTE = `Python placeholder package for '${ARCHIVE_NAME}' with ${MODULE_COUNT} archived module references.`;
7
+ export default {
8
+ ARCHIVE_NAME,
9
+ MODULE_COUNT,
10
+ PORTING_NOTE,
11
+ SAMPLE_FILES,
12
+ };
@@ -0,0 +1,4 @@
1
+ export function applyCostHook(tracker, label, units) {
2
+ tracker.record(label, units);
3
+ return tracker;
4
+ }
@@ -0,0 +1,8 @@
1
+ export class CostTracker {
2
+ totalUnits = 0;
3
+ events = [];
4
+ record(label, units) {
5
+ this.totalUnits += units;
6
+ this.events.push(`${label}:${units}`);
7
+ }
8
+ }
@@ -0,0 +1,10 @@
1
+ export function runDeferredInit(trusted) {
2
+ const enabled = Boolean(trusted);
3
+ return {
4
+ trusted,
5
+ pluginInit: enabled,
6
+ skillInit: enabled,
7
+ mcpPrefetch: enabled,
8
+ sessionHooks: enabled,
9
+ };
10
+ }
@@ -0,0 +1,6 @@
1
+ export function runDirectConnect(target) {
2
+ return { mode: 'direct-connect', target, active: true };
3
+ }
4
+ export function runDeepLink(target) {
5
+ return { mode: 'deep-link', target, active: true };
6
+ }
@@ -0,0 +1,85 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = path.dirname(__filename);
6
+ function resolveToolPath(sourceHint) {
7
+ return path.join(__dirname, sourceHint);
8
+ }
9
+ function inferFunctionName(sourceHint) {
10
+ const basename = path.basename(sourceHint, path.extname(sourceHint));
11
+ const nameMap = {
12
+ listMarkets: 'listMarkets',
13
+ getMarket: 'getMarket',
14
+ createOrder: 'createOrder',
15
+ cancelOrder: 'cancelOrder',
16
+ getOrders: 'getOrders',
17
+ createTransaction: 'createTransaction',
18
+ proposeTransaction: 'proposeTransaction',
19
+ confirmTransaction: 'confirmTransaction',
20
+ executeTransaction: 'executeTransaction',
21
+ getPendingTransactions: 'getPendingTransactions',
22
+ getBalance: 'getBalance',
23
+ deploySafe: 'deploySafe',
24
+ runCommand: 'runCommand',
25
+ listAdapters: 'listAdapters',
26
+ execAdapter: 'execAdapter',
27
+ };
28
+ return nameMap[basename] || basename;
29
+ }
30
+ export async function executeToolFromSnapshot(sourceHint, params) {
31
+ try {
32
+ const fullPath = resolveToolPath(sourceHint);
33
+ if (!fs.existsSync(fullPath)) {
34
+ return {
35
+ success: false,
36
+ error: `Tool file not found: ${fullPath}`,
37
+ };
38
+ }
39
+ const module = await import(`file://${fullPath}?t=${Date.now()}`);
40
+ const functionName = inferFunctionName(sourceHint);
41
+ if (typeof module[functionName] !== 'function') {
42
+ return {
43
+ success: false,
44
+ error: `Function '${functionName}' not found in ${sourceHint}`,
45
+ };
46
+ }
47
+ const result = await module[functionName](params);
48
+ return {
49
+ success: true,
50
+ data: result,
51
+ };
52
+ }
53
+ catch (error) {
54
+ return {
55
+ success: false,
56
+ error: error instanceof Error ? error.message : String(error),
57
+ };
58
+ }
59
+ }
60
+ export class DynamicToolExecutor {
61
+ async loadAndExecute(modulePath, functionName, params) {
62
+ try {
63
+ const fullPath = resolveToolPath(modulePath);
64
+ if (!fs.existsSync(fullPath)) {
65
+ return { success: false, error: `Module not found: ${fullPath}` };
66
+ }
67
+ const module = await import(`file://${fullPath}?t=${Date.now()}`);
68
+ if (typeof module[functionName] !== 'function') {
69
+ return {
70
+ success: false,
71
+ error: `Function '${functionName}' not exported from ${modulePath}`,
72
+ };
73
+ }
74
+ const result = await module[functionName](params);
75
+ return { success: true, data: result };
76
+ }
77
+ catch (error) {
78
+ return {
79
+ success: false,
80
+ error: error instanceof Error ? error.message : String(error),
81
+ };
82
+ }
83
+ }
84
+ }
85
+ export const defaultExecutor = new DynamicToolExecutor();
@@ -0,0 +1,12 @@
1
+ import { loadArchiveMetadata } from '../_archive_helper.js';
2
+ const SNAPSHOT = loadArchiveMetadata('entrypoints');
3
+ export const ARCHIVE_NAME = SNAPSHOT['archive_name'];
4
+ export const MODULE_COUNT = SNAPSHOT['module_count'];
5
+ export const SAMPLE_FILES = SNAPSHOT['sample_files'];
6
+ export const PORTING_NOTE = `Python placeholder package for '${ARCHIVE_NAME}' with ${MODULE_COUNT} archived module references.`;
7
+ export default {
8
+ ARCHIVE_NAME,
9
+ MODULE_COUNT,
10
+ PORTING_NOTE,
11
+ SAMPLE_FILES,
12
+ };
@@ -0,0 +1,44 @@
1
+ import { PORTED_COMMANDS, executeCommand } from './commands.js';
2
+ import { PORTED_TOOLS, executeTool } from './tools.js';
3
+ export class MirroredCommand {
4
+ name;
5
+ sourceHint;
6
+ constructor(name, sourceHint) {
7
+ this.name = name;
8
+ this.sourceHint = sourceHint;
9
+ }
10
+ execute(prompt) {
11
+ return executeCommand(this.name, prompt).message;
12
+ }
13
+ }
14
+ export class MirroredTool {
15
+ name;
16
+ sourceHint;
17
+ constructor(name, sourceHint) {
18
+ this.name = name;
19
+ this.sourceHint = sourceHint;
20
+ }
21
+ async execute(payload) {
22
+ const result = await executeTool(this.name, payload);
23
+ return result.message;
24
+ }
25
+ }
26
+ export class ExecutionRegistry {
27
+ commands;
28
+ tools;
29
+ constructor(commands, tools) {
30
+ this.commands = commands;
31
+ this.tools = tools;
32
+ }
33
+ command(name) {
34
+ const lowered = name.toLowerCase();
35
+ return this.commands.find(c => c.name.toLowerCase() === lowered);
36
+ }
37
+ tool(name) {
38
+ const lowered = name.toLowerCase();
39
+ return this.tools.find(t => t.name.toLowerCase() === lowered);
40
+ }
41
+ }
42
+ export function buildExecutionRegistry() {
43
+ return new ExecutionRegistry(PORTED_COMMANDS.map(m => new MirroredCommand(m.name, m.sourceHint)), PORTED_TOOLS.map(m => new MirroredTool(m.name, m.sourceHint)));
44
+ }
@@ -0,0 +1,9 @@
1
+ export class HistoryLog {
2
+ events = [];
3
+ add(title, detail) {
4
+ this.events.push({ title, detail });
5
+ }
6
+ asMarkdown() {
7
+ return ['# Session History', '', ...this.events.map(e => `- ${e.title}: ${e.detail}`)].join('\n');
8
+ }
9
+ }