@bolloon/bolloon-agent 0.1.0 → 0.1.2

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 (581) hide show
  1. package/bin/bolloon-cli.cjs +157 -0
  2. package/bin/bolloon-daemon.sh +207 -0
  3. package/bin/bolloon.cmd +11 -0
  4. package/dist/agents/constraint-layer.js +10 -15
  5. package/dist/agents/pi-sdk.js +433 -106
  6. package/dist/agents/protocol.js +82 -1
  7. package/dist/agents/subagent-manager.js +2 -2
  8. package/dist/agents/workflow-engine.js +15 -20
  9. package/dist/agents/workflow-pivot-loop.js +541 -0
  10. package/dist/bollharness/src/index.js +5 -0
  11. package/dist/bollharness/src/scripts/checks/check_adr_plan_numbering.js +6 -0
  12. package/dist/bollharness/src/scripts/checks/check_api_types.js +45 -0
  13. package/dist/bollharness/src/scripts/checks/check_artifact_link.js +146 -0
  14. package/dist/bollharness/src/scripts/checks/check_bridge_deps.js +6 -0
  15. package/dist/bollharness/src/scripts/checks/check_bugfix_binding.js +6 -0
  16. package/dist/bollharness/src/scripts/checks/check_bugfix_binding_ci.js +6 -0
  17. package/dist/bollharness/src/scripts/checks/check_doc_file_references.js +6 -0
  18. package/dist/bollharness/src/scripts/checks/check_doc_freshness.js +135 -0
  19. package/dist/bollharness/src/scripts/checks/check_doc_links.js +31 -0
  20. package/dist/bollharness/src/scripts/checks/check_file_existence_claims.js +6 -0
  21. package/dist/bollharness/src/scripts/checks/check_fragment_integrity.js +34 -0
  22. package/dist/bollharness/src/scripts/checks/check_hook_installed.js +63 -0
  23. package/dist/bollharness/src/scripts/checks/check_issue_closure.js +41 -0
  24. package/dist/bollharness/src/scripts/checks/check_mcp_parity.js +6 -0
  25. package/dist/bollharness/src/scripts/checks/check_security.js +48 -0
  26. package/dist/bollharness/src/scripts/checks/check_skill_parity.js +6 -0
  27. package/dist/bollharness/src/scripts/checks/check_versions.js +6 -0
  28. package/dist/bollharness/src/scripts/checks/finding.js +13 -0
  29. package/dist/bollharness/src/scripts/checks/next_decision_number.js +20 -0
  30. package/dist/bollharness/src/scripts/checks/regenerate_magic_docs.js +6 -0
  31. package/dist/bollharness/src/scripts/ci/detect_rebaseline_triggers.js +8 -0
  32. package/dist/bollharness/src/scripts/ci/scan_subprocess_cfg.js +8 -0
  33. package/dist/bollharness/src/scripts/ci/scan_verify_artifacts.js +8 -0
  34. package/dist/bollharness/src/scripts/ci/scan_yaml_schema.js +8 -0
  35. package/dist/bollharness/src/scripts/context_router.js +67 -0
  36. package/dist/bollharness/src/scripts/deploy-guard.js +157 -0
  37. package/dist/bollharness/src/scripts/guard-feedback.js +192 -0
  38. package/dist/bollharness/src/scripts/guard_router.js +158 -0
  39. package/dist/bollharness/src/scripts/hooks/_hook_output.js +6 -0
  40. package/dist/bollharness/src/scripts/hooks/auto-python3.js +6 -0
  41. package/dist/bollharness/src/scripts/hooks/deploy-progress-on-session-end.js +6 -0
  42. package/dist/bollharness/src/scripts/hooks/failure-analyzer.js +6 -0
  43. package/dist/bollharness/src/scripts/hooks/gate-judgment-inject.js +92 -0
  44. package/dist/bollharness/src/scripts/hooks/gate-transition-judgment.js +63 -0
  45. package/dist/bollharness/src/scripts/hooks/inbox-ack.js +6 -0
  46. package/dist/bollharness/src/scripts/hooks/inbox-inject-on-start.js +6 -0
  47. package/dist/bollharness/src/scripts/hooks/inbox-validate.js +6 -0
  48. package/dist/bollharness/src/scripts/hooks/inbox-write-ledger.js +6 -0
  49. package/dist/bollharness/src/scripts/hooks/initializer-agent.js +6 -0
  50. package/dist/bollharness/src/scripts/hooks/loop-detection.js +73 -0
  51. package/dist/bollharness/src/scripts/hooks/owner-guard.js +6 -0
  52. package/dist/bollharness/src/scripts/hooks/precompact.js +6 -0
  53. package/dist/bollharness/src/scripts/hooks/review-agent-gatekeeper.js +6 -0
  54. package/dist/bollharness/src/scripts/hooks/risk-tracker.js +108 -0
  55. package/dist/bollharness/src/scripts/hooks/sanitize-on-read.js +6 -0
  56. package/dist/bollharness/src/scripts/hooks/session-reflection.js +7 -0
  57. package/dist/bollharness/src/scripts/hooks/session-start-magic-docs.js +7 -0
  58. package/dist/bollharness/src/scripts/hooks/session-start-reset-risk.js +7 -0
  59. package/dist/bollharness/src/scripts/hooks/session-start-toolkit-reminder.js +7 -0
  60. package/dist/bollharness/src/scripts/hooks/stop-evaluator.js +157 -0
  61. package/dist/bollharness/src/scripts/hooks/tool-call-counter.js +6 -0
  62. package/dist/bollharness/src/scripts/hooks/trace-analyzer.js +10 -0
  63. package/dist/bollharness/src/scripts/install/install-trust-token.js +7 -0
  64. package/dist/bollharness/src/scripts/install/multi_project_registry.js +9 -0
  65. package/dist/bollharness/src/scripts/install/phase2_auto.js +21 -0
  66. package/dist/bollharness/src/scripts/install/pre_commit_installer.js +6 -0
  67. package/dist/bollharness/src/scripts/install/tier_selector.js +7 -0
  68. package/dist/bollharness/src/scripts/install/transcript_miner.js +7 -0
  69. package/dist/bollharness/src/scripts/lib/claim_patterns.js +10 -0
  70. package/dist/bollharness/src/scripts/lib/sanitize_patterns.js +12 -0
  71. package/dist/bollharness/src/scripts/sanitize.js +6 -0
  72. package/dist/bollharness-integration/channel-judgment-engine.js +530 -0
  73. package/dist/bollharness-integration/context-chain-router.js +383 -0
  74. package/dist/bollharness-integration/context-router-judgment.js +13 -21
  75. package/dist/bollharness-integration/context-router.js +22 -64
  76. package/dist/bollharness-integration/gate-state-machine.js +14 -19
  77. package/dist/bollharness-integration/gate-transition-hooks.js +16 -61
  78. package/dist/bollharness-integration/guard-checker.js +21 -68
  79. package/dist/bollharness-integration/index.js +14 -124
  80. package/dist/bollharness-integration/integration.js +13 -20
  81. package/dist/bollharness-integration/llm-judgment-engine.js +569 -0
  82. package/dist/bollharness-integration/skill-adapter.js +18 -64
  83. package/dist/cli-entry.js +261 -0
  84. package/dist/constraint-runtime/src/commands.js +17 -7
  85. package/dist/constraint-runtime/src/constraint/budget.js +1 -6
  86. package/dist/constraint-runtime/src/constraint/permission.js +1 -6
  87. package/dist/constraint-runtime/src/models.js +1 -3
  88. package/dist/constraint-runtime/src/tools.js +17 -7
  89. package/dist/constraints/index.js +1 -7
  90. package/dist/documents/reader.js +8 -49
  91. package/dist/heartbeat/DaemonManager.js +242 -0
  92. package/dist/heartbeat/HealthMonitor.js +285 -0
  93. package/dist/heartbeat/StartupVerifier.js +205 -0
  94. package/dist/heartbeat/Watchdog.js +168 -0
  95. package/dist/heartbeat/index.js +84 -0
  96. package/dist/heartbeat/types.js +5 -0
  97. package/dist/index.js +381 -28
  98. package/dist/llm/config-store.js +31 -57
  99. package/dist/llm/llm-judgment-client.js +389 -0
  100. package/dist/llm/pi-ai.js +9 -52
  101. package/dist/network/agent-network.js +46 -90
  102. package/dist/network/hybrid-messenger.js +125 -0
  103. package/dist/network/iroh-bootstrap.js +38 -0
  104. package/dist/network/iroh-discovery.js +145 -0
  105. package/dist/network/iroh-integration.js +9 -16
  106. package/dist/network/iroh-transport.js +10 -48
  107. package/dist/network/p2p.js +23 -62
  108. package/dist/network/storage/adapters/json-adapter.js +4 -42
  109. package/dist/network/storage/index.js +147 -0
  110. package/dist/network/storage/types.js +14 -0
  111. package/dist/pi-ecosystem/index.js +233 -0
  112. package/dist/pi-ecosystem-colony/index.js +29 -90
  113. package/dist/pi-ecosystem-goals/index.js +20 -74
  114. package/dist/pi-ecosystem-judgment/decision.js +29 -47
  115. package/dist/pi-ecosystem-judgment/distillation.js +16 -29
  116. package/dist/pi-ecosystem-judgment/human-value-store.js +13 -60
  117. package/dist/pi-ecosystem-judgment/index.js +21 -74
  118. package/dist/pi-ecosystem-judgment/value-injection.js +26 -72
  119. package/dist/pi-ecosystem-mcp/index.js +24 -78
  120. package/dist/pi-ecosystem-subagents/index.js +20 -69
  121. package/dist/social/ant-colony/AdaptiveHeartbeat.js +3 -8
  122. package/dist/social/ant-colony/PheromoneEngine.js +11 -49
  123. package/dist/social/ant-colony/index.js +6 -0
  124. package/dist/social/ant-colony/types.js +4 -8
  125. package/dist/social/channels/ChannelManager.js +8 -46
  126. package/dist/social/channels/DiapChannelBridge.js +9 -47
  127. package/dist/social/channels/InterestMatcher.js +2 -7
  128. package/dist/social/channels/channel-agent-session.js +309 -0
  129. package/dist/social/channels/channel-heartbeat-agent.js +494 -0
  130. package/dist/social/channels/diap-doc-parser.js +204 -0
  131. package/dist/social/channels/harness-workflow-integrator.js +446 -0
  132. package/dist/social/channels/index.js +9 -0
  133. package/dist/social/channels/types.js +3 -7
  134. package/dist/social/global-shared-context.js +6 -47
  135. package/dist/social/heartbeat.js +29 -72
  136. package/dist/social/persona/enhanced-persona.js +299 -0
  137. package/dist/web/client.js +302 -136
  138. package/dist/web/components/p2p/index.js +159 -9
  139. package/dist/web/components/p2p/p2p-connection.js +136 -0
  140. package/dist/web/components/p2p/p2p-manager.js +24 -0
  141. package/dist/web/components/p2p/p2p-store-memory.js +1 -1
  142. package/dist/web/components/p2p/types.js +7 -0
  143. package/dist/web/index.html +5 -0
  144. package/dist/web/style.css +118 -0
  145. package/package.json +12 -6
  146. package/scripts/build-cli.js +206 -0
  147. package/scripts/postinstall.js +153 -0
  148. package/src/agents/pi-sdk.ts +347 -28
  149. package/src/agents/protocol.ts +95 -1
  150. package/src/agents/workflow-pivot-loop.ts +674 -0
  151. package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +34 -0
  152. package/src/cli-entry.ts +304 -0
  153. package/src/heartbeat/DaemonManager.ts +283 -0
  154. package/src/heartbeat/HealthMonitor.ts +316 -0
  155. package/src/heartbeat/StartupVerifier.ts +223 -0
  156. package/src/heartbeat/Watchdog.ts +198 -0
  157. package/src/heartbeat/index.ts +108 -0
  158. package/src/heartbeat/types.ts +82 -0
  159. package/src/llm/config-store.ts +23 -5
  160. package/src/network/iroh-transport.ts +3 -3
  161. package/src/web/client.js +302 -136
  162. package/src/web/components/p2p/P2PModal.tsx +91 -3
  163. package/src/web/components/p2p/index.ts +171 -9
  164. package/src/web/components/p2p/p2p-connection.ts +153 -1
  165. package/src/web/components/p2p/p2p-manager.ts +39 -1
  166. package/src/web/components/p2p/p2p-store-memory.ts +1 -1
  167. package/src/web/components/p2p/p2p-tools.ts +315 -0
  168. package/src/web/components/p2p/types.ts +58 -0
  169. package/src/web/index.html +5 -0
  170. package/src/web/server.ts +353 -36
  171. package/src/web/style.css +118 -0
  172. package/tsconfig.cli.json +16 -0
  173. package/tsconfig.electron.json +1 -1
  174. package/tsconfig.json +1 -2
  175. package/dist/constraint-runtime/tests/agent.test.js +0 -16
  176. package/dist/constraint-runtime/tests/constraint.test.js +0 -41
  177. package/dist/constraint-runtime/tests/skill.test.js +0 -19
  178. package/dist/constraint-runtime/tests/thinking.test.js +0 -22
  179. package/dist/electron-preload.js +0 -15
  180. package/dist/electron-preload.js.map +0 -1
  181. package/dist/electron.js +0 -206
  182. package/dist/electron.js.map +0 -1
  183. package/dist/test/constraint-layer.test.js +0 -164
  184. package/dist/test/global-shared-context.test.js +0 -315
  185. package/dist/test/pi-sdk.test.js +0 -47
  186. package/dist/test/set-persona.test.js +0 -38
  187. package/dist/test/subagent-manager.test.js +0 -276
  188. package/dist/test/workflow-engine.test.js +0 -87
  189. package/dist/web/server.js +0 -1647
  190. package/dist/web/server.js.map +0 -1
  191. package/dist/workflows/collaboration.js +0 -374
  192. package/dist/workflows/index.js +0 -54
  193. package/docs/agent-communication.md +0 -333
  194. package/docs/plans/2026-05-15-document-agent-design.md +0 -479
  195. package/docs/plans/2026-05-15-document-agent-implementation-plan.md +0 -792
  196. package/docs/plans/2026-05-16-chat-ui-design.md +0 -86
  197. package/docs/plans/2026-05-16-constraint-runtime-design.md +0 -106
  198. package/docs/plans/2026-05-16-constraint-runtime-implementation.md +0 -441
  199. package/docs//346/225/260/345/255/246/350/276/205/345/212/251/346/231/272/350/203/275/344/275/223-/346/240/270/345/277/203/346/225/210/346/236/234/345/256/232/344/271/211.md +0 -287
  200. package/src/bollharness/.boll/CLAUDE.md.template +0 -34
  201. package/src/bollharness/.boll/MANIFEST.yaml +0 -213
  202. package/src/bollharness/.boll/active-review-agents/.gitkeep +0 -0
  203. package/src/bollharness/.boll/agents/review-base.yaml +0 -108
  204. package/src/bollharness/.boll/deploy-allowlist.yaml +0 -38
  205. package/src/bollharness/.boll/inbox/schema/message-v1.json +0 -99
  206. package/src/bollharness/.boll/install-staging/.gitkeep +0 -0
  207. package/src/bollharness/.boll/issue-adapter.yaml +0 -31
  208. package/src/bollharness/.boll/plugins/boll-mode-toolkit/contracts/mode-contract.md +0 -85
  209. package/src/bollharness/.boll/plugins/boll-review-toolkit/contracts/evidence-packet-schema.json +0 -102
  210. package/src/bollharness/.boll/plugins/boll-review-toolkit/contracts/review-contract.yaml +0 -247
  211. package/src/bollharness/.boll/rules/backend-routes.md +0 -31
  212. package/src/bollharness/.boll/rules/closure-semantics.md +0 -30
  213. package/src/bollharness/.boll/rules/env-vars.md +0 -32
  214. package/src/bollharness/.boll/rules/hanis-protocol.md +0 -145
  215. package/src/bollharness/.boll/rules/repo-structure.md +0 -42
  216. package/src/bollharness/.boll/rules/review-agent-isolation.md +0 -73
  217. package/src/bollharness/.boll/rules/source-of-truth.md +0 -33
  218. package/src/bollharness/.boll/settings.json +0 -180
  219. package/src/bollharness/.boll/settings.json.template +0 -31
  220. package/src/bollharness/.boll/skills/arch/SKILL.md +0 -372
  221. package/src/bollharness/.boll/skills/bug-pipeline/SKILL.md +0 -168
  222. package/src/bollharness/.boll/skills/bug-triage/SKILL.md +0 -161
  223. package/src/bollharness/.boll/skills/context-chains/SKILL.md +0 -250
  224. package/src/bollharness/.boll/skills/context-chains/context-chain-index.md +0 -48
  225. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/code_change_extractor.ts +0 -142
  226. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/debugging_extractor.ts +0 -126
  227. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/design_extractor.ts +0 -148
  228. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/planning_extractor.ts +0 -162
  229. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/question_extractor.ts +0 -116
  230. package/src/bollharness/.boll/skills/context-chains/work-type-extractors/review_extractor.ts +0 -136
  231. package/src/bollharness/.boll/skills/crystal-learn/SKILL.md +0 -93
  232. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-0.md +0 -34
  233. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-1.md +0 -34
  234. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-2.md +0 -35
  235. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-3.md +0 -34
  236. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-4.md +0 -43
  237. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-5.md +0 -34
  238. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-6.md +0 -37
  239. package/src/bollharness/.boll/skills/crystal-learn/invariants/INV-7.md +0 -46
  240. package/src/bollharness/.boll/skills/guardian-fixer/PROMPT.md +0 -415
  241. package/src/bollharness/.boll/skills/guardian-fixer/SKILL.md +0 -320
  242. package/src/bollharness/.boll/skills/harness-dev/SKILL.md +0 -93
  243. package/src/bollharness/.boll/skills/harness-dev/examples/README.md +0 -227
  244. package/src/bollharness/.boll/skills/harness-dev-handoff/SKILL.md +0 -165
  245. package/src/bollharness/.boll/skills/harness-eng/SKILL.md +0 -110
  246. package/src/bollharness/.boll/skills/harness-eng-test/SKILL.md +0 -79
  247. package/src/bollharness/.boll/skills/harness-lab/SKILL.md +0 -170
  248. package/src/bollharness/.boll/skills/harness-ops/SKILL.md +0 -57
  249. package/src/bollharness/.boll/skills/harness-voice/SKILL.md +0 -183
  250. package/src/bollharness/.boll/skills/judgment/SKILL.md +0 -115
  251. package/src/bollharness/.boll/skills/lead/SKILL.md +0 -245
  252. package/src/bollharness/.boll/skills/lead/install-wow-harness.md +0 -77
  253. package/src/bollharness/.boll/skills/lead/ref-review-sop.md +0 -91
  254. package/src/bollharness/.boll/skills/lead/ref-stages.md +0 -129
  255. package/src/bollharness/.boll/skills/skill-discovery/SKILL.md +0 -169
  256. package/src/bollharness/.boll/skills/task-arch/SKILL.md +0 -106
  257. package/src/bollharness/.boll/skills/toolkit/SKILL.md +0 -57
  258. package/src/bollharness/.boll/tasks/.gitkeep +0 -0
  259. package/src/bollharness/.boll/toolkit-index.yaml +0 -112
  260. package/src/bollharness/.claude/agents/review-base.yaml +0 -108
  261. package/src/bollharness/.claude/plugins/boll-mode-toolkit/.claude-plugin/plugin.json +0 -44
  262. package/src/bollharness/.claude/plugins/boll-review-toolkit/.claude-plugin/plugin.json +0 -24
  263. package/src/bollharness/.claude/plugins/boll-review-toolkit/contracts/evidence-packet-schema.json +0 -102
  264. package/src/bollharness/.claude/plugins/boll-review-toolkit/contracts/review-contract.yaml +0 -247
  265. package/src/bollharness/.claude/settings.json +0 -157
  266. package/src/bollharness/.claude/skills/arch/SKILL.md +0 -64
  267. package/src/bollharness/.claude/skills/crystal-learn/SKILL.md +0 -93
  268. package/src/bollharness/.claude/skills/guardian-fixer/PROMPT.md +0 -44
  269. package/src/bollharness/.claude/skills/guardian-fixer/SKILL.md +0 -324
  270. package/src/bollharness/.claude/skills/harness-dev/SKILL.md +0 -93
  271. package/src/bollharness/.claude/skills/harness-dev/examples/README.md +0 -17
  272. package/src/bollharness/.claude/skills/harness-dev-handoff/SKILL.md +0 -165
  273. package/src/bollharness/.claude/skills/harness-eng/SKILL.md +0 -183
  274. package/src/bollharness/.claude/skills/harness-eng-test/SKILL.md +0 -57
  275. package/src/bollharness/.claude/skills/harness-ops/SKILL.md +0 -57
  276. package/src/bollharness/.claude/skills/harness-voice/SKILL.md +0 -84
  277. package/src/bollharness/.claude/skills/lead/INDEX.md +0 -28
  278. package/src/bollharness/.claude/skills/lead/SKILL.md +0 -24
  279. package/src/bollharness/.claude/skills/lead/install-wow-harness.md +0 -77
  280. package/src/bollharness/.claude/skills/lead/ref-review-sop.md +0 -48
  281. package/src/bollharness/.claude/skills/lead/ref-stages.md +0 -58
  282. package/src/bollharness/.claude/skills/plan-lock/SKILL.md +0 -74
  283. package/src/bollharness/.claude/skills/skill-discovery/SKILL.md +0 -120
  284. package/src/bollharness/.claude/skills/task-arch/SKILL.md +0 -106
  285. package/src/bollharness/.claude/skills/toolkit/SKILL.md +0 -57
  286. package/src/bollharness/.claude/skills/toolkit/list.sh +0 -92
  287. package/src/bollharness/.githooks/pre-commit +0 -21
  288. package/src/bollharness/.github/workflows/ci.yml +0 -88
  289. package/src/bollharness/docs/decisions/ADR-030-guard-signal-protocol-and-governance-reload.md +0 -1076
  290. package/src/bollharness/docs/decisions/ADR-038-harness-optimization-strategy.md +0 -2039
  291. package/src/bollharness/docs/decisions/ADR-041-codex-claude-code-division-of-labor.md +0 -128
  292. package/src/bollharness/docs/decisions/ADR-H1-crystal-learn-revival.md +0 -188
  293. package/src/bollharness/docs/decisions/ADR-H2-identity-isolation.md +0 -183
  294. package/src/bollharness/docs/decisions/ADR-H3-memory-scope.md +0 -133
  295. package/src/bollharness/docs/decisions/ADR-H4-prompt-governance.md +0 -146
  296. package/src/bollharness/docs/decisions/ADR-H5-gate-quantization.md +0 -212
  297. package/src/bollharness/docs/decisions/ADR-H6-state-file-health.md +0 -211
  298. package/src/bollharness/docs/decisions/ADR-H8-issue-and-doc-compliance.md +0 -202
  299. package/src/bollharness/docs/decisions/ADR-H9-mailbox.md +0 -231
  300. package/src/bollharness/docs/decisions/PLAN-H1-crystal-learn-revival.md +0 -270
  301. package/src/bollharness/docs/decisions/PLAN-H2-identity-isolation.md +0 -291
  302. package/src/bollharness/docs/decisions/PLAN-H3-memory-scope.md +0 -228
  303. package/src/bollharness/docs/decisions/PLAN-H4-prompt-governance.md +0 -227
  304. package/src/bollharness/docs/decisions/PLAN-H5-gate-quantization.md +0 -239
  305. package/src/bollharness/docs/decisions/PLAN-H6-state-file-health.md +0 -325
  306. package/src/bollharness/docs/decisions/PLAN-H8-issue-and-doc-compliance.md +0 -242
  307. package/src/bollharness/docs/decisions/PLAN-H9-mailbox.md +0 -378
  308. package/src/bollharness/docs/launch-article-en.md +0 -276
  309. package/src/bollharness/docs/launch-article-zh.md +0 -305
  310. package/src/bollharness/docs/practice.html +0 -356
  311. package/src/bollharness/docs/practice.md +0 -82
  312. package/src/bollharness/docs/research/round-1/README.md +0 -11
  313. package/src/bollharness/docs/research/round-2/README.md +0 -11
  314. package/src/bollharness/docs/research/round-3/README.md +0 -11
  315. package/src/bollharness/docs/research/round-4/README.md +0 -11
  316. package/src/bollharness/docs/research/round-5/README.md +0 -11
  317. package/src/bollharness/docs/research/round-6/README.md +0 -11
  318. package/src/bollharness/package-lock.json +0 -48
  319. package/src/bollharness/reference/boll-reference/.claude/rules/backend-routes.md +0 -268
  320. package/src/bollharness/reference/boll-reference/.claude/rules/bridge.md +0 -20
  321. package/src/bollharness/reference/boll-reference/.claude/rules/closure-semantics.md +0 -30
  322. package/src/bollharness/reference/boll-reference/.claude/rules/coaching.md +0 -13
  323. package/src/bollharness/reference/boll-reference/.claude/rules/env-vars.md +0 -50
  324. package/src/bollharness/reference/boll-reference/.claude/rules/hackathon.md +0 -12
  325. package/src/bollharness/reference/boll-reference/.claude/rules/repo-structure.md +0 -184
  326. package/src/bollharness/reference/boll-reference/.claude/rules/review-agent-isolation.md +0 -112
  327. package/src/bollharness/reference/boll-reference/.claude/rules/scenes.md +0 -12
  328. package/src/bollharness/reference/boll-reference/.claude/skills/arch/SKILL.md +0 -551
  329. package/src/bollharness/reference/boll-reference/.claude/skills/boll-animation/SKILL.md +0 -26
  330. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/SKILL.md +0 -227
  331. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/agents/openai.yaml +0 -4
  332. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/references/bridge-failure-taxonomy.md +0 -142
  333. package/src/bollharness/reference/boll-reference/.claude/skills/boll-bridge/references/bridge-validation-ladder.md +0 -107
  334. package/src/bollharness/reference/boll-reference/.claude/skills/boll-crystal/SKILL.md +0 -893
  335. package/src/bollharness/reference/boll-reference/.claude/skills/boll-crystal-learn/SKILL.md +0 -89
  336. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev/SKILL.md +0 -93
  337. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev/examples/README.md +0 -209
  338. package/src/bollharness/reference/boll-reference/.claude/skills/boll-dev-handoff/SKILL.md +0 -165
  339. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng/SKILL.md +0 -110
  340. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-frontend/SKILL.md +0 -203
  341. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-hdc/SKILL.md +0 -27
  342. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-orchestrator/SKILL.md +0 -28
  343. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-prompt/SKILL.md +0 -27
  344. package/src/bollharness/reference/boll-reference/.claude/skills/boll-eng-test/SKILL.md +0 -79
  345. package/src/bollharness/reference/boll-reference/.claude/skills/boll-lab/SKILL.md +0 -372
  346. package/src/bollharness/reference/boll-reference/.claude/skills/boll-run/SKILL.md +0 -437
  347. package/src/bollharness/reference/boll-reference/.claude/skills/boll-ux-appstore/SKILL.md +0 -27
  348. package/src/bollharness/reference/boll-reference/.claude/skills/boll-voice/SKILL.md +0 -442
  349. package/src/bollharness/reference/boll-reference/.claude/skills/guardian-fixer/PROMPT.md +0 -421
  350. package/src/bollharness/reference/boll-reference/.claude/skills/guardian-fixer/SKILL.md +0 -326
  351. package/src/bollharness/reference/boll-reference/.claude/skills/lead/SKILL.md +0 -155
  352. package/src/bollharness/reference/boll-reference/.claude/skills/lead/ref-review-sop.md +0 -91
  353. package/src/bollharness/reference/boll-reference/.claude/skills/lead/ref-stages.md +0 -129
  354. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-preview.png +0 -0
  355. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v2.png +0 -0
  356. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v3.png +0 -0
  357. package/src/bollharness/reference/boll-reference/.claude/skills/nature-designer/output/skill-map-v4.png +0 -0
  358. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/SKILL.md +0 -425
  359. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/ref-three-checks.md +0 -62
  360. package/src/bollharness/reference/boll-reference/.claude/skills/plan-lock/ref-wp-templates.md +0 -78
  361. package/src/bollharness/reference/boll-reference/.claude/skills/task-arch/SKILL.md +0 -76
  362. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-graph/SKILL.md +0 -57
  363. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-graph/beads-graph.sh +0 -153
  364. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-init/SKILL.md +0 -52
  365. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-init/beads-auto-link.sh +0 -76
  366. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-sync/SKILL.md +0 -50
  367. package/src/bollharness/reference/boll-reference/.claude/skills/vibedevteam-sync/beads-sync-proj.sh +0 -108
  368. package/src/bollharness/reference/boll-reference/docs/architecture/AGENT-PROFILE.md +0 -151
  369. package/src/bollharness/reference/boll-reference/docs/architecture/COST-STRUCTURE.md +0 -56
  370. package/src/bollharness/reference/boll-reference/docs/architecture/INDEX.md +0 -76
  371. package/src/bollharness/reference/boll-reference/docs/architecture/MODULE1-INTENT-FIELD.md +0 -116
  372. package/src/bollharness/reference/boll-reference/docs/architecture/MODULE2-CRYSTALLIZATION.md +0 -200
  373. package/src/bollharness/reference/boll-reference/docs/architecture/PRINCIPLES.md +0 -84
  374. package/src/bollharness/reference/boll-reference/docs/architecture/PROTOCOL-CORE.md +0 -209
  375. package/src/bollharness/reference/boll-reference/docs/architecture/VISION.md +0 -181
  376. package/src/bollharness/reference/boll-reference/docs/architecture/discussions/D-01-MARKET-SCENE-PROTOCOL.md +0 -754
  377. package/src/bollharness/templates/scaffold/.boll/guard/.gitkeep +0 -0
  378. package/src/bollharness/templates/scaffold/.boll/metrics/.gitkeep +0 -0
  379. package/src/bollharness/templates/scaffold/.boll/state/.gitkeep +0 -0
  380. package/src/bollharness/templates/scaffold/docs/INDEX.md +0 -3
  381. package/src/bollharness/templates/scaffold/docs/decisions/ADR_TEMPLATE.md +0 -38
  382. package/src/bollharness/templates/scaffold/docs/decisions/PLAN_TEMPLATE.md +0 -45
  383. package/src/bollharness/templates/scaffold/docs/decisions/tasks/.gitkeep +0 -2
  384. package/src/bollharness/templates/scaffold/docs/issues/.gitkeep +0 -0
  385. package/src/bollharness/templates/scaffold/docs/issues/GUARD_ISSUE_TEMPLATE.md +0 -35
  386. package/src/bollharness/templates/scaffold/docs/issues/ISSUE_TEMPLATE.md +0 -51
  387. package/src/bollharness/tsconfig.json +0 -26
  388. package/src/constraint-runtime/package-lock.json +0 -48
  389. package/src/constraint-runtime/package.json +0 -34
  390. package/src/constraint-runtime/src/_archive_helper.ts +0 -16
  391. package/src/constraint-runtime/src/agent/coordinator.ts +0 -71
  392. package/src/constraint-runtime/src/agent/index.ts +0 -1
  393. package/src/constraint-runtime/src/assistant/index.ts +0 -15
  394. package/src/constraint-runtime/src/bootstrap/index.ts +0 -15
  395. package/src/constraint-runtime/src/bootstrap_graph.ts +0 -17
  396. package/src/constraint-runtime/src/bridge/index.ts +0 -15
  397. package/src/constraint-runtime/src/buddy/index.ts +0 -15
  398. package/src/constraint-runtime/src/cli/index.ts +0 -15
  399. package/src/constraint-runtime/src/command_graph.ts +0 -20
  400. package/src/constraint-runtime/src/commands.ts +0 -83
  401. package/src/constraint-runtime/src/components/index.ts +0 -15
  402. package/src/constraint-runtime/src/constants/index.ts +0 -15
  403. package/src/constraint-runtime/src/constraint/budget.ts +0 -25
  404. package/src/constraint-runtime/src/constraint/index.ts +0 -3
  405. package/src/constraint-runtime/src/constraint/permission.ts +0 -28
  406. package/src/constraint-runtime/src/context.ts +0 -45
  407. package/src/constraint-runtime/src/coordinator/index.ts +0 -15
  408. package/src/constraint-runtime/src/cost_hook.ts +0 -6
  409. package/src/constraint-runtime/src/cost_tracker.ts +0 -9
  410. package/src/constraint-runtime/src/deferred_init.ts +0 -18
  411. package/src/constraint-runtime/src/direct_modes.ts +0 -13
  412. package/src/constraint-runtime/src/dynamic-tool-loader.ts +0 -115
  413. package/src/constraint-runtime/src/entrypoints/index.ts +0 -15
  414. package/src/constraint-runtime/src/execution_registry.ts +0 -41
  415. package/src/constraint-runtime/src/history.ts +0 -16
  416. package/src/constraint-runtime/src/hooks/index.ts +0 -15
  417. package/src/constraint-runtime/src/index.ts +0 -28
  418. package/src/constraint-runtime/src/ink.ts +0 -4
  419. package/src/constraint-runtime/src/keybindings/index.ts +0 -15
  420. package/src/constraint-runtime/src/memdir/index.ts +0 -15
  421. package/src/constraint-runtime/src/migrations/index.ts +0 -15
  422. package/src/constraint-runtime/src/models.ts +0 -49
  423. package/src/constraint-runtime/src/moreright/index.ts +0 -15
  424. package/src/constraint-runtime/src/native_ts/index.ts +0 -15
  425. package/src/constraint-runtime/src/output_styles/index.ts +0 -15
  426. package/src/constraint-runtime/src/parity_audit.ts +0 -23
  427. package/src/constraint-runtime/src/plugins/index.ts +0 -15
  428. package/src/constraint-runtime/src/port_manifest.ts +0 -20
  429. package/src/constraint-runtime/src/prefetch.ts +0 -17
  430. package/src/constraint-runtime/src/query.ts +0 -7
  431. package/src/constraint-runtime/src/reference_data/archive_surface_snapshot.json +0 -63
  432. package/src/constraint-runtime/src/reference_data/commands_snapshot.json +0 -1037
  433. package/src/constraint-runtime/src/reference_data/subsystems/OpenCLI.json +0 -10
  434. package/src/constraint-runtime/src/reference_data/subsystems/PolymarketSDK.json +0 -12
  435. package/src/constraint-runtime/src/reference_data/subsystems/SafeSDK.json +0 -14
  436. package/src/constraint-runtime/src/reference_data/subsystems/assistant.json +0 -8
  437. package/src/constraint-runtime/src/reference_data/subsystems/bootstrap.json +0 -8
  438. package/src/constraint-runtime/src/reference_data/subsystems/bridge.json +0 -32
  439. package/src/constraint-runtime/src/reference_data/subsystems/buddy.json +0 -13
  440. package/src/constraint-runtime/src/reference_data/subsystems/cli.json +0 -26
  441. package/src/constraint-runtime/src/reference_data/subsystems/components.json +0 -32
  442. package/src/constraint-runtime/src/reference_data/subsystems/constants.json +0 -28
  443. package/src/constraint-runtime/src/reference_data/subsystems/coordinator.json +0 -8
  444. package/src/constraint-runtime/src/reference_data/subsystems/entrypoints.json +0 -15
  445. package/src/constraint-runtime/src/reference_data/subsystems/hooks.json +0 -32
  446. package/src/constraint-runtime/src/reference_data/subsystems/keybindings.json +0 -21
  447. package/src/constraint-runtime/src/reference_data/subsystems/memdir.json +0 -15
  448. package/src/constraint-runtime/src/reference_data/subsystems/migrations.json +0 -18
  449. package/src/constraint-runtime/src/reference_data/subsystems/moreright.json +0 -8
  450. package/src/constraint-runtime/src/reference_data/subsystems/native_ts.json +0 -11
  451. package/src/constraint-runtime/src/reference_data/subsystems/outputStyles.json +0 -8
  452. package/src/constraint-runtime/src/reference_data/subsystems/plugins.json +0 -9
  453. package/src/constraint-runtime/src/reference_data/subsystems/remote.json +0 -11
  454. package/src/constraint-runtime/src/reference_data/subsystems/schemas.json +0 -8
  455. package/src/constraint-runtime/src/reference_data/subsystems/screens.json +0 -10
  456. package/src/constraint-runtime/src/reference_data/subsystems/server.json +0 -10
  457. package/src/constraint-runtime/src/reference_data/subsystems/services.json +0 -32
  458. package/src/constraint-runtime/src/reference_data/subsystems/skills.json +0 -27
  459. package/src/constraint-runtime/src/reference_data/subsystems/state.json +0 -13
  460. package/src/constraint-runtime/src/reference_data/subsystems/types.json +0 -18
  461. package/src/constraint-runtime/src/reference_data/subsystems/upstreamproxy.json +0 -9
  462. package/src/constraint-runtime/src/reference_data/subsystems/utils.json +0 -32
  463. package/src/constraint-runtime/src/reference_data/subsystems/vim.json +0 -12
  464. package/src/constraint-runtime/src/reference_data/subsystems/voice.json +0 -8
  465. package/src/constraint-runtime/src/reference_data/tools_snapshot.json +0 -1042
  466. package/src/constraint-runtime/src/remote/index.ts +0 -15
  467. package/src/constraint-runtime/src/remote_runtime.ts +0 -17
  468. package/src/constraint-runtime/src/runtime/index.ts +0 -1
  469. package/src/constraint-runtime/src/runtime/session.ts +0 -42
  470. package/src/constraint-runtime/src/schemas/index.ts +0 -15
  471. package/src/constraint-runtime/src/screens/index.ts +0 -15
  472. package/src/constraint-runtime/src/server/index.ts +0 -15
  473. package/src/constraint-runtime/src/services/index.ts +0 -15
  474. package/src/constraint-runtime/src/session_store.ts +0 -32
  475. package/src/constraint-runtime/src/setup.ts +0 -50
  476. package/src/constraint-runtime/src/skills/index.ts +0 -1
  477. package/src/constraint-runtime/src/skills/skill-registry.ts +0 -40
  478. package/src/constraint-runtime/src/state/index.ts +0 -15
  479. package/src/constraint-runtime/src/system_init.ts +0 -21
  480. package/src/constraint-runtime/src/thinking/engine.ts +0 -61
  481. package/src/constraint-runtime/src/thinking/index.ts +0 -1
  482. package/src/constraint-runtime/src/tool_pool.ts +0 -20
  483. package/src/constraint-runtime/src/tools/OpenCLI/execAdapter.ts +0 -12
  484. package/src/constraint-runtime/src/tools/OpenCLI/listAdapters.ts +0 -12
  485. package/src/constraint-runtime/src/tools/OpenCLI/runCommand.ts +0 -13
  486. package/src/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.ts +0 -10
  487. package/src/constraint-runtime/src/tools/PolymarketSDK/createOrder.ts +0 -13
  488. package/src/constraint-runtime/src/tools/PolymarketSDK/getMarket.ts +0 -14
  489. package/src/constraint-runtime/src/tools/PolymarketSDK/getOrders.ts +0 -10
  490. package/src/constraint-runtime/src/tools/PolymarketSDK/listMarkets.ts +0 -24
  491. package/src/constraint-runtime/src/tools/SafeSDK/confirmTransaction.ts +0 -13
  492. package/src/constraint-runtime/src/tools/SafeSDK/createTransaction.ts +0 -23
  493. package/src/constraint-runtime/src/tools/SafeSDK/deploySafe.ts +0 -12
  494. package/src/constraint-runtime/src/tools/SafeSDK/executeTransaction.ts +0 -12
  495. package/src/constraint-runtime/src/tools/SafeSDK/getBalance.ts +0 -10
  496. package/src/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.ts +0 -10
  497. package/src/constraint-runtime/src/tools/SafeSDK/proposeTransaction.ts +0 -14
  498. package/src/constraint-runtime/src/tools/WalletTools/autoPay.ts +0 -58
  499. package/src/constraint-runtime/src/tools/WalletTools/createWallet.ts +0 -19
  500. package/src/constraint-runtime/src/tools/WalletTools/getBalance.ts +0 -28
  501. package/src/constraint-runtime/src/tools/WalletTools/importWallet.ts +0 -34
  502. package/src/constraint-runtime/src/tools/WalletTools/sendTransaction.ts +0 -50
  503. package/src/constraint-runtime/src/tools/WalletTools/signMessage.ts +0 -23
  504. package/src/constraint-runtime/src/tools/WalletTools/transferToken.ts +0 -49
  505. package/src/constraint-runtime/src/tools.ts +0 -100
  506. package/src/constraint-runtime/src/transcript.ts +0 -23
  507. package/src/constraint-runtime/src/types/index.ts +0 -15
  508. package/src/constraint-runtime/src/upstream_proxy/index.ts +0 -15
  509. package/src/constraint-runtime/src/utils/index.ts +0 -15
  510. package/src/constraint-runtime/src/vim/index.ts +0 -15
  511. package/src/constraint-runtime/src/voice/index.ts +0 -15
  512. package/src/constraint-runtime/tests/agent.test.ts +0 -20
  513. package/src/constraint-runtime/tests/constraint.test.ts +0 -47
  514. package/src/constraint-runtime/tests/skill.test.ts +0 -23
  515. package/src/constraint-runtime/tests/thinking.test.ts +0 -28
  516. package/src/constraint-runtime/tsconfig.json +0 -13
  517. package/src/pi-ecosystem/index.ts +0 -453
  518. package/src/pi-ecosystem-colony/index.ts +0 -482
  519. package/src/pi-ecosystem-goals/index.ts +0 -585
  520. package/src/pi-ecosystem-judgment/decision.ts +0 -431
  521. package/src/pi-ecosystem-judgment/distillation.ts +0 -398
  522. package/src/pi-ecosystem-judgment/human-value-store.ts +0 -580
  523. package/src/pi-ecosystem-judgment/index.ts +0 -678
  524. package/src/pi-ecosystem-judgment/value-injection.ts +0 -744
  525. package/src/pi-ecosystem-mcp/index.ts +0 -427
  526. package/src/pi-ecosystem-subagents/index.ts +0 -408
  527. package/src/test/ai-judgment-test.ts +0 -92
  528. package/src/test/bollharness-integration.test.ts +0 -398
  529. package/src/test/channel-agent-multi-dialogue.ts +0 -265
  530. package/src/test/channel-heartbeat-agent-test.ts +0 -244
  531. package/src/test/constraint-layer.test.ts +0 -191
  532. package/src/test/diap-identity-test.ts +0 -222
  533. package/src/test/diap-quick-test.ts +0 -73
  534. package/src/test/global-shared-context.test.ts +0 -393
  535. package/src/test/harness-judgment-injection.test.ts +0 -353
  536. package/src/test/harness-workflow-integrator-test.ts +0 -285
  537. package/src/test/human-value-store.test.ts +0 -316
  538. package/src/test/hybrid-integration-test.ts +0 -126
  539. package/src/test/hybrid-messenger-verify.ts +0 -68
  540. package/src/test/iroh-bistream-debug.ts +0 -50
  541. package/src/test/iroh-communication.test.ts +0 -81
  542. package/src/test/iroh-debug-test.ts +0 -69
  543. package/src/test/iroh-diap-test.ts +0 -90
  544. package/src/test/iroh-direct-connect.ts +0 -65
  545. package/src/test/iroh-e2e-fixed.ts +0 -106
  546. package/src/test/iroh-e2e-same-process.ts +0 -83
  547. package/src/test/iroh-e2e.ts +0 -83
  548. package/src/test/iroh-final-e2e.ts +0 -84
  549. package/src/test/iroh-relay-test.ts +0 -46
  550. package/src/test/iroh-simple-test.ts +0 -49
  551. package/src/test/iroh-transport-verify.ts +0 -60
  552. package/src/test/iroh-transport.test.ts +0 -47
  553. package/src/test/iroh-two-nodes.ts +0 -87
  554. package/src/test/iroh-verify.ts +0 -55
  555. package/src/test/judgment-decision.test.ts +0 -373
  556. package/src/test/llm-judgment-integration.test.ts +0 -257
  557. package/src/test/p2p-agent-complex-dialogue.ts +0 -490
  558. package/src/test/p2p-agent-dialogue.ts +0 -423
  559. package/src/test/p2p-agent-full-bidirectional.ts +0 -686
  560. package/src/test/p2p-agent-harness-flow.ts +0 -562
  561. package/src/test/p2p-agent-harness-single.ts +0 -175
  562. package/src/test/p2p-ai-dialogue-test.ts +0 -374
  563. package/src/test/p2p-cid-connect-test.ts +0 -245
  564. package/src/test/p2p-connect-receiver.ts +0 -85
  565. package/src/test/p2p-iroh-test.ts +0 -214
  566. package/src/test/p2p-minimal-test.ts +0 -264
  567. package/src/test/p2p-node-1.ts +0 -172
  568. package/src/test/p2p-node-2.ts +0 -172
  569. package/src/test/p2p-server.ts +0 -335
  570. package/src/test/p2p-two-nodes-test.ts +0 -542
  571. package/src/test/pi-sdk.test.ts +0 -47
  572. package/src/test/set-persona.ts +0 -56
  573. package/src/test/simple.test.ts +0 -11
  574. package/src/test/storage-integration.test.ts +0 -191
  575. package/src/test/subagent-manager.test.ts +0 -392
  576. package/src/test/test-gate-flow.test.ts +0 -92
  577. package/src/test/workflow-engine.test.ts +0 -101
  578. package/src/workflows/collaboration.ts +0 -455
  579. package/src/workflows/index.ts +0 -64
  580. package/vitest.config.ts +0 -12
  581. package//346/203/263/346/263/225.md +0 -79
