@bolloon/bolloon-agent 0.1.36 → 0.1.38

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 (518) hide show
  1. package/package.json +2 -2
  2. package/.auto-evolve-calls +0 -1
  3. package/.last-auto-evolve-baseline +0 -1
  4. package/.playwright-mcp/page-2026-06-16T07-51-45-706Z.yml +0 -130
  5. package/.playwright-mcp/page-2026-06-16T07-56-44-116Z.yml +0 -131
  6. package/Bolloon.md +0 -144
  7. package/Dive-into/CITATION.cff +0 -17
  8. package/Dive-into/LICENSE +0 -25
  9. package/Dive-into/README.md +0 -598
  10. package/Dive-into/README_zh.md +0 -599
  11. package/Dive-into/assets/context.png +0 -0
  12. package/Dive-into/assets/extensibility.png +0 -0
  13. package/Dive-into/assets/iteration.png +0 -0
  14. package/Dive-into/assets/layered_architecture.png +0 -0
  15. package/Dive-into/assets/main_structure.png +0 -0
  16. package/Dive-into/assets/permission.png +0 -0
  17. package/Dive-into/assets/session_compact.png +0 -0
  18. package/Dive-into/assets/subagent.png +0 -0
  19. package/Dive-into/paper/Dive_into_Claude_Code.pdf +0 -0
  20. package/dist/agents/constraint-layer.js.map +0 -1
  21. package/dist/agents/pi-sdk.js.map +0 -1
  22. package/dist/agents/workflow-engine.js.map +0 -1
  23. package/dist/bollharness/src/index.js +0 -5
  24. package/dist/bollharness/src/scripts/checks/check_adr_plan_numbering.js +0 -6
  25. package/dist/bollharness/src/scripts/checks/check_api_types.js +0 -45
  26. package/dist/bollharness/src/scripts/checks/check_artifact_link.js +0 -146
  27. package/dist/bollharness/src/scripts/checks/check_bridge_deps.js +0 -6
  28. package/dist/bollharness/src/scripts/checks/check_bugfix_binding.js +0 -6
  29. package/dist/bollharness/src/scripts/checks/check_bugfix_binding_ci.js +0 -6
  30. package/dist/bollharness/src/scripts/checks/check_doc_file_references.js +0 -6
  31. package/dist/bollharness/src/scripts/checks/check_doc_freshness.js +0 -135
  32. package/dist/bollharness/src/scripts/checks/check_doc_links.js +0 -31
  33. package/dist/bollharness/src/scripts/checks/check_file_existence_claims.js +0 -6
  34. package/dist/bollharness/src/scripts/checks/check_fragment_integrity.js +0 -34
  35. package/dist/bollharness/src/scripts/checks/check_hook_installed.js +0 -63
  36. package/dist/bollharness/src/scripts/checks/check_issue_closure.js +0 -41
  37. package/dist/bollharness/src/scripts/checks/check_mcp_parity.js +0 -6
  38. package/dist/bollharness/src/scripts/checks/check_security.js +0 -48
  39. package/dist/bollharness/src/scripts/checks/check_skill_parity.js +0 -6
  40. package/dist/bollharness/src/scripts/checks/check_versions.js +0 -6
  41. package/dist/bollharness/src/scripts/checks/finding.js +0 -13
  42. package/dist/bollharness/src/scripts/checks/next_decision_number.js +0 -20
  43. package/dist/bollharness/src/scripts/checks/regenerate_magic_docs.js +0 -6
  44. package/dist/bollharness/src/scripts/ci/detect_rebaseline_triggers.js +0 -8
  45. package/dist/bollharness/src/scripts/ci/scan_subprocess_cfg.js +0 -8
  46. package/dist/bollharness/src/scripts/ci/scan_verify_artifacts.js +0 -8
  47. package/dist/bollharness/src/scripts/ci/scan_yaml_schema.js +0 -8
  48. package/dist/bollharness/src/scripts/context_router.js +0 -67
  49. package/dist/bollharness/src/scripts/deploy-guard.js +0 -157
  50. package/dist/bollharness/src/scripts/guard-feedback.js +0 -192
  51. package/dist/bollharness/src/scripts/guard_router.js +0 -158
  52. package/dist/bollharness/src/scripts/hooks/_hook_output.js +0 -6
  53. package/dist/bollharness/src/scripts/hooks/auto-python3.js +0 -6
  54. package/dist/bollharness/src/scripts/hooks/deploy-progress-on-session-end.js +0 -6
  55. package/dist/bollharness/src/scripts/hooks/failure-analyzer.js +0 -6
  56. package/dist/bollharness/src/scripts/hooks/gate-judgment-inject.js +0 -92
  57. package/dist/bollharness/src/scripts/hooks/gate-transition-judgment.js +0 -63
  58. package/dist/bollharness/src/scripts/hooks/inbox-ack.js +0 -6
  59. package/dist/bollharness/src/scripts/hooks/inbox-inject-on-start.js +0 -6
  60. package/dist/bollharness/src/scripts/hooks/inbox-validate.js +0 -6
  61. package/dist/bollharness/src/scripts/hooks/inbox-write-ledger.js +0 -6
  62. package/dist/bollharness/src/scripts/hooks/initializer-agent.js +0 -6
  63. package/dist/bollharness/src/scripts/hooks/loop-detection.js +0 -73
  64. package/dist/bollharness/src/scripts/hooks/owner-guard.js +0 -6
  65. package/dist/bollharness/src/scripts/hooks/precompact.js +0 -6
  66. package/dist/bollharness/src/scripts/hooks/review-agent-gatekeeper.js +0 -6
  67. package/dist/bollharness/src/scripts/hooks/risk-tracker.js +0 -108
  68. package/dist/bollharness/src/scripts/hooks/sanitize-on-read.js +0 -6
  69. package/dist/bollharness/src/scripts/hooks/session-reflection.js +0 -7
  70. package/dist/bollharness/src/scripts/hooks/session-start-magic-docs.js +0 -7
  71. package/dist/bollharness/src/scripts/hooks/session-start-reset-risk.js +0 -7
  72. package/dist/bollharness/src/scripts/hooks/session-start-toolkit-reminder.js +0 -7
  73. package/dist/bollharness/src/scripts/hooks/stop-evaluator.js +0 -157
  74. package/dist/bollharness/src/scripts/hooks/tool-call-counter.js +0 -6
  75. package/dist/bollharness/src/scripts/hooks/trace-analyzer.js +0 -10
  76. package/dist/bollharness/src/scripts/install/install-trust-token.js +0 -7
  77. package/dist/bollharness/src/scripts/install/multi_project_registry.js +0 -9
  78. package/dist/bollharness/src/scripts/install/phase2_auto.js +0 -21
  79. package/dist/bollharness/src/scripts/install/pre_commit_installer.js +0 -6
  80. package/dist/bollharness/src/scripts/install/tier_selector.js +0 -7
  81. package/dist/bollharness/src/scripts/install/transcript_miner.js +0 -7
  82. package/dist/bollharness/src/scripts/lib/claim_patterns.js +0 -10
  83. package/dist/bollharness/src/scripts/lib/sanitize_patterns.js +0 -12
  84. package/dist/bollharness/src/scripts/sanitize.js +0 -6
  85. package/dist/bollharness-integration/context-router-judgment.js.map +0 -1
  86. package/dist/bollharness-integration/context-router.js.map +0 -1
  87. package/dist/bollharness-integration/gate-state-machine.js.map +0 -1
  88. package/dist/bollharness-integration/gate-transition-hooks.js.map +0 -1
  89. package/dist/bollharness-integration/guard-checker.js.map +0 -1
  90. package/dist/bollharness-integration/index.js.map +0 -1
  91. package/dist/bollharness-integration/integration.js.map +0 -1
  92. package/dist/bollharness-integration/llm/pi-ai.d.ts +0 -60
  93. package/dist/bollharness-integration/pi-ecosystem-colony/index.d.ts +0 -153
  94. package/dist/bollharness-integration/pi-ecosystem-goals/index.d.ts +0 -136
  95. package/dist/bollharness-integration/pi-ecosystem-judgment/decision.d.ts +0 -117
  96. package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.d.ts +0 -78
  97. package/dist/bollharness-integration/pi-ecosystem-judgment/index.d.ts +0 -139
  98. package/dist/bollharness-integration/pi-ecosystem-mcp/index.d.ts +0 -127
  99. package/dist/bollharness-integration/pi-ecosystem-subagents/index.d.ts +0 -95
  100. package/dist/bollharness-integration/skill-adapter.js.map +0 -1
  101. package/dist/constraint-runtime/src/_archive_helper.js +0 -9
  102. package/dist/constraint-runtime/src/agent/coordinator.js +0 -48
  103. package/dist/constraint-runtime/src/agent/index.js +0 -1
  104. package/dist/constraint-runtime/src/assistant/index.js +0 -12
  105. package/dist/constraint-runtime/src/bootstrap/index.js +0 -12
  106. package/dist/constraint-runtime/src/bootstrap_graph.js +0 -13
  107. package/dist/constraint-runtime/src/bridge/index.js +0 -12
  108. package/dist/constraint-runtime/src/buddy/index.js +0 -12
  109. package/dist/constraint-runtime/src/cli/index.js +0 -12
  110. package/dist/constraint-runtime/src/command_graph.js +0 -10
  111. package/dist/constraint-runtime/src/commands.js +0 -60
  112. package/dist/constraint-runtime/src/components/index.js +0 -12
  113. package/dist/constraint-runtime/src/constants/index.js +0 -12
  114. package/dist/constraint-runtime/src/constraint/budget.js +0 -22
  115. package/dist/constraint-runtime/src/constraint/budget.js.map +0 -1
  116. package/dist/constraint-runtime/src/constraint/index.js +0 -2
  117. package/dist/constraint-runtime/src/constraint/permission.js +0 -20
  118. package/dist/constraint-runtime/src/constraint/permission.js.map +0 -1
  119. package/dist/constraint-runtime/src/context.js +0 -30
  120. package/dist/constraint-runtime/src/coordinator/index.js +0 -12
  121. package/dist/constraint-runtime/src/cost_hook.js +0 -4
  122. package/dist/constraint-runtime/src/cost_tracker.js +0 -8
  123. package/dist/constraint-runtime/src/deferred_init.js +0 -10
  124. package/dist/constraint-runtime/src/direct_modes.js +0 -6
  125. package/dist/constraint-runtime/src/dynamic-tool-loader.js +0 -85
  126. package/dist/constraint-runtime/src/entrypoints/index.js +0 -12
  127. package/dist/constraint-runtime/src/execution_registry.js +0 -44
  128. package/dist/constraint-runtime/src/history.js +0 -9
  129. package/dist/constraint-runtime/src/hooks/index.js +0 -12
  130. package/dist/constraint-runtime/src/index.js +0 -26
  131. package/dist/constraint-runtime/src/ink.js +0 -4
  132. package/dist/constraint-runtime/src/keybindings/index.js +0 -12
  133. package/dist/constraint-runtime/src/memdir/index.js +0 -12
  134. package/dist/constraint-runtime/src/migrations/index.js +0 -12
  135. package/dist/constraint-runtime/src/models.js +0 -1
  136. package/dist/constraint-runtime/src/models.js.map +0 -1
  137. package/dist/constraint-runtime/src/moreright/index.js +0 -12
  138. package/dist/constraint-runtime/src/native_ts/index.js +0 -12
  139. package/dist/constraint-runtime/src/output_styles/index.js +0 -12
  140. package/dist/constraint-runtime/src/parity_audit.js +0 -12
  141. package/dist/constraint-runtime/src/plugins/index.js +0 -12
  142. package/dist/constraint-runtime/src/port_manifest.js +0 -11
  143. package/dist/constraint-runtime/src/prefetch.js +0 -9
  144. package/dist/constraint-runtime/src/query.js +0 -1
  145. package/dist/constraint-runtime/src/remote/index.js +0 -12
  146. package/dist/constraint-runtime/src/remote_runtime.js +0 -9
  147. package/dist/constraint-runtime/src/runtime/index.js +0 -1
  148. package/dist/constraint-runtime/src/runtime/session.js +0 -35
  149. package/dist/constraint-runtime/src/schemas/index.js +0 -12
  150. package/dist/constraint-runtime/src/screens/index.js +0 -12
  151. package/dist/constraint-runtime/src/server/index.js +0 -12
  152. package/dist/constraint-runtime/src/services/index.js +0 -12
  153. package/dist/constraint-runtime/src/session_store.js +0 -22
  154. package/dist/constraint-runtime/src/setup.js +0 -30
  155. package/dist/constraint-runtime/src/skills/index.js +0 -1
  156. package/dist/constraint-runtime/src/skills/skill-registry.js +0 -28
  157. package/dist/constraint-runtime/src/state/index.js +0 -12
  158. package/dist/constraint-runtime/src/system_init.js +0 -20
  159. package/dist/constraint-runtime/src/thinking/engine.js +0 -42
  160. package/dist/constraint-runtime/src/thinking/index.js +0 -1
  161. package/dist/constraint-runtime/src/tool_pool.js +0 -8
  162. package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +0 -7
  163. package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +0 -7
  164. package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +0 -7
  165. package/dist/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +0 -6
  166. package/dist/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +0 -6
  167. package/dist/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +0 -5
  168. package/dist/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +0 -6
  169. package/dist/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +0 -4
  170. package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +0 -6
  171. package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +0 -8
  172. package/dist/constraint-runtime/src/tools/SafeSDK/deploySafe.js +0 -6
  173. package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +0 -6
  174. package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +0 -6
  175. package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +0 -6
  176. package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +0 -6
  177. package/dist/constraint-runtime/src/tools/WalletTools/autoPay.js +0 -29
  178. package/dist/constraint-runtime/src/tools/WalletTools/createWallet.js +0 -10
  179. package/dist/constraint-runtime/src/tools/WalletTools/getBalance.js +0 -13
  180. package/dist/constraint-runtime/src/tools/WalletTools/importWallet.js +0 -22
  181. package/dist/constraint-runtime/src/tools/WalletTools/sendTransaction.js +0 -25
  182. package/dist/constraint-runtime/src/tools/WalletTools/signMessage.js +0 -10
  183. package/dist/constraint-runtime/src/tools/WalletTools/transferToken.js +0 -25
  184. package/dist/constraint-runtime/src/tools.js +0 -80
  185. package/dist/constraint-runtime/src/transcript.js +0 -19
  186. package/dist/constraint-runtime/src/types/index.js +0 -12
  187. package/dist/constraint-runtime/src/upstream_proxy/index.js +0 -12
  188. package/dist/constraint-runtime/src/utils/index.js +0 -12
  189. package/dist/constraint-runtime/src/vim/index.js +0 -12
  190. package/dist/constraint-runtime/src/voice/index.js +0 -12
  191. package/dist/constraints/index.js.map +0 -1
  192. package/dist/documents/reader.js.map +0 -1
  193. package/dist/llm/config-store.js.map +0 -1
  194. package/dist/llm/pi-ai.js.map +0 -1
  195. package/dist/network/agent-network.js.map +0 -1
  196. package/dist/network/iroh-integration.js.map +0 -1
  197. package/dist/network/iroh-transport.js.map +0 -1
  198. package/dist/network/p2p.js.map +0 -1
  199. package/dist/network/storage/adapters/json-adapter.js.map +0 -1
  200. package/dist/pi-ecosystem-colony/index.js.map +0 -1
  201. package/dist/pi-ecosystem-goals/index.js.map +0 -1
  202. package/dist/pi-ecosystem-judgment/decision.js.map +0 -1
  203. package/dist/pi-ecosystem-judgment/distillation.js.map +0 -1
  204. package/dist/pi-ecosystem-judgment/human-value-store.js.map +0 -1
  205. package/dist/pi-ecosystem-judgment/index.js.map +0 -1
  206. package/dist/pi-ecosystem-judgment/value-injection.js.map +0 -1
  207. package/dist/pi-ecosystem-mcp/index.js.map +0 -1
  208. package/dist/pi-ecosystem-subagents/index.js.map +0 -1
  209. package/dist/social/ant-colony/AdaptiveHeartbeat.js.map +0 -1
  210. package/dist/social/ant-colony/PheromoneEngine.js.map +0 -1
  211. package/dist/social/ant-colony/types.js.map +0 -1
  212. package/dist/social/channels/ChannelManager.js.map +0 -1
  213. package/dist/social/channels/DiapChannelBridge.js.map +0 -1
  214. package/dist/social/channels/InterestMatcher.js.map +0 -1
  215. package/dist/social/channels/types.js.map +0 -1
  216. package/dist/social/global-shared-context.js.map +0 -1
  217. package/dist/social/heartbeat.js.map +0 -1
  218. package/lefthook.yml +0 -33
  219. package/scripts/auto-evolve-loop.ts +0 -481
  220. package/scripts/build-web.ts +0 -116
  221. package/scripts/diff-reviewer.ts +0 -159
  222. package/scripts/validate-system-prompt.ts +0 -142
  223. package/scripts/weekly-report.ts +0 -364
  224. package/src/agents/agent-manifest-protocol.ts +0 -117
  225. package/src/agents/constraint-layer.ts +0 -309
  226. package/src/agents/iroh-secret.ts +0 -32
  227. package/src/agents/p2p-chat-tools.ts +0 -383
  228. package/src/agents/p2p-document-tools.ts +0 -347
  229. package/src/agents/permission-mode.ts +0 -127
  230. package/src/agents/pi-sdk.ts +0 -2895
  231. package/src/agents/pre-tool-validator.ts +0 -213
  232. package/src/agents/protocol.ts +0 -398
  233. package/src/agents/shell-guard.ts +0 -417
  234. package/src/agents/shell-tool.ts +0 -103
  235. package/src/agents/skill-loader.ts +0 -202
  236. package/src/agents/subagent-manager.ts +0 -553
  237. package/src/agents/workflow-engine.ts +0 -332
  238. package/src/agents/workflow-pivot-loop.ts +0 -766
  239. package/src/bollharness/.sanitize-report.json +0 -13
  240. package/src/bollharness/CLAUDE.md +0 -73
  241. package/src/bollharness/LICENSE +0 -21
  242. package/src/bollharness/README.md +0 -143
  243. package/src/bollharness/README.zh-CN.md +0 -131
  244. package/src/bollharness/package.json +0 -20
  245. package/src/bollharness/reference/SOURCE-COMMIT.txt +0 -3
  246. package/src/bollharness/reference/boll-reference/scripts/hooks/.sanitize-report.json +0 -12
  247. package/src/bollharness/reference/boll-reference/scripts/hooks/find-boll-root.sh +0 -27
  248. package/src/bollharness/reference/boll-reference/scripts/hooks/precompact.sh +0 -57
  249. package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +0 -57
  250. package/src/bollharness/schemas/metrics-jsonl-allowlist.json +0 -67
  251. package/src/bollharness/scripts/checks/next_decision_number.sh +0 -48
  252. package/src/bollharness/scripts/ci/count-components.sh +0 -65
  253. package/src/bollharness/scripts/context-fragments/artifact-linkage.md +0 -14
  254. package/src/bollharness/scripts/context-fragments/auth-consumers.md +0 -17
  255. package/src/bollharness/scripts/context-fragments/bridge-constitution.md +0 -13
  256. package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +0 -18
  257. package/src/bollharness/scripts/context-fragments/closure-checklist.md +0 -13
  258. package/src/bollharness/scripts/context-fragments/contract-consumers.md +0 -15
  259. package/src/bollharness/scripts/context-fragments/db-shared-structures.md +0 -15
  260. package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +0 -19
  261. package/src/bollharness/scripts/context-fragments/general-dev-principles.md +0 -11
  262. package/src/bollharness/scripts/context-fragments/issue-first.md +0 -8
  263. package/src/bollharness/scripts/context-fragments/mcp-parity.md +0 -16
  264. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +0 -108
  265. package/src/bollharness/scripts/context-fragments/protocol-consumers.md +0 -15
  266. package/src/bollharness/scripts/context-fragments/run-events-consumers.md +0 -15
  267. package/src/bollharness/scripts/context-fragments/scene-fidelity.md +0 -13
  268. package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +0 -15
  269. package/src/bollharness/scripts/context-fragments/two-language.md +0 -15
  270. package/src/bollharness/scripts/context-fragments/version-sources.md +0 -14
  271. package/src/bollharness/scripts/hooks/find-project-root.sh +0 -47
  272. package/src/bollharness/scripts/hooks/inbox-poll.sh +0 -78
  273. package/src/bollharness/scripts/hooks/precompact.sh +0 -56
  274. package/src/bollharness/scripts/hooks/stop-evaluator.md +0 -83
  275. package/src/bollharness/scripts/sync-from-upstream.sh +0 -281
  276. package/src/bollharness/src/index.ts +0 -5
  277. package/src/bollharness/src/scripts/checks/check_adr_plan_numbering.ts +0 -11
  278. package/src/bollharness/src/scripts/checks/check_api_types.ts +0 -52
  279. package/src/bollharness/src/scripts/checks/check_artifact_link.ts +0 -156
  280. package/src/bollharness/src/scripts/checks/check_bridge_deps.ts +0 -11
  281. package/src/bollharness/src/scripts/checks/check_bugfix_binding.ts +0 -11
  282. package/src/bollharness/src/scripts/checks/check_bugfix_binding_ci.ts +0 -11
  283. package/src/bollharness/src/scripts/checks/check_doc_file_references.ts +0 -11
  284. package/src/bollharness/src/scripts/checks/check_doc_freshness.ts +0 -141
  285. package/src/bollharness/src/scripts/checks/check_doc_links.ts +0 -36
  286. package/src/bollharness/src/scripts/checks/check_file_existence_claims.ts +0 -11
  287. package/src/bollharness/src/scripts/checks/check_fragment_integrity.ts +0 -40
  288. package/src/bollharness/src/scripts/checks/check_hook_installed.ts +0 -70
  289. package/src/bollharness/src/scripts/checks/check_issue_closure.ts +0 -51
  290. package/src/bollharness/src/scripts/checks/check_mcp_parity.ts +0 -11
  291. package/src/bollharness/src/scripts/checks/check_security.ts +0 -54
  292. package/src/bollharness/src/scripts/checks/check_skill_parity.ts +0 -11
  293. package/src/bollharness/src/scripts/checks/check_versions.ts +0 -11
  294. package/src/bollharness/src/scripts/checks/finding.ts +0 -35
  295. package/src/bollharness/src/scripts/checks/next_decision_number.ts +0 -24
  296. package/src/bollharness/src/scripts/checks/regenerate_magic_docs.ts +0 -11
  297. package/src/bollharness/src/scripts/ci/detect_rebaseline_triggers.ts +0 -14
  298. package/src/bollharness/src/scripts/ci/scan_subprocess_cfg.ts +0 -14
  299. package/src/bollharness/src/scripts/ci/scan_verify_artifacts.ts +0 -14
  300. package/src/bollharness/src/scripts/ci/scan_yaml_schema.ts +0 -14
  301. package/src/bollharness/src/scripts/context_router.ts +0 -76
  302. package/src/bollharness/src/scripts/deploy-guard.ts +0 -182
  303. package/src/bollharness/src/scripts/guard-feedback.ts +0 -215
  304. package/src/bollharness/src/scripts/guard_router.ts +0 -194
  305. package/src/bollharness/src/scripts/hooks/_hook_output.js +0 -3
  306. package/src/bollharness/src/scripts/hooks/_hook_output.ts +0 -11
  307. package/src/bollharness/src/scripts/hooks/auto-python3.ts +0 -10
  308. package/src/bollharness/src/scripts/hooks/deploy-progress-on-session-end.ts +0 -10
  309. package/src/bollharness/src/scripts/hooks/failure-analyzer.ts +0 -10
  310. package/src/bollharness/src/scripts/hooks/gate-judgment-inject.ts +0 -111
  311. package/src/bollharness/src/scripts/hooks/gate-transition-judgment.ts +0 -74
  312. package/src/bollharness/src/scripts/hooks/inbox-ack.ts +0 -10
  313. package/src/bollharness/src/scripts/hooks/inbox-inject-on-start.ts +0 -10
  314. package/src/bollharness/src/scripts/hooks/inbox-validate.ts +0 -10
  315. package/src/bollharness/src/scripts/hooks/inbox-write-ledger.ts +0 -10
  316. package/src/bollharness/src/scripts/hooks/initializer-agent.ts +0 -10
  317. package/src/bollharness/src/scripts/hooks/loop-detection.ts +0 -83
  318. package/src/bollharness/src/scripts/hooks/owner-guard.ts +0 -10
  319. package/src/bollharness/src/scripts/hooks/precompact.ts +0 -10
  320. package/src/bollharness/src/scripts/hooks/review-agent-gatekeeper.ts +0 -10
  321. package/src/bollharness/src/scripts/hooks/risk-tracker.ts +0 -121
  322. package/src/bollharness/src/scripts/hooks/sanitize-on-read.ts +0 -10
  323. package/src/bollharness/src/scripts/hooks/session-reflection.ts +0 -12
  324. package/src/bollharness/src/scripts/hooks/session-start-magic-docs.ts +0 -12
  325. package/src/bollharness/src/scripts/hooks/session-start-reset-risk.ts +0 -12
  326. package/src/bollharness/src/scripts/hooks/session-start-toolkit-reminder.ts +0 -12
  327. package/src/bollharness/src/scripts/hooks/stop-evaluator.ts +0 -164
  328. package/src/bollharness/src/scripts/hooks/tool-call-counter.ts +0 -10
  329. package/src/bollharness/src/scripts/hooks/trace-analyzer.ts +0 -14
  330. package/src/bollharness/src/scripts/install/install-trust-token.ts +0 -13
  331. package/src/bollharness/src/scripts/install/multi_project_registry.ts +0 -13
  332. package/src/bollharness/src/scripts/install/phase2_auto.ts +0 -28
  333. package/src/bollharness/src/scripts/install/pre_commit_installer.ts +0 -10
  334. package/src/bollharness/src/scripts/install/tier_selector.ts +0 -10
  335. package/src/bollharness/src/scripts/install/transcript_miner.ts +0 -13
  336. package/src/bollharness/src/scripts/lib/claim_patterns.ts +0 -11
  337. package/src/bollharness/src/scripts/lib/sanitize_patterns.ts +0 -13
  338. package/src/bollharness/src/scripts/sanitize.ts +0 -9
  339. package/src/bollharness/templates/persona/default.json +0 -19
  340. package/src/bollharness/templates/scaffold/.gitignore.append +0 -16
  341. package/src/bollharness/templates/scaffold/CLAUDE.md +0 -89
  342. package/src/bollharness-integration/channel-judgment-engine.ts +0 -634
  343. package/src/bollharness-integration/context-chain-router.ts +0 -474
  344. package/src/bollharness-integration/context-router-judgment.ts +0 -339
  345. package/src/bollharness-integration/context-router.ts +0 -583
  346. package/src/bollharness-integration/gate-state-machine.ts +0 -444
  347. package/src/bollharness-integration/gate-transition-hooks.ts +0 -137
  348. package/src/bollharness-integration/guard-checker.ts +0 -451
  349. package/src/bollharness-integration/index.ts +0 -195
  350. package/src/bollharness-integration/integration.ts +0 -538
  351. package/src/bollharness-integration/judgment-prompts.yaml +0 -535
  352. package/src/bollharness-integration/llm-judgment-engine.ts +0 -712
  353. package/src/bollharness-integration/skill-adapter.ts +0 -646
  354. package/src/bootstrap/bootstrap.ts +0 -135
  355. package/src/bootstrap/context-collector.ts +0 -371
  356. package/src/bootstrap/context-hierarchy.ts +0 -283
  357. package/src/bootstrap/lifecycle-hooks.ts +0 -289
  358. package/src/bootstrap/project-context.ts +0 -171
  359. package/src/cli/interface.ts +0 -211
  360. package/src/cli-entry.ts +0 -304
  361. package/src/constraints/index.ts +0 -6
  362. package/src/context-compaction/auto-compact.ts +0 -153
  363. package/src/context-compaction/budget-gate.ts +0 -32
  364. package/src/context-compaction/budget-reduce.ts +0 -37
  365. package/src/context-compaction/context-collapse.ts +0 -72
  366. package/src/context-compaction/index.ts +0 -24
  367. package/src/context-compaction/microcompact.ts +0 -54
  368. package/src/context-compaction/pipeline.ts +0 -133
  369. package/src/context-compaction/snip.ts +0 -51
  370. package/src/context-compaction/token-estimator.ts +0 -36
  371. package/src/context-compaction/types.ts +0 -99
  372. package/src/documents/reader.ts +0 -85
  373. package/src/documents/store.ts +0 -252
  374. package/src/electron-preload.ts +0 -25
  375. package/src/electron.ts +0 -200
  376. package/src/heartbeat/DaemonManager.ts +0 -283
  377. package/src/heartbeat/HealthMonitor.ts +0 -317
  378. package/src/heartbeat/StartupVerifier.ts +0 -223
  379. package/src/heartbeat/Watchdog.ts +0 -208
  380. package/src/heartbeat/index.ts +0 -109
  381. package/src/heartbeat/self-improve-bus.ts +0 -110
  382. package/src/heartbeat/types.ts +0 -82
  383. package/src/index.ts +0 -1724
  384. package/src/llm/audio-config-store.ts +0 -246
  385. package/src/llm/config-store.ts +0 -400
  386. package/src/llm/llm-judgment-client.ts +0 -471
  387. package/src/llm/pi-ai.ts +0 -653
  388. package/src/llm/system-prompt/health.ts +0 -159
  389. package/src/llm/system-prompt/layers/channel/local.md +0 -14
  390. package/src/llm/system-prompt/layers/channel/p2p-agent.md +0 -18
  391. package/src/llm/system-prompt/layers/channel/p2p-visitor.md +0 -19
  392. package/src/llm/system-prompt/layers/core/artifacts_storage.md +0 -89
  393. package/src/llm/system-prompt/layers/core/evenhandedness.md +0 -21
  394. package/src/llm/system-prompt/layers/core/hibs_reminders.md +0 -15
  395. package/src/llm/system-prompt/layers/core/identity.md +0 -37
  396. package/src/llm/system-prompt/layers/core/knowledge.md +0 -17
  397. package/src/llm/system-prompt/layers/core/memory_system.md +0 -12
  398. package/src/llm/system-prompt/layers/core/network_filesystem.md +0 -28
  399. package/src/llm/system-prompt/layers/core/refusal.md +0 -37
  400. package/src/llm/system-prompt/layers/core/tone.md +0 -31
  401. package/src/llm/system-prompt/layers/core/tools.thin.md +0 -13
  402. package/src/llm/system-prompt/layers/core/wellbeing.md +0 -41
  403. package/src/llm/system-prompt/layers/role/architect.md +0 -20
  404. package/src/llm/system-prompt/layers/role/expert.md +0 -19
  405. package/src/llm/system-prompt/layers/role/implementer.md +0 -15
  406. package/src/llm/system-prompt/layers/role/security.md +0 -15
  407. package/src/llm/system-prompt/layers/tool/artifacts.md +0 -72
  408. package/src/llm/system-prompt/layers/tool/bash.md +0 -25
  409. package/src/llm/system-prompt/layers/tool/hibs_api.md +0 -171
  410. package/src/llm/system-prompt/layers/tool/image_search.md +0 -70
  411. package/src/llm/system-prompt/layers/tool/manifest.md +0 -89
  412. package/src/llm/system-prompt/layers/tool/mcp_apps.md +0 -53
  413. package/src/llm/system-prompt/layers/tool/web_search.md +0 -83
  414. package/src/llm/system-prompt/registry.ts +0 -325
  415. package/src/llm/system-prompt/strip-hibsml.ts +0 -52
  416. package/src/llm/tool-manifest/ask_user_input.ts +0 -37
  417. package/src/llm/tool-manifest/bash.ts +0 -25
  418. package/src/llm/tool-manifest/create_file.ts +0 -26
  419. package/src/llm/tool-manifest/fetch_sports_data.ts +0 -28
  420. package/src/llm/tool-manifest/image_search.ts +0 -26
  421. package/src/llm/tool-manifest/index.ts +0 -88
  422. package/src/llm/tool-manifest/mcp.ts +0 -46
  423. package/src/llm/tool-manifest/message_compose.ts +0 -33
  424. package/src/llm/tool-manifest/places.ts +0 -86
  425. package/src/llm/tool-manifest/present_files.ts +0 -23
  426. package/src/llm/tool-manifest/recipe.ts +0 -42
  427. package/src/llm/tool-manifest/recommend_apps.ts +0 -25
  428. package/src/llm/tool-manifest/str_replace.ts +0 -29
  429. package/src/llm/tool-manifest/types.ts +0 -52
  430. package/src/llm/tool-manifest/view.ts +0 -26
  431. package/src/llm/tool-manifest/weather.ts +0 -29
  432. package/src/llm/tool-manifest/web.ts +0 -54
  433. package/src/llm/video-config-store.ts +0 -257
  434. package/src/network/agent-network.ts +0 -800
  435. package/src/network/hybrid-messenger.ts +0 -199
  436. package/src/network/iroh-bootstrap.ts +0 -57
  437. package/src/network/iroh-discovery.ts +0 -208
  438. package/src/network/iroh-integration.ts +0 -158
  439. package/src/network/iroh-transport.ts +0 -637
  440. package/src/network/known-peers.ts +0 -102
  441. package/src/network/p2p-direct.ts +0 -262
  442. package/src/network/p2p-secret.ts +0 -153
  443. package/src/network/p2p.ts +0 -964
  444. package/src/network/source-intent-broadcaster.ts +0 -242
  445. package/src/network/source-intent.ts +0 -167
  446. package/src/network/storage/adapters/json-adapter.ts +0 -454
  447. package/src/network/storage/index.ts +0 -203
  448. package/src/network/storage/types.ts +0 -166
  449. package/src/security/builtin-guards.ts +0 -162
  450. package/src/security/context-router-tool.ts +0 -122
  451. package/src/security/input-scanner.ts +0 -287
  452. package/src/security/react-harness.ts +0 -177
  453. package/src/security/tool-gate.ts +0 -294
  454. package/src/social/ant-colony/index.js +0 -19
  455. package/src/social/channels/ChannelManager.ts +0 -485
  456. package/src/social/channels/DiapChannelBridge.ts +0 -501
  457. package/src/social/channels/InterestMatcher.ts +0 -189
  458. package/src/social/channels/agent-workflow-config.json +0 -214
  459. package/src/social/channels/agent-workflow-config.yaml +0 -334
  460. package/src/social/channels/channel-agent-session.ts +0 -407
  461. package/src/social/channels/channel-heartbeat-agent.ts +0 -622
  462. package/src/social/channels/diap-doc-parser.ts +0 -282
  463. package/src/social/channels/harness-workflow-integrator.ts +0 -594
  464. package/src/social/channels/index.ts +0 -22
  465. package/src/social/channels/types.ts +0 -115
  466. package/src/social/global-shared-context.ts +0 -506
  467. package/src/social/heartbeat.ts +0 -1057
  468. package/src/social/persona/enhanced-persona.ts +0 -359
  469. package/src/types.d.ts +0 -12
  470. package/src/utils/auto-evolve-policy.ts +0 -138
  471. package/src/utils/auto-update.ts +0 -482
  472. package/src/utils/clamp.ts +0 -5
  473. package/src/web/agent-delegate-server.ts +0 -148
  474. package/src/web/api-config.html +0 -520
  475. package/src/web/client.js +0 -2352
  476. package/src/web/client.ts +0 -4326
  477. package/src/web/components/p2p/P2PModal.tsx +0 -416
  478. package/src/web/components/p2p/index.ts +0 -566
  479. package/src/web/components/p2p/index.tsx +0 -297
  480. package/src/web/components/p2p/p2p-connection.ts +0 -338
  481. package/src/web/components/p2p/p2p-identity.ts +0 -92
  482. package/src/web/components/p2p/p2p-manager.ts +0 -147
  483. package/src/web/components/p2p/p2p-messages.ts +0 -219
  484. package/src/web/components/p2p/p2p-modal.ts +0 -685
  485. package/src/web/components/p2p/p2p-store-memory.ts +0 -162
  486. package/src/web/components/p2p/p2p-tools.ts +0 -315
  487. package/src/web/components/p2p/types.ts +0 -170
  488. package/src/web/components/wallet-viem.mjs +0 -118
  489. package/src/web/design.md +0 -99
  490. package/src/web/icons/apple-touch-icon.png +0 -0
  491. package/src/web/icons/favicon-16x16.png +0 -0
  492. package/src/web/icons/favicon-192x192.png +0 -0
  493. package/src/web/icons/favicon-32x32.png +0 -0
  494. package/src/web/icons/favicon-48x48.png +0 -0
  495. package/src/web/icons/favicon-512x512.png +0 -0
  496. package/src/web/icons/favicon.icns +0 -0
  497. package/src/web/icons/favicon.ico +0 -0
  498. package/src/web/icons/icon.png +0 -0
  499. package/src/web/icons/image.png +0 -0
  500. package/src/web/index.html +0 -373
  501. package/src/web/iroh-delegate-transport.ts +0 -139
  502. package/src/web/manifest.json +0 -21
  503. package/src/web/server.ts +0 -5731
  504. package/src/web/style.css +0 -4737
  505. package/src/web/ui/message-renderer.ts +0 -540
  506. package/src/web/ui/step-timeline.ts +0 -394
  507. package/staging/auto-evolve/clean-001/.review-verdict +0 -9
  508. package/staging/auto-evolve/clean-001/clean-001.patch +0 -14
  509. package/staging/auto-evolve/e2e-001/.patch-id +0 -1
  510. package/staging/auto-evolve/e2e-001/.review-verdict +0 -12
  511. package/staging/auto-evolve/e2e-001/e2e-001.patch +0 -11
  512. package/staging/auto-evolve/test-bad/.review-verdict +0 -12
  513. package/staging/auto-evolve/test-bad/test-bad.patch +0 -11
  514. package/test-results/.last-run.json +0 -6
  515. package/test-results/src-test-web-loop-status-b-5734c-atus-bar-/346/230/276/347/244/272-spinner-/344/270/215/346/230/276/347/244/272/345/276/252/347/216/257/350/256/241/346/225/260/error-context.md +0 -285
  516. package/tsconfig.cli.json +0 -16
  517. package/tsconfig.electron.json +0 -20
  518. package/tsconfig.json +0 -18
