@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
@@ -1,132 +0,0 @@
1
- /**
2
- * Bolloon Bootstrap — 启动入口
3
- *
4
- * web server 启动时 (或 CLI 模式) 调一次, 完成 3 件事:
5
- * 1. 跑类 B 自适应扫描 (暖缓存 + 写 evolution.jsonl 启动事件)
6
- * 2. 收集项目 Context (Bolloon.md / git / persona / judgments / skills)
7
- * 3. 挂每天 0:00 定时任务
8
- *
9
- * 失败静默: 任意步骤失败 console.warn, 不抛错 (主流程不被阻塞)
10
- */
11
-
12
- import { runAdaptiveScan, logEvolution } from '../pi-ecosystem-judgment/adaptive-scan.js';
13
- import { collectBolloonContext, type BolloonContext } from './context-collector.js';
14
- import type { AdaptiveScanResult } from '../pi-ecosystem-judgment/adaptive-scan.js';
15
-
16
- export interface BootstrapResult {
17
- context: BolloonContext;
18
- scanResult: AdaptiveScanResult;
19
- durationMs: number;
20
- // 失败的部分不影响主流程
21
- errors: string[];
22
- }
23
-
24
- /**
25
- * 入口: web server / CLI 启动时调一次
26
- */
27
- export async function bootstrapBolloon(opts: { cwd?: string } = {}): Promise<BootstrapResult> {
28
- const start = Date.now();
29
- const errors: string[] = [];
30
-
31
- // 1. 类 B 启动扫描
32
- let scanResult: AdaptiveScanResult = {
33
- scannedAt: new Date().toISOString(),
34
- judgmentsTotal: 0,
35
- usageEntriesScanned: 0,
36
- suggestions: [],
37
- };
38
- try {
39
- scanResult = await runAdaptiveScan();
40
- await logEvolution({
41
- ts: new Date().toISOString(),
42
- action: 'accept', // 用 accept 表示"系统记录" (跟 reject 区分)
43
- suggestion: {
44
- key: 'bootstrap-startup',
45
- kind: 'unused', // 占位
46
- judgmentId: '__bootstrap__',
47
- decision: 'Bolloon 启动扫描',
48
- reason: `本次启动扫描了 ${scanResult.judgmentsTotal} 条原则, ${scanResult.usageEntriesScanned} 条使用记录, 生成 ${scanResult.suggestions.length} 条建议`,
49
- action: 'review',
50
- metrics: { usage7d: 0, usage30d: 0, daysSinceLastUse: 0, totalUsage: 0 },
51
- scannedAt: scanResult.scannedAt,
52
- },
53
- });
54
- console.log(`[bootstrap] 类 B 启动扫描完成: ${scanResult.suggestions.length} 条建议`);
55
- } catch (err) {
56
- errors.push(`scan: ${(err as Error).message}`);
57
- console.warn('[bootstrap] 启动扫描失败 (非致命):', err);
58
- }
59
-
60
- // 2. 收集项目 Context
61
- let context: BolloonContext = {
62
- projectRoot: opts.cwd ?? process.cwd(),
63
- projectName: 'unknown',
64
- bolloonMd: null,
65
- git: null,
66
- persona: null,
67
- judgmentsSummary: { total: 0, active: 0, superseded: 0, rejected: 0, topValues: [] },
68
- skills: [],
69
- env: { os: 'unknown', nodeVersion: 'unknown', llmProvider: 'unknown' },
70
- pending: { goals: [], todos: [] },
71
- collectedAt: new Date().toISOString(),
72
- };
73
- try {
74
- context = await collectBolloonContext({ cwd: opts.cwd ?? process.cwd() });
75
- console.log(`[bootstrap] context 收集完成: ${context.judgmentsSummary.total} judgments, ${context.skills.length} skills`);
76
- } catch (err) {
77
- errors.push(`context: ${(err as Error).message}`);
78
- console.warn('[bootstrap] context 收集失败 (非致命):', err);
79
- }
80
-
81
- // 3. 挂定时任务 (每天 0:00 跑扫描, server 重启时丢失可接受)
82
- try {
83
- scheduleAdaptiveScanDaily();
84
- console.log('[bootstrap] 定时任务已挂: 每天 0:00 跑类 B 扫描');
85
- } catch (err) {
86
- errors.push(`schedule: ${(err as Error).message}`);
87
- console.warn('[bootstrap] 定时任务挂载失败 (非致命):', err);
88
- }
89
-
90
- const durationMs = Date.now() - start;
91
- console.log(`[bootstrap] 完成 (${durationMs}ms, ${errors.length} 个错误)`);
92
-
93
- return { context, scanResult, durationMs, errors };
94
- }
95
-
96
- // ============================================================
97
- // 定时任务: 每天 0:00 跑类 B 自适应扫描
98
- // ============================================================
99
-
100
- let scheduled = false;
101
-
102
- function scheduleAdaptiveScanDaily(): void {
103
- if (scheduled) return;
104
- scheduled = true;
105
-
106
- const now = new Date();
107
- const next = new Date(now);
108
- next.setHours(24, 0, 0, 0);
109
- const msUntilMidnight = next.getTime() - now.getTime();
110
-
111
- // 第一次: 等到明天 0:00
112
- setTimeout(() => {
113
- runAdaptiveScan().then((result) => {
114
- console.log(`[bootstrap] 定时扫描完成: ${result.suggestions.length} 条建议`);
115
- }).catch((err) => {
116
- console.warn('[bootstrap] 定时扫描失败:', err);
117
- });
118
- // 之后: 每 24h
119
- setInterval(() => {
120
- runAdaptiveScan().then((result) => {
121
- console.log(`[bootstrap] 定时扫描完成: ${result.suggestions.length} 条建议`);
122
- }).catch((err) => {
123
- console.warn('[bootstrap] 定时扫描失败:', err);
124
- });
125
- }, 24 * 60 * 60 * 1000);
126
- }, msUntilMidnight);
127
- }
128
-
129
- /** 测试辅助: 重置 scheduled 标志 */
130
- export function _resetScheduleForTest(): void {
131
- scheduled = false;
132
- }
@@ -1,342 +0,0 @@
1
- /**
2
- * Bolloon Context Collector — 启动时一次扫描, 收集 5 类项目状态
3
- *
4
- * 设计原则:
5
- * - 每个收集器独立, 失败静默 (返回 null/[] 而非抛错)
6
- * - 整体 < 200ms (git log + 文件扫描)
7
- * - 结果可缓存 24h (跟类 B 自适应一致)
8
- *
9
- * 收集维度:
10
- * 1. 项目层: projectRoot, projectName, Bolloon.md 全文
11
- * 2. git 层: branch, last 5 commits, uncommitted changes count
12
- * 3. persona 层: ~/.bolloon/persona.json
13
- * 4. judgments 层: 摘要 (total / active / superseded / top values)
14
- * 5. skills 层: ~/.bolloon/skills/ + .bolloon/skills/
15
- * 6. 环境层: OS / node / llm provider
16
- * 7. pending 层: ~/.bolloon/goals/* + src/ 下的 TODO/FIXME
17
- */
18
-
19
- import * as fs from 'fs/promises';
20
- import * as os from 'os';
21
- import * as path from 'path';
22
- import { execFile } from 'child_process';
23
- import { promisify } from 'util';
24
-
25
- const execFileAsync = promisify(execFile);
26
-
27
- export interface BolloonContext {
28
- // 1. 项目层
29
- projectRoot: string;
30
- projectName: string;
31
- bolloonMd: string | null;
32
- // 2. git 层
33
- git: {
34
- branch: string;
35
- lastCommits: string[];
36
- uncommittedChanges: number;
37
- } | null;
38
- // 3. persona
39
- persona: { name: string; description: string; personality: string } | null;
40
- // 4. judgments 摘要
41
- judgmentsSummary: {
42
- total: number;
43
- active: number;
44
- superseded: number;
45
- rejected: number;
46
- topValues: Array<{ category: string; value: string; weight: number }>;
47
- };
48
- // 5. skills
49
- skills: Array<{ name: string; description: string }>;
50
- // 6. 环境
51
- env: { os: string; nodeVersion: string; llmProvider: string };
52
- // 7. pending
53
- pending: {
54
- goals: string[];
55
- todos: Array<{ file: string; line: number; text: string }>;
56
- };
57
- // 采集时间
58
- collectedAt: string;
59
- }
60
-
61
- export interface CollectOptions {
62
- cwd: string;
63
- /** Bolloon.md 全文最大字符数 (默认 2000) */
64
- bolloonMdMaxBytes?: number;
65
- /** git log 几条 (默认 5) */
66
- gitCommitLimit?: number;
67
- /** judgments Top N values (默认 10) */
68
- topValuesLimit?: number;
69
- /** 扫 TODO/FIXME 的根目录, 默认 cwd/src */
70
- todoScanDir?: string;
71
- }
72
-
73
- // ============================================================
74
- // 单个收集器: 全部独立, 失败静默
75
- // ============================================================
76
-
77
- async function safeReadFile(filePath: string, maxBytes: number): Promise<string | null> {
78
- try {
79
- const content = await fs.readFile(filePath, 'utf-8');
80
- if (content.length > maxBytes) {
81
- return content.substring(0, maxBytes) + '\n... (truncated)';
82
- }
83
- return content;
84
- } catch {
85
- return null;
86
- }
87
- }
88
-
89
- async function safeExecFile(cmd: string, args: string[], cwd: string): Promise<string> {
90
- try {
91
- const { stdout } = await execFileAsync(cmd, args, { cwd, timeout: 5000 });
92
- return stdout.trim();
93
- } catch {
94
- return '';
95
- }
96
- }
97
-
98
- async function collectProject(cwd: string, bolloonMdMaxBytes: number) {
99
- let projectName = path.basename(cwd);
100
- try {
101
- const pkgRaw = await fs.readFile(path.join(cwd, 'package.json'), 'utf-8');
102
- const pkg = JSON.parse(pkgRaw);
103
- if (typeof pkg.name === 'string') projectName = pkg.name;
104
- } catch { /* ignore */ }
105
- const bolloonMd = await safeReadFile(path.join(cwd, 'Bolloon.md'), bolloonMdMaxBytes);
106
- return { projectName, bolloonMd };
107
- }
108
-
109
- async function collectGit(cwd: string, limit: number): Promise<BolloonContext['git']> {
110
- const branchOut = await safeExecFile('git', ['rev-parse', '--abbrev-ref', 'HEAD'], cwd);
111
- if (!branchOut) return null;
112
- const logOut = await safeExecFile('git', ['log', '--oneline', `-n`, String(limit)], cwd);
113
- const statusOut = await safeExecFile('git', ['status', '--porcelain'], cwd);
114
- return {
115
- branch: branchOut,
116
- lastCommits: logOut ? logOut.split('\n').filter(Boolean) : [],
117
- uncommittedChanges: statusOut ? statusOut.split('\n').filter(Boolean).length : 0,
118
- };
119
- }
120
-
121
- async function collectPersona(): Promise<BolloonContext['persona']> {
122
- const home = process.env.HOME || os.homedir() || '/tmp';
123
- const raw = await safeReadFile(path.join(home, '.bolloon', 'persona.json'), 5000);
124
- if (!raw) return null;
125
- try {
126
- const p = JSON.parse(raw);
127
- return {
128
- name: String(p.name || 'unknown'),
129
- description: String(p.description || ''),
130
- personality: String(p.personality || ''),
131
- };
132
- } catch {
133
- return null;
134
- }
135
- }
136
-
137
- async function collectJudgmentsSummary(topN: number): Promise<BolloonContext['judgmentsSummary']> {
138
- // 用动态 import 避免循环依赖
139
- const { loadAllJudgments } = await import('../pi-ecosystem-judgment/human-value-store.js');
140
- let all: Awaited<ReturnType<typeof loadAllJudgments>> = [];
141
- try {
142
- all = await loadAllJudgments();
143
- } catch {
144
- return { total: 0, active: 0, superseded: 0, rejected: 0, topValues: [] };
145
- }
146
- const byStatus = { active: 0, superseded: 0, rejected: 0 };
147
- for (const j of all) {
148
- const s = (j.status ?? 'active') as 'active' | 'superseded' | 'rejected';
149
- if (s in byStatus) byStatus[s]++;
150
- }
151
- // 借用 getRelevantValues 算 top values (已经在 store 里)
152
- let topValues: BolloonContext['judgmentsSummary']['topValues'] = [];
153
- try {
154
- const { getRelevantValues } = await import('../pi-ecosystem-judgment/human-value-store.js');
155
- const values = await getRelevantValues('安全 代码 质量 测试 文档 用户'); // 通用 query
156
- topValues = values.slice(0, topN).map((v) => ({
157
- category: v.category,
158
- value: v.value,
159
- weight: v.weight,
160
- }));
161
- } catch { /* ignore */ }
162
- return {
163
- total: all.length,
164
- active: byStatus.active,
165
- superseded: byStatus.superseded,
166
- rejected: byStatus.rejected,
167
- topValues,
168
- };
169
- }
170
-
171
- async function collectSkills(): Promise<BolloonContext['skills']> {
172
- const home = process.env.HOME || os.homedir() || '/tmp';
173
- const userSkillsDir = path.join(home, '.bolloon', 'skills');
174
- const projectSkillsDir = path.join(process.cwd(), '.bolloon', 'skills');
175
- const out: BolloonContext['skills'] = [];
176
- const seen = new Set<string>();
177
- for (const dir of [userSkillsDir, projectSkillsDir]) {
178
- try {
179
- const entries = await fs.readdir(dir, { withFileTypes: true });
180
- for (const e of entries) {
181
- if (!e.isDirectory() || seen.has(e.name)) continue;
182
- seen.add(e.name);
183
- // 尝试读 SKILL.md 第一行作为描述
184
- let description = '';
185
- try {
186
- const skillMd = await fs.readFile(path.join(dir, e.name, 'SKILL.md'), 'utf-8');
187
- // 抓第一段非空非 frontmatter
188
- const lines = skillMd.split('\n');
189
- let inFrontmatter = false;
190
- for (const line of lines) {
191
- if (line.trim() === '---') { inFrontmatter = !inFrontmatter; continue; }
192
- if (inFrontmatter) continue;
193
- if (line.trim() && !line.startsWith('#')) {
194
- description = line.trim().substring(0, 120);
195
- break;
196
- }
197
- }
198
- } catch { /* ignore */ }
199
- out.push({ name: e.name, description });
200
- }
201
- } catch { /* dir 不存在正常 */ }
202
- }
203
- return out;
204
- }
205
-
206
- function collectEnv(): BolloonContext['env'] {
207
- let llmProvider = 'unknown';
208
- try {
209
- const home = process.env.HOME || os.homedir() || '/tmp';
210
- const cfg = require(path.join(home, '.bolloon', 'llm-config.json'));
211
- if (cfg && typeof cfg === 'object' && 'provider' in cfg) {
212
- llmProvider = String(cfg.provider);
213
- }
214
- } catch { /* ignore */ }
215
- return {
216
- os: `${os.platform()} ${os.release()}`,
217
- nodeVersion: process.version,
218
- llmProvider,
219
- };
220
- }
221
-
222
- async function collectPending(opts: CollectOptions): Promise<BolloonContext['pending']> {
223
- const home = process.env.HOME || os.homedir() || '/tmp';
224
- const goalsDir = path.join(home, '.bolloon', 'goals');
225
- const goals: string[] = [];
226
- try {
227
- const entries = await fs.readdir(goalsDir, { withFileTypes: true });
228
- for (const e of entries) {
229
- if (e.isFile()) goals.push(e.name);
230
- }
231
- } catch { /* dir 不存在 */ }
232
-
233
- // 扫 TODO/FIXME (限制 20 条避免太长)
234
- const todoScanDir = opts.todoScanDir ?? path.join(opts.cwd, 'src');
235
- const todos = await scanTodos(todoScanDir, 20);
236
-
237
- return { goals, todos };
238
- }
239
-
240
- async function scanTodos(dir: string, limit: number): Promise<BolloonContext['pending']['todos']> {
241
- const out: BolloonContext['pending']['todos'] = [];
242
- try {
243
- await walkDir(dir, async (filePath) => {
244
- if (!/\.(ts|js|tsx|jsx)$/.test(filePath)) return;
245
- // 跳过 dist / node_modules
246
- if (filePath.includes('/node_modules/') || filePath.includes('/dist/')) return;
247
- try {
248
- const content = await fs.readFile(filePath, 'utf-8');
249
- const lines = content.split('\n');
250
- for (let i = 0; i < lines.length; i++) {
251
- const line = lines[i];
252
- // 匹配 TODO / FIXME / XXX 注释
253
- const m = line.match(/(?:\/\/|\/\*|\*|<!--)\s*(TODO|FIXME|XXX|HACK)[::]?\s*(.+)/);
254
- if (m) {
255
- out.push({
256
- file: path.relative(dir, filePath),
257
- line: i + 1,
258
- text: m[2].trim().substring(0, 80),
259
- });
260
- if (out.length >= limit) return;
261
- }
262
- }
263
- } catch { /* ignore */ }
264
- });
265
- } catch { /* dir 不存在 */ }
266
- return out;
267
- }
268
-
269
- async function walkDir(dir: string, cb: (file: string) => Promise<void>): Promise<void> {
270
- let entries: import('fs').Dirent[];
271
- try {
272
- entries = await fs.readdir(dir, { withFileTypes: true });
273
- } catch {
274
- return;
275
- }
276
- for (const e of entries) {
277
- const full = path.join(dir, e.name);
278
- if (e.isDirectory()) {
279
- if (e.name === 'node_modules' || e.name === 'dist' || e.name.startsWith('.')) continue;
280
- await walkDir(full, cb);
281
- } else if (e.isFile()) {
282
- await cb(full);
283
- }
284
- }
285
- }
286
-
287
- // ============================================================
288
- // 主入口
289
- // ============================================================
290
-
291
- export async function collectBolloonContext(opts: CollectOptions): Promise<BolloonContext> {
292
- const {
293
- cwd,
294
- bolloonMdMaxBytes = 2000,
295
- gitCommitLimit = 5,
296
- topValuesLimit = 10,
297
- } = opts;
298
- // 并行收集 (除 judgments 因为要动态 import + 依赖其它)
299
- const [project, git, persona, skills, env, pending] = await Promise.all([
300
- collectProject(cwd, bolloonMdMaxBytes),
301
- collectGit(cwd, gitCommitLimit),
302
- collectPersona(),
303
- collectSkills(),
304
- Promise.resolve(collectEnv()),
305
- collectPending(opts),
306
- ]);
307
- // judgments 单独调 (内部 import)
308
- const judgmentsSummary = await collectJudgmentsSummary(topValuesLimit);
309
-
310
- return {
311
- projectRoot: cwd,
312
- projectName: project.projectName,
313
- bolloonMd: project.bolloonMd,
314
- git,
315
- persona,
316
- judgmentsSummary,
317
- skills,
318
- env,
319
- pending,
320
- collectedAt: new Date().toISOString(),
321
- };
322
- }
323
-
324
- // ============================================================
325
- // 24h 缓存 (跟类 B 一致)
326
- // ============================================================
327
-
328
- let cached: { at: number; ctx: BolloonContext; cwd: string } | null = null;
329
- const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
330
-
331
- export async function getCachedBolloonContext(opts: CollectOptions, force: boolean = false): Promise<BolloonContext> {
332
- if (!force && cached && cached.cwd === opts.cwd && Date.now() - cached.at < CACHE_TTL_MS) {
333
- return cached.ctx;
334
- }
335
- const ctx = await collectBolloonContext(opts);
336
- cached = { at: Date.now(), ctx, cwd: opts.cwd };
337
- return ctx;
338
- }
339
-
340
- export function clearBolloonContextCache(): void {
341
- cached = null;
342
- }
@@ -1,176 +0,0 @@
1
- /**
2
- * Lifecycle Hooks — SessionStart / Stop / PreToolUse
3
- *
4
- * 失败静默: 任意 hook 挂掉不抛错, 仅 console.warn.
5
- * 任何调用方都可以放心 await, 不会阻塞主对话.
6
- */
7
-
8
- import * as fs from 'fs/promises';
9
- import * as os from 'os';
10
- import * as path from 'path';
11
- import { getCachedBolloonContext, clearBolloonContextCache } from './context-collector.js';
12
- import { formatContextForSystemPrompt } from './project-context.js';
13
-
14
- // ============================================================
15
- // SessionStart
16
- // ============================================================
17
-
18
- export interface SessionStartOptions {
19
- /** channelId 暂时不传到 context (单 channel 维度, plan 范围) */
20
- channelId?: string;
21
- /** 工作目录, 默认 process.cwd() */
22
- cwd?: string;
23
- /** 强制重扫, 跳过 24h 缓存 */
24
- force?: boolean;
25
- /** system prompt 片段字符上限 */
26
- maxChars?: number;
27
- }
28
-
29
- export interface SessionStartResult {
30
- /** 拼到 system prompt 头部的 markdown 文本 */
31
- systemAddition: string;
32
- /** 收集耗时 ms */
33
- collectMs: number;
34
- /** 是否被截断 */
35
- truncated: boolean;
36
- }
37
-
38
- let lastSessionStartAt = 0;
39
- const MIN_INTERVAL_MS = 5000; // 同一进程 5s 内最多触发一次, 防止循环
40
-
41
- export async function onSessionStart(opts: SessionStartOptions = {}): Promise<SessionStartResult> {
42
- const start = Date.now();
43
- if (start - lastSessionStartAt < MIN_INTERVAL_MS) {
44
- // 限流: 返回空 (调用方已经有缓存, 不需要重算)
45
- return { systemAddition: '', collectMs: 0, truncated: false };
46
- }
47
- lastSessionStartAt = start;
48
-
49
- try {
50
- const ctx = await getCachedBolloonContext(
51
- { cwd: opts.cwd ?? process.cwd() },
52
- opts.force ?? false
53
- );
54
- let systemAddition = formatContextForSystemPrompt(ctx, { maxChars: opts.maxChars });
55
- // 在头部加 channel 标识 (供 LLM 知道当前对话归属)
56
- if (opts.channelId) {
57
- systemAddition = `# 当前 channel: ${opts.channelId}\n\n` + systemAddition;
58
- }
59
- return {
60
- systemAddition,
61
- collectMs: Date.now() - start,
62
- truncated: systemAddition.length > 0 && systemAddition.includes('截断模式'),
63
- };
64
- } catch (err) {
65
- console.warn('[lifecycle-hooks] onSessionStart failed (silent):', err);
66
- return { systemAddition: '', collectMs: Date.now() - start, truncated: false };
67
- }
68
- }
69
-
70
- export function clearSessionStartCache(): void {
71
- lastSessionStartAt = 0;
72
- clearBolloonContextCache();
73
- }
74
-
75
- // ============================================================
76
- // Stop
77
- // ============================================================
78
-
79
- export interface StopOptions {
80
- channelId: string;
81
- messages?: number;
82
- durationMs: number;
83
- /** 注入门使用过的 judgment ids (供审计) */
84
- usedJudgmentIds?: string[];
85
- }
86
-
87
- export interface StopResult {
88
- persisted: boolean;
89
- path: string | null;
90
- }
91
-
92
- const STOP_LOG = (os.homedir() || process.env.HOME || '/tmp') + '/.bolloon/sessions';
93
-
94
- /**
95
- * 把本次 session 摘要写 ~/.bolloon/sessions/<channelId>/last-stop.json
96
- * 不重复写完整 session 持久化 (已由 createWebServer 内的 saveSession 处理)
97
- */
98
- export async function onStop(opts: StopOptions): Promise<StopResult> {
99
- try {
100
- const dir = path.join(STOP_LOG, sanitizeChannelId(opts.channelId));
101
- await fs.mkdir(dir, { recursive: true });
102
- const file = path.join(dir, 'last-stop.json');
103
- const entry = {
104
- ts: new Date().toISOString(),
105
- channelId: opts.channelId,
106
- messages: opts.messages ?? 0,
107
- durationMs: opts.durationMs,
108
- usedJudgmentIds: opts.usedJudgmentIds ?? [],
109
- };
110
- await fs.writeFile(file, JSON.stringify(entry, null, 2), 'utf-8');
111
- return { persisted: true, path: file };
112
- } catch (err) {
113
- console.warn('[lifecycle-hooks] onStop failed (silent):', err);
114
- return { persisted: false, path: null };
115
- }
116
- }
117
-
118
- function sanitizeChannelId(id: string): string {
119
- // 防止路径穿越
120
- return id.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 64);
121
- }
122
-
123
- // ============================================================
124
- // PreToolUse (接口预留, 当前仅实现白名单 + 危险命令拦截)
125
- // ============================================================
126
-
127
- export interface PreToolUseOptions {
128
- tool: string;
129
- args: Record<string, unknown>;
130
- }
131
-
132
- export interface PreToolUseResult {
133
- allowed: boolean;
134
- reason?: string;
135
- }
136
-
137
- // 黑名单: 高危 shell 命令模式
138
- const DANGEROUS_PATTERNS: Array<{ re: RegExp; reason: string }> = [
139
- { re: /\brm\s+(-[a-z]*f[a-z]*\s+)?-[a-z]*r[a-z]*\s+\//, reason: '禁止递归删除根目录' },
140
- { re: /\bgit\s+push\s+.*--force\b/, reason: '禁止 force push' },
141
- { re: /\brm\s+-rf\s+~\//, reason: '禁止递归删除 home' },
142
- { re: /\bdd\s+if=.*\s+of=\/dev\//, reason: '禁止 dd 覆盖块设备' },
143
- { re: /\bcurl\s+.*\|\s*(ba)?sh\b/, reason: '禁止 curl|sh 直执行' },
144
- { re: />\s*\/dev\/sd[a-z]/, reason: '禁止写裸设备' },
145
- ];
146
-
147
- /**
148
- * PreToolUse: 当前实现"危险命令拦截" (黑名单)
149
- * 白名单机制未启用 (默认放行所有非黑名单)
150
- * PreToolUse hook 接入 pi-sdk.ts 的 ReAct 循环是下个迭代
151
- */
152
- export async function onPreToolUse(opts: PreToolUseOptions): Promise<PreToolUseResult> {
153
- try {
154
- // 仅检查 shell 类工具的命令字符串
155
- if (opts.tool === 'shell' || opts.tool === 'shell_exec' || opts.tool === 'bash') {
156
- const cmd = String(opts.args.command || opts.args.cmd || '');
157
- for (const { re, reason } of DANGEROUS_PATTERNS) {
158
- if (re.test(cmd)) {
159
- return { allowed: false, reason };
160
- }
161
- }
162
- }
163
- return { allowed: true };
164
- } catch (err) {
165
- console.warn('[lifecycle-hooks] onPreToolUse failed (silent):', err);
166
- return { allowed: true }; // 失败放行 (不阻塞)
167
- }
168
- }
169
-
170
- // ============================================================
171
- // 测试辅助: 获取 STOP_LOG 路径 (供测试覆盖路径)
172
- // ============================================================
173
-
174
- export function getStopLogPathForTest(): string {
175
- return STOP_LOG;
176
- }