@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
@@ -12,6 +12,7 @@ import { p2pNetwork } from '../network/p2p.js';
12
12
  import { ConstraintLayer, WorkflowContext } from './constraint-layer.js';
13
13
  import { WorkflowEngine, WorkflowStep, StepResult, Workflow } from './workflow-engine.js';
14
14
  import { DeepThinkingEngine, AgentCoordinator, type ThinkResult, type AgentResult } from '@bolloon/constraint-runtime';
15
+ import { WorkflowPivotLoop, createDefaultPivotConfig, type PivotLoopConfig, type LoopResult } from './workflow-pivot-loop.js';
15
16
  import {
16
17
  DiscoveredAgentsManager,
17
18
  SocialHeartbeat,
@@ -42,6 +43,8 @@ export interface AgentSessionConfig {
42
43
  cwd: string;
43
44
  peerId?: string;
44
45
  identityDoc?: IdentityDoc;
46
+ usePivotLoop?: boolean;
47
+ pivotLoopConfig?: PivotLoopConfig;
45
48
  }
46
49
 
47
50
  export interface IdentityDoc {
@@ -487,6 +490,7 @@ export interface HeartbeatConfig {
487
490
  export interface AgentSession {
488
491
  prompt(input: string): Promise<string>;
489
492
  promptStream(input: string, onStream: StreamCallback): Promise<string>;
493
+ promptWithPivotLoop(input: string, config?: PivotLoopConfig): Promise<LoopResult>;
490
494
  suggestRename(messages: { type: string; content: string }[]): Promise<string | null>;
491
495
  readDocument(filePath: string): Promise<string>;
492
496
  summarizeDocument(filePath: string, context?: string): Promise<{
@@ -546,11 +550,15 @@ class PiAgentSession implements AgentSession {
546
550
  private messageHistory: Message[] = [];
547
551
  private tools: Map<string, Tool> = new Map();
548
552
  private skillRegistry: SkillRegistry = new SkillRegistry();
549
- private readonly MAX_REACT_ITERATIONS = 10;
553
+ private readonly MAX_REACT_ITERATIONS = 100;
554
+ private readonly MAX_REFINE_ATTEMPTS = 3;
555
+ private readonly QUALITY_THRESHOLD = 0.6;
550
556
  private thinkingEngine = new DeepThinkingEngine(3);
551
557
  private coordinator = new AgentCoordinator(3);
552
558
  private harness: any = null;
553
559
  private harnessEnabled = false;
560
+ private usePivotLoop: boolean = false;
561
+ private pivotLoopConfig?: PivotLoopConfig;
554
562
 
555
563
  constructor(config: AgentSessionConfig) {
556
564
  this.cwd = config.cwd;
@@ -561,6 +569,8 @@ class PiAgentSession implements AgentSession {
561
569
  this.workflowEngine = new WorkflowEngine(this.constraintLayer);
562
570
  this.sessionManager = new PiSessionManager(this.identity.did, this.cwd);
563
571
  this.agentsManager = new DiscoveredAgentsManager();
572
+ this.usePivotLoop = config.usePivotLoop ?? false;
573
+ this.pivotLoopConfig = config.pivotLoopConfig;
564
574
  this.initSession();
565
575
  this.registerTools();
566
576
  this.initHarness();
@@ -739,6 +749,58 @@ class PiAgentSession implements AgentSession {
739
749
  };
740
750
  }
741
751
  });
752
+
753
+ // 添加文件列表工具
754
+ this.tools.set('list_files', {
755
+ name: 'list_files',
756
+ description: '列出目录中的文件',
757
+ parameters: { path: '目录路径(可选,默认为当前目录)' },
758
+ execute: async (args) => {
759
+ try {
760
+ const fs = await import('fs');
761
+ const path = args.path || this.cwd;
762
+ const files = fs.readdirSync(path);
763
+ return {
764
+ success: true,
765
+ output: `📁 目录 ${path} 中的文件 (${files.length} 个):\n${files.slice(0, 20).map(f => ` - ${f}`).join('\n')}${files.length > 20 ? '\n ...' : ''}`
766
+ };
767
+ } catch (e) {
768
+ return { success: false, error: String(e) };
769
+ }
770
+ }
771
+ });
772
+
773
+ // 添加目录读取工具(更完整的实现)
774
+ this.tools.set('read_directory', {
775
+ name: 'read_directory',
776
+ description: '读取目录内容,返回文件列表和目录结构',
777
+ parameters: { path: '目录路径(可选,默认为当前目录)' },
778
+ execute: async (args) => {
779
+ try {
780
+ const fs = await import('fs');
781
+ const pathModule = await import('path');
782
+ const targetPath = args.path || this.cwd;
783
+ const items = fs.readdirSync(targetPath);
784
+ const result: string[] = [];
785
+ for (const item of items.slice(0, 30)) {
786
+ const fullPath = pathModule.join(targetPath, item);
787
+ try {
788
+ const stat = fs.statSync(fullPath);
789
+ const type = stat.isDirectory() ? '📁' : '📄';
790
+ result.push(`${type} ${item}${stat.isDirectory() ? '/' : ''}`);
791
+ } catch {
792
+ result.push(`📄 ${item}`);
793
+ }
794
+ }
795
+ return {
796
+ success: true,
797
+ output: `📂 ${targetPath} (${items.length} 项):\n${result.join('\n')}${items.length > 30 ? '\n... 还有更多文件' : ''}`
798
+ };
799
+ } catch (e) {
800
+ return { success: false, error: `无法读取目录: ${String(e)}` };
801
+ }
802
+ }
803
+ });
742
804
  }
743
805
 
744
806
  private getToolDefinitions(): string {
@@ -803,7 +865,7 @@ class PiAgentSession implements AgentSession {
803
865
  content: input
804
866
  });
805
867
 
806
- onStream({ type: 'thinking', content: '🤔 思考中...' });
868
+ onStream({ type: 'thinking', content: '🤔 开始思考...' });
807
869
 
808
870
  if (!this.minimaxAvailable) {
809
871
  const response = await this.handleFallback(input);
@@ -812,22 +874,113 @@ class PiAgentSession implements AgentSession {
812
874
  return response;
813
875
  }
814
876
 
815
- const result = await this.runReActLoop();
877
+ const result = await this.runReActLoop(onStream);
816
878
  onStream({ type: 'done', content: '' });
817
879
  return result;
818
880
  }
819
881
 
820
- private async runReActLoop(): Promise<string> {
882
+ async promptWithPivotLoop(input: string, config?: PivotLoopConfig): Promise<LoopResult> {
883
+ if (!this.minimaxAvailable) {
884
+ const response = await this.handleFallback(input);
885
+ return {
886
+ success: false,
887
+ response,
888
+ iterations: 0,
889
+ toolCalls: 0,
890
+ qualityScore: 0,
891
+ exitReason: 'error',
892
+ state: {
893
+ iteration: 0,
894
+ totalTokens: 0,
895
+ toolCallsCount: 0,
896
+ consecutiveNoProgress: 0,
897
+ qualityScores: [],
898
+ pendingToolUses: [],
899
+ lastMeaningfulWork: 0
900
+ }
901
+ };
902
+ }
903
+
904
+ const llm = getMinimax();
905
+ const loopConfig = config || this.pivotLoopConfig || createDefaultPivotConfig();
906
+ const loop = new WorkflowPivotLoop(loopConfig);
907
+
908
+ for (const tool of this.tools.values()) {
909
+ loop.registerTool(tool);
910
+ }
911
+
912
+ const personaSection = this.persona ? `
913
+ 角色描述: ${this.persona.description || '无'}
914
+ 性格特点: ${this.persona.personality || '无'}
915
+ 问候语: ${this.persona.greeting || '无'}
916
+ ` : '';
917
+
918
+ const systemPrompt = `你是 ${this.identity.name},基于ReAct (Reasoning + Acting)模式工作。${personaSection}
919
+ 当前工作目录: ${this.cwd}
920
+ 当前身份: ${this.identity.name} (${this.identity.did})
921
+
922
+ ${this.getToolDefinitions()}
923
+
924
+ 工作模式:
925
+ 1. 理解用户自然语言请求
926
+ 2. 分析需要哪些工具来完成
927
+ 3. 按顺序调用工具并观察结果
928
+ 4. 根据观察结果决定下一步
929
+ 5. 最终给出完整回答
930
+
931
+ 重要:
932
+ - 每次只调用一个工具
933
+ - 仔细分析工具返回结果
934
+ - 当任务完成时,必须在回答末尾添加 <final gen> 标记表示结束
935
+ - 如果需要更多信息,继续调用工具`;
936
+
937
+ const result = await loop.execute(input, llm, systemPrompt);
938
+
939
+ this.messageHistory.push({ role: 'user', content: input });
940
+ if (result.response) {
941
+ this.messageHistory.push({ role: 'assistant', content: result.response });
942
+ }
943
+
944
+ return result;
945
+ }
946
+
947
+ private async runReActLoop(onStream?: StreamCallback): Promise<string> {
821
948
  const llm = getMinimax();
822
949
  let iteration = 0;
823
950
  let finalResponse = '';
951
+ let lastQualityScore = 0;
952
+ let refineAttempts = 0;
953
+ let consecutiveErrors = 0;
954
+ const MAX_CONSECUTIVE_ERRORS = 3;
955
+
956
+ // 发送循环开始的事件
957
+ if (onStream) {
958
+ onStream({ type: 'status', content: '🔄 开始 ReAct 循环...', tool: 'system' });
959
+ }
824
960
 
825
961
  while (iteration < this.MAX_REACT_ITERATIONS) {
826
962
  iteration++;
827
963
 
964
+ // 调试日志:显示每次循环开始
965
+ console.log(`[PiAgent] 循环 ${iteration}/${this.MAX_REACT_ITERATIONS} 开始`);
966
+ if (onStream) {
967
+ onStream({ type: 'status', content: `🔄 循环 ${iteration}/${this.MAX_REACT_ITERATIONS}`, tool: 'loop' });
968
+ }
969
+
828
970
  const context = this.buildContext();
829
971
  const toolDefs = this.getToolDefinitions();
830
972
 
973
+ // 动态构建 refine 上下文
974
+ let refineContext = '';
975
+ if (refineAttempts > 0 && lastQualityScore < this.QUALITY_THRESHOLD) {
976
+ refineContext = `\n【改进提示】上轮结果质量分 ${(lastQualityScore * 10).toFixed(1)}/10,请改进回答。`;
977
+ }
978
+
979
+ // 连续错误时的额外提示
980
+ if (consecutiveErrors > 0) {
981
+ refineContext += `\n【错误提示】上轮发生 ${consecutiveErrors} 次错误,请重新分析问题或换一种方式处理。`;
982
+ }
983
+
831
984
  const personaSection = this.persona ? `
832
985
  角色描述: ${this.persona.description || '无'}
833
986
  性格特点: ${this.persona.personality || '无'}
@@ -837,6 +990,7 @@ class PiAgentSession implements AgentSession {
837
990
  const systemPrompt = `你是 ${this.identity.name},基于ReAct (Reasoning + Acting)模式工作。${personaSection}
838
991
  当前工作目录: ${this.cwd}
839
992
  当前身份: ${this.identity.name} (${this.identity.did})
993
+ ${refineContext}
840
994
 
841
995
  ${toolDefs}
842
996
 
@@ -850,13 +1004,30 @@ ${toolDefs}
850
1004
  重要:
851
1005
  - 每次只调用一个工具
852
1006
  - 仔细分析工具返回结果
853
- - 如果任务完成,返回完整回答
1007
+ - 当任务完成时,必须在回答末尾添加 <final gen> 标记表示结束
854
1008
  - 如果需要更多信息,继续调用工具`;
855
1009
 
856
1010
  const response = await llm.chat(context, systemPrompt);
857
1011
  const reply = response.reply.trim();
858
1012
 
1013
+ console.log(`[PiAgent] LLM 回复长度: ${reply.length}, 内容预览: "${reply.substring(0, 80)}..."`);
1014
+
1015
+ // 通知前端:收到 LLM 回复
1016
+ if (onStream) {
1017
+ onStream({ type: 'token', content: reply.substring(0, 100) });
1018
+ }
1019
+
859
1020
  if (this.isFinalResponse(reply)) {
1021
+ // 检查质量分数
1022
+ lastQualityScore = this.estimateResponseQuality(reply);
1023
+
1024
+ // 如果质量太低且还有改进机会,进入改进循环
1025
+ if (lastQualityScore < this.QUALITY_THRESHOLD && refineAttempts < this.MAX_REFINE_ATTEMPTS) {
1026
+ refineAttempts++;
1027
+ console.log(`[PiAgent] 质量评分 ${(lastQualityScore * 10).toFixed(1)}/10 < ${(this.QUALITY_THRESHOLD * 10).toFixed(1)}/10,自动改进中 (${refineAttempts}/${this.MAX_REFINE_ATTEMPTS})`);
1028
+ continue;
1029
+ }
1030
+
860
1031
  finalResponse = this.extractFinalAnswer(reply);
861
1032
  break;
862
1033
  }
@@ -869,30 +1040,132 @@ ${toolDefs}
869
1040
  toolCall
870
1041
  });
871
1042
 
1043
+ // 通知前端:检测到工具调用
1044
+ if (onStream) {
1045
+ onStream({ type: 'tool', content: `🔧 调用工具: ${toolCall.name}`, tool: toolCall.name });
1046
+ if (toolCall.args && Object.keys(toolCall.args).length > 0) {
1047
+ onStream({ type: 'status', content: `📋 参数: ${JSON.stringify(toolCall.args)}`, tool: toolCall.name });
1048
+ }
1049
+ }
1050
+
872
1051
  const tool = this.tools.get(toolCall.name);
873
1052
  if (!tool) {
1053
+ consecutiveErrors++;
874
1054
  const errorResult: ToolResult = { success: false, error: `未知工具: ${toolCall.name}` };
875
1055
  this.messageHistory.push({ role: 'tool', content: JSON.stringify(errorResult), toolResult: errorResult });
876
1056
  this.logToHarness(toolCall.name, toolCall.args, errorResult);
1057
+ console.warn(`[PiAgent] 未知工具: ${toolCall.name},跳过并继续`);
877
1058
  continue;
878
1059
  }
879
1060
 
880
- const result = await tool.execute(toolCall.args);
881
- this.messageHistory.push({ role: 'tool', content: JSON.stringify(result), toolResult: result });
882
- this.logToHarness(toolCall.name, toolCall.args, result);
1061
+ try {
1062
+ const result = await tool.execute(toolCall.args);
1063
+ console.log(`[PiAgent] 工具 ${toolCall.name} 执行完成: success=${result.success}`);
1064
+ this.messageHistory.push({ role: 'tool', content: JSON.stringify(result), toolResult: result });
1065
+ this.logToHarness(toolCall.name, toolCall.args, result);
1066
+
1067
+ // 通知前端工具执行结果
1068
+ if (onStream) {
1069
+ if (result.success) {
1070
+ onStream({ type: 'status', content: `✅ ${toolCall.name} 执行成功`, tool: toolCall.name });
1071
+ if (result.output) {
1072
+ const outputPreview = result.output.substring(0, 200);
1073
+ onStream({ type: 'tool', content: `📤 结果: ${outputPreview}${result.output.length > 200 ? '...' : ''}`, tool: toolCall.name });
1074
+ }
1075
+ } else {
1076
+ onStream({ type: 'error', content: `❌ ${toolCall.name} 执行失败: ${result.error}`, tool: toolCall.name });
1077
+ }
1078
+ }
883
1079
 
884
- if (!result.success && result.error) {
885
- console.warn(`Tool ${toolCall.name} error: ${result.error}`);
1080
+ if (result.success) {
1081
+ consecutiveErrors = 0; // 重置连续错误计数
1082
+
1083
+ // 检查工具执行质量
1084
+ lastQualityScore = this.estimateToolResultQuality(result);
1085
+ if (lastQualityScore < this.QUALITY_THRESHOLD && refineAttempts < this.MAX_REFINE_ATTEMPTS) {
1086
+ refineAttempts++;
1087
+ console.log(`[PiAgent] 工具结果质量低,自动重试 (${refineAttempts}/${this.MAX_REFINE_ATTEMPTS})`);
1088
+ } else {
1089
+ console.log(`[PiAgent] 工具执行成功,质量评分: ${(lastQualityScore * 10).toFixed(1)}/10`);
1090
+ }
1091
+
1092
+ // 工具执行成功后,继续循环获取下一个 LLM 响应
1093
+ if (onStream) {
1094
+ onStream({ type: 'status', content: `🔄 工具执行完成,继续循环...`, tool: 'loop' });
1095
+ }
1096
+ // 不 break,继续下一次循环
1097
+ } else {
1098
+ consecutiveErrors++;
1099
+ console.warn(`[PiAgent] 工具执行失败 (${consecutiveErrors}/${MAX_CONSECUTIVE_ERRORS}): ${result.error}`);
1100
+
1101
+ // 连续错误达到上限,尝试换一种方式
1102
+ if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
1103
+ console.log(`[PiAgent] 连续 ${MAX_CONSECUTIVE_ERRORS} 次错误,尝试换一种方式处理`);
1104
+ // 添加错误上下文,让 LLM 换一种方式
1105
+ this.messageHistory.push({
1106
+ role: 'system',
1107
+ content: `[注意] 前面的工具调用连续失败。请尝试其他工具或换一种方式完成用户请求。`
1108
+ });
1109
+ consecutiveErrors = 0; // 重置以继续尝试
1110
+ }
1111
+ }
1112
+ } catch (execError) {
1113
+ consecutiveErrors++;
1114
+ const errorResult: ToolResult = { success: false, error: String(execError) };
1115
+ this.messageHistory.push({ role: 'tool', content: JSON.stringify(errorResult), toolResult: errorResult });
1116
+ this.logToHarness(toolCall.name, toolCall.args, errorResult);
1117
+ console.error(`[PiAgent] 工具执行异常: ${execError}`);
886
1118
  }
887
1119
  } else {
888
- this.messageHistory.push({ role: 'assistant', content: reply });
1120
+ // LLM 返回的不是 tool call 格式
1121
+ this.messageHistory.push({
1122
+ role: 'assistant',
1123
+ content: reply
1124
+ });
1125
+
1126
+ // 通知前端收到非工具调用回复
1127
+ if (onStream) {
1128
+ onStream({ type: 'token', content: reply.substring(0, 150) });
1129
+ }
1130
+
1131
+ // 检查是否需要继续循环处理
1132
+ // 更严格的判断:只有当回复明确表示需要更多信息时才继续
1133
+ const containsToolCallIntent = reply.includes('调用工具') || reply.includes('tool(') ||
1134
+ reply.includes('使用工具') || reply.includes('需要获取') || reply.includes('需要查看');
1135
+ const hasError = ['不存在', '找不到', '无法找到', 'not found', 'does not exist',
1136
+ '错误', 'error', '失败', 'failed'].some(k => reply.includes(k));
1137
+ const isTooShort = reply.length < 50 && reply.length > 0;
1138
+ const hasQuestion = reply.includes('?') && (reply.includes('怎么') || reply.includes('如何') || reply.includes('什么'));
1139
+
1140
+ const needsMoreWork = hasError || containsToolCallIntent || isTooShort || hasQuestion;
1141
+
1142
+ if (needsMoreWork && iteration < this.MAX_REACT_ITERATIONS) {
1143
+ console.log(`[PiAgent] 继续循环处理 (${iteration}/${this.MAX_REACT_ITERATIONS}): needsMoreWork=${needsMoreWork}, hasError=${hasError}, containsToolCallIntent=${containsToolCallIntent}`);
1144
+ if (onStream) {
1145
+ onStream({ type: 'status', content: `🔄 继续处理,循环 ${iteration}...`, tool: 'loop' });
1146
+ }
1147
+ continue;
1148
+ }
1149
+
1150
+ // 否则把这个当作可能的最终回答
889
1151
  finalResponse = reply;
1152
+ if (onStream) {
1153
+ onStream({ type: 'status', content: `📝 提取最终回答,长度 ${reply.length}`, tool: 'system' });
1154
+ }
890
1155
  break;
891
1156
  }
892
1157
  }
893
1158
 
894
1159
  if (!finalResponse) {
895
1160
  finalResponse = '任务处理超时,请尝试更具体的请求。';
1161
+ if (onStream) {
1162
+ onStream({ type: 'error', content: '⚠️ 任务处理超时', tool: 'system' });
1163
+ }
1164
+ }
1165
+
1166
+ // 通知前端循环完成
1167
+ if (onStream) {
1168
+ onStream({ type: 'status', content: `✅ 处理完成,共 ${iteration - 1} 次循环`, tool: 'system' });
896
1169
  }
897
1170
 
898
1171
  const now = new Date().toISOString();
@@ -975,30 +1248,23 @@ Workspace root folder: ${this.cwd}
975
1248
  }
976
1249
 
977
1250
  private isFinalResponse(content: string): boolean {
978
- const finalMarkers = ['最终回答', '完成', '答案如下', '结果是', 'final', 'answer:'];
979
- const lower = content.toLowerCase();
980
- // 更保守的判断:只有明确标记最终回答,且回复较短时才认为是最终回复
981
- if (content.includes('✅') && content.length < 200 && finalMarkers.some(m => lower.includes(m))) {
982
- return true;
983
- }
984
- return finalMarkers.some(m => lower.includes(m));
1251
+ // 只有明确输出 <final gen> 才认为是最终回答
1252
+ return content.includes('<final gen>');
985
1253
  }
986
1254
 
987
1255
  private extractFinalAnswer(content: string): string {
988
- // 移除任何 tool call 标记(保持完整回复)
1256
+ // 提取 <final gen> 后的内容作为最终回答
1257
+ const marker = '<final gen>';
1258
+ const markerIndex = content.indexOf(marker);
1259
+ if (markerIndex !== -1) {
1260
+ content = content.substring(markerIndex + marker.length).trim();
1261
+ }
1262
+ // 移除任何 tool call 标记
989
1263
  let cleaned = content
990
1264
  .replace(/调用工具[::]\s*\w+\s*\([^)]*\)/g, '')
991
1265
  .replace(/使用工具[::]\s*\w+\s*\([^)]*\)/g, '')
992
1266
  .replace(/tool[_\w]*[::]\s*\w+\s*\([^)]*\)/gi, '')
993
1267
  .trim();
994
-
995
- const lines = cleaned.split('\n');
996
- const answerStart = lines.findIndex(l =>
997
- ['最终回答', '完成', '答案如下', '结果是', 'final', 'answer:'].some(m => l.toLowerCase().includes(m))
998
- );
999
- if (answerStart >= 0) {
1000
- return lines.slice(answerStart + 1).join('\n').trim();
1001
- }
1002
1268
  return cleaned;
1003
1269
  }
1004
1270
 
@@ -1033,6 +1299,34 @@ Workspace root folder: ${this.cwd}
1033
1299
  return null;
1034
1300
  }
1035
1301
 
1302
+ private estimateResponseQuality(response: string): number {
1303
+ let score = 0.5;
1304
+ if (response.length > 50) score += 0.1;
1305
+ if (response.length > 200) score += 0.1;
1306
+ if (response.length < 20) score -= 0.3;
1307
+ if (response.includes('\n')) score += 0.1;
1308
+ if (response.includes('-') || response.includes('•')) score += 0.05;
1309
+ if (response.includes('```')) score += 0.1;
1310
+ const conclusionWords = ['完成', '结果', '总结', '所以', '因此', '答案', '推荐'];
1311
+ if (conclusionWords.some(w => response.includes(w))) score += 0.1;
1312
+ if (response.includes('调用工具') || response.includes('tool(')) score -= 0.2;
1313
+ return Math.max(0, Math.min(1, score));
1314
+ }
1315
+
1316
+ private estimateToolResultQuality(result: ToolResult): number {
1317
+ let score = 0.5;
1318
+ if (!result.success) return 0.2;
1319
+ if (result.output) {
1320
+ score += 0.2;
1321
+ if (result.output.length > 50) score += 0.1;
1322
+ if (result.output.length < 10) score -= 0.1;
1323
+ if (result.output.includes('❌') || result.output.includes('error')) score -= 0.2;
1324
+ if (result.output.includes('✅') || result.output.includes('success')) score += 0.1;
1325
+ }
1326
+ if (result.error) score -= 0.3;
1327
+ return Math.max(0, Math.min(1, score));
1328
+ }
1329
+
1036
1330
  private async handleFallback(input: string): Promise<string> {
1037
1331
  const lowerInput = input.toLowerCase();
1038
1332
  const parts = input.trim().split(/\s+/);
@@ -1551,9 +1845,34 @@ ${this.extractOperationsFromRef(operationsRef)}
1551
1845
  let sessionInstance: AgentSession | null = null;
1552
1846
  let lastIdentityDid: string | null = null;
1553
1847
 
1554
- export async function createAgentSession(config: AgentSessionConfig): Promise<AgentSession> {
1848
+ // 独立的 session 实例缓存(用于多 session 支持)
1849
+ const independentSessions: Map<string, AgentSession> = new Map();
1850
+
1851
+ export async function createAgentSession(config: AgentSessionConfig, forceNew?: boolean): Promise<AgentSession> {
1555
1852
  const incomingDid = config.identityDoc?.did;
1556
1853
 
1854
+ // 如果有独立的 peerId (包含 :),使用它作为 key
1855
+ if (config.peerId && config.peerId.includes(':')) {
1856
+ const key = config.peerId;
1857
+ if (!forceNew && independentSessions.has(key)) {
1858
+ console.log(`[createAgentSession] 找到现有独立 session, key=${key}`);
1859
+ return independentSessions.get(key)!;
1860
+ }
1861
+ const session = new PiAgentSession(config);
1862
+ independentSessions.set(key, session);
1863
+ console.log(`[createAgentSession] 创建独立 session, key=${key}, DID=${incomingDid}`);
1864
+ return session;
1865
+ }
1866
+
1867
+ // 如果指定了 forceNew 但没有 peerId,生成带时间戳的 key
1868
+ if (forceNew) {
1869
+ const key = `force:${Date.now()}`;
1870
+ const session = new PiAgentSession(config);
1871
+ independentSessions.set(key, session);
1872
+ console.log(`[createAgentSession] 创建强制新 session, key=${key}`);
1873
+ return session;
1874
+ }
1875
+
1557
1876
  // 如果有新的 DID,强制重建 session
1558
1877
  if (sessionInstance && lastIdentityDid && incomingDid && lastIdentityDid !== incomingDid) {
1559
1878
  console.log(`[createAgentSession] DID 变化 ${lastIdentityDid} -> ${incomingDid},重建 session`);
@@ -268,11 +268,105 @@ export class AgentProtocol {
268
268
  };
269
269
 
270
270
  const peers = p2pNetwork.getPeers();
271
+ const failedPeers: string[] = [];
272
+
271
273
  for (const peer of peers) {
272
274
  if (peer !== fromPeer) {
273
- await p2pNetwork.sendMessage(peer, 'report', JSON.stringify(reportMsg));
275
+ try {
276
+ await p2pNetwork.sendMessage(peer, 'report', JSON.stringify(reportMsg));
277
+ console.log(`[${this.identityName}] 汇报已发送至 ${peer}`);
278
+ } catch (sendError) {
279
+ console.warn(`[${this.identityName}] 发送汇报至 ${peer} 失败: ${sendError}`);
280
+ failedPeers.push(peer);
281
+ }
282
+ }
283
+ }
284
+
285
+ // 重试失败的发送
286
+ if (failedPeers.length > 0) {
287
+ console.log(`[${this.identityName}] 尝试重新发送汇报至 ${failedPeers.length} 个失败节点`);
288
+ await this.retryFailedReports(reportMsg, failedPeers, 2);
289
+ }
290
+ }
291
+
292
+ private async retryFailedReports(
293
+ reportMsg: AgentMessage,
294
+ failedPeers: string[],
295
+ maxRetries: number
296
+ ): Promise<void> {
297
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
298
+ if (failedPeers.length === 0) break;
299
+
300
+ console.log(`[${this.identityName}] 重试第 ${attempt}/${maxRetries} 次`);
301
+ await this.sleep(1000 * attempt); // 指数退避
302
+
303
+ const stillFailed: string[] = [];
304
+ for (const peer of failedPeers) {
305
+ try {
306
+ await p2pNetwork.sendMessage(peer, 'report', JSON.stringify(reportMsg));
307
+ console.log(`[${this.identityName}] 重试成功: ${peer}`);
308
+ } catch {
309
+ stillFailed.push(peer);
310
+ }
311
+ }
312
+ failedPeers = stillFailed;
313
+ }
314
+
315
+ if (failedPeers.length > 0) {
316
+ console.log(`[${this.identityName}] 最终仍有 ${failedPeers.length} 个节点发送失败,将加入待重试队列`);
317
+ this.queueFailedReports(reportMsg, failedPeers);
318
+ }
319
+ }
320
+
321
+ private failedReportsQueue: Array<{ msg: AgentMessage; peers: string[]; timestamp: number }> = [];
322
+
323
+ private queueFailedReports(msg: AgentMessage, peers: string[]): void {
324
+ this.failedReportsQueue.push({
325
+ msg,
326
+ peers,
327
+ timestamp: Date.now()
328
+ });
329
+ // 限制队列大小
330
+ if (this.failedReportsQueue.length > 50) {
331
+ this.failedReportsQueue = this.failedReportsQueue.slice(-50);
332
+ }
333
+ }
334
+
335
+ async processFailedReportsQueue(): Promise<void> {
336
+ if (this.failedReportsQueue.length === 0) return;
337
+
338
+ console.log(`[${this.identityName}] 处理待重试汇报队列 (${this.failedReportsQueue.length} 条)`);
339
+ const processed: number[] = [];
340
+
341
+ for (let i = 0; i < this.failedReportsQueue.length; i++) {
342
+ const item = this.failedReportsQueue[i];
343
+ const stillFailed: string[] = [];
344
+
345
+ for (const peer of item.peers) {
346
+ try {
347
+ await p2pNetwork.sendMessage(peer, 'report', JSON.stringify(item.msg));
348
+ console.log(`[${this.identityName}] 队列重试成功: ${peer}`);
349
+ } catch {
350
+ stillFailed.push(peer);
351
+ }
352
+ }
353
+
354
+ if (stillFailed.length === 0) {
355
+ processed.push(i);
356
+ } else {
357
+ item.peers = stillFailed;
358
+ item.timestamp = Date.now();
274
359
  }
275
360
  }
361
+
362
+ // 移除已成功的
363
+ for (let i = processed.length - 1; i >= 0; i--) {
364
+ this.failedReportsQueue.splice(processed[i], 1);
365
+ }
366
+ }
367
+
368
+ private sleep(ms: number): Promise<void> {
369
+ return new Promise(resolve => setTimeout(resolve, ms));
276
370
  }
277
371
 
278
372
  async submitImprovements(taskId: string, improvements: string): Promise<void> {