@@ -1,540 +0,0 @@
1
- /**
2
- * message-renderer.ts — 对话显示 UI (2026-06-15 从 client.js 拆出, .js → .ts)
3
- *
4
- * 职责 (单一):
5
- * - 把 user / AI 内容渲染成 DOM 气泡 (含 marked.parse 渲染)
6
- * - 处理流式 token 累积 (textNode 增量, O(1), 不重排)
7
- * - finalize 流式消息为正式 AI 气泡
8
- * - 折叠 think / environment_details 块
9
- * - 复制 / 重新回答 / 蒸馏为判断 按钮
10
- * - 挂载 step-timeline (2026-06-15) 步骤状态条到每条 AI 消息内
11
- *
12
- * 状态 (本模块私有):
13
- * - streamingMessageEl / streamingTextNode / streamingText
14
- * - lastUserCommand / lastAiContent (去重)
15
- *
16
- * 依赖 (import):
17
- * - 浏览器 API (document, marked, fetch, navigator)
18
- * - ./step-timeline (4 状态步骤条模块)
19
- *
20
- * 不依赖 (零业务 import, 防循环):
21
- * - 不 import client.js
22
- * - 不 import 任何业务模块
23
- *
24
- * 输入 (从 client.js 调用):
25
- * - addMessage(content, type, save, container, usedIds, ctx)
26
- * - handleStreamTokenEvent({ streamType, content }, ctx)
27
- * - finalizeTimelineAsMessage(ctx)
28
- * - handleStepEvent({ type: 'step_start'|'step_done'|'step_error', ... }, ctx)
29
- * - escapeHtml(s)
30
- * - getMessagesContainerForCurrent(currentChannelId, messagesContainers, messagesEl)
31
- *
32
- * 输出 (DOM):
33
- * - .message / .bubble / .think-container / .env-container
34
- * - .message-streaming (流式期间, finalize 时移除)
35
- * - .message-actions (复制/重新回答/蒸馏按钮)
36
- * - .used-judgments-link (P0.5 反向引用)
37
- * - .step-timeline (气泡内步骤状态条, 由 ./step-timeline 渲染)
38
- */
39
-
40
- // ---------------------------------------------------------------------------
41
- // 类型定义
42
- // ---------------------------------------------------------------------------
43
- import {
44
- mountStepTimeline,
45
- pushStepToTimeline,
46
- migrateStepTimeline,
47
- getStepTimeline,
48
- } from './step-timeline.js';
49
- export type MessageType = 'user' | 'ai' | 'system' | 'error';
50
-
51
- export interface StreamTokenEvent {
52
- streamType: 'token' | 'thinking';
53
- content: string;
54
- }
55
-
56
- export interface RendererCtx {
57
- messagesEl: HTMLElement | null;
58
- messagesContainers: Map<string, HTMLElement>;
59
- currentChannelId: string | null;
60
- lastUsedJudgmentIds?: string[];
61
- /** 引用 client.js 函数, 避免循环 import */
62
- openJudgmentsModalWithFilter?: (ids: string[]) => void;
63
- workflowDisplayEl?: HTMLElement | null;
64
- /**
65
- * B-3 (2026-06-15) 3 状态机回调:
66
- * - setTimelineState('streaming'): 首个 token 来时切到 streaming (蓝徽)
67
- * - setTimelineState('done'): finalize 时切到 done (绿徽), 1.5s 后自动 hide
68
- * 走 ctx 注入而非直接 import, 保持 message-renderer 零业务依赖.
69
- */
70
- setTimelineState?: (state: 'idle' | 'loading' | 'streaming' | 'done') => void;
71
- }
72
-
73
- export interface UsedJudgmentsLink {
74
- length: number;
75
- ids: string[];
76
- }
77
-
78
- // ---------------------------------------------------------------------------
79
- // 模块私有状态
80
- // ---------------------------------------------------------------------------
81
- let streamingMessageEl: HTMLElement | null = null;
82
- let streamingTextNode: Text | null = null;
83
- let streamingText = '';
84
- let lastUserCommand = '';
85
- let lastAiContent = '';
86
-
87
- // 滚动限频 (60ms 16fps, 减 reflow)
88
- let scrollToBottomTimer: ReturnType<typeof setTimeout> | null = null;
89
- function scheduleScrollToBottom(container: HTMLElement | null): void {
90
- if (!container) return;
91
- if (scrollToBottomTimer) return;
92
- scrollToBottomTimer = setTimeout(() => {
93
- container.scrollTop = container.scrollHeight;
94
- scrollToBottomTimer = null;
95
- }, 60);
96
- }
97
-
98
- // ---------------------------------------------------------------------------
99
- // 容器选择 (主入口或 per-channel 容器)
100
- // ---------------------------------------------------------------------------
101
- export function getMessagesContainerForCurrent(
102
- currentChannelId: string | null,
103
- messagesContainers: Map<string, HTMLElement>,
104
- messagesEl: HTMLElement | null
105
- ): HTMLElement | null {
106
- if (currentChannelId && messagesContainers.get(currentChannelId)) {
107
- return messagesContainers.get(currentChannelId) || null;
108
- }
109
- return messagesEl;
110
- }
111
-
112
- // ---------------------------------------------------------------------------
113
- // HTML escape (供 think / env 折叠块用)
114
- // ---------------------------------------------------------------------------
115
- export function escapeHtml(s: unknown): string {
116
- return String(s ?? '').replace(/[&<>"']/g, (c) => ({
117
- '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;'
118
- }[c] as string));
119
- }
120
-
121
- // ---------------------------------------------------------------------------
122
- // 主入口: 渲染一条消息气泡 (user / ai / system)
123
- // ---------------------------------------------------------------------------
124
- export function addMessage(
125
- content: string,
126
- type: MessageType,
127
- save: boolean = true,
128
- container?: HTMLElement | null,
129
- usedJudgmentIds: string[] = [],
130
- ctx: RendererCtx = { messagesEl: null, messagesContainers: new Map(), currentChannelId: null }
131
- ): void {
132
- const messagesEl = ctx.messagesEl || (typeof document !== 'undefined' ? document.getElementById('messages') : null);
133
- const messagesContainers = ctx.messagesContainers || new Map<string, HTMLElement>();
134
- const currentChannelId = ctx.currentChannelId;
135
- const msgContainer = container || getMessagesContainerForCurrent(currentChannelId, messagesContainers, messagesEl);
136
-
137
- // 内存保护: 单个 channel 容器超过 200 条, 旧会话加载时淘汰最旧
138
- if (!save && msgContainer && msgContainer.children.length > 200) {
139
- const toRemove = msgContainer.children.length - 200;
140
- for (let i = 0; i < toRemove; i++) {
141
- const first = msgContainer.firstElementChild;
142
- if (first) msgContainer.removeChild(first);
143
- }
144
- }
145
-
146
- // 去重 (save=true 时)
147
- if (save) {
148
- const lastContent = type === 'user' ? lastUserCommand : lastAiContent;
149
- if (lastContent && content === lastContent) {
150
- console.log(`[addMessage] 跳过重复的 ${type} 消息`);
151
- return;
152
- }
153
- if (type === 'user') lastUserCommand = content;
154
- else lastAiContent = content;
155
- }
156
-
157
- const div = document.createElement('div');
158
- div.className = `message message-${type}`;
159
-
160
- // 清理: 移除 tool_call 标记
161
- let cleanContent = content
162
- .replace(/\[TOOL_CALL\][\s\S]*?\[\/TOOL_CALL\]/g, '')
163
- .replace(/TOOL_CALL[\s\S]*?\/TOOL_CALL/g, '')
164
- .replace(/<tool_call>[\s\S]*?<\/tool_call>/gi, '')
165
- .replace(/\{\s*"tool":[\s\S]*?\}/g, '')
166
- .replace(/\{\s*tool\s*=>\s*["'][^"']+["']\s*(?:,\s*args\s*=>\s*\{[\s\S]*?\})?\s*\}/g, '')
167
- .replace(/\[Function[^\]]*\]\s*/g, '')
168
- .trim();
169
-
170
- // think 折叠
171
- const thinkMatch = cleanContent.match(/<think>([\s\S]*?)<\/think>/);
172
- let mainContent = cleanContent;
173
- let thinkContainer: HTMLElement | null = null;
174
- if (thinkMatch) {
175
- const thinkContent = thinkMatch[1].trim();
176
- mainContent = cleanContent.replace(/<think>[\s\S]*?<\/think>/, '').trim();
177
- thinkContainer = buildThinkContainer(thinkContent);
178
- }
179
-
180
- // environment_details 折叠 + 身份头
181
- const envMatch = mainContent.match(/^(.+?)\n<environment_details>([\s\S]*?)<\/environment_details>\n([\s\S]*)$/);
182
- if (envMatch) {
183
- const identity = envMatch[1].trim();
184
- const envDetails = envMatch[2].trim();
185
- const messageBody = envMatch[3].trim();
186
- const header = document.createElement('div');
187
- header.className = 'message-header';
188
- header.textContent = identity;
189
- div.appendChild(header);
190
- div.appendChild(buildEnvContainer(envDetails));
191
- if (thinkContainer) div.appendChild(thinkContainer);
192
- if (messageBody) div.appendChild(buildBubble(messageBody, type));
193
- } else if (cleanContent) {
194
- if (thinkContainer) div.appendChild(thinkContainer);
195
- div.appendChild(buildBubble(cleanContent, type));
196
- } else {
197
- return; // 空内容, 不上屏
198
- }
199
-
200
- // 纯文本用于复制按钮
201
- const rawContent = cleanContent
202
- .replace(/<[^>]+>/g, '')
203
- .replace(/&lt;/g, '<')
204
- .replace(/&gt;/g, '>')
205
- .replace(/&amp;/g, '&')
206
- .replace(/&nbsp;/g, ' ');
207
-
208
- // 时间
209
- const time = document.createElement('div');
210
- time.className = 'time';
211
- time.textContent = new Date().toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' });
212
-
213
- // AI 消息操作按钮
214
- if (type === 'ai') {
215
- div.appendChild(buildMessageActions(div, rawContent, ctx));
216
- }
217
-
218
- // P0.5 反向引用
219
- if (type === 'ai' && Array.isArray(usedJudgmentIds) && usedJudgmentIds.length > 0) {
220
- const link = document.createElement('a');
221
- link.className = 'used-judgments-link';
222
- link.textContent = `📎 参考 ${usedJudgmentIds.length} 条原则`;
223
- link.onclick = (e) => {
224
- e.preventDefault();
225
- if (typeof ctx.openJudgmentsModalWithFilter === 'function') {
226
- ctx.openJudgmentsModalWithFilter(usedJudgmentIds);
227
- }
228
- };
229
- div.appendChild(link);
230
- }
231
-
232
- // 2026-06-15: 每条 AI 消息挂一个空 step-timeline 占位 (用户决策)
233
- // 后续 step_start/step_done 事件会通过 handleStepEvent 推入
234
- if (type === 'ai' && msgContainer) {
235
- mountStepTimeline(div, currentChannelId);
236
- }
237
-
238
- div.appendChild(time);
239
- if (msgContainer) {
240
- msgContainer.appendChild(div);
241
- scheduleScrollToBottom(msgContainer);
242
- }
243
- }
244
-
245
- // ---------------------------------------------------------------------------
246
- // 私有: think 折叠块
247
- // ---------------------------------------------------------------------------
248
- function buildThinkContainer(thinkContent: string): HTMLElement {
249
- const container = document.createElement('div');
250
- container.className = 'think-container';
251
- const toggle = document.createElement('div');
252
- toggle.className = 'think-toggle';
253
- toggle.innerHTML = '💭 思考过程 <span class="think-arrow">▸</span>';
254
- toggle.onclick = function() {
255
- const details = container.querySelector('.think-content') as HTMLElement | null;
256
- const arrow = toggle.querySelector('.think-arrow') as HTMLElement | null;
257
- if (!details || !arrow) return;
258
- if (details.style.display === 'none') {
259
- details.style.display = 'block';
260
- arrow.textContent = '▾';
261
- } else {
262
- details.style.display = 'none';
263
- arrow.textContent = '▸';
264
- }
265
- };
266
- const content = document.createElement('div');
267
- content.className = 'think-content';
268
- content.style.display = 'none';
269
- content.innerHTML = `<pre>${escapeHtml(thinkContent)}</pre>`;
270
- container.appendChild(toggle);
271
- container.appendChild(content);
272
- return container;
273
- }
274
-
275
- // ---------------------------------------------------------------------------
276
- // 私有: environment_details 折叠块
277
- // ---------------------------------------------------------------------------
278
- function buildEnvContainer(envDetails: string): HTMLElement {
279
- const container = document.createElement('div');
280
- container.className = 'env-container';
281
- const toggle = document.createElement('div');
282
- toggle.className = 'env-toggle';
283
- toggle.innerHTML = '⚙️ 环境信息 <span class="env-arrow">▸</span>';
284
- toggle.onclick = function() {
285
- const details = container.querySelector('.environment-details') as HTMLElement | null;
286
- const arrow = toggle.querySelector('.env-arrow') as HTMLElement | null;
287
- if (!details || !arrow) return;
288
- if (details.style.display === 'none') {
289
- details.style.display = 'block';
290
- arrow.textContent = '▾';
291
- } else {
292
- details.style.display = 'none';
293
- arrow.textContent = '▸';
294
- }
295
- };
296
- const content = document.createElement('div');
297
- content.className = 'environment-details';
298
- content.style.display = 'none';
299
- content.innerHTML = `<pre>${escapeHtml(envDetails)}</pre>`;
300
- container.appendChild(toggle);
301
- container.appendChild(content);
302
- return container;
303
- }
304
-
305
- // ---------------------------------------------------------------------------
306
- // 私有: 气泡 (marked.parse 渲染)
307
- // ---------------------------------------------------------------------------
308
- function buildBubble(text: string, type: MessageType): HTMLElement {
309
- const bubble = document.createElement('div');
310
- bubble.className = `bubble bubble-${type}`;
311
- // 安全降级: CDN 加载失败时 marked 是 escape 版本, 这里不需要二次 escape
312
- // window.marked 在 ts 类型上不一定有, 用 any 兜底
313
- const marked = (window as any).marked;
314
- bubble.innerHTML = marked ? marked.parse(text) : escapeHtml(text);
315
- return bubble;
316
- }
317
-
318
- // ---------------------------------------------------------------------------
319
- // 私有: 消息操作按钮 (复制 / 重新回答 / 蒸馏为判断)
320
- // ---------------------------------------------------------------------------
321
- function buildMessageActions(div: HTMLElement, rawContent: string, ctx: RendererCtx): HTMLElement {
322
- const actions = document.createElement('div');
323
- actions.className = 'message-actions';
324
-
325
- // 复制
326
- const copyBtn = document.createElement('button');
327
- copyBtn.className = 'action-btn copy-btn';
328
- copyBtn.innerHTML = copyIcon() + ' 复制';
329
- copyBtn.title = '复制消息';
330
- copyBtn.onclick = () => {
331
- navigator.clipboard.writeText(rawContent).then(() => {
332
- copyBtn.innerHTML = checkIcon() + ' 已复制';
333
- setTimeout(() => { copyBtn.innerHTML = copyIcon() + ' 复制'; }, 2000);
334
- });
335
- };
336
- actions.appendChild(copyBtn);
337
-
338
- // 蒸馏为判断
339
- const saveJudgmentBtn = document.createElement('button');
340
- saveJudgmentBtn.className = 'action-btn save-as-judgment';
341
- saveJudgmentBtn.title = 'AI 蒸馏为 30-80 字判断力 + 自动演化对齐';
342
- saveJudgmentBtn.setAttribute('data-decision', rawContent.substring(0, 800));
343
- if (ctx.currentChannelId) saveJudgmentBtn.setAttribute('data-channel-id', ctx.currentChannelId);
344
- saveJudgmentBtn.innerHTML = shieldIcon() + ' 蒸馏为判断';
345
- actions.appendChild(saveJudgmentBtn);
346
-
347
- // 重新回答
348
- const regenBtn = document.createElement('button');
349
- regenBtn.className = 'action-btn regenerate-btn';
350
- regenBtn.innerHTML = refreshIcon(false) + ' 重新回答';
351
- regenBtn.title = '重新生成回复';
352
- regenBtn.onclick = () => {
353
- regenBtn.innerHTML = refreshIcon(true) + ' 生成中...';
354
- regenBtn.disabled = true;
355
- const messages = div.parentElement?.querySelectorAll('.message') || [];
356
- let lastUserMsg = '';
357
- for (let i = messages.length - 1; i >= 0; i--) {
358
- const msg = messages[i];
359
- if (msg.classList.contains('message-user')) {
360
- const bubble = msg.querySelector('.bubble') as HTMLElement | null;
361
- if (bubble) { lastUserMsg = bubble.textContent || bubble.innerText || ''; break; }
362
- }
363
- }
364
- fetch('/regenerate', {
365
- method: 'POST',
366
- headers: { 'Content-Type': 'application/json' },
367
- body: JSON.stringify({ channelId: ctx.currentChannelId, userMessage: lastUserMsg })
368
- }).then(res => {
369
- if (!res.ok) throw new Error('regenerate failed');
370
- }).catch(err => {
371
- console.error('重新生成失败:', err);
372
- regenBtn.innerHTML = refreshIcon(false) + ' 失败';
373
- setTimeout(() => {
374
- regenBtn.innerHTML = refreshIcon(false) + ' 重新回答';
375
- regenBtn.disabled = false;
376
- }, 2000);
377
- });
378
- };
379
- actions.appendChild(regenBtn);
380
- return actions;
381
- }
382
-
383
- function copyIcon(): string { return '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>'; }
384
- function checkIcon(): string { return '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"></polyline></svg>'; }
385
- function shieldIcon(): string { return '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L4 6v6c0 5 3.5 9.5 8 10 4.5-.5 8-5 8-10V6l-8-4z"></path><path d="M9 12l2 2 4-4"></path></svg>'; }
386
- function refreshIcon(spin: boolean = false): string { const cls = spin ? ' class="spin"' : ''; return `<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"${cls}><path d="M21 2v6h-6M3 12a9 9 0 0 1 15-6.7L21 8M3 22v-6h6M21 12a9 9 0 0 1-15 6.7L3 16"></path></svg>`; }
387
-
388
- // ---------------------------------------------------------------------------
389
- // 流式 token 处理 (textNode 增量, 不重排)
390
- // ---------------------------------------------------------------------------
391
- export function handleStreamTokenEvent(data: StreamTokenEvent, ctx: RendererCtx = { messagesEl: null, messagesContainers: new Map(), currentChannelId: null }): void {
392
- const messagesEl = ctx.messagesEl || (typeof document !== 'undefined' ? document.getElementById('messages') : null);
393
- const messagesContainers = ctx.messagesContainers || new Map<string, HTMLElement>();
394
- const currentChannelId = ctx.currentChannelId;
395
- const container = getMessagesContainerForCurrent(currentChannelId, messagesContainers, messagesEl);
396
- if (!container) return;
397
- const delta = data.content || '';
398
- if (!delta) return;
399
-
400
- if (!streamingMessageEl || !streamingMessageEl.isConnected) {
401
- // 新建流式消息
402
- streamingMessageEl = document.createElement('div');
403
- streamingMessageEl.className = 'message message-ai message-streaming';
404
- streamingTextNode = document.createTextNode('');
405
- streamingMessageEl.appendChild(streamingTextNode);
406
- streamingText = '';
407
- // 2026-06-15: 流式期间也挂一个空 step-timeline 占位 — step_start/done/error 事件
408
- // 走 handleStepEvent, getStepTimeline 找到这个流式元素内的 timeline 推入
409
- mountStepTimeline(streamingMessageEl, currentChannelId);
410
- container.appendChild(streamingMessageEl);
411
- // B-3: 首个 token 来时切状态到 streaming (蓝徽), 提示用户 panel 在工作
412
- if (typeof ctx.setTimelineState === 'function') {
413
- ctx.setTimelineState('streaming');
414
- }
415
- scheduleScrollToBottom(container);
416
- }
417
- if (streamingTextNode) streamingTextNode.appendData(delta);
418
- streamingText += delta;
419
- scheduleScrollToBottom(container);
420
- }
421
-
422
- // ---------------------------------------------------------------------------
423
- // 流式消息 finalize (done 事件): 移除流式元素, 走 addMessage 走 marked.parse
424
- // ---------------------------------------------------------------------------
425
- export function finalizeTimelineAsMessage(ctx: RendererCtx = { messagesEl: null, messagesContainers: new Map(), currentChannelId: null }): void {
426
- const messagesEl = ctx.messagesEl || (typeof document !== 'undefined' ? document.getElementById('messages') : null);
427
- const messagesContainers = ctx.messagesContainers || new Map<string, HTMLElement>();
428
- const currentChannelId = ctx.currentChannelId;
429
- const container = getMessagesContainerForCurrent(currentChannelId, messagesContainers, messagesEl);
430
- if (streamingText.trim().length > 0) {
431
- // 2026-06-15: finalize 时把 streaming 内的 step-timeline 整体搬到新建的正式 AI message 内
432
- // addMessage 会建一个新 timeline 占位, 先记下 streaming 的引用, addMessage 后再迁移
433
- // 避免节点从 0 重渲 (10+ 步的任务, 重渲闪烁会很厉害)
434
- const oldStreamingEl = streamingMessageEl;
435
- if (oldStreamingEl && oldStreamingEl.parentNode) {
436
- oldStreamingEl.parentNode.removeChild(oldStreamingEl);
437
- }
438
- addMessage(streamingText, 'ai', true, container, ctx.lastUsedJudgmentIds || [], ctx);
439
- if (oldStreamingEl && container) {
440
- // 找刚 addMessage 创建的最后一条 ai message
441
- const newAiMsg = container.querySelector('.message-ai:last-of-type') as HTMLElement | null;
442
- if (newAiMsg && newAiMsg !== oldStreamingEl) {
443
- migrateStepTimeline(oldStreamingEl, newAiMsg);
444
- }
445
- }
446
- }
447
- // 重置流式状态
448
- streamingMessageEl = null;
449
- streamingTextNode = null;
450
- streamingText = '';
451
- // B-3: finalize 时切 done 状态 (绿徽), hide 延迟由 client.js 的 hideTimelinePanel 统一管
452
- if (typeof ctx.setTimelineState === 'function') {
453
- ctx.setTimelineState('done');
454
- }
455
- }
456
-
457
- // ---------------------------------------------------------------------------
458
- // 用户命令装饰条 (showUserCommand) — 2026-06-16 整段删除, SSE 已走 addMessage 路径
459
- // 2026-06-11 修: 不再走 showUserCommand (› 装饰条) 路径 — 会和 user bubble 双重显示
460
-
461
- // ---------------------------------------------------------------------------
462
- // 2026-06-15: step-timeline 事件入口 (server 推 step_start/step_done/step_error)
463
- // 找到当前正在流式 / 最后一条 AI 消息的 timeline 容器, 推入
464
- // ---------------------------------------------------------------------------
465
- export interface StepEvent {
466
- type: 'step_start' | 'step_done' | 'step_error';
467
- tool?: string;
468
- content?: string;
469
- success?: boolean;
470
- output?: string;
471
- error?: string;
472
- args?: Record<string, unknown>;
473
- }
474
-
475
- export function handleStepEvent(data: StepEvent, ctx: RendererCtx = { messagesEl: null, messagesContainers: new Map(), currentChannelId: null }): void {
476
- const messagesEl = ctx.messagesEl || (typeof document !== 'undefined' ? document.getElementById('messages') : null);
477
- const messagesContainers = ctx.messagesContainers || new Map<string, HTMLElement>();
478
- const currentChannelId = ctx.currentChannelId;
479
- const container = getMessagesContainerForCurrent(currentChannelId, messagesContainers, messagesEl);
480
- if (!container) return;
481
- if (!data || !data.type) return;
482
-
483
- // 1. 优先用正在流式的元素 (流式期间能即时看到)
484
- let target: HTMLElement | null = streamingMessageEl && streamingMessageEl.isConnected
485
- ? streamingMessageEl
486
- : null;
487
- // 2. 否则用最后一条 AI message
488
- if (!target) {
489
- const aiMsgs = container.querySelectorAll('.message-ai');
490
- if (aiMsgs.length === 0) return;
491
- target = aiMsgs[aiMsgs.length - 1] as HTMLElement;
492
- }
493
- if (!target) return;
494
-
495
- const timeline = getStepTimeline(target);
496
- if (!timeline) return;
497
-
498
- pushStepToTimeline(timeline, data.type, {
499
- tool: data.tool || 'unknown',
500
- args: data.args,
501
- success: data.success,
502
- output: data.output,
503
- error: data.error,
504
- });
505
- }
506
-
507
- // ---------------------------------------------------------------------------
508
- // 重置模块状态 (切频道时调用)
509
- // ---------------------------------------------------------------------------
510
- export function resetRendererState(): void {
511
- streamingMessageEl = null;
512
- streamingTextNode = null;
513
- streamingText = '';
514
- lastUserCommand = '';
515
- lastAiContent = '';
516
- if (scrollToBottomTimer) {
517
- clearTimeout(scrollToBottomTimer);
518
- scrollToBottomTimer = null;
519
- }
520
- }
521
-
522
- export const MessageRenderer = {
523
- addMessage,
524
- handleStreamTokenEvent,
525
- finalizeTimelineAsMessage,
526
- handleStepEvent,
527
- escapeHtml,
528
- getMessagesContainerForCurrent,
529
- resetRendererState,
530
- };
531
-
532
- declare global {
533
- interface Window {
534
- MR?: typeof MessageRenderer;
535
- }
536
- }
537
-
538
- if (typeof window !== 'undefined') {
539
- window.MR = MessageRenderer;
540
- }