@@ -0,0 +1,674 @@
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
+ }
42
+
43
+ export interface LoopResult {
44
+ success: boolean;
45
+ response: string;
46
+ iterations: number;
47
+ toolCalls: number;
48
+ qualityScore: number;
49
+ exitReason: ExitReason;
50
+ state: PivotLoopState;
51
+ }
52
+
53
+ export type ExitReason =
54
+ | 'max_iterations'
55
+ | 'no_pending_tools'
56
+ | 'quality_threshold_met'
57
+ | 'no_progress_exhausted'
58
+ | 'token_budget_exceeded'
59
+ | 'min_iterations_not_met'
60
+ | 'error';
61
+
62
+ export type TaskComplexity = 'simple' | 'moderate' | 'complex';
63
+
64
+ export interface TaskProfile {
65
+ complexity: TaskComplexity;
66
+ estimatedSteps: number;
67
+ suggestedMaxIterations: number;
68
+ tokenBudget: number;
69
+ }
70
+
71
+ /**
72
+ * Analyze input to determine task complexity
73
+ */
74
+ function analyzeTaskComplexity(input: string): TaskProfile {
75
+ const inputLower = input.toLowerCase();
76
+ const inputLength = input.length;
77
+
78
+ // Simple task indicators
79
+ const simpleIndicators = [
80
+ '读取', '查看', '显示', '列出', '获取', 'what is', 'show me',
81
+ 'list', 'get', 'show', 'read', 'view', 'display'
82
+ ];
83
+
84
+ // Complex task indicators
85
+ const complexIndicators = [
86
+ '分析', '比较', '改进', '优化', '重构', '实现', '设计', '创建',
87
+ 'analyze', 'compare', 'improve', 'optimize', 'refactor', 'implement',
88
+ 'design', 'create', 'build', 'develop'
89
+ ];
90
+
91
+ // Question patterns suggest moderate complexity
92
+ const questionPatterns = [
93
+ '如何', '怎么', '为什么', '什么', 'which', 'how', 'why', 'what', '?'
94
+ ];
95
+
96
+ const simpleCount = simpleIndicators.filter(i => inputLower.includes(i)).length;
97
+ const complexCount = complexIndicators.filter(i => inputLower.includes(i)).length;
98
+ const questionCount = questionPatterns.filter(p => inputLower.includes(p)).length;
99
+
100
+ let complexity: TaskComplexity;
101
+ let estimatedSteps: number;
102
+
103
+ if (complexCount > simpleCount && complexCount > 1) {
104
+ complexity = 'complex';
105
+ estimatedSteps = 5 + complexCount * 2;
106
+ } else if (questionCount > 2 || (simpleCount > 0 && complexCount > 0)) {
107
+ complexity = 'moderate';
108
+ estimatedSteps = 3 + questionCount;
109
+ } else if (inputLength < 50 && simpleCount > 0) {
110
+ complexity = 'simple';
111
+ estimatedSteps = 1 + simpleCount;
112
+ } else if (complexCount > 0) {
113
+ complexity = 'complex';
114
+ estimatedSteps = 4 + complexCount;
115
+ } else {
116
+ complexity = 'moderate';
117
+ estimatedSteps = 3;
118
+ }
119
+
120
+ // Adjust based on input length (longer inputs often mean more complex tasks)
121
+ if (inputLength > 500 && complexity !== 'complex') {
122
+ complexity = 'moderate';
123
+ estimatedSteps = Math.max(estimatedSteps, 4);
124
+ }
125
+
126
+ // Suggested max iterations: 2-3x estimated steps for safety margin
127
+ const suggestedMaxIterations = Math.min(Math.max(estimatedSteps * 3, 10), 100);
128
+ const tokenBudget = estimatedSteps * 800; // ~800 tokens per step estimate
129
+
130
+ return { complexity, estimatedSteps, suggestedMaxIterations, tokenBudget };
131
+ }
132
+
133
+ /**
134
+ * WorkflowPivotLoop - Main loop controller
135
+ */
136
+ export class WorkflowPivotLoop {
137
+ private config: Required<PivotLoopConfig>;
138
+ private state: PivotLoopState;
139
+ private tools: Map<string, Tool>;
140
+ private messageHistory: Array<{ role: string; content: string; toolCall?: { name: string; args: Record<string, string> }; toolResult?: ToolResult }>;
141
+ private streamCallback?: StreamCallback;
142
+
143
+ constructor(config: PivotLoopConfig) {
144
+ this.tools = new Map();
145
+
146
+ // Default configuration based on task complexity if not provided
147
+ const defaults: Required<PivotLoopConfig> = {
148
+ maxIterations: config.maxIterations || 50,
149
+ minIterations: config.minIterations || 2,
150
+ qualityThreshold: config.qualityThreshold || 0.7,
151
+ maxConsecutiveNoProgress: config.maxConsecutiveNoProgress || 5,
152
+ maxTokenBudget: config.maxTokenBudget || 50000,
153
+ complexity: config.complexity || 'moderate'
154
+ };
155
+
156
+ this.config = defaults;
157
+
158
+ this.state = this.createInitialState();
159
+ this.messageHistory = [];
160
+ }
161
+
162
+ private createInitialState(): PivotLoopState {
163
+ return {
164
+ iteration: 0,
165
+ totalTokens: 0,
166
+ toolCallsCount: 0,
167
+ consecutiveNoProgress: 0,
168
+ qualityScores: [],
169
+ pendingToolUses: [],
170
+ lastMeaningfulWork: 0
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Register a tool for use in the loop
176
+ */
177
+ registerTool(tool: Tool): void {
178
+ this.tools.set(tool.name, tool);
179
+ }
180
+
181
+ /**
182
+ * Register multiple tools at once
183
+ */
184
+ registerTools(tools: Tool[]): void {
185
+ for (const tool of tools) {
186
+ this.registerTool(tool);
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Execute the pivot loop
192
+ */
193
+ async execute(
194
+ input: string,
195
+ llm: LLMInterface,
196
+ systemPrompt: string,
197
+ streamCallback?: StreamCallback
198
+ ): Promise<LoopResult> {
199
+ this.streamCallback = streamCallback;
200
+ this.state = this.createInitialState();
201
+ this.messageHistory = [{ role: 'user', content: input }];
202
+
203
+ // Analyze task complexity and adapt config
204
+ const taskProfile = analyzeTaskComplexity(input);
205
+ const effectiveConfig = this.adaptConfigForTask(taskProfile);
206
+
207
+ this.emit({
208
+ type: 'status',
209
+ content: `🔍 任务复杂度: ${taskProfile.complexity} (预估 ${taskProfile.estimatedSteps} 步)`,
210
+ tool: 'system'
211
+ });
212
+
213
+ this.emit({
214
+ type: 'status',
215
+ content: `⚙️ 动态配置: maxIterations=${effectiveConfig.maxIterations}, tokenBudget=${effectiveConfig.maxTokenBudget}`,
216
+ tool: 'system'
217
+ });
218
+
219
+ let response = '';
220
+
221
+ while (this.shouldContinue(effectiveConfig)) {
222
+ this.state.iteration++;
223
+
224
+ this.emit({
225
+ type: 'status',
226
+ content: `🔄 循环 ${this.state.iteration}/${effectiveConfig.maxIterations}`,
227
+ tool: 'loop'
228
+ });
229
+
230
+ // Build context for LLM
231
+ const context = this.buildContext();
232
+ const fullPrompt = `${systemPrompt}\n\n${context}`;
233
+
234
+ try {
235
+ // Call LLM
236
+ const llmResponse = await llm.chat(context, systemPrompt);
237
+ const reply = llmResponse.reply.trim();
238
+
239
+ this.emit({ type: 'token', content: reply.substring(0, 100) });
240
+
241
+ // Estimate token usage
242
+ this.state.totalTokens += this.estimateTokens(fullPrompt) + this.estimateTokens(reply);
243
+
244
+ // Check token budget
245
+ if (this.state.totalTokens > effectiveConfig.maxTokenBudget) {
246
+ this.emit({
247
+ type: 'error',
248
+ content: '⚠️ Token 预算超支,中断循环'
249
+ });
250
+ return this.createResult(false, response, 'token_budget_exceeded');
251
+ }
252
+
253
+ // Check if this is a final response (no tool calls)
254
+ const pendingTools = this.extractPendingToolUses(reply);
255
+
256
+ if (pendingTools.length === 0) {
257
+ // No pending tool uses - this is a normal completion
258
+ this.state.pendingToolUses = [];
259
+
260
+ // Evaluate quality before accepting
261
+ const quality = this.evaluateQuality(reply);
262
+ this.state.qualityScores.push(quality);
263
+
264
+ this.emit({
265
+ type: 'status',
266
+ content: `✅ 检测到最终回复 (质量: ${(quality * 10).toFixed(1)}/10)`,
267
+ tool: 'system'
268
+ });
269
+
270
+ // Check if quality threshold met
271
+ if (quality >= effectiveConfig.qualityThreshold) {
272
+ response = reply;
273
+ return this.createResult(true, reply, 'quality_threshold_met');
274
+ }
275
+
276
+ // Quality not met but no more tools to call
277
+ // Accept response if we've done minimum iterations
278
+ if (this.state.iteration >= effectiveConfig.minIterations) {
279
+ response = reply;
280
+ return this.createResult(true, reply, 'no_pending_tools');
281
+ }
282
+
283
+ // Too early, continue to see if we can improve
284
+ this.state.consecutiveNoProgress++;
285
+ this.emit({
286
+ type: 'status',
287
+ content: `📊 质量未达标 (${(quality * 10).toFixed(1)}/${(effectiveConfig.qualityThreshold * 10).toFixed(1)}),继续循环`,
288
+ tool: 'system'
289
+ });
290
+ continue;
291
+ }
292
+
293
+ // We have pending tool uses - execute them
294
+ this.state.pendingToolUses = pendingTools;
295
+ this.state.lastMeaningfulWork = this.state.iteration;
296
+ this.state.consecutiveNoProgress = 0;
297
+
298
+ for (const toolCall of pendingTools) {
299
+ this.state.toolCallsCount++;
300
+
301
+ const tool = this.tools.get(toolCall.name);
302
+ if (!tool) {
303
+ this.emit({
304
+ type: 'error',
305
+ content: `❌ 未知工具: ${toolCall.name}`
306
+ });
307
+ this.messageHistory.push({
308
+ role: 'tool',
309
+ content: JSON.stringify({ success: false, error: `Unknown tool: ${toolCall.name}` })
310
+ });
311
+ continue;
312
+ }
313
+
314
+ this.emit({
315
+ type: 'tool',
316
+ content: `🔧 执行: ${toolCall.name}`,
317
+ tool: toolCall.name
318
+ });
319
+
320
+ try {
321
+ const result = await tool.execute(toolCall.args);
322
+
323
+ this.emit({
324
+ type: result.success ? 'status' : 'error',
325
+ content: result.success
326
+ ? `✅ ${toolCall.name} 成功`
327
+ : `❌ ${toolCall.name} 失败: ${result.error}`
328
+ });
329
+
330
+ this.messageHistory.push({
331
+ role: 'assistant',
332
+ content: reply,
333
+ toolCall,
334
+ toolResult: result
335
+ });
336
+
337
+ // Record quality from tool result
338
+ const toolQuality = this.evaluateToolResult(result);
339
+ this.state.qualityScores.push(toolQuality);
340
+
341
+ } catch (execError) {
342
+ this.emit({
343
+ type: 'error',
344
+ content: `❌ 工具执行异常: ${execError}`
345
+ });
346
+ this.messageHistory.push({
347
+ role: 'tool',
348
+ content: JSON.stringify({ success: false, error: String(execError) })
349
+ });
350
+ }
351
+ }
352
+
353
+ } catch (error) {
354
+ this.emit({
355
+ type: 'error',
356
+ content: `❌ 循环异常: ${error}`
357
+ });
358
+ return this.createResult(false, response, 'error');
359
+ }
360
+ }
361
+
362
+ // Loop exited - determine reason
363
+ const exitReason = this.determineExitReason(effectiveConfig);
364
+
365
+ if (!response && this.messageHistory.length > 0) {
366
+ const lastAssistant = this.messageHistory
367
+ .filter(m => m.role === 'assistant')
368
+ .pop();
369
+ response = lastAssistant?.content || '任务处理超时';
370
+ }
371
+
372
+ return this.createResult(
373
+ exitReason !== 'error',
374
+ response,
375
+ exitReason
376
+ );
377
+ }
378
+
379
+ /**
380
+ * Determine if loop should continue
381
+ */
382
+ private shouldContinue(config: Required<PivotLoopConfig>): boolean {
383
+ // Hard stop: max iterations reached
384
+ if (this.state.iteration >= config.maxIterations) {
385
+ this.emit({
386
+ type: 'status',
387
+ content: `🛑 达到最大迭代次数 ${config.maxIterations}`
388
+ });
389
+ return false;
390
+ }
391
+
392
+ // Soft stop: consecutive no progress
393
+ if (this.state.consecutiveNoProgress >= config.maxConsecutiveNoProgress) {
394
+ this.emit({
395
+ type: 'status',
396
+ content: `🛑 连续 ${config.maxConsecutiveNoProgress} 次无进展`
397
+ });
398
+ return false;
399
+ }
400
+
401
+ return true;
402
+ }
403
+
404
+ /**
405
+ * Adapt configuration based on task profile
406
+ */
407
+ private adaptConfigForTask(profile: TaskProfile): Required<PivotLoopConfig> {
408
+ return {
409
+ ...this.config,
410
+ maxIterations: Math.min(this.config.maxIterations, profile.suggestedMaxIterations),
411
+ maxTokenBudget: Math.min(this.config.maxTokenBudget, profile.tokenBudget),
412
+ complexity: profile.complexity
413
+ };
414
+ }
415
+
416
+ /**
417
+ * Extract pending tool uses from LLM response
418
+ */
419
+ private extractPendingToolUses(content: string): Array<{ name: string; args: Record<string, string> }> {
420
+ const pending: Array<{ name: string; args: Record<string, string> }> = [];
421
+
422
+ // Pattern 1: Chinese format "调用工具: tool_name(args)"
423
+ const pattern1 = /调用工具[::]\s*(\w+)\s*\(([^)]*)\)/g;
424
+ let match;
425
+ while ((match = pattern1.exec(content)) !== null) {
426
+ const name = match[1];
427
+ const argsStr = match[2];
428
+ const args = this.parseArgs(argsStr);
429
+ if (this.tools.has(name)) {
430
+ pending.push({ name, args });
431
+ }
432
+ }
433
+
434
+ // Pattern 2: tool_name(args) format
435
+ const pattern2 = /(\w+)\s*\(\s*([^)]*)\s*\)/g;
436
+ while ((match = pattern2.exec(content)) !== null) {
437
+ const name = match[1];
438
+ const argsStr = match[2];
439
+ // Skip if already matched or doesn't look like a tool call
440
+ if (pending.some(p => p.name === name)) continue;
441
+ if (!this.tools.has(name)) continue;
442
+
443
+ const args = this.parseArgs(argsStr);
444
+ pending.push({ name, args });
445
+ }
446
+
447
+ // Pattern 3: JSON format tool calls
448
+ try {
449
+ const jsonMatch = content.match(/\{[\s\S]*"tool_calls"[\s\S]*\}/);
450
+ if (jsonMatch) {
451
+ const parsed = JSON.parse(jsonMatch[0]);
452
+ if (Array.isArray(parsed.tool_calls)) {
453
+ for (const tc of parsed.tool_calls) {
454
+ if (this.tools.has(tc.name)) {
455
+ pending.push({ name: tc.name, args: tc.args || {} });
456
+ }
457
+ }
458
+ }
459
+ }
460
+ } catch {
461
+ // JSON parsing failed, ignore
462
+ }
463
+
464
+ return pending;
465
+ }
466
+
467
+ /**
468
+ * Parse tool arguments from string
469
+ */
470
+ private parseArgs(argsStr: string): Record<string, string> {
471
+ const args: Record<string, string> = {};
472
+ if (!argsStr || !argsStr.trim()) return args;
473
+
474
+ const pairs = argsStr.split(',').map(s => s.trim()).filter(Boolean);
475
+ for (const pair of pairs) {
476
+ const colonIdx = pair.indexOf(':');
477
+ if (colonIdx > 0) {
478
+ const key = pair.substring(0, colonIdx).trim();
479
+ const value = pair.substring(colonIdx + 1).trim().replace(/^['"]|['"]$/g, '');
480
+ args[key] = value;
481
+ } else {
482
+ // No colon, try to parse as positional
483
+ const parts = pair.split(/\s+/);
484
+ if (parts.length >= 2) {
485
+ args[parts[0]] = parts.slice(1).join(' ');
486
+ }
487
+ }
488
+ }
489
+ return args;
490
+ }
491
+
492
+ /**
493
+ * Build context from message history
494
+ */
495
+ private buildContext(): string {
496
+ return this.messageHistory.map(m => {
497
+ if (m.role === 'user') return `用户: ${m.content}`;
498
+ if (m.role === 'assistant') return `助手: ${m.content}`;
499
+ if (m.role === 'tool' && m.toolResult) {
500
+ return `工具结果: ${JSON.stringify(m.toolResult)}`;
501
+ }
502
+ return '';
503
+ }).filter(Boolean).join('\n');
504
+ }
505
+
506
+ /**
507
+ * Evaluate response quality
508
+ */
509
+ private evaluateQuality(response: string): number {
510
+ let score = 0.5;
511
+
512
+ // Length-based scoring
513
+ if (response.length > 100) score += 0.1;
514
+ if (response.length > 500) score += 0.1;
515
+ if (response.length < 30) score -= 0.2;
516
+
517
+ // Structure indicators
518
+ if (response.includes('\n')) score += 0.05;
519
+ if (response.includes('-') || response.includes('•')) score += 0.05;
520
+ if (response.includes('```')) score += 0.1;
521
+
522
+ // Content quality indicators
523
+ const conclusionWords = ['完成', '结果', '总结', '所以', '因此', '答案', '推荐', '建议'];
524
+ if (conclusionWords.some(w => response.includes(w))) score += 0.1;
525
+
526
+ // Negative indicators
527
+ if (response.includes('调用工具') || response.includes('tool(')) score -= 0.15;
528
+ if (response.includes('??') || response.includes('未知')) score -= 0.1;
529
+
530
+ return Math.max(0, Math.min(1, score));
531
+ }
532
+
533
+ /**
534
+ * Evaluate tool result quality
535
+ */
536
+ private evaluateToolResult(result: ToolResult): number {
537
+ if (!result.success) return 0.2;
538
+
539
+ let score = 0.6;
540
+ if (result.output) {
541
+ score += 0.2;
542
+ if (result.output.length > 100) score += 0.1;
543
+ if (result.output.includes('error') || result.output.includes('❌')) score -= 0.2;
544
+ if (result.output.includes('success') || result.output.includes('✅')) score += 0.1;
545
+ }
546
+ if (result.error) score -= 0.3;
547
+
548
+ return Math.max(0, Math.min(1, score));
549
+ }
550
+
551
+ /**
552
+ * Estimate token count (rough approximation)
553
+ */
554
+ private estimateTokens(text: string): number {
555
+ // Rough estimate: ~4 characters per token for Chinese/English mix
556
+ return Math.ceil(text.length / 4);
557
+ }
558
+
559
+ /**
560
+ * Create result object
561
+ */
562
+ private createResult(success: boolean, response: string, exitReason: ExitReason): LoopResult {
563
+ const avgQuality = this.state.qualityScores.length > 0
564
+ ? this.state.qualityScores.reduce((a, b) => a + b, 0) / this.state.qualityScores.length
565
+ : 0;
566
+
567
+ return {
568
+ success,
569
+ response,
570
+ iterations: this.state.iteration,
571
+ toolCalls: this.state.toolCallsCount,
572
+ qualityScore: avgQuality,
573
+ exitReason,
574
+ state: { ...this.state }
575
+ };
576
+ }
577
+
578
+ /**
579
+ * Determine why loop exited
580
+ */
581
+ private determineExitReason(config: Required<PivotLoopConfig>): ExitReason {
582
+ if (this.state.iteration >= config.maxIterations) {
583
+ return 'max_iterations';
584
+ }
585
+ if (this.state.consecutiveNoProgress >= config.maxConsecutiveNoProgress) {
586
+ return 'no_progress_exhausted';
587
+ }
588
+ if (this.state.pendingToolUses.length === 0 && this.state.iteration >= config.minIterations) {
589
+ return 'no_pending_tools';
590
+ }
591
+ if (this.state.totalTokens > config.maxTokenBudget) {
592
+ return 'token_budget_exceeded';
593
+ }
594
+ return 'max_iterations';
595
+ }
596
+
597
+ /**
598
+ * Emit stream event
599
+ */
600
+ private emit(event: StreamEvent): void {
601
+ if (this.streamCallback) {
602
+ this.streamCallback(event);
603
+ }
604
+ }
605
+
606
+ /**
607
+ * Get current state
608
+ */
609
+ getState(): PivotLoopState {
610
+ return { ...this.state };
611
+ }
612
+
613
+ /**
614
+ * Reset the loop state
615
+ */
616
+ reset(): void {
617
+ this.state = this.createInitialState();
618
+ this.messageHistory = [];
619
+ }
620
+ }
621
+
622
+ /**
623
+ * Interface for LLM chat capability
624
+ */
625
+ export interface LLMInterface {
626
+ chat(context: string, systemPrompt: string): Promise<{ reply: string; tokens?: number }>;
627
+ }
628
+
629
+ /**
630
+ * Factory to create a default pivot loop configuration
631
+ */
632
+ export function createDefaultPivotConfig(complexity?: TaskComplexity): PivotLoopConfig {
633
+ const profiles: Record<TaskComplexity, PivotLoopConfig> = {
634
+ simple: {
635
+ maxIterations: 15,
636
+ minIterations: 1,
637
+ qualityThreshold: 0.6,
638
+ maxConsecutiveNoProgress: 3,
639
+ maxTokenBudget: 10000
640
+ },
641
+ moderate: {
642
+ maxIterations: 30,
643
+ minIterations: 2,
644
+ qualityThreshold: 0.7,
645
+ maxConsecutiveNoProgress: 5,
646
+ maxTokenBudget: 30000
647
+ },
648
+ complex: {
649
+ maxIterations: 60,
650
+ minIterations: 3,
651
+ qualityThreshold: 0.75,
652
+ maxConsecutiveNoProgress: 8,
653
+ maxTokenBudget: 60000
654
+ }
655
+ };
656
+
657
+ return complexity ? profiles[complexity] : profiles.moderate;
658
+ }
659
+
660
+ /**
661
+ * Helper to run a simple prompt through the loop
662
+ */
663
+ export async function runPivotLoop(
664
+ input: string,
665
+ llm: LLMInterface,
666
+ tools: Tool[],
667
+ systemPrompt: string,
668
+ config?: PivotLoopConfig,
669
+ streamCallback?: StreamCallback
670
+ ): Promise<LoopResult> {
671
+ const loop = new WorkflowPivotLoop(config || createDefaultPivotConfig());
672
+ loop.registerTools(tools);
673
+ return loop.execute(input, llm, systemPrompt, streamCallback);
674
+ }
@@ -24,6 +24,40 @@ paths:
24
24
  | 设置 Persona | 更新智能体 persona 信息 | `set_persona(persona_json)` |
25
25
  | 执行工作流 | 执行预定义工作流 | `run_workflow(steps)` |
26
26
  | 查看日志 | 查看最近操作日志 | `get_operation_logs()` |
27
+ | 列出文件 | 列出目录中的文件 | `list_files(path?)` |
28
+ | 读取目录 | 读取目录内容,返回文件列表和目录结构 | `read_directory(path?)` |
29
+
30
+ ---
31
+
32
+ ## 自主循环机制
33
+
34
+ 智能体基于 ReAct (Reasoning + Acting) 模式工作,具备自动评估质量和错误恢复能力:
35
+
36
+ ### 质量评估与自动改进
37
+ - **质量阈值**: `0.6` (6/10)
38
+ - **最大改进次数**: `3` 次
39
+ - 当回复或工具执行结果质量低于阈值时,自动触发改进循环
40
+ - 改进时在 system prompt 中添加质量提示,让 LLM 重新生成更优回答
41
+
42
+ ### 错误处理与自动恢复
43
+ - **连续错误上限**: `3` 次
44
+ - 工具执行失败时增加错误计数
45
+ - 达到连续错误上限时,添加错误上下文让 LLM 换一种方式处理
46
+ - 工具执行异常会被捕获并记录,不中断循环
47
+
48
+ ### 循环继续条件
49
+ 当 LLM 返回不是 tool call 格式时,判断是否需要继续循环:
50
+ 1. 包含错误/失败信息(不存在、找不到、错误、failed 等)
51
+ 2. 回复太短(<100 字符且无换行),可能是中间回复
52
+ 3. 包含问号,可能是需要更多信息
53
+ 4. 不包含明确结论(完成、结果、答案等)
54
+
55
+ 满足以上任一条件且循环未达上限,则继续处理。
56
+
57
+ ### 重试机制
58
+ - 工具调用失败时重试(最多 3 次)
59
+ - 汇报发送失败时重试(最多 2 次,指数退避)
60
+ - 失败的汇报会进入待重试队列
27
61
 
28
62
  ---
29
63