@bolloon/bolloon-agent 0.1.35 → 0.1.37

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 (502) hide show
  1. package/README.md +1 -1
  2. package/dist/agents/p2p-chat-tools.js +6 -6
  3. package/dist/agents/permission-mode.js +115 -0
  4. package/dist/agents/pi-sdk.js +435 -25
  5. package/dist/agents/pre-tool-validator.js +194 -0
  6. package/dist/agents/workflow-pivot-loop.js +113 -12
  7. package/dist/bollharness-integration/context-router.js +2 -2
  8. package/dist/bollharness-integration/guard-checker.js +1 -1
  9. package/dist/bootstrap/bootstrap.js +3 -0
  10. package/dist/bootstrap/context-collector.js +17 -1
  11. package/dist/bootstrap/context-hierarchy.js +218 -0
  12. package/dist/bootstrap/lifecycle-hooks.js +86 -24
  13. package/dist/bootstrap/project-context.js +10 -3
  14. package/dist/context-compaction/auto-compact.js +144 -0
  15. package/dist/context-compaction/budget-gate.js +28 -0
  16. package/dist/context-compaction/budget-reduce.js +35 -0
  17. package/dist/context-compaction/context-collapse.js +66 -0
  18. package/dist/context-compaction/index.js +21 -0
  19. package/dist/context-compaction/microcompact.js +51 -0
  20. package/dist/context-compaction/pipeline.js +123 -0
  21. package/dist/context-compaction/snip.js +45 -0
  22. package/dist/context-compaction/token-estimator.js +35 -0
  23. package/dist/context-compaction/types.js +19 -0
  24. package/dist/heartbeat/HealthMonitor.js +3 -2
  25. package/dist/index.js +38 -2
  26. package/dist/llm/llm-judgment-client.js +32 -30
  27. package/dist/llm/pi-ai.js +103 -16
  28. package/dist/llm/system-prompt/health.js +129 -0
  29. package/dist/llm/system-prompt/registry.js +246 -0
  30. package/dist/llm/system-prompt/strip-hibsml.js +51 -0
  31. package/dist/llm/tool-manifest/ask_user_input.js +35 -0
  32. package/dist/llm/tool-manifest/bash.js +23 -0
  33. package/dist/llm/tool-manifest/create_file.js +24 -0
  34. package/dist/llm/tool-manifest/fetch_sports_data.js +26 -0
  35. package/dist/llm/tool-manifest/image_search.js +24 -0
  36. package/dist/llm/tool-manifest/index.js +69 -0
  37. package/dist/llm/tool-manifest/mcp.js +43 -0
  38. package/dist/llm/tool-manifest/message_compose.js +31 -0
  39. package/dist/llm/tool-manifest/places.js +83 -0
  40. package/dist/llm/tool-manifest/present_files.js +21 -0
  41. package/dist/llm/tool-manifest/recipe.js +40 -0
  42. package/dist/llm/tool-manifest/recommend_apps.js +23 -0
  43. package/dist/llm/tool-manifest/str_replace.js +27 -0
  44. package/dist/llm/tool-manifest/types.js +7 -0
  45. package/dist/llm/tool-manifest/view.js +24 -0
  46. package/dist/llm/tool-manifest/weather.js +27 -0
  47. package/dist/llm/tool-manifest/web.js +51 -0
  48. package/dist/network/p2p-direct.js +23 -0
  49. package/dist/network/source-intent-broadcaster.js +203 -0
  50. package/dist/network/source-intent.js +100 -0
  51. package/dist/pi-ecosystem-judgment/adaptive-scan.js +48 -0
  52. package/dist/pi-ecosystem-judgment/injection-gate.js +54 -12
  53. package/dist/pi-ecosystem-judgment/value-injection.js +8 -2
  54. package/dist/security/context-router-tool.js +1 -1
  55. package/dist/security/input-scanner.js +223 -0
  56. package/dist/web/client.js +3089 -4458
  57. package/dist/web/index.html +58 -67
  58. package/dist/web/server.js +299 -117
  59. package/dist/web/style.css +531 -249
  60. package/dist/web/ui/message-renderer.js +352 -0
  61. package/dist/web/ui/step-timeline.js +279 -0
  62. package/package.json +2 -2
  63. package/.auto-evolve-calls +0 -1
  64. package/.last-auto-evolve-baseline +0 -1
  65. package/Bolloon.md +0 -103
  66. package/dist/agents/constraint-layer.js.map +0 -1
  67. package/dist/agents/pi-sdk.js.map +0 -1
  68. package/dist/agents/workflow-engine.js.map +0 -1
  69. package/dist/bollharness/src/index.js +0 -5
  70. package/dist/bollharness/src/scripts/checks/check_adr_plan_numbering.js +0 -6
  71. package/dist/bollharness/src/scripts/checks/check_api_types.js +0 -45
  72. package/dist/bollharness/src/scripts/checks/check_artifact_link.js +0 -146
  73. package/dist/bollharness/src/scripts/checks/check_bridge_deps.js +0 -6
  74. package/dist/bollharness/src/scripts/checks/check_bugfix_binding.js +0 -6
  75. package/dist/bollharness/src/scripts/checks/check_bugfix_binding_ci.js +0 -6
  76. package/dist/bollharness/src/scripts/checks/check_doc_file_references.js +0 -6
  77. package/dist/bollharness/src/scripts/checks/check_doc_freshness.js +0 -135
  78. package/dist/bollharness/src/scripts/checks/check_doc_links.js +0 -31
  79. package/dist/bollharness/src/scripts/checks/check_file_existence_claims.js +0 -6
  80. package/dist/bollharness/src/scripts/checks/check_fragment_integrity.js +0 -34
  81. package/dist/bollharness/src/scripts/checks/check_hook_installed.js +0 -63
  82. package/dist/bollharness/src/scripts/checks/check_issue_closure.js +0 -41
  83. package/dist/bollharness/src/scripts/checks/check_mcp_parity.js +0 -6
  84. package/dist/bollharness/src/scripts/checks/check_security.js +0 -48
  85. package/dist/bollharness/src/scripts/checks/check_skill_parity.js +0 -6
  86. package/dist/bollharness/src/scripts/checks/check_versions.js +0 -6
  87. package/dist/bollharness/src/scripts/checks/finding.js +0 -13
  88. package/dist/bollharness/src/scripts/checks/next_decision_number.js +0 -20
  89. package/dist/bollharness/src/scripts/checks/regenerate_magic_docs.js +0 -6
  90. package/dist/bollharness/src/scripts/ci/detect_rebaseline_triggers.js +0 -8
  91. package/dist/bollharness/src/scripts/ci/scan_subprocess_cfg.js +0 -8
  92. package/dist/bollharness/src/scripts/ci/scan_verify_artifacts.js +0 -8
  93. package/dist/bollharness/src/scripts/ci/scan_yaml_schema.js +0 -8
  94. package/dist/bollharness/src/scripts/context_router.js +0 -67
  95. package/dist/bollharness/src/scripts/deploy-guard.js +0 -157
  96. package/dist/bollharness/src/scripts/guard-feedback.js +0 -192
  97. package/dist/bollharness/src/scripts/guard_router.js +0 -158
  98. package/dist/bollharness/src/scripts/hooks/_hook_output.js +0 -6
  99. package/dist/bollharness/src/scripts/hooks/auto-python3.js +0 -6
  100. package/dist/bollharness/src/scripts/hooks/deploy-progress-on-session-end.js +0 -6
  101. package/dist/bollharness/src/scripts/hooks/failure-analyzer.js +0 -6
  102. package/dist/bollharness/src/scripts/hooks/gate-judgment-inject.js +0 -92
  103. package/dist/bollharness/src/scripts/hooks/gate-transition-judgment.js +0 -63
  104. package/dist/bollharness/src/scripts/hooks/inbox-ack.js +0 -6
  105. package/dist/bollharness/src/scripts/hooks/inbox-inject-on-start.js +0 -6
  106. package/dist/bollharness/src/scripts/hooks/inbox-validate.js +0 -6
  107. package/dist/bollharness/src/scripts/hooks/inbox-write-ledger.js +0 -6
  108. package/dist/bollharness/src/scripts/hooks/initializer-agent.js +0 -6
  109. package/dist/bollharness/src/scripts/hooks/loop-detection.js +0 -73
  110. package/dist/bollharness/src/scripts/hooks/owner-guard.js +0 -6
  111. package/dist/bollharness/src/scripts/hooks/precompact.js +0 -6
  112. package/dist/bollharness/src/scripts/hooks/review-agent-gatekeeper.js +0 -6
  113. package/dist/bollharness/src/scripts/hooks/risk-tracker.js +0 -108
  114. package/dist/bollharness/src/scripts/hooks/sanitize-on-read.js +0 -6
  115. package/dist/bollharness/src/scripts/hooks/session-reflection.js +0 -7
  116. package/dist/bollharness/src/scripts/hooks/session-start-magic-docs.js +0 -7
  117. package/dist/bollharness/src/scripts/hooks/session-start-reset-risk.js +0 -7
  118. package/dist/bollharness/src/scripts/hooks/session-start-toolkit-reminder.js +0 -7
  119. package/dist/bollharness/src/scripts/hooks/stop-evaluator.js +0 -157
  120. package/dist/bollharness/src/scripts/hooks/tool-call-counter.js +0 -6
  121. package/dist/bollharness/src/scripts/hooks/trace-analyzer.js +0 -10
  122. package/dist/bollharness/src/scripts/install/install-trust-token.js +0 -7
  123. package/dist/bollharness/src/scripts/install/multi_project_registry.js +0 -9
  124. package/dist/bollharness/src/scripts/install/phase2_auto.js +0 -21
  125. package/dist/bollharness/src/scripts/install/pre_commit_installer.js +0 -6
  126. package/dist/bollharness/src/scripts/install/tier_selector.js +0 -7
  127. package/dist/bollharness/src/scripts/install/transcript_miner.js +0 -7
  128. package/dist/bollharness/src/scripts/lib/claim_patterns.js +0 -10
  129. package/dist/bollharness/src/scripts/lib/sanitize_patterns.js +0 -12
  130. package/dist/bollharness/src/scripts/sanitize.js +0 -6
  131. package/dist/bollharness-integration/context-router-judgment.js.map +0 -1
  132. package/dist/bollharness-integration/context-router.js.map +0 -1
  133. package/dist/bollharness-integration/gate-state-machine.js.map +0 -1
  134. package/dist/bollharness-integration/gate-transition-hooks.js.map +0 -1
  135. package/dist/bollharness-integration/guard-checker.js.map +0 -1
  136. package/dist/bollharness-integration/index.js.map +0 -1
  137. package/dist/bollharness-integration/integration.js.map +0 -1
  138. package/dist/bollharness-integration/llm/pi-ai.d.ts +0 -60
  139. package/dist/bollharness-integration/pi-ecosystem-colony/index.d.ts +0 -153
  140. package/dist/bollharness-integration/pi-ecosystem-goals/index.d.ts +0 -136
  141. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.d.ts +0 -117
  142. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.d.ts +0 -78
  143. package/dist/bollharness-integration/pi-ecosystem-judgment/index.d.ts +0 -139
  144. package/dist/bollharness-integration/pi-ecosystem-mcp/index.d.ts +0 -127
  145. package/dist/bollharness-integration/pi-ecosystem-subagents/index.d.ts +0 -95
  146. package/dist/bollharness-integration/skill-adapter.js.map +0 -1
  147. package/dist/constraint-runtime/src/_archive_helper.js +0 -9
  148. package/dist/constraint-runtime/src/agent/coordinator.js +0 -48
  149. package/dist/constraint-runtime/src/agent/index.js +0 -1
  150. package/dist/constraint-runtime/src/assistant/index.js +0 -12
  151. package/dist/constraint-runtime/src/bootstrap/index.js +0 -12
  152. package/dist/constraint-runtime/src/bootstrap_graph.js +0 -13
  153. package/dist/constraint-runtime/src/bridge/index.js +0 -12
  154. package/dist/constraint-runtime/src/buddy/index.js +0 -12
  155. package/dist/constraint-runtime/src/cli/index.js +0 -12
  156. package/dist/constraint-runtime/src/command_graph.js +0 -10
  157. package/dist/constraint-runtime/src/commands.js +0 -60
  158. package/dist/constraint-runtime/src/components/index.js +0 -12
  159. package/dist/constraint-runtime/src/constants/index.js +0 -12
  160. package/dist/constraint-runtime/src/constraint/budget.js +0 -22
  161. package/dist/constraint-runtime/src/constraint/budget.js.map +0 -1
  162. package/dist/constraint-runtime/src/constraint/index.js +0 -2
  163. package/dist/constraint-runtime/src/constraint/permission.js +0 -20
  164. package/dist/constraint-runtime/src/constraint/permission.js.map +0 -1
  165. package/dist/constraint-runtime/src/context.js +0 -30
  166. package/dist/constraint-runtime/src/coordinator/index.js +0 -12
  167. package/dist/constraint-runtime/src/cost_hook.js +0 -4
  168. package/dist/constraint-runtime/src/cost_tracker.js +0 -8
  169. package/dist/constraint-runtime/src/deferred_init.js +0 -10
  170. package/dist/constraint-runtime/src/direct_modes.js +0 -6
  171. package/dist/constraint-runtime/src/dynamic-tool-loader.js +0 -85
  172. package/dist/constraint-runtime/src/entrypoints/index.js +0 -12
  173. package/dist/constraint-runtime/src/execution_registry.js +0 -44
  174. package/dist/constraint-runtime/src/history.js +0 -9
  175. package/dist/constraint-runtime/src/hooks/index.js +0 -12
  176. package/dist/constraint-runtime/src/index.js +0 -26
  177. package/dist/constraint-runtime/src/ink.js +0 -4
  178. package/dist/constraint-runtime/src/keybindings/index.js +0 -12
  179. package/dist/constraint-runtime/src/memdir/index.js +0 -12
  180. package/dist/constraint-runtime/src/migrations/index.js +0 -12
  181. package/dist/constraint-runtime/src/models.js +0 -1
  182. package/dist/constraint-runtime/src/models.js.map +0 -1
  183. package/dist/constraint-runtime/src/moreright/index.js +0 -12
  184. package/dist/constraint-runtime/src/native_ts/index.js +0 -12
  185. package/dist/constraint-runtime/src/output_styles/index.js +0 -12
  186. package/dist/constraint-runtime/src/parity_audit.js +0 -12
  187. package/dist/constraint-runtime/src/plugins/index.js +0 -12
  188. package/dist/constraint-runtime/src/port_manifest.js +0 -11
  189. package/dist/constraint-runtime/src/prefetch.js +0 -9
  190. package/dist/constraint-runtime/src/query.js +0 -1
  191. package/dist/constraint-runtime/src/remote/index.js +0 -12
  192. package/dist/constraint-runtime/src/remote_runtime.js +0 -9
  193. package/dist/constraint-runtime/src/runtime/index.js +0 -1
  194. package/dist/constraint-runtime/src/runtime/session.js +0 -35
  195. package/dist/constraint-runtime/src/schemas/index.js +0 -12
  196. package/dist/constraint-runtime/src/screens/index.js +0 -12
  197. package/dist/constraint-runtime/src/server/index.js +0 -12
  198. package/dist/constraint-runtime/src/services/index.js +0 -12
  199. package/dist/constraint-runtime/src/session_store.js +0 -22
  200. package/dist/constraint-runtime/src/setup.js +0 -30
  201. package/dist/constraint-runtime/src/skills/index.js +0 -1
  202. package/dist/constraint-runtime/src/skills/skill-registry.js +0 -28
  203. package/dist/constraint-runtime/src/state/index.js +0 -12
  204. package/dist/constraint-runtime/src/system_init.js +0 -20
  205. package/dist/constraint-runtime/src/thinking/engine.js +0 -42
  206. package/dist/constraint-runtime/src/thinking/index.js +0 -1
  207. package/dist/constraint-runtime/src/tool_pool.js +0 -8
  208. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +0 -7
  209. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +0 -7
  210. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +0 -7
  211. package/dist/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +0 -6
  212. package/dist/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +0 -6
  213. package/dist/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +0 -5
  214. package/dist/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +0 -6
  215. package/dist/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +0 -4
  216. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +0 -6
  217. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +0 -8
  218. package/dist/constraint-runtime/src/tools/SafeSDK/deploySafe.js +0 -6
  219. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +0 -6
  220. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +0 -6
  221. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +0 -6
  222. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +0 -6
  223. package/dist/constraint-runtime/src/tools/WalletTools/autoPay.js +0 -29
  224. package/dist/constraint-runtime/src/tools/WalletTools/createWallet.js +0 -10
  225. package/dist/constraint-runtime/src/tools/WalletTools/getBalance.js +0 -13
  226. package/dist/constraint-runtime/src/tools/WalletTools/importWallet.js +0 -22
  227. package/dist/constraint-runtime/src/tools/WalletTools/sendTransaction.js +0 -25
  228. package/dist/constraint-runtime/src/tools/WalletTools/signMessage.js +0 -10
  229. package/dist/constraint-runtime/src/tools/WalletTools/transferToken.js +0 -25
  230. package/dist/constraint-runtime/src/tools.js +0 -80
  231. package/dist/constraint-runtime/src/transcript.js +0 -19
  232. package/dist/constraint-runtime/src/types/index.js +0 -12
  233. package/dist/constraint-runtime/src/upstream_proxy/index.js +0 -12
  234. package/dist/constraint-runtime/src/utils/index.js +0 -12
  235. package/dist/constraint-runtime/src/vim/index.js +0 -12
  236. package/dist/constraint-runtime/src/voice/index.js +0 -12
  237. package/dist/constraints/index.js.map +0 -1
  238. package/dist/documents/reader.js.map +0 -1
  239. package/dist/llm/config-store.js.map +0 -1
  240. package/dist/llm/pi-ai.js.map +0 -1
  241. package/dist/network/agent-network.js.map +0 -1
  242. package/dist/network/iroh-integration.js.map +0 -1
  243. package/dist/network/iroh-transport.js.map +0 -1
  244. package/dist/network/p2p.js.map +0 -1
  245. package/dist/network/storage/adapters/json-adapter.js.map +0 -1
  246. package/dist/pi-ecosystem-colony/index.js.map +0 -1
  247. package/dist/pi-ecosystem-goals/index.js.map +0 -1
  248. package/dist/pi-ecosystem-judgment/decision.js.map +0 -1
  249. package/dist/pi-ecosystem-judgment/distillation.js.map +0 -1
  250. package/dist/pi-ecosystem-judgment/human-value-store.js.map +0 -1
  251. package/dist/pi-ecosystem-judgment/index.js.map +0 -1
  252. package/dist/pi-ecosystem-judgment/value-injection.js.map +0 -1
  253. package/dist/pi-ecosystem-mcp/index.js.map +0 -1
  254. package/dist/pi-ecosystem-subagents/index.js.map +0 -1
  255. package/dist/social/ant-colony/AdaptiveHeartbeat.js.map +0 -1
  256. package/dist/social/ant-colony/PheromoneEngine.js.map +0 -1
  257. package/dist/social/ant-colony/types.js.map +0 -1
  258. package/dist/social/channels/ChannelManager.js.map +0 -1
  259. package/dist/social/channels/DiapChannelBridge.js.map +0 -1
  260. package/dist/social/channels/InterestMatcher.js.map +0 -1
  261. package/dist/social/channels/types.js.map +0 -1
  262. package/dist/social/global-shared-context.js.map +0 -1
  263. package/dist/social/heartbeat.js.map +0 -1
  264. package/lefthook.yml +0 -29
  265. package/scripts/auto-evolve-loop.ts +0 -376
  266. package/scripts/auto-evolve-oneshot.sh +0 -155
  267. package/scripts/auto-evolve-snapshot.sh +0 -136
  268. package/scripts/build-cli.js +0 -216
  269. package/scripts/build-web.ts +0 -82
  270. package/scripts/detect-schema-changes.sh +0 -48
  271. package/scripts/diff-reviewer.ts +0 -159
  272. package/scripts/postinstall.js +0 -153
  273. package/scripts/weekly-report.ts +0 -364
  274. package/src/agents/agent-manifest-protocol.ts +0 -117
  275. package/src/agents/constraint-layer.ts +0 -309
  276. package/src/agents/iroh-secret.ts +0 -32
  277. package/src/agents/p2p-chat-tools.ts +0 -383
  278. package/src/agents/p2p-document-tools.ts +0 -347
  279. package/src/agents/pi-sdk.ts +0 -2462
  280. package/src/agents/protocol.ts +0 -398
  281. package/src/agents/shell-guard.ts +0 -417
  282. package/src/agents/shell-tool.ts +0 -103
  283. package/src/agents/skill-loader.ts +0 -202
  284. package/src/agents/subagent-manager.ts +0 -553
  285. package/src/agents/workflow-engine.ts +0 -332
  286. package/src/agents/workflow-pivot-loop.ts +0 -675
  287. package/src/bollharness/.sanitize-report.json +0 -13
  288. package/src/bollharness/CLAUDE.md +0 -73
  289. package/src/bollharness/LICENSE +0 -21
  290. package/src/bollharness/README.md +0 -143
  291. package/src/bollharness/README.zh-CN.md +0 -131
  292. package/src/bollharness/package.json +0 -20
  293. package/src/bollharness/reference/SOURCE-COMMIT.txt +0 -3
  294. package/src/bollharness/reference/boll-reference/scripts/hooks/.sanitize-report.json +0 -12
  295. package/src/bollharness/reference/boll-reference/scripts/hooks/find-boll-root.sh +0 -27
  296. package/src/bollharness/reference/boll-reference/scripts/hooks/precompact.sh +0 -57
  297. package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +0 -57
  298. package/src/bollharness/schemas/metrics-jsonl-allowlist.json +0 -67
  299. package/src/bollharness/scripts/checks/next_decision_number.sh +0 -48
  300. package/src/bollharness/scripts/ci/count-components.sh +0 -65
  301. package/src/bollharness/scripts/context-fragments/artifact-linkage.md +0 -14
  302. package/src/bollharness/scripts/context-fragments/auth-consumers.md +0 -17
  303. package/src/bollharness/scripts/context-fragments/bridge-constitution.md +0 -13
  304. package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +0 -18
  305. package/src/bollharness/scripts/context-fragments/closure-checklist.md +0 -13
  306. package/src/bollharness/scripts/context-fragments/contract-consumers.md +0 -15
  307. package/src/bollharness/scripts/context-fragments/db-shared-structures.md +0 -15
  308. package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +0 -19
  309. package/src/bollharness/scripts/context-fragments/general-dev-principles.md +0 -11
  310. package/src/bollharness/scripts/context-fragments/issue-first.md +0 -8
  311. package/src/bollharness/scripts/context-fragments/mcp-parity.md +0 -16
  312. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +0 -108
  313. package/src/bollharness/scripts/context-fragments/protocol-consumers.md +0 -15
  314. package/src/bollharness/scripts/context-fragments/run-events-consumers.md +0 -15
  315. package/src/bollharness/scripts/context-fragments/scene-fidelity.md +0 -13
  316. package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +0 -15
  317. package/src/bollharness/scripts/context-fragments/two-language.md +0 -15
  318. package/src/bollharness/scripts/context-fragments/version-sources.md +0 -14
  319. package/src/bollharness/scripts/hooks/find-project-root.sh +0 -47
  320. package/src/bollharness/scripts/hooks/inbox-poll.sh +0 -78
  321. package/src/bollharness/scripts/hooks/precompact.sh +0 -56
  322. package/src/bollharness/scripts/hooks/stop-evaluator.md +0 -83
  323. package/src/bollharness/scripts/sync-from-upstream.sh +0 -281
  324. package/src/bollharness/src/index.ts +0 -5
  325. package/src/bollharness/src/scripts/checks/check_adr_plan_numbering.ts +0 -11
  326. package/src/bollharness/src/scripts/checks/check_api_types.ts +0 -52
  327. package/src/bollharness/src/scripts/checks/check_artifact_link.ts +0 -156
  328. package/src/bollharness/src/scripts/checks/check_bridge_deps.ts +0 -11
  329. package/src/bollharness/src/scripts/checks/check_bugfix_binding.ts +0 -11
  330. package/src/bollharness/src/scripts/checks/check_bugfix_binding_ci.ts +0 -11
  331. package/src/bollharness/src/scripts/checks/check_doc_file_references.ts +0 -11
  332. package/src/bollharness/src/scripts/checks/check_doc_freshness.ts +0 -141
  333. package/src/bollharness/src/scripts/checks/check_doc_links.ts +0 -36
  334. package/src/bollharness/src/scripts/checks/check_file_existence_claims.ts +0 -11
  335. package/src/bollharness/src/scripts/checks/check_fragment_integrity.ts +0 -40
  336. package/src/bollharness/src/scripts/checks/check_hook_installed.ts +0 -70
  337. package/src/bollharness/src/scripts/checks/check_issue_closure.ts +0 -51
  338. package/src/bollharness/src/scripts/checks/check_mcp_parity.ts +0 -11
  339. package/src/bollharness/src/scripts/checks/check_security.ts +0 -54
  340. package/src/bollharness/src/scripts/checks/check_skill_parity.ts +0 -11
  341. package/src/bollharness/src/scripts/checks/check_versions.ts +0 -11
  342. package/src/bollharness/src/scripts/checks/finding.ts +0 -35
  343. package/src/bollharness/src/scripts/checks/next_decision_number.ts +0 -24
  344. package/src/bollharness/src/scripts/checks/regenerate_magic_docs.ts +0 -11
  345. package/src/bollharness/src/scripts/ci/detect_rebaseline_triggers.ts +0 -14
  346. package/src/bollharness/src/scripts/ci/scan_subprocess_cfg.ts +0 -14
  347. package/src/bollharness/src/scripts/ci/scan_verify_artifacts.ts +0 -14
  348. package/src/bollharness/src/scripts/ci/scan_yaml_schema.ts +0 -14
  349. package/src/bollharness/src/scripts/context_router.ts +0 -76
  350. package/src/bollharness/src/scripts/deploy-guard.ts +0 -182
  351. package/src/bollharness/src/scripts/guard-feedback.ts +0 -215
  352. package/src/bollharness/src/scripts/guard_router.ts +0 -194
  353. package/src/bollharness/src/scripts/hooks/_hook_output.js +0 -3
  354. package/src/bollharness/src/scripts/hooks/_hook_output.ts +0 -11
  355. package/src/bollharness/src/scripts/hooks/auto-python3.ts +0 -10
  356. package/src/bollharness/src/scripts/hooks/deploy-progress-on-session-end.ts +0 -10
  357. package/src/bollharness/src/scripts/hooks/failure-analyzer.ts +0 -10
  358. package/src/bollharness/src/scripts/hooks/gate-judgment-inject.ts +0 -111
  359. package/src/bollharness/src/scripts/hooks/gate-transition-judgment.ts +0 -74
  360. package/src/bollharness/src/scripts/hooks/inbox-ack.ts +0 -10
  361. package/src/bollharness/src/scripts/hooks/inbox-inject-on-start.ts +0 -10
  362. package/src/bollharness/src/scripts/hooks/inbox-validate.ts +0 -10
  363. package/src/bollharness/src/scripts/hooks/inbox-write-ledger.ts +0 -10
  364. package/src/bollharness/src/scripts/hooks/initializer-agent.ts +0 -10
  365. package/src/bollharness/src/scripts/hooks/loop-detection.ts +0 -83
  366. package/src/bollharness/src/scripts/hooks/owner-guard.ts +0 -10
  367. package/src/bollharness/src/scripts/hooks/precompact.ts +0 -10
  368. package/src/bollharness/src/scripts/hooks/review-agent-gatekeeper.ts +0 -10
  369. package/src/bollharness/src/scripts/hooks/risk-tracker.ts +0 -121
  370. package/src/bollharness/src/scripts/hooks/sanitize-on-read.ts +0 -10
  371. package/src/bollharness/src/scripts/hooks/session-reflection.ts +0 -12
  372. package/src/bollharness/src/scripts/hooks/session-start-magic-docs.ts +0 -12
  373. package/src/bollharness/src/scripts/hooks/session-start-reset-risk.ts +0 -12
  374. package/src/bollharness/src/scripts/hooks/session-start-toolkit-reminder.ts +0 -12
  375. package/src/bollharness/src/scripts/hooks/stop-evaluator.ts +0 -164
  376. package/src/bollharness/src/scripts/hooks/tool-call-counter.ts +0 -10
  377. package/src/bollharness/src/scripts/hooks/trace-analyzer.ts +0 -14
  378. package/src/bollharness/src/scripts/install/install-trust-token.ts +0 -13
  379. package/src/bollharness/src/scripts/install/multi_project_registry.ts +0 -13
  380. package/src/bollharness/src/scripts/install/phase2_auto.ts +0 -28
  381. package/src/bollharness/src/scripts/install/pre_commit_installer.ts +0 -10
  382. package/src/bollharness/src/scripts/install/tier_selector.ts +0 -10
  383. package/src/bollharness/src/scripts/install/transcript_miner.ts +0 -13
  384. package/src/bollharness/src/scripts/lib/claim_patterns.ts +0 -11
  385. package/src/bollharness/src/scripts/lib/sanitize_patterns.ts +0 -13
  386. package/src/bollharness/src/scripts/sanitize.ts +0 -9
  387. package/src/bollharness/templates/persona/default.json +0 -19
  388. package/src/bollharness/templates/scaffold/.gitignore.append +0 -16
  389. package/src/bollharness/templates/scaffold/CLAUDE.md +0 -89
  390. package/src/bollharness-integration/channel-judgment-engine.ts +0 -634
  391. package/src/bollharness-integration/context-chain-router.ts +0 -474
  392. package/src/bollharness-integration/context-router-judgment.ts +0 -339
  393. package/src/bollharness-integration/context-router.ts +0 -583
  394. package/src/bollharness-integration/gate-state-machine.ts +0 -444
  395. package/src/bollharness-integration/gate-transition-hooks.ts +0 -137
  396. package/src/bollharness-integration/guard-checker.ts +0 -451
  397. package/src/bollharness-integration/index.ts +0 -195
  398. package/src/bollharness-integration/integration.ts +0 -538
  399. package/src/bollharness-integration/judgment-prompts.yaml +0 -535
  400. package/src/bollharness-integration/llm-judgment-engine.ts +0 -712
  401. package/src/bollharness-integration/skill-adapter.ts +0 -646
  402. package/src/bootstrap/bootstrap.ts +0 -132
  403. package/src/bootstrap/context-collector.ts +0 -342
  404. package/src/bootstrap/lifecycle-hooks.ts +0 -176
  405. package/src/bootstrap/project-context.ts +0 -163
  406. package/src/cli/interface.ts +0 -211
  407. package/src/cli-entry.ts +0 -304
  408. package/src/constraints/index.ts +0 -6
  409. package/src/documents/reader.ts +0 -85
  410. package/src/documents/store.ts +0 -252
  411. package/src/electron-preload.ts +0 -25
  412. package/src/electron.ts +0 -200
  413. package/src/heartbeat/DaemonManager.ts +0 -283
  414. package/src/heartbeat/HealthMonitor.ts +0 -316
  415. package/src/heartbeat/StartupVerifier.ts +0 -223
  416. package/src/heartbeat/Watchdog.ts +0 -208
  417. package/src/heartbeat/index.ts +0 -109
  418. package/src/heartbeat/self-improve-bus.ts +0 -110
  419. package/src/heartbeat/types.ts +0 -82
  420. package/src/index.ts +0 -1690
  421. package/src/llm/audio-config-store.ts +0 -246
  422. package/src/llm/config-store.ts +0 -400
  423. package/src/llm/llm-judgment-client.ts +0 -470
  424. package/src/llm/pi-ai.ts +0 -558
  425. package/src/llm/video-config-store.ts +0 -257
  426. package/src/network/agent-network.ts +0 -800
  427. package/src/network/hybrid-messenger.ts +0 -199
  428. package/src/network/iroh-bootstrap.ts +0 -57
  429. package/src/network/iroh-discovery.ts +0 -208
  430. package/src/network/iroh-integration.ts +0 -158
  431. package/src/network/iroh-transport.ts +0 -637
  432. package/src/network/known-peers.ts +0 -102
  433. package/src/network/p2p-direct.ts +0 -240
  434. package/src/network/p2p-secret.ts +0 -153
  435. package/src/network/p2p.ts +0 -964
  436. package/src/network/storage/adapters/json-adapter.ts +0 -454
  437. package/src/network/storage/index.ts +0 -203
  438. package/src/network/storage/types.ts +0 -166
  439. package/src/security/builtin-guards.ts +0 -162
  440. package/src/security/context-router-tool.ts +0 -122
  441. package/src/security/react-harness.ts +0 -177
  442. package/src/security/tool-gate.ts +0 -294
  443. package/src/social/ant-colony/index.js +0 -19
  444. package/src/social/channels/ChannelManager.ts +0 -485
  445. package/src/social/channels/DiapChannelBridge.ts +0 -501
  446. package/src/social/channels/InterestMatcher.ts +0 -189
  447. package/src/social/channels/agent-workflow-config.json +0 -214
  448. package/src/social/channels/agent-workflow-config.yaml +0 -334
  449. package/src/social/channels/channel-agent-session.ts +0 -407
  450. package/src/social/channels/channel-heartbeat-agent.ts +0 -622
  451. package/src/social/channels/diap-doc-parser.ts +0 -282
  452. package/src/social/channels/harness-workflow-integrator.ts +0 -594
  453. package/src/social/channels/index.ts +0 -22
  454. package/src/social/channels/types.ts +0 -115
  455. package/src/social/global-shared-context.ts +0 -506
  456. package/src/social/heartbeat.ts +0 -1057
  457. package/src/social/persona/enhanced-persona.ts +0 -359
  458. package/src/types.d.ts +0 -12
  459. package/src/utils/auto-evolve-policy.ts +0 -138
  460. package/src/utils/auto-update.ts +0 -482
  461. package/src/utils/clamp.ts +0 -5
  462. package/src/web/agent-delegate-server.ts +0 -148
  463. package/src/web/api-config.html +0 -520
  464. package/src/web/client.js +0 -4898
  465. package/src/web/components/p2p/P2PModal.tsx +0 -416
  466. package/src/web/components/p2p/index.ts +0 -566
  467. package/src/web/components/p2p/index.tsx +0 -297
  468. package/src/web/components/p2p/p2p-connection.ts +0 -338
  469. package/src/web/components/p2p/p2p-identity.ts +0 -92
  470. package/src/web/components/p2p/p2p-manager.ts +0 -147
  471. package/src/web/components/p2p/p2p-messages.ts +0 -219
  472. package/src/web/components/p2p/p2p-modal.ts +0 -685
  473. package/src/web/components/p2p/p2p-store-memory.ts +0 -162
  474. package/src/web/components/p2p/p2p-tools.ts +0 -315
  475. package/src/web/components/p2p/types.ts +0 -170
  476. package/src/web/components/wallet-viem.mjs +0 -118
  477. package/src/web/design.md +0 -99
  478. package/src/web/icons/apple-touch-icon.png +0 -0
  479. package/src/web/icons/favicon-16x16.png +0 -0
  480. package/src/web/icons/favicon-192x192.png +0 -0
  481. package/src/web/icons/favicon-32x32.png +0 -0
  482. package/src/web/icons/favicon-48x48.png +0 -0
  483. package/src/web/icons/favicon-512x512.png +0 -0
  484. package/src/web/icons/favicon.icns +0 -0
  485. package/src/web/icons/favicon.ico +0 -0
  486. package/src/web/icons/icon.png +0 -0
  487. package/src/web/icons/image.png +0 -0
  488. package/src/web/index.html +0 -382
  489. package/src/web/iroh-delegate-transport.ts +0 -139
  490. package/src/web/manifest.json +0 -21
  491. package/src/web/server.ts +0 -5571
  492. package/src/web/style.css +0 -4455
  493. package/staging/auto-evolve/clean-001/.review-verdict +0 -9
  494. package/staging/auto-evolve/clean-001/clean-001.patch +0 -14
  495. package/staging/auto-evolve/e2e-001/.patch-id +0 -1
  496. package/staging/auto-evolve/e2e-001/.review-verdict +0 -12
  497. package/staging/auto-evolve/e2e-001/e2e-001.patch +0 -11
  498. package/staging/auto-evolve/test-bad/.review-verdict +0 -12
  499. package/staging/auto-evolve/test-bad/test-bad.patch +0 -11
  500. package/tsconfig.cli.json +0 -16
  501. package/tsconfig.electron.json +0 -20
  502. package/tsconfig.json +0 -18
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Snip — 第 2 层: 裁掉老 history
3
+ *
4
+ * 论文: feature flag 关闭 (默认), 用户开启后才生效
5
+ * 开启环境变量: BOLLOON_SNIP_ENABLED=1
6
+ *
7
+ * 行为: 只保留最近 N 对 user/assistant (默认 20 对)
8
+ * 工具结果消息按其所属 round 一起保留
9
+ *
10
+ * 失败静默: 异常 → 返回原 history
11
+ */
12
+ const DEFAULT_KEEP_PAIRS = 20;
13
+ export function isSnipEnabled() {
14
+ return process.env.BOLLOON_SNIP_ENABLED === '1';
15
+ }
16
+ export function snip(history, opts = {}) {
17
+ try {
18
+ if (opts.skip || !isSnipEnabled()) {
19
+ return { history, applied: false, detail: isSnipEnabled() ? 'skipped' : 'feature flag off' };
20
+ }
21
+ const keepPairs = opts.snipKeepPairs ?? DEFAULT_KEEP_PAIRS;
22
+ // 从后往前数 N 对 user/assistant 边界
23
+ let pairsFound = 0;
24
+ let cutFrom = -1;
25
+ for (let i = history.length - 1; i >= 0; i--) {
26
+ const m = history[i];
27
+ if (m.role === 'user') {
28
+ pairsFound++;
29
+ if (pairsFound >= keepPairs) {
30
+ cutFrom = i;
31
+ break;
32
+ }
33
+ }
34
+ }
35
+ if (cutFrom <= 0) {
36
+ return { history, applied: false, detail: 'history too short' };
37
+ }
38
+ const out = history.slice(cutFrom);
39
+ return { history: out, applied: true, detail: `kept last ${keepPairs} pairs, dropped ${cutFrom} older messages` };
40
+ }
41
+ catch (err) {
42
+ console.warn('[compactor] snip failed (silent, returning original):', err);
43
+ return { history, applied: false, detail: 'error' };
44
+ }
45
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Token Estimator — 4 字符 ≈ 1 token 的粗估
3
+ *
4
+ * 为什么不引 tiktoken 依赖:
5
+ * - bolloon 默认 npm 用户, 引依赖增加 install 体积
6
+ * - Claude Code 论文也指出: 精确 token 计数不是关键, 渐进压缩才是
7
+ * - 4 字符/token 在中文/英文混合场景下误差约 ±20%, 对预算判定足够
8
+ *
9
+ * 失败静默: 任何异常 → 返回估算值 (不抛错)
10
+ */
11
+ const CHARS_PER_TOKEN = 4;
12
+ export function estimateTokens(messages) {
13
+ let total = 0;
14
+ for (const m of messages) {
15
+ total += Math.ceil((m.content?.length || 0) / CHARS_PER_TOKEN);
16
+ if (m.toolResult) {
17
+ try {
18
+ const s = typeof m.toolResult === 'string' ? m.toolResult : JSON.stringify(m.toolResult);
19
+ total += Math.ceil(s.length / CHARS_PER_TOKEN);
20
+ }
21
+ catch { /* circular ref, ignore */ }
22
+ }
23
+ if (m.toolCall) {
24
+ try {
25
+ const s = typeof m.toolCall === 'string' ? m.toolCall : JSON.stringify(m.toolCall);
26
+ total += Math.ceil(s.length / CHARS_PER_TOKEN);
27
+ }
28
+ catch { /* ignore */ }
29
+ }
30
+ }
31
+ return total;
32
+ }
33
+ export function estimateStringTokens(s) {
34
+ return Math.ceil(s.length / CHARS_PER_TOKEN);
35
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Context Compaction — 类型定义
3
+ *
4
+ * 严格对齐 Claude Code 论文 5 层压缩流水线:
5
+ * 1. Budget Reduction (单条消息大小限制)
6
+ * 2. Snip (裁掉老历史, feature flag 关闭)
7
+ * 3. Microcompact (cache-aware 细粒度压缩, 老 tool_result 折叠)
8
+ * 4. Context Collapse (读时虚拟投影, 非破坏)
9
+ * 5. Auto-Compact (LLM 摘要, 兜底)
10
+ *
11
+ * 关键不变量:
12
+ * - 第 1-3 层不破坏 messageHistory 内存结构, 只改 buildContext 输出
13
+ * - 第 4 层读时投影, 绝不改 messageHistory
14
+ * - 第 5 层破坏 messageHistory, 把 N 对折叠成 1 条 summary
15
+ *
16
+ * 类型设计: Message 在本模块内独立定义, 靠 structural typing 与 pi-sdk.ts 的 Message 兼容.
17
+ * 不 import pi-sdk 避免循环依赖.
18
+ */
19
+ export {};
@@ -231,9 +231,10 @@ export class HealthMonitor {
231
231
  async pingLLM(minimax) {
232
232
  const start = Date.now();
233
233
  try {
234
- // 简单的 chat 测试
234
+ // 2026-06-15: signal 位置正确传 undefined (chat signature 是 (message, context?, signal?))
235
+ // 之前传 { maxTokens: 1 } 被当 signal, Node 22+ undici 强类型 AbortSignal 校验 throw
235
236
  if (minimax.chat) {
236
- await minimax.chat('ping', 'test', { maxTokens: 1 });
237
+ await minimax.chat('ping', 'test', undefined);
237
238
  }
238
239
  else if (minimax.ping) {
239
240
  await minimax.ping();
package/dist/index.js CHANGED
@@ -978,6 +978,34 @@ async function runNonInteractive(args, comm) {
978
978
  console.log(`✅ 结果已保存到: ${output}`);
979
979
  return;
980
980
  }
981
+ if (tool === 'prompt' && prompt) {
982
+ // 2026-06-15: --prompt "text" 走直接调 a.prompt(prompt) 路径, 避开 runToolCommand
983
+ // (case 'prompt' 内的 [text] = args 从 toolArgs 取值是空数组, 永远报"缺少 prompt 文本"是 CLI bug)
984
+ const startTime = Date.now();
985
+ const a = await getAgent();
986
+ try {
987
+ const response = await a.prompt(prompt);
988
+ const elapsed = Date.now() - startTime;
989
+ if (json) {
990
+ console.log(JSON.stringify({ success: true, response, elapsedMs: elapsed }, null, 2));
991
+ }
992
+ else {
993
+ console.log(response);
994
+ console.log(`\n耗时: ${elapsed}ms`);
995
+ }
996
+ }
997
+ catch (e) {
998
+ const error = e?.message || String(e);
999
+ if (json) {
1000
+ console.log(JSON.stringify({ success: false, error }, null, 2));
1001
+ }
1002
+ else {
1003
+ console.log(`\n错误: ${error}`);
1004
+ }
1005
+ process.exit(1);
1006
+ }
1007
+ return;
1008
+ }
981
1009
  if (tool) {
982
1010
  await runToolCommand(tool, toolArgs, !!json, comm);
983
1011
  }
@@ -1367,7 +1395,9 @@ async function main() {
1367
1395
  s.banner();
1368
1396
  s.section('系统初始化');
1369
1397
  const hasOpenAI = !!process.env.OPENAI_API_KEY;
1370
- const hasAnthropic = !!process.env.ANTHROPIC_API_KEY;
1398
+ // 2026-06-15: 修复 — 之前 anthropic 401 是因为 shell env 残留的旧 ANTHROPIC_API_KEY 抢了 provider 选择
1399
+ // 用 BOLLOON_LLM_PROVIDER env 显式覆盖, 否则还是按 env hasXxx 顺序自动选
1400
+ const hasAnthropic = !!process.env.ANTHROPIC_API_KEY && !process.env.BOLLOON_LLM_PROVIDER;
1371
1401
  const hasMinimax = !!process.env.MINIMAX_API_KEY;
1372
1402
  const hasDeepSeek = !!process.env.DEEPSEEK_API_KEY;
1373
1403
  const hasKimi = !!(process.env.KIMI_API_KEY || process.env.MOONSHOT_API_KEY);
@@ -1447,9 +1477,15 @@ async function main() {
1447
1477
  s.divider();
1448
1478
  if (mode === 'web') {
1449
1479
  const port = parseInt(process.env.PORT || '54188');
1480
+ // 2026-06-16: BOLLOON_DEV_MODE=1 或 selfImprove=true 启动项 → 开发者模式, 启用自迭代 (健康监控+自改总线)
1481
+ // 默认用户模式: 不自迭代, 自改卡片不自动出现, 仍可 POST /api/self-improve/trigger 手动触发
1482
+ const selfImprove = process.env.BOLLOON_DEV_MODE === '1' || process.env.BOLLOON_DEV_MODE === 'true';
1483
+ if (selfImprove) {
1484
+ console.log('[startup] BOLLOON_DEV_MODE=1, 开发者模式: 自迭代已启用');
1485
+ }
1450
1486
  const { createWebServer, openBrowser } = await import('./web/server.js');
1451
1487
  s.info(`启动 Web 服务端口 ${port}...`);
1452
- const { port: actualPort } = await createWebServer(port);
1488
+ const { port: actualPort } = await createWebServer(port, { selfImprove });
1453
1489
  s.success(`浏览器已打开 → http://localhost:${actualPort}`);
1454
1490
  openBrowser(`http://localhost:${actualPort}`);
1455
1491
  }
@@ -6,19 +6,31 @@
6
6
  */
7
7
  import { llmConfigStore } from './config-store.js';
8
8
  import { PiAIModel } from './pi-ai.js';
9
+ import * as fs from 'fs/promises';
10
+ import * as path from 'path';
11
+ import { fileURLToPath } from 'url';
12
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
13
+ const LAYERS_DIR = path.join(__dirname, 'system-prompt', 'layers');
14
+ /**
15
+ * 从 layer 读 .md 文件作为系统 prompt
16
+ * 失败时降级到兜底字符串 (不挂)
17
+ */
18
+ async function loadRoleLayer(layerId, fallback) {
19
+ const [group, ...rest] = layerId.split('.');
20
+ const path2md = path.join(LAYERS_DIR, group, `${rest.join('.')}.md`);
21
+ try {
22
+ return await fs.readFile(path2md, 'utf-8');
23
+ }
24
+ catch {
25
+ return fallback;
26
+ }
27
+ }
9
28
  // 预定义的判断 Prompt 配置
10
29
  export const JUDGMENT_PROMPTS = {
11
30
  // 默认判断 Prompt
12
31
  default: {
13
- systemPrompt: `你是一个专业的 AI 任务分析专家。你的职责是深入理解用户的问题,并给出精准的判断。
14
-
15
- 核心原则:
16
- 1. 第一性原理:追问问题的本质,而非表面现象
17
- 2. 多角度思考:考虑不同视角和影响因素
18
- 3. 上下文感知:理解对话历史和隐含意图
19
- 4. 动态评估:根据实际情况判断复杂性
20
-
21
- 你的判断会影响后续的智能体协作方式,请认真分析。`,
32
+ systemPrompt: '',
33
+ systemPromptResolver: () => loadRoleLayer('role.expert', '你是一个专业的 AI 任务分析专家. '),
22
34
  userPromptTemplate: `【当前输入】
23
35
  {user_input}
24
36
 
@@ -73,16 +85,8 @@ export const JUDGMENT_PROMPTS = {
73
85
  },
74
86
  // 架构相关问题
75
87
  architecture: {
76
- systemPrompt: `你是一个经验丰富的系统架构师。你擅长:
77
- - 从需求中提取本质问题
78
- - 设计可扩展的系统架构
79
- - 权衡技术方案
80
- - 识别架构风险
81
-
82
- 你相信:
83
- - 本质和实现必须分离
84
- - 好的架构从简单规则中生长
85
- - 复杂性应该被控制而非消除`,
88
+ systemPrompt: '',
89
+ systemPromptResolver: () => loadRoleLayer('role.architect', '你是一个经验丰富的系统架构师. '),
86
90
  userPromptTemplate: `【架构设计问题】
87
91
  {user_input}
88
92
 
@@ -108,11 +112,8 @@ export const JUDGMENT_PROMPTS = {
108
112
  },
109
113
  // 代码相关问题
110
114
  code: {
111
- systemPrompt: `你是一个高效的代码实现专家。你擅长:
112
- - 快速理解和实现需求
113
- - 编写清晰、可维护的代码
114
- - 遵循最佳实践
115
- - 处理边界情况`,
115
+ systemPrompt: '',
116
+ systemPromptResolver: () => loadRoleLayer('role.implementer', '你是一个高效的代码实现专家. '),
116
117
  userPromptTemplate: `【代码问题】
117
118
  {user_input}
118
119
 
@@ -134,11 +135,8 @@ export const JUDGMENT_PROMPTS = {
134
135
  },
135
136
  // 安全相关问题
136
137
  security: {
137
- systemPrompt: `你是一个严格的安全专家。你擅长:
138
- - 识别安全风险
139
- - 评估威胁模型
140
- - 设计安全方案
141
- - 遵循安全最佳实践`,
138
+ systemPrompt: '',
139
+ systemPromptResolver: () => loadRoleLayer('role.security', '你是一个严格的安全专家. '),
142
140
  userPromptTemplate: `【安全问题】
143
141
  {user_input}
144
142
 
@@ -221,8 +219,12 @@ export class LLMJudgmentClient {
221
219
  }
222
220
  try {
223
221
  // 调用 LLM
222
+ // 优先用 systemPromptResolver (从 layer 读), fallback 静态 systemPrompt
223
+ const systemPrompt = this.promptConfig.systemPromptResolver
224
+ ? await this.promptConfig.systemPromptResolver()
225
+ : this.promptConfig.systemPrompt;
224
226
  const messages = [
225
- { role: 'system', content: this.promptConfig.systemPrompt },
227
+ { role: 'system', content: systemPrompt },
226
228
  { role: 'user', content: userPrompt }
227
229
  ];
228
230
  const response = await this.model.chat(userPrompt);
package/dist/llm/pi-ai.js CHANGED
@@ -1,5 +1,22 @@
1
1
  import * as path from 'path';
2
2
  import * as fs from 'fs';
3
+ /**
4
+ * 外部 system 注入钩子.
5
+ * 调用方 (e.g. auto-evolve-loop) 用 setSystemPrependProvider() 注册一个返回字符串的函数,
6
+ * generateText 在拼 finalMessages 时, 把返回的字符串作为最前一个 system message.
7
+ *
8
+ * 用途: P2P 协作时把"行级 reserve 状态"实时塞给 LLM,
9
+ * 让 LLM 主动避开对方正在改的代码行.
10
+ *
11
+ * 返回 '' / null / undefined → 不注入.
12
+ */
13
+ let _prependProvider = null;
14
+ export function setSystemPrependProvider(p) {
15
+ _prependProvider = p;
16
+ }
17
+ export function getSystemPrependProvider() {
18
+ return _prependProvider;
19
+ }
3
20
  export class PiAIModel {
4
21
  config;
5
22
  provider;
@@ -8,7 +25,7 @@ export class PiAIModel {
8
25
  this.provider = config.provider;
9
26
  }
10
27
  async chat(message, context, signal) {
11
- const systemPrompt = this.buildSystemPrompt(context);
28
+ const systemPrompt = await this.buildSystemPromptAsync(context);
12
29
  const messages = [
13
30
  { role: 'system', content: systemPrompt },
14
31
  { role: 'user', content: message }
@@ -17,6 +34,7 @@ export class PiAIModel {
17
34
  const response = await this.generateText({
18
35
  messages,
19
36
  temperature: 0.8,
37
+ maxTokens: 8192, // 2026-06-15: 提到 8192, 避免长回答 (含表格/代码块) 被截断
20
38
  signal,
21
39
  });
22
40
  return { reply: response };
@@ -27,7 +45,14 @@ export class PiAIModel {
27
45
  throw error; // 上层 try/catch 处理
28
46
  }
29
47
  console.error('PiAI chat error:', error);
30
- return { reply: '抱歉,AI服务暂时不可用。' };
48
+ // 2026-06-15: 真实 error 信息 + 明确告诉 LLM "这是 API 错, 不要 retry"
49
+ // 旧版: "抱歉,AI服务暂时不可用。" → LLM 看到 isTooShort=false(< 50 但 > 0),
50
+ // needsMoreWork 不会触发, 但 hasError 模式 (含 "error" / "失败") 会判定要继续修
51
+ // 新版: 让 LLM 立即停止循环, 直接展示给用户
52
+ const errMsg = (error?.message || '').slice(0, 300);
53
+ return {
54
+ reply: `[AI 服务调用失败] ${errMsg}\n\n这是一个**底层 API 错误**(401 / 鉴权失败 / 网络中断 / 配额耗尽等),不是你的任务有问题。**请直接把这个错误消息回复给用户,不要再循环尝试。**`,
55
+ };
31
56
  }
32
57
  }
33
58
  async summarize(text, context) {
@@ -69,7 +94,39 @@ export class PiAIModel {
69
94
  }
70
95
  }
71
96
  async generateText(options) {
72
- const { messages, temperature = 0.7, maxTokens = 4096, signal } = options;
97
+ const { messages, temperature = 0.7, maxTokens = 4096, signal, tools } = options;
98
+ // 工具清单: 代码侧 schema → 进 system prompt (作为额外 system message)
99
+ let finalMessages = messages;
100
+ // 1) 外部 prepend (e.g. P2P 行级 reserve 状态), 拼到最前
101
+ if (_prependProvider) {
102
+ try {
103
+ const pre = await _prependProvider();
104
+ if (pre && typeof pre === 'string' && pre.trim()) {
105
+ finalMessages = [{ role: 'system', content: pre }, ...finalMessages];
106
+ }
107
+ }
108
+ catch (err) {
109
+ console.warn('[pi-ai] systemPrepend 失败:', err?.message?.slice(0, 100));
110
+ }
111
+ }
112
+ if (tools && tools.length > 0) {
113
+ try {
114
+ const { getToolManifest, formatForPrompt } = await import('./tool-manifest/index.js');
115
+ const manifests = tools
116
+ .map((id) => getToolManifest(id))
117
+ .filter((m) => m !== undefined);
118
+ if (manifests.length > 0) {
119
+ const toolPrompt = formatForPrompt(manifests);
120
+ finalMessages = [
121
+ { role: 'system', content: toolPrompt },
122
+ ...messages,
123
+ ];
124
+ }
125
+ }
126
+ catch (err) {
127
+ console.warn('[pi-ai] tool-manifest 加载失败:', err.message?.slice(0, 100));
128
+ }
129
+ }
73
130
  switch (this.provider) {
74
131
  case 'openai':
75
132
  case 'minimax':
@@ -77,17 +134,17 @@ export class PiAIModel {
77
134
  case 'kimi':
78
135
  case 'glm':
79
136
  case 'qwen':
80
- return this.callOpenAI(messages, temperature, maxTokens, signal);
137
+ return this.callOpenAI(finalMessages, temperature, maxTokens, signal);
81
138
  case 'anthropic':
82
- return this.callAnthropic(messages, temperature, maxTokens, signal);
139
+ return this.callAnthropic(finalMessages, temperature, maxTokens, signal);
83
140
  case 'ollama':
84
- return this.callOllama(messages, temperature, signal);
141
+ return this.callOllama(finalMessages, temperature, signal);
85
142
  case 'openrouter':
86
- return this.callOpenRouter(messages, temperature, maxTokens, signal);
143
+ return this.callOpenRouter(finalMessages, temperature, maxTokens, signal);
87
144
  case 'gemini':
88
- return this.callGemini(messages, temperature, maxTokens, signal);
145
+ return this.callGemini(finalMessages, temperature, maxTokens, signal);
89
146
  case 'local':
90
- return this.callLocal(messages, temperature, signal);
147
+ return this.callLocal(finalMessages, temperature, signal);
91
148
  default:
92
149
  throw new Error(`Unsupported provider: ${this.provider}`);
93
150
  }
@@ -152,19 +209,23 @@ export class PiAIModel {
152
209
  if (!apiKey) {
153
210
  throw new Error('OPENAI_API_KEY not set');
154
211
  }
212
+ const requestBody = {
213
+ model: this.mapModel(),
214
+ messages,
215
+ temperature,
216
+ max_tokens: maxTokens
217
+ };
155
218
  const response = await fetch(`${this.getBaseUrl()}/chat/completions`, {
156
219
  method: 'POST',
157
220
  headers: {
158
221
  'Content-Type': 'application/json',
159
222
  'Authorization': `Bearer ${apiKey}`
160
223
  },
161
- body: JSON.stringify({
162
- model: this.mapModel(),
163
- messages,
164
- temperature,
165
- max_tokens: maxTokens
166
- }),
167
- signal,
224
+ body: JSON.stringify(requestBody),
225
+ // 2026-06-15: signal 字段防御 — Node 22+ undici 强类型 AbortSignal, 非 AbortSignal 实例
226
+ // (e.g. 误传的 { maxTokens: 1 } 对象) 会 throw "Expected signal to be AbortSignal".
227
+ // 若不是 AbortSignal, 退到无 signal 调用, fetch 自然支持 timeout 由外层控制.
228
+ signal: signal instanceof AbortSignal ? signal : undefined,
168
229
  });
169
230
  if (!response.ok) {
170
231
  throw new Error(`OpenAI API error: ${response.status}`);
@@ -285,6 +346,32 @@ export class PiAIModel {
285
346
  async callLocal(messages, temperature, signal) {
286
347
  return this.callOllama(messages, temperature, signal);
287
348
  }
349
+ // 注: callLocal 直接代理 ollama. 工具清单由 generateText 在外层拼到 messages, 这里 messages 已是 finalMessages.
350
+ async buildSystemPromptAsync(context) {
351
+ // 走 layer registry: 装配所有相关 layer (身份/行为/工具/角色/渠道)
352
+ try {
353
+ const { assembleSystemPrompt, SYSTEM_PROMPT_VERSION } = await import('./system-prompt/registry.js').catch(() => import('./system-prompt/registry.js'));
354
+ // channel = 本机 (PI SDK 直接调就是 local)
355
+ // role = 由 prompt context 决定 (默认 expert)
356
+ const ctx = context ? { channel: 'local', role: 'expert' } : { channel: 'local', role: 'expert' };
357
+ const result = await assembleSystemPrompt(ctx);
358
+ return `${result.text}\n\n## User Working Directory\n${context || process.cwd()}\n\n## bolloon-runtime\n${SYSTEM_PROMPT_VERSION} · layers: ${result.layerIds.join(',')}`;
359
+ }
360
+ catch (err) {
361
+ // 降级: 旧硬编码 (layer registry 不可用时不挂)
362
+ console.warn('[pi-ai] layer registry 不可用, 降级:', err.message?.slice(0, 100));
363
+ const envDetails = this.getEnvironmentDetails();
364
+ return `You are a friendly AI assistant in a P2P document collaboration network.
365
+
366
+ ## User Working Directory
367
+ ${context || process.cwd()}
368
+
369
+ ## Environment
370
+ ${envDetails}`;
371
+ }
372
+ }
373
+ // 同步版: 旧调用点 (buildSystemPrompt 是同步)
374
+ // 保留但内部用 sync fallback; 后续可改成 async
288
375
  buildSystemPrompt(context) {
289
376
  const envDetails = this.getEnvironmentDetails();
290
377
  return `You are a friendly AI assistant in a P2P document collaboration network.
@@ -0,0 +1,129 @@
1
+ /**
2
+ * system-prompt health — 每层 lifecycle 状态扫描
3
+ *
4
+ * 严格对齐 deusyu 论文 "Harness Gardening 3-6 月" + walkinglabs Lifecycle 4-stage
5
+ * + 马书 ch05+ch13 systemPromptSection + 89 FF 的版本/owner 治理思想.
6
+ *
7
+ * 设计:
8
+ * - 输入: 完整 layer list (assembleSystemPrompt 返回的 layers[])
9
+ * - 输出: 每层 health 状态 (ok | stale | overdue-review | missing-frontmatter)
10
+ * - 失败静默: 任何 layer 读失败 → 标 'missing-frontmatter' 而非抛错
11
+ *
12
+ * 决策 (cross-repo_caveats 选边):
13
+ * - dynamic layers (function source) → 标 'ok' (last_reviewed_at = now), 视作 runtime-managed
14
+ * - frontmatter author 拒绝 'llm-judge' 之外的不合法值 → 标 'missing-frontmatter'
15
+ */
16
+ const DAY_MS = 24 * 60 * 60 * 1000;
17
+ /** 兼容运行时: dynamic layer 没有 meta, 视作 'dynamic' (last_reviewed = now) */
18
+ function isDynamic(l) {
19
+ return l.source === 'function';
20
+ }
21
+ /** 评估单层 health */
22
+ export function evaluateLayer(l, now = new Date()) {
23
+ if (isDynamic(l)) {
24
+ return {
25
+ id: l.id,
26
+ health: 'dynamic',
27
+ ageDays: 0,
28
+ ttlDays: -1,
29
+ remainingDays: -1,
30
+ author: l.meta?.author ?? 'runtime',
31
+ lastReviewedAt: now.toISOString(),
32
+ active: false, // 由 caller (assembleSystemPrompt) 决定
33
+ };
34
+ }
35
+ if (!l.meta) {
36
+ // frontmatter 解析失败或缺失
37
+ return {
38
+ id: l.id,
39
+ health: 'missing-frontmatter',
40
+ ageDays: -1,
41
+ ttlDays: -1,
42
+ remainingDays: -1,
43
+ author: null,
44
+ lastReviewedAt: null,
45
+ active: false,
46
+ };
47
+ }
48
+ const reviewedAt = new Date(l.meta.lastReviewedAt).getTime();
49
+ if (isNaN(reviewedAt)) {
50
+ return {
51
+ id: l.id,
52
+ health: 'missing-frontmatter',
53
+ ageDays: -1,
54
+ ttlDays: l.meta.ttlDays,
55
+ remainingDays: -1,
56
+ author: l.meta.author,
57
+ lastReviewedAt: l.meta.lastReviewedAt,
58
+ active: false,
59
+ };
60
+ }
61
+ const ageMs = now.getTime() - reviewedAt;
62
+ const ageDays = Math.floor(ageMs / DAY_MS);
63
+ const remainingDays = l.meta.ttlDays - ageDays;
64
+ let health;
65
+ if (remainingDays < 0) {
66
+ health = 'overdue-review';
67
+ }
68
+ else if (remainingDays < l.meta.ttlDays * 0.2) {
69
+ health = 'stale'; // 剩余 < 20% ttl 触发告警
70
+ }
71
+ else {
72
+ health = 'ok';
73
+ }
74
+ return {
75
+ id: l.id,
76
+ health,
77
+ ageDays,
78
+ ttlDays: l.meta.ttlDays,
79
+ remainingDays,
80
+ author: l.meta.author,
81
+ lastReviewedAt: l.meta.lastReviewedAt,
82
+ notes: l.meta.notes,
83
+ active: false, // caller 决定
84
+ };
85
+ }
86
+ /** 评估整组 layer (输入: assembleSystemPrompt 返回的 layers[]) */
87
+ export function evaluateLayers(layers, now = new Date()) {
88
+ const entries = layers.map((l) => evaluateLayer(l, now));
89
+ return summarize(entries, now);
90
+ }
91
+ /** 汇总: 给一批 entries 算 counts */
92
+ function summarize(entries, now) {
93
+ const counts = { ok: 0, stale: 0, overdue: 0, missing: 0, dynamic: 0 };
94
+ for (const e of entries) {
95
+ if (e.health === 'ok')
96
+ counts.ok++;
97
+ else if (e.health === 'stale')
98
+ counts.stale++;
99
+ else if (e.health === 'overdue-review')
100
+ counts.overdue++;
101
+ else if (e.health === 'missing-frontmatter')
102
+ counts.missing++;
103
+ else if (e.health === 'dynamic')
104
+ counts.dynamic++;
105
+ }
106
+ return {
107
+ scannedAt: now.toISOString(),
108
+ total: entries.length,
109
+ okCount: counts.ok,
110
+ staleCount: counts.stale,
111
+ overdueCount: counts.overdue,
112
+ missingCount: counts.missing,
113
+ dynamicCount: counts.dynamic,
114
+ entries,
115
+ };
116
+ }
117
+ /** 标记当前 context 下激活的 layer (在 assembleSystemPrompt 调用后用) */
118
+ export function markActive(report, activeIds) {
119
+ return {
120
+ ...report,
121
+ entries: report.entries.map((e) => ({ ...e, active: activeIds.has(e.id) })),
122
+ };
123
+ }
124
+ // ============================================================
125
+ // 测试钩子
126
+ // ============================================================
127
+ export function _resetHealthForTest() {
128
+ // 无内部状态, 保留 API 一致
129
+ }