@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,675 +0,0 @@
1
- /**
2
- * WorkflowPivotLoop - Robust Agent Loop with Adaptive Iteration Control
3
- *
4
- * Based on the architecture pattern:
5
- * 1. Loop interrupted by max iterations
6
- * 2. Model decides via pending_tool_uses (empty = normal completion)
7
- * 3. Conditional routing based on tool call presence
8
- *
9
- * Key improvements over simple ReAct:
10
- * - Dynamic loop length based on task complexity
11
- * - Multi-dimensional exit conditions
12
- * - Consecutive invalid iteration detection
13
- * - Token budget awareness
14
- */
15
-
16
- import type { Tool, ToolResult, StreamCallback, StreamEvent } from './pi-sdk.js';
17
-
18
- export interface PivotLoopConfig {
19
- maxIterations: number;
20
- minIterations?: number;
21
- qualityThreshold?: number;
22
- maxConsecutiveNoProgress?: number;
23
- maxTokenBudget?: number;
24
- complexity?: TaskComplexity;
25
- }
26
-
27
- export interface PivotLoopState {
28
- iteration: number;
29
- totalTokens: number;
30
- toolCallsCount: number;
31
- consecutiveNoProgress: number;
32
- qualityScores: number[];
33
- pendingToolUses: ToolDefinition[];
34
- lastMeaningfulWork: number;
35
- }
36
-
37
- export interface ToolDefinition {
38
- name: string;
39
- description: string;
40
- parameters: Record<string, string>;
41
- args?: Record<string, string>;
42
- }
43
-
44
- export interface LoopResult {
45
- success: boolean;
46
- response: string;
47
- iterations: number;
48
- toolCalls: number;
49
- qualityScore: number;
50
- exitReason: ExitReason;
51
- state: PivotLoopState;
52
- }
53
-
54
- export type ExitReason =
55
- | 'max_iterations'
56
- | 'no_pending_tools'
57
- | 'quality_threshold_met'
58
- | 'no_progress_exhausted'
59
- | 'token_budget_exceeded'
60
- | 'min_iterations_not_met'
61
- | 'error';
62
-
63
- export type TaskComplexity = 'simple' | 'moderate' | 'complex';
64
-
65
- export interface TaskProfile {
66
- complexity: TaskComplexity;
67
- estimatedSteps: number;
68
- suggestedMaxIterations: number;
69
- tokenBudget: number;
70
- }
71
-
72
- /**
73
- * Analyze input to determine task complexity
74
- */
75
- function analyzeTaskComplexity(input: string): TaskProfile {
76
- const inputLower = input.toLowerCase();
77
- const inputLength = input.length;
78
-
79
- // Simple task indicators
80
- const simpleIndicators = [
81
- '读取', '查看', '显示', '列出', '获取', 'what is', 'show me',
82
- 'list', 'get', 'show', 'read', 'view', 'display'
83
- ];
84
-
85
- // Complex task indicators
86
- const complexIndicators = [
87
- '分析', '比较', '改进', '优化', '重构', '实现', '设计', '创建',
88
- 'analyze', 'compare', 'improve', 'optimize', 'refactor', 'implement',
89
- 'design', 'create', 'build', 'develop'
90
- ];
91
-
92
- // Question patterns suggest moderate complexity
93
- const questionPatterns = [
94
- '如何', '怎么', '为什么', '什么', 'which', 'how', 'why', 'what', '?'
95
- ];
96
-
97
- const simpleCount = simpleIndicators.filter(i => inputLower.includes(i)).length;
98
- const complexCount = complexIndicators.filter(i => inputLower.includes(i)).length;
99
- const questionCount = questionPatterns.filter(p => inputLower.includes(p)).length;
100
-
101
- let complexity: TaskComplexity;
102
- let estimatedSteps: number;
103
-
104
- if (complexCount > simpleCount && complexCount > 1) {
105
- complexity = 'complex';
106
- estimatedSteps = 5 + complexCount * 2;
107
- } else if (questionCount > 2 || (simpleCount > 0 && complexCount > 0)) {
108
- complexity = 'moderate';
109
- estimatedSteps = 3 + questionCount;
110
- } else if (inputLength < 50 && simpleCount > 0) {
111
- complexity = 'simple';
112
- estimatedSteps = 1 + simpleCount;
113
- } else if (complexCount > 0) {
114
- complexity = 'complex';
115
- estimatedSteps = 4 + complexCount;
116
- } else {
117
- complexity = 'moderate';
118
- estimatedSteps = 3;
119
- }
120
-
121
- // Adjust based on input length (longer inputs often mean more complex tasks)
122
- if (inputLength > 500 && complexity !== 'complex') {
123
- complexity = 'moderate';
124
- estimatedSteps = Math.max(estimatedSteps, 4);
125
- }
126
-
127
- // Suggested max iterations: 2-3x estimated steps for safety margin
128
- const suggestedMaxIterations = Math.min(Math.max(estimatedSteps * 3, 10), 100);
129
- const tokenBudget = estimatedSteps * 800; // ~800 tokens per step estimate
130
-
131
- return { complexity, estimatedSteps, suggestedMaxIterations, tokenBudget };
132
- }
133
-
134
- /**
135
- * WorkflowPivotLoop - Main loop controller
136
- */
137
- export class WorkflowPivotLoop {
138
- private config: Required<PivotLoopConfig>;
139
- private state: PivotLoopState;
140
- private tools: Map<string, Tool>;
141
- private messageHistory: Array<{ role: string; content: string; toolCall?: ToolDefinition; toolResult?: ToolResult }>;
142
- private streamCallback?: StreamCallback;
143
-
144
- constructor(config: PivotLoopConfig) {
145
- this.tools = new Map();
146
-
147
- // Default configuration based on task complexity if not provided
148
- const defaults: Required<PivotLoopConfig> = {
149
- maxIterations: config.maxIterations || 50,
150
- minIterations: config.minIterations || 2,
151
- qualityThreshold: config.qualityThreshold || 0.7,
152
- maxConsecutiveNoProgress: config.maxConsecutiveNoProgress || 5,
153
- maxTokenBudget: config.maxTokenBudget || 50000,
154
- complexity: config.complexity || 'moderate'
155
- };
156
-
157
- this.config = defaults;
158
-
159
- this.state = this.createInitialState();
160
- this.messageHistory = [];
161
- }
162
-
163
- private createInitialState(): PivotLoopState {
164
- return {
165
- iteration: 0,
166
- totalTokens: 0,
167
- toolCallsCount: 0,
168
- consecutiveNoProgress: 0,
169
- qualityScores: [],
170
- pendingToolUses: [],
171
- lastMeaningfulWork: 0
172
- };
173
- }
174
-
175
- /**
176
- * Register a tool for use in the loop
177
- */
178
- registerTool(tool: Tool): void {
179
- this.tools.set(tool.name, tool);
180
- }
181
-
182
- /**
183
- * Register multiple tools at once
184
- */
185
- registerTools(tools: Tool[]): void {
186
- for (const tool of tools) {
187
- this.registerTool(tool);
188
- }
189
- }
190
-
191
- /**
192
- * Execute the pivot loop
193
- */
194
- async execute(
195
- input: string,
196
- llm: LLMInterface,
197
- systemPrompt: string,
198
- streamCallback?: StreamCallback
199
- ): Promise<LoopResult> {
200
- this.streamCallback = streamCallback;
201
- this.state = this.createInitialState();
202
- this.messageHistory = [{ role: 'user', content: input }];
203
-
204
- // Analyze task complexity and adapt config
205
- const taskProfile = analyzeTaskComplexity(input);
206
- const effectiveConfig = this.adaptConfigForTask(taskProfile);
207
-
208
- this.emit({
209
- type: 'status',
210
- content: `🔍 任务复杂度: ${taskProfile.complexity} (预估 ${taskProfile.estimatedSteps} 步)`,
211
- tool: 'system'
212
- });
213
-
214
- this.emit({
215
- type: 'status',
216
- content: `⚙️ 动态配置: maxIterations=${effectiveConfig.maxIterations}, tokenBudget=${effectiveConfig.maxTokenBudget}`,
217
- tool: 'system'
218
- });
219
-
220
- let response = '';
221
-
222
- while (this.shouldContinue(effectiveConfig)) {
223
- this.state.iteration++;
224
-
225
- this.emit({
226
- type: 'status',
227
- content: `🔄 循环 ${this.state.iteration}/${effectiveConfig.maxIterations}`,
228
- tool: 'loop'
229
- });
230
-
231
- // Build context for LLM
232
- const context = this.buildContext();
233
- const fullPrompt = `${systemPrompt}\n\n${context}`;
234
-
235
- try {
236
- // Call LLM
237
- const llmResponse = await llm.chat(context, systemPrompt);
238
- const reply = llmResponse.reply.trim();
239
-
240
- this.emit({ type: 'token', content: reply.substring(0, 100) });
241
-
242
- // Estimate token usage
243
- this.state.totalTokens += this.estimateTokens(fullPrompt) + this.estimateTokens(reply);
244
-
245
- // Check token budget
246
- if (this.state.totalTokens > effectiveConfig.maxTokenBudget) {
247
- this.emit({
248
- type: 'error',
249
- content: '⚠️ Token 预算超支,中断循环'
250
- });
251
- return this.createResult(false, response, 'token_budget_exceeded');
252
- }
253
-
254
- // Check if this is a final response (no tool calls)
255
- const pendingTools = this.extractPendingToolUses(reply);
256
-
257
- if (pendingTools.length === 0) {
258
- // No pending tool uses - this is a normal completion
259
- this.state.pendingToolUses = [];
260
-
261
- // Evaluate quality before accepting
262
- const quality = this.evaluateQuality(reply);
263
- this.state.qualityScores.push(quality);
264
-
265
- this.emit({
266
- type: 'status',
267
- content: `✅ 检测到最终回复 (质量: ${(quality * 10).toFixed(1)}/10)`,
268
- tool: 'system'
269
- });
270
-
271
- // Check if quality threshold met
272
- if (quality >= effectiveConfig.qualityThreshold) {
273
- response = reply;
274
- return this.createResult(true, reply, 'quality_threshold_met');
275
- }
276
-
277
- // Quality not met but no more tools to call
278
- // Accept response if we've done minimum iterations
279
- if (this.state.iteration >= effectiveConfig.minIterations) {
280
- response = reply;
281
- return this.createResult(true, reply, 'no_pending_tools');
282
- }
283
-
284
- // Too early, continue to see if we can improve
285
- this.state.consecutiveNoProgress++;
286
- this.emit({
287
- type: 'status',
288
- content: `📊 质量未达标 (${(quality * 10).toFixed(1)}/${(effectiveConfig.qualityThreshold * 10).toFixed(1)}),继续循环`,
289
- tool: 'system'
290
- });
291
- continue;
292
- }
293
-
294
- // We have pending tool uses - execute them
295
- this.state.pendingToolUses = pendingTools;
296
- this.state.lastMeaningfulWork = this.state.iteration;
297
- this.state.consecutiveNoProgress = 0;
298
-
299
- for (const toolCall of pendingTools) {
300
- this.state.toolCallsCount++;
301
-
302
- const tool = this.tools.get(toolCall.name);
303
- if (!tool) {
304
- this.emit({
305
- type: 'error',
306
- content: `❌ 未知工具: ${toolCall.name}`
307
- });
308
- this.messageHistory.push({
309
- role: 'tool',
310
- content: JSON.stringify({ success: false, error: `Unknown tool: ${toolCall.name}` })
311
- });
312
- continue;
313
- }
314
-
315
- this.emit({
316
- type: 'tool',
317
- content: `🔧 执行: ${toolCall.name}`,
318
- tool: toolCall.name
319
- });
320
-
321
- try {
322
- const result = await tool.execute(toolCall.args ?? {});
323
-
324
- this.emit({
325
- type: result.success ? 'status' : 'error',
326
- content: result.success
327
- ? `✅ ${toolCall.name} 成功`
328
- : `❌ ${toolCall.name} 失败: ${result.error}`
329
- });
330
-
331
- this.messageHistory.push({
332
- role: 'assistant',
333
- content: reply,
334
- toolCall,
335
- toolResult: result
336
- });
337
-
338
- // Record quality from tool result
339
- const toolQuality = this.evaluateToolResult(result);
340
- this.state.qualityScores.push(toolQuality);
341
-
342
- } catch (execError) {
343
- this.emit({
344
- type: 'error',
345
- content: `❌ 工具执行异常: ${execError}`
346
- });
347
- this.messageHistory.push({
348
- role: 'tool',
349
- content: JSON.stringify({ success: false, error: String(execError) })
350
- });
351
- }
352
- }
353
-
354
- } catch (error) {
355
- this.emit({
356
- type: 'error',
357
- content: `❌ 循环异常: ${error}`
358
- });
359
- return this.createResult(false, response, 'error');
360
- }
361
- }
362
-
363
- // Loop exited - determine reason
364
- const exitReason = this.determineExitReason(effectiveConfig);
365
-
366
- if (!response && this.messageHistory.length > 0) {
367
- const lastAssistant = this.messageHistory
368
- .filter(m => m.role === 'assistant')
369
- .pop();
370
- response = lastAssistant?.content || '任务处理超时';
371
- }
372
-
373
- return this.createResult(
374
- exitReason !== 'error',
375
- response,
376
- exitReason
377
- );
378
- }
379
-
380
- /**
381
- * Determine if loop should continue
382
- */
383
- private shouldContinue(config: Required<PivotLoopConfig>): boolean {
384
- // Hard stop: max iterations reached
385
- if (this.state.iteration >= config.maxIterations) {
386
- this.emit({
387
- type: 'status',
388
- content: `🛑 达到最大迭代次数 ${config.maxIterations}`
389
- });
390
- return false;
391
- }
392
-
393
- // Soft stop: consecutive no progress
394
- if (this.state.consecutiveNoProgress >= config.maxConsecutiveNoProgress) {
395
- this.emit({
396
- type: 'status',
397
- content: `🛑 连续 ${config.maxConsecutiveNoProgress} 次无进展`
398
- });
399
- return false;
400
- }
401
-
402
- return true;
403
- }
404
-
405
- /**
406
- * Adapt configuration based on task profile
407
- */
408
- private adaptConfigForTask(profile: TaskProfile): Required<PivotLoopConfig> {
409
- return {
410
- ...this.config,
411
- maxIterations: Math.min(this.config.maxIterations, profile.suggestedMaxIterations),
412
- maxTokenBudget: Math.min(this.config.maxTokenBudget, profile.tokenBudget),
413
- complexity: profile.complexity
414
- };
415
- }
416
-
417
- /**
418
- * Extract pending tool uses from LLM response
419
- */
420
- private extractPendingToolUses(content: string): ToolDefinition[] {
421
- const pending: ToolDefinition[] = [];
422
-
423
- // Pattern 1: Chinese format "调用工具: tool_name(args)"
424
- const pattern1 = /调用工具[::]\s*(\w+)\s*\(([^)]*)\)/g;
425
- let match;
426
- while ((match = pattern1.exec(content)) !== null) {
427
- const name = match[1];
428
- const argsStr = match[2];
429
- const args = this.parseArgs(argsStr);
430
- if (this.tools.has(name)) {
431
- pending.push({ name, args, description: '', parameters: {} });
432
- }
433
- }
434
-
435
- // Pattern 2: tool_name(args) format
436
- const pattern2 = /(\w+)\s*\(\s*([^)]*)\s*\)/g;
437
- while ((match = pattern2.exec(content)) !== null) {
438
- const name = match[1];
439
- const argsStr = match[2];
440
- // Skip if already matched or doesn't look like a tool call
441
- if (pending.some(p => p.name === name)) continue;
442
- if (!this.tools.has(name)) continue;
443
-
444
- const args = this.parseArgs(argsStr);
445
- pending.push({ name, args, description: '', parameters: {} });
446
- }
447
-
448
- // Pattern 3: JSON format tool calls
449
- try {
450
- const jsonMatch = content.match(/\{[\s\S]*"tool_calls"[\s\S]*\}/);
451
- if (jsonMatch) {
452
- const parsed = JSON.parse(jsonMatch[0]);
453
- if (Array.isArray(parsed.tool_calls)) {
454
- for (const tc of parsed.tool_calls) {
455
- if (this.tools.has(tc.name)) {
456
- pending.push({ name: tc.name, args: tc.args || {}, description: '', parameters: {} });
457
- }
458
- }
459
- }
460
- }
461
- } catch {
462
- // JSON parsing failed, ignore
463
- }
464
-
465
- return pending;
466
- }
467
-
468
- /**
469
- * Parse tool arguments from string
470
- */
471
- private parseArgs(argsStr: string): Record<string, string> {
472
- const args: Record<string, string> = {};
473
- if (!argsStr || !argsStr.trim()) return args;
474
-
475
- const pairs = argsStr.split(',').map(s => s.trim()).filter(Boolean);
476
- for (const pair of pairs) {
477
- const colonIdx = pair.indexOf(':');
478
- if (colonIdx > 0) {
479
- const key = pair.substring(0, colonIdx).trim();
480
- const value = pair.substring(colonIdx + 1).trim().replace(/^['"]|['"]$/g, '');
481
- args[key] = value;
482
- } else {
483
- // No colon, try to parse as positional
484
- const parts = pair.split(/\s+/);
485
- if (parts.length >= 2) {
486
- args[parts[0]] = parts.slice(1).join(' ');
487
- }
488
- }
489
- }
490
- return args;
491
- }
492
-
493
- /**
494
- * Build context from message history
495
- */
496
- private buildContext(): string {
497
- return this.messageHistory.map(m => {
498
- if (m.role === 'user') return `用户: ${m.content}`;
499
- if (m.role === 'assistant') return `助手: ${m.content}`;
500
- if (m.role === 'tool' && m.toolResult) {
501
- return `工具结果: ${JSON.stringify(m.toolResult)}`;
502
- }
503
- return '';
504
- }).filter(Boolean).join('\n');
505
- }
506
-
507
- /**
508
- * Evaluate response quality
509
- */
510
- private evaluateQuality(response: string): number {
511
- let score = 0.5;
512
-
513
- // Length-based scoring
514
- if (response.length > 100) score += 0.1;
515
- if (response.length > 500) score += 0.1;
516
- if (response.length < 30) score -= 0.2;
517
-
518
- // Structure indicators
519
- if (response.includes('\n')) score += 0.05;
520
- if (response.includes('-') || response.includes('•')) score += 0.05;
521
- if (response.includes('```')) score += 0.1;
522
-
523
- // Content quality indicators
524
- const conclusionWords = ['完成', '结果', '总结', '所以', '因此', '答案', '推荐', '建议'];
525
- if (conclusionWords.some(w => response.includes(w))) score += 0.1;
526
-
527
- // Negative indicators
528
- if (response.includes('调用工具') || response.includes('tool(')) score -= 0.15;
529
- if (response.includes('??') || response.includes('未知')) score -= 0.1;
530
-
531
- return Math.max(0, Math.min(1, score));
532
- }
533
-
534
- /**
535
- * Evaluate tool result quality
536
- */
537
- private evaluateToolResult(result: ToolResult): number {
538
- if (!result.success) return 0.2;
539
-
540
- let score = 0.6;
541
- if (result.output) {
542
- score += 0.2;
543
- if (result.output.length > 100) score += 0.1;
544
- if (result.output.includes('error') || result.output.includes('❌')) score -= 0.2;
545
- if (result.output.includes('success') || result.output.includes('✅')) score += 0.1;
546
- }
547
- if (result.error) score -= 0.3;
548
-
549
- return Math.max(0, Math.min(1, score));
550
- }
551
-
552
- /**
553
- * Estimate token count (rough approximation)
554
- */
555
- private estimateTokens(text: string): number {
556
- // Rough estimate: ~4 characters per token for Chinese/English mix
557
- return Math.ceil(text.length / 4);
558
- }
559
-
560
- /**
561
- * Create result object
562
- */
563
- private createResult(success: boolean, response: string, exitReason: ExitReason): LoopResult {
564
- const avgQuality = this.state.qualityScores.length > 0
565
- ? this.state.qualityScores.reduce((a, b) => a + b, 0) / this.state.qualityScores.length
566
- : 0;
567
-
568
- return {
569
- success,
570
- response,
571
- iterations: this.state.iteration,
572
- toolCalls: this.state.toolCallsCount,
573
- qualityScore: avgQuality,
574
- exitReason,
575
- state: { ...this.state }
576
- };
577
- }
578
-
579
- /**
580
- * Determine why loop exited
581
- */
582
- private determineExitReason(config: Required<PivotLoopConfig>): ExitReason {
583
- if (this.state.iteration >= config.maxIterations) {
584
- return 'max_iterations';
585
- }
586
- if (this.state.consecutiveNoProgress >= config.maxConsecutiveNoProgress) {
587
- return 'no_progress_exhausted';
588
- }
589
- if (this.state.pendingToolUses.length === 0 && this.state.iteration >= config.minIterations) {
590
- return 'no_pending_tools';
591
- }
592
- if (this.state.totalTokens > config.maxTokenBudget) {
593
- return 'token_budget_exceeded';
594
- }
595
- return 'max_iterations';
596
- }
597
-
598
- /**
599
- * Emit stream event
600
- */
601
- private emit(event: StreamEvent): void {
602
- if (this.streamCallback) {
603
- this.streamCallback(event);
604
- }
605
- }
606
-
607
- /**
608
- * Get current state
609
- */
610
- getState(): PivotLoopState {
611
- return { ...this.state };
612
- }
613
-
614
- /**
615
- * Reset the loop state
616
- */
617
- reset(): void {
618
- this.state = this.createInitialState();
619
- this.messageHistory = [];
620
- }
621
- }
622
-
623
- /**
624
- * Interface for LLM chat capability
625
- */
626
- export interface LLMInterface {
627
- chat(context: string, systemPrompt: string): Promise<{ reply: string; tokens?: number }>;
628
- }
629
-
630
- /**
631
- * Factory to create a default pivot loop configuration
632
- */
633
- export function createDefaultPivotConfig(complexity?: TaskComplexity): PivotLoopConfig {
634
- const profiles: Record<TaskComplexity, PivotLoopConfig> = {
635
- simple: {
636
- maxIterations: 15,
637
- minIterations: 1,
638
- qualityThreshold: 0.6,
639
- maxConsecutiveNoProgress: 3,
640
- maxTokenBudget: 10000
641
- },
642
- moderate: {
643
- maxIterations: 30,
644
- minIterations: 2,
645
- qualityThreshold: 0.7,
646
- maxConsecutiveNoProgress: 5,
647
- maxTokenBudget: 30000
648
- },
649
- complex: {
650
- maxIterations: 60,
651
- minIterations: 3,
652
- qualityThreshold: 0.75,
653
- maxConsecutiveNoProgress: 8,
654
- maxTokenBudget: 60000
655
- }
656
- };
657
-
658
- return complexity ? profiles[complexity] : profiles.moderate;
659
- }
660
-
661
- /**
662
- * Helper to run a simple prompt through the loop
663
- */
664
- export async function runPivotLoop(
665
- input: string,
666
- llm: LLMInterface,
667
- tools: Tool[],
668
- systemPrompt: string,
669
- config?: PivotLoopConfig,
670
- streamCallback?: StreamCallback
671
- ): Promise<LoopResult> {
672
- const loop = new WorkflowPivotLoop(config || createDefaultPivotConfig());
673
- loop.registerTools(tools);
674
- return loop.execute(input, llm, systemPrompt, streamCallback);
675
- }
@@ -1,13 +0,0 @@
1
- {
2
- "schema_version": "1.0",
3
- "last_scan": "2026-04-19T00:00:00+08:00",
4
- "total_files_scanned": 0,
5
- "findings": [],
6
- "statistics": {
7
- "secrets": 0,
8
- "trade_secrets": 0,
9
- "pii": 0,
10
- "network_internal": 0,
11
- "protocol_internal": 0
12
- }
13
- }