@bolloon/bolloon-agent 0.4.27 → 0.4.29

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 (443) hide show
  1. package/bin/bolloon.cjs +18 -148
  2. package/bin/bolloon.cmd +6 -3
  3. package/dist/agents/execution-supervisor.js +21 -0
  4. package/dist/agents/pi-sdk-tools.js +3 -1
  5. package/dist/agents/pi-sdk.js +4 -1
  6. package/dist/agents/task/local-seller.js +149 -0
  7. package/dist/agents/task/report-card.js +146 -0
  8. package/dist/agents/task/resource-advisor.js +182 -0
  9. package/dist/agents/task/task-budget.js +103 -0
  10. package/dist/agents/task/task-runner.js +618 -0
  11. package/dist/agents/x402/goal-run-bridge.js +10 -6
  12. package/dist/agents/x402/resource-contract.js +12 -1
  13. package/dist/cli/update-commands.js +349 -0
  14. package/dist/cli-entry.js +133 -53
  15. package/dist/electron-build/agents/agent-gateway.js +169 -0
  16. package/dist/electron-build/agents/agent-gateway.js.map +1 -0
  17. package/dist/electron-build/agents/agent-identity-store.js +212 -0
  18. package/dist/electron-build/agents/agent-identity-store.js.map +1 -0
  19. package/dist/electron-build/agents/agent-identity.js +196 -0
  20. package/dist/electron-build/agents/agent-identity.js.map +1 -0
  21. package/dist/electron-build/agents/agent-manifest-protocol.js +151 -0
  22. package/dist/electron-build/agents/agent-manifest-protocol.js.map +1 -0
  23. package/dist/electron-build/agents/agent-registry.js +217 -0
  24. package/dist/electron-build/agents/agent-registry.js.map +1 -0
  25. package/dist/electron-build/agents/agent-reputation.js +60 -0
  26. package/dist/electron-build/agents/agent-reputation.js.map +1 -0
  27. package/dist/electron-build/agents/agent-service-client.js +186 -0
  28. package/dist/electron-build/agents/agent-service-client.js.map +1 -0
  29. package/dist/electron-build/agents/browser-cdp.js +765 -0
  30. package/dist/electron-build/agents/browser-cdp.js.map +1 -0
  31. package/dist/electron-build/agents/computer-use.js +341 -0
  32. package/dist/electron-build/agents/computer-use.js.map +1 -0
  33. package/dist/electron-build/agents/constraint-layer.js +210 -0
  34. package/dist/electron-build/agents/constraint-layer.js.map +1 -0
  35. package/dist/electron-build/agents/decision-store.js +292 -0
  36. package/dist/electron-build/agents/decision-store.js.map +1 -0
  37. package/dist/electron-build/agents/deny-pipeline.js +125 -0
  38. package/dist/electron-build/agents/deny-pipeline.js.map +1 -0
  39. package/dist/electron-build/agents/economic-policy.js +172 -0
  40. package/dist/electron-build/agents/economic-policy.js.map +1 -0
  41. package/dist/electron-build/agents/error-classifier.js +125 -0
  42. package/dist/electron-build/agents/error-classifier.js.map +1 -0
  43. package/dist/electron-build/agents/execution-supervisor.js +539 -0
  44. package/dist/electron-build/agents/execution-supervisor.js.map +1 -0
  45. package/dist/electron-build/agents/external-events.js +171 -0
  46. package/dist/electron-build/agents/external-events.js.map +1 -0
  47. package/dist/electron-build/agents/gateway-join.js +315 -0
  48. package/dist/electron-build/agents/gateway-join.js.map +1 -0
  49. package/dist/electron-build/agents/gateway-network.js +505 -0
  50. package/dist/electron-build/agents/gateway-network.js.map +1 -0
  51. package/dist/electron-build/agents/goal-criteria.js +133 -0
  52. package/dist/electron-build/agents/goal-criteria.js.map +1 -0
  53. package/dist/electron-build/agents/goal-resume.js +364 -0
  54. package/dist/electron-build/agents/goal-resume.js.map +1 -0
  55. package/dist/electron-build/agents/goal-store.js +587 -0
  56. package/dist/electron-build/agents/goal-store.js.map +1 -0
  57. package/dist/electron-build/agents/intent-classifier.js +104 -0
  58. package/dist/electron-build/agents/intent-classifier.js.map +1 -0
  59. package/dist/electron-build/agents/iroh-secret.js +70 -0
  60. package/dist/electron-build/agents/iroh-secret.js.map +1 -0
  61. package/dist/electron-build/agents/loop-review.js +101 -0
  62. package/dist/electron-build/agents/loop-review.js.map +1 -0
  63. package/dist/electron-build/agents/memory-recall.js +154 -0
  64. package/dist/electron-build/agents/memory-recall.js.map +1 -0
  65. package/dist/electron-build/agents/p2p-document-tools.js +328 -0
  66. package/dist/electron-build/agents/p2p-document-tools.js.map +1 -0
  67. package/dist/electron-build/agents/parse-tool-call.js +564 -0
  68. package/dist/electron-build/agents/parse-tool-call.js.map +1 -0
  69. package/dist/electron-build/agents/patch-tool.js +205 -0
  70. package/dist/electron-build/agents/patch-tool.js.map +1 -0
  71. package/dist/electron-build/agents/payment-approval.js +183 -0
  72. package/dist/electron-build/agents/payment-approval.js.map +1 -0
  73. package/dist/electron-build/agents/payment-gate.js +139 -0
  74. package/dist/electron-build/agents/payment-gate.js.map +1 -0
  75. package/dist/electron-build/agents/permission-mode.js +124 -0
  76. package/dist/electron-build/agents/permission-mode.js.map +1 -0
  77. package/dist/electron-build/agents/pi-harness.js +268 -0
  78. package/dist/electron-build/agents/pi-harness.js.map +1 -0
  79. package/dist/electron-build/agents/pi-sdk-session-factory.js +117 -0
  80. package/dist/electron-build/agents/pi-sdk-session-factory.js.map +1 -0
  81. package/dist/electron-build/agents/pi-sdk-session-manager.js +335 -0
  82. package/dist/electron-build/agents/pi-sdk-session-manager.js.map +1 -0
  83. package/dist/electron-build/agents/pi-sdk-tools.js +4042 -0
  84. package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -0
  85. package/dist/electron-build/agents/pi-sdk-types.js +17 -0
  86. package/dist/electron-build/agents/pi-sdk-types.js.map +1 -0
  87. package/dist/electron-build/agents/pi-sdk.js +3325 -0
  88. package/dist/electron-build/agents/pi-sdk.js.map +1 -0
  89. package/dist/electron-build/agents/plan-store.js +212 -0
  90. package/dist/electron-build/agents/plan-store.js.map +1 -0
  91. package/dist/electron-build/agents/pre-tool-validator.js +200 -0
  92. package/dist/electron-build/agents/pre-tool-validator.js.map +1 -0
  93. package/dist/electron-build/agents/process-runner.js +148 -0
  94. package/dist/electron-build/agents/process-runner.js.map +1 -0
  95. package/dist/electron-build/agents/react-loop.js +131 -0
  96. package/dist/electron-build/agents/react-loop.js.map +1 -0
  97. package/dist/electron-build/agents/resource-store.js +180 -0
  98. package/dist/electron-build/agents/resource-store.js.map +1 -0
  99. package/dist/electron-build/agents/resource-token.js +118 -0
  100. package/dist/electron-build/agents/resource-token.js.map +1 -0
  101. package/dist/electron-build/agents/resource-wallet.js +84 -0
  102. package/dist/electron-build/agents/resource-wallet.js.map +1 -0
  103. package/dist/electron-build/agents/run-store.js +854 -0
  104. package/dist/electron-build/agents/run-store.js.map +1 -0
  105. package/dist/electron-build/agents/runner-resolver.js +267 -0
  106. package/dist/electron-build/agents/runner-resolver.js.map +1 -0
  107. package/dist/electron-build/agents/session-store.js +294 -0
  108. package/dist/electron-build/agents/session-store.js.map +1 -0
  109. package/dist/electron-build/agents/shell-guard.js +465 -0
  110. package/dist/electron-build/agents/shell-guard.js.map +1 -0
  111. package/dist/electron-build/agents/shell-tool.js +102 -0
  112. package/dist/electron-build/agents/shell-tool.js.map +1 -0
  113. package/dist/electron-build/agents/skill-loader.js +216 -0
  114. package/dist/electron-build/agents/skill-loader.js.map +1 -0
  115. package/dist/electron-build/agents/skill-readiness.js +174 -0
  116. package/dist/electron-build/agents/skill-readiness.js.map +1 -0
  117. package/dist/electron-build/agents/skill-share.js +394 -0
  118. package/dist/electron-build/agents/skill-share.js.map +1 -0
  119. package/dist/electron-build/agents/skill-supervisor-link.js +75 -0
  120. package/dist/electron-build/agents/skill-supervisor-link.js.map +1 -0
  121. package/dist/electron-build/agents/skill-writer.js +347 -0
  122. package/dist/electron-build/agents/skill-writer.js.map +1 -0
  123. package/dist/electron-build/agents/skills-manager.js +763 -0
  124. package/dist/electron-build/agents/skills-manager.js.map +1 -0
  125. package/dist/electron-build/agents/supervisor-host.js +294 -0
  126. package/dist/electron-build/agents/supervisor-host.js.map +1 -0
  127. package/dist/electron-build/agents/task/local-seller.js +188 -0
  128. package/dist/electron-build/agents/task/local-seller.js.map +1 -0
  129. package/dist/electron-build/agents/task/report-card.js +152 -0
  130. package/dist/electron-build/agents/task/report-card.js.map +1 -0
  131. package/dist/electron-build/agents/task/resource-advisor.js +222 -0
  132. package/dist/electron-build/agents/task/resource-advisor.js.map +1 -0
  133. package/dist/electron-build/agents/task/task-budget.js +111 -0
  134. package/dist/electron-build/agents/task/task-budget.js.map +1 -0
  135. package/dist/electron-build/agents/task/task-runner.js +670 -0
  136. package/dist/electron-build/agents/task/task-runner.js.map +1 -0
  137. package/dist/electron-build/agents/task-state.js +266 -0
  138. package/dist/electron-build/agents/task-state.js.map +1 -0
  139. package/dist/electron-build/agents/tool-registry.js +141 -0
  140. package/dist/electron-build/agents/tool-registry.js.map +1 -0
  141. package/dist/electron-build/agents/treasury-bridge.js +165 -0
  142. package/dist/electron-build/agents/treasury-bridge.js.map +1 -0
  143. package/dist/electron-build/agents/user-questions.js +223 -0
  144. package/dist/electron-build/agents/user-questions.js.map +1 -0
  145. package/dist/electron-build/agents/verify-recipe.js +90 -0
  146. package/dist/electron-build/agents/verify-recipe.js.map +1 -0
  147. package/dist/electron-build/agents/workflow-engine.js +222 -0
  148. package/dist/electron-build/agents/workflow-engine.js.map +1 -0
  149. package/dist/electron-build/agents/workflow-pivot-loop.js +988 -0
  150. package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -0
  151. package/dist/electron-build/agents/write-staging.js +133 -0
  152. package/dist/electron-build/agents/write-staging.js.map +1 -0
  153. package/dist/electron-build/agents/x402/goal-run-bridge.js +115 -0
  154. package/dist/electron-build/agents/x402/goal-run-bridge.js.map +1 -0
  155. package/dist/electron-build/agents/x402/milestone-settlement.js +163 -0
  156. package/dist/electron-build/agents/x402/milestone-settlement.js.map +1 -0
  157. package/dist/electron-build/agents/x402/paid-info-protocol.js +274 -0
  158. package/dist/electron-build/agents/x402/paid-info-protocol.js.map +1 -0
  159. package/dist/electron-build/agents/x402/paid-info-store.js +409 -0
  160. package/dist/electron-build/agents/x402/paid-info-store.js.map +1 -0
  161. package/dist/electron-build/agents/x402/paid-info-tools.js +346 -0
  162. package/dist/electron-build/agents/x402/paid-info-tools.js.map +1 -0
  163. package/dist/electron-build/agents/x402/payment-recovery.js +330 -0
  164. package/dist/electron-build/agents/x402/payment-recovery.js.map +1 -0
  165. package/dist/electron-build/agents/x402/resource-contract.js +533 -0
  166. package/dist/electron-build/agents/x402/resource-contract.js.map +1 -0
  167. package/dist/electron-build/agents/x402/settlement-state.js +432 -0
  168. package/dist/electron-build/agents/x402/settlement-state.js.map +1 -0
  169. package/dist/electron-build/agents/x402/trade.js +294 -0
  170. package/dist/electron-build/agents/x402/trade.js.map +1 -0
  171. package/dist/electron-build/agents/x402/transaction-protocol.js +109 -0
  172. package/dist/electron-build/agents/x402/transaction-protocol.js.map +1 -0
  173. package/dist/electron-build/agents/x402/transaction-store.js +404 -0
  174. package/dist/electron-build/agents/x402/transaction-store.js.map +1 -0
  175. package/dist/electron-build/agents/x402/x402Pay.js +377 -0
  176. package/dist/electron-build/agents/x402/x402Pay.js.map +1 -0
  177. package/dist/electron-build/bollharness-integration/context-router-judgment.js +269 -0
  178. package/dist/electron-build/bollharness-integration/context-router-judgment.js.map +1 -0
  179. package/dist/electron-build/bollharness-integration/context-router.js +584 -0
  180. package/dist/electron-build/bollharness-integration/context-router.js.map +1 -0
  181. package/dist/electron-build/bollharness-integration/gate-state-machine.js +362 -0
  182. package/dist/electron-build/bollharness-integration/gate-state-machine.js.map +1 -0
  183. package/dist/electron-build/bollharness-integration/gate-transition-hooks.js +136 -0
  184. package/dist/electron-build/bollharness-integration/gate-transition-hooks.js.map +1 -0
  185. package/dist/electron-build/bollharness-integration/guard-checker.js +400 -0
  186. package/dist/electron-build/bollharness-integration/guard-checker.js.map +1 -0
  187. package/dist/electron-build/bollharness-integration/index.js +123 -0
  188. package/dist/electron-build/bollharness-integration/index.js.map +1 -0
  189. package/dist/electron-build/bollharness-integration/integration.js +531 -0
  190. package/dist/electron-build/bollharness-integration/integration.js.map +1 -0
  191. package/dist/electron-build/bollharness-integration/skill-adapter.js +608 -0
  192. package/dist/electron-build/bollharness-integration/skill-adapter.js.map +1 -0
  193. package/dist/electron-build/bootstrap/bootstrap.js +173 -0
  194. package/dist/electron-build/bootstrap/bootstrap.js.map +1 -0
  195. package/dist/electron-build/bootstrap/context-collector.js +358 -0
  196. package/dist/electron-build/bootstrap/context-collector.js.map +1 -0
  197. package/dist/electron-build/bootstrap/context-hierarchy.js +262 -0
  198. package/dist/electron-build/bootstrap/context-hierarchy.js.map +1 -0
  199. package/dist/electron-build/bootstrap/context-manager.js +211 -0
  200. package/dist/electron-build/bootstrap/context-manager.js.map +1 -0
  201. package/dist/electron-build/bootstrap/context-os.js +277 -0
  202. package/dist/electron-build/bootstrap/context-os.js.map +1 -0
  203. package/dist/electron-build/bootstrap/event-log.js +203 -0
  204. package/dist/electron-build/bootstrap/event-log.js.map +1 -0
  205. package/dist/electron-build/bootstrap/exhaust-scrubber.js +277 -0
  206. package/dist/electron-build/bootstrap/exhaust-scrubber.js.map +1 -0
  207. package/dist/electron-build/bootstrap/lifecycle-hooks.js +282 -0
  208. package/dist/electron-build/bootstrap/lifecycle-hooks.js.map +1 -0
  209. package/dist/electron-build/bootstrap/memory-compressor.js +377 -0
  210. package/dist/electron-build/bootstrap/memory-compressor.js.map +1 -0
  211. package/dist/electron-build/bootstrap/persona-loader.js +219 -0
  212. package/dist/electron-build/bootstrap/persona-loader.js.map +1 -0
  213. package/dist/electron-build/bootstrap/project-context.js +162 -0
  214. package/dist/electron-build/bootstrap/project-context.js.map +1 -0
  215. package/dist/electron-build/bootstrap/project-state.js +205 -0
  216. package/dist/electron-build/bootstrap/project-state.js.map +1 -0
  217. package/dist/electron-build/bootstrap/session-window.js +162 -0
  218. package/dist/electron-build/bootstrap/session-window.js.map +1 -0
  219. package/dist/electron-build/bootstrap/vector-index.js +291 -0
  220. package/dist/electron-build/bootstrap/vector-index.js.map +1 -0
  221. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +22 -0
  222. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js.map +1 -0
  223. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/clobShared.js +86 -0
  224. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/clobShared.js.map +1 -0
  225. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +37 -0
  226. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/createOrder.js.map +1 -0
  227. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +20 -0
  228. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getMarket.js.map +1 -0
  229. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +29 -0
  230. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getOrders.js.map +1 -0
  231. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +28 -0
  232. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js.map +1 -0
  233. package/dist/electron-build/constraint-runtime/src/tools/SafeSDK/deploySafe.js +10 -0
  234. package/dist/electron-build/constraint-runtime/src/tools/SafeSDK/deploySafe.js.map +1 -0
  235. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/autoPay.js +68 -0
  236. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/autoPay.js.map +1 -0
  237. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/createWallet.js +14 -0
  238. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/createWallet.js.map +1 -0
  239. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/getBalance.js +17 -0
  240. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/getBalance.js.map +1 -0
  241. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/importWallet.js +59 -0
  242. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/importWallet.js.map +1 -0
  243. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/sendTransaction.js +29 -0
  244. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/sendTransaction.js.map +1 -0
  245. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/signMessage.js +14 -0
  246. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/signMessage.js.map +1 -0
  247. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/transferToken.js +29 -0
  248. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/transferToken.js.map +1 -0
  249. package/dist/electron-build/constraints/index.js +11 -0
  250. package/dist/electron-build/constraints/index.js.map +1 -0
  251. package/dist/electron-build/context-compaction/auto-compact.js +182 -0
  252. package/dist/electron-build/context-compaction/auto-compact.js.map +1 -0
  253. package/dist/electron-build/context-compaction/budget-gate.js +32 -0
  254. package/dist/electron-build/context-compaction/budget-gate.js.map +1 -0
  255. package/dist/electron-build/context-compaction/budget-reduce.js +39 -0
  256. package/dist/electron-build/context-compaction/budget-reduce.js.map +1 -0
  257. package/dist/electron-build/context-compaction/context-collapse.js +71 -0
  258. package/dist/electron-build/context-compaction/context-collapse.js.map +1 -0
  259. package/dist/electron-build/context-compaction/index.js +38 -0
  260. package/dist/electron-build/context-compaction/index.js.map +1 -0
  261. package/dist/electron-build/context-compaction/microcompact.js +55 -0
  262. package/dist/electron-build/context-compaction/microcompact.js.map +1 -0
  263. package/dist/electron-build/context-compaction/pipeline.js +128 -0
  264. package/dist/electron-build/context-compaction/pipeline.js.map +1 -0
  265. package/dist/electron-build/context-compaction/snip.js +50 -0
  266. package/dist/electron-build/context-compaction/snip.js.map +1 -0
  267. package/dist/electron-build/context-compaction/token-estimator.js +40 -0
  268. package/dist/electron-build/context-compaction/token-estimator.js.map +1 -0
  269. package/dist/electron-build/context-compaction/types.js +21 -0
  270. package/dist/electron-build/context-compaction/types.js.map +1 -0
  271. package/dist/electron-build/cron/tick-lock.js +247 -0
  272. package/dist/electron-build/cron/tick-lock.js.map +1 -0
  273. package/dist/electron-build/documents/reader.js +131 -0
  274. package/dist/electron-build/documents/reader.js.map +1 -0
  275. package/dist/electron-build/documents/store.js +220 -0
  276. package/dist/electron-build/documents/store.js.map +1 -0
  277. package/dist/electron-build/external-engines/delegate-handle.js +76 -0
  278. package/dist/electron-build/external-engines/delegate-handle.js.map +1 -0
  279. package/dist/electron-build/external-engines/delegate.js +225 -0
  280. package/dist/electron-build/external-engines/delegate.js.map +1 -0
  281. package/dist/electron-build/external-engines/discovery.js +448 -0
  282. package/dist/electron-build/external-engines/discovery.js.map +1 -0
  283. package/dist/electron-build/external-engines/types.js +13 -0
  284. package/dist/electron-build/external-engines/types.js.map +1 -0
  285. package/dist/electron-build/hooks/hooks-engine.js +367 -0
  286. package/dist/electron-build/hooks/hooks-engine.js.map +1 -0
  287. package/dist/electron-build/judgeness/reflect.js +100 -0
  288. package/dist/electron-build/judgeness/reflect.js.map +1 -0
  289. package/dist/electron-build/judgeness/store.js +536 -0
  290. package/dist/electron-build/judgeness/store.js.map +1 -0
  291. package/dist/electron-build/judgeness/types.js +21 -0
  292. package/dist/electron-build/judgeness/types.js.map +1 -0
  293. package/dist/electron-build/llm/config-store.js +551 -0
  294. package/dist/electron-build/llm/config-store.js.map +1 -0
  295. package/dist/electron-build/llm/error-lessons.js +76 -0
  296. package/dist/electron-build/llm/error-lessons.js.map +1 -0
  297. package/dist/electron-build/llm/pi-ai.js +830 -0
  298. package/dist/electron-build/llm/pi-ai.js.map +1 -0
  299. package/dist/electron-build/llm/system-prompt/registry.js +318 -0
  300. package/dist/electron-build/llm/system-prompt/registry.js.map +1 -0
  301. package/dist/electron-build/llm/system-prompt/strip-hibsml.js +55 -0
  302. package/dist/electron-build/llm/system-prompt/strip-hibsml.js.map +1 -0
  303. package/dist/electron-build/locales/en.js +32 -0
  304. package/dist/electron-build/locales/en.js.map +1 -0
  305. package/dist/electron-build/locales/zh.js +30 -0
  306. package/dist/electron-build/locales/zh.js.map +1 -0
  307. package/dist/electron-build/lsp/lsp-manager.js +327 -0
  308. package/dist/electron-build/lsp/lsp-manager.js.map +1 -0
  309. package/dist/electron-build/lsp/lsp-tools.js +226 -0
  310. package/dist/electron-build/lsp/lsp-tools.js.map +1 -0
  311. package/dist/electron-build/migration/external-agent-migrator.js +451 -0
  312. package/dist/electron-build/migration/external-agent-migrator.js.map +1 -0
  313. package/dist/electron-build/network/agent-network.js +775 -0
  314. package/dist/electron-build/network/agent-network.js.map +1 -0
  315. package/dist/electron-build/network/goal-event-bridge.js +62 -0
  316. package/dist/electron-build/network/goal-event-bridge.js.map +1 -0
  317. package/dist/electron-build/network/iroh-integration.js +117 -0
  318. package/dist/electron-build/network/iroh-integration.js.map +1 -0
  319. package/dist/electron-build/network/iroh-transport.js +550 -0
  320. package/dist/electron-build/network/iroh-transport.js.map +1 -0
  321. package/dist/electron-build/network/p2p.js +1103 -0
  322. package/dist/electron-build/network/p2p.js.map +1 -0
  323. package/dist/electron-build/network/storage/adapters/json-adapter.js +416 -0
  324. package/dist/electron-build/network/storage/adapters/json-adapter.js.map +1 -0
  325. package/dist/electron-build/network/storage/types.js +18 -0
  326. package/dist/electron-build/network/storage/types.js.map +1 -0
  327. package/dist/electron-build/orbitdb/agent-tools.js +402 -0
  328. package/dist/electron-build/orbitdb/agent-tools.js.map +1 -0
  329. package/dist/electron-build/orbitdb/cid-database.js +284 -0
  330. package/dist/electron-build/orbitdb/cid-database.js.map +1 -0
  331. package/dist/electron-build/orbitdb/context-store.js +99 -0
  332. package/dist/electron-build/orbitdb/context-store.js.map +1 -0
  333. package/dist/electron-build/orbitdb/ipfs-node.js +120 -0
  334. package/dist/electron-build/orbitdb/ipfs-node.js.map +1 -0
  335. package/dist/electron-build/orbitdb/kanban-store.js +299 -0
  336. package/dist/electron-build/orbitdb/kanban-store.js.map +1 -0
  337. package/dist/electron-build/orbitdb/task-store.js +155 -0
  338. package/dist/electron-build/orbitdb/task-store.js.map +1 -0
  339. package/dist/electron-build/orbitdb/trajectory-store.js +194 -0
  340. package/dist/electron-build/orbitdb/trajectory-store.js.map +1 -0
  341. package/dist/electron-build/orbitdb/ui-cid.js +77 -0
  342. package/dist/electron-build/orbitdb/ui-cid.js.map +1 -0
  343. package/dist/electron-build/pi-ecosystem-a2ui/index.js +89 -0
  344. package/dist/electron-build/pi-ecosystem-a2ui/index.js.map +1 -0
  345. package/dist/electron-build/pi-ecosystem-goals/index.js +512 -0
  346. package/dist/electron-build/pi-ecosystem-goals/index.js.map +1 -0
  347. package/dist/electron-build/pi-ecosystem-judgment/adaptive-scan.js +325 -0
  348. package/dist/electron-build/pi-ecosystem-judgment/adaptive-scan.js.map +1 -0
  349. package/dist/electron-build/pi-ecosystem-judgment/causal-judge.js +492 -0
  350. package/dist/electron-build/pi-ecosystem-judgment/causal-judge.js.map +1 -0
  351. package/dist/electron-build/pi-ecosystem-judgment/cleanup.js +167 -0
  352. package/dist/electron-build/pi-ecosystem-judgment/cleanup.js.map +1 -0
  353. package/dist/electron-build/pi-ecosystem-judgment/decision.js +321 -0
  354. package/dist/electron-build/pi-ecosystem-judgment/decision.js.map +1 -0
  355. package/dist/electron-build/pi-ecosystem-judgment/detect-hook.js +175 -0
  356. package/dist/electron-build/pi-ecosystem-judgment/detect-hook.js.map +1 -0
  357. package/dist/electron-build/pi-ecosystem-judgment/distill-prompt.js +232 -0
  358. package/dist/electron-build/pi-ecosystem-judgment/distill-prompt.js.map +1 -0
  359. package/dist/electron-build/pi-ecosystem-judgment/distillation.js +304 -0
  360. package/dist/electron-build/pi-ecosystem-judgment/distillation.js.map +1 -0
  361. package/dist/electron-build/pi-ecosystem-judgment/evolve-judgment.js +176 -0
  362. package/dist/electron-build/pi-ecosystem-judgment/evolve-judgment.js.map +1 -0
  363. package/dist/electron-build/pi-ecosystem-judgment/human-value-pipeline.js +65 -0
  364. package/dist/electron-build/pi-ecosystem-judgment/human-value-pipeline.js.map +1 -0
  365. package/dist/electron-build/pi-ecosystem-judgment/human-value-store.js +808 -0
  366. package/dist/electron-build/pi-ecosystem-judgment/human-value-store.js.map +1 -0
  367. package/dist/electron-build/pi-ecosystem-judgment/index.js +508 -0
  368. package/dist/electron-build/pi-ecosystem-judgment/index.js.map +1 -0
  369. package/dist/electron-build/pi-ecosystem-judgment/injection-gate.js +334 -0
  370. package/dist/electron-build/pi-ecosystem-judgment/injection-gate.js.map +1 -0
  371. package/dist/electron-build/pi-ecosystem-judgment/monitor-gate.js +228 -0
  372. package/dist/electron-build/pi-ecosystem-judgment/monitor-gate.js.map +1 -0
  373. package/dist/electron-build/pi-ecosystem-judgment/value-injection.js +598 -0
  374. package/dist/electron-build/pi-ecosystem-judgment/value-injection.js.map +1 -0
  375. package/dist/electron-build/pi-ecosystem-mcp/index.js +643 -0
  376. package/dist/electron-build/pi-ecosystem-mcp/index.js.map +1 -0
  377. package/dist/electron-build/pi-ecosystem-mcp/ui-tools.js +116 -0
  378. package/dist/electron-build/pi-ecosystem-mcp/ui-tools.js.map +1 -0
  379. package/dist/electron-build/pi-ecosystem-subagents/index.js +352 -0
  380. package/dist/electron-build/pi-ecosystem-subagents/index.js.map +1 -0
  381. package/dist/electron-build/security/builtin-guards.js +133 -0
  382. package/dist/electron-build/security/builtin-guards.js.map +1 -0
  383. package/dist/electron-build/security/context-router-tool.js +111 -0
  384. package/dist/electron-build/security/context-router-tool.js.map +1 -0
  385. package/dist/electron-build/security/input-scanner.js +263 -0
  386. package/dist/electron-build/security/input-scanner.js.map +1 -0
  387. package/dist/electron-build/security/react-harness.js +148 -0
  388. package/dist/electron-build/security/react-harness.js.map +1 -0
  389. package/dist/electron-build/security/tool-gate.js +287 -0
  390. package/dist/electron-build/security/tool-gate.js.map +1 -0
  391. package/dist/electron-build/setup/setup-store.js +648 -0
  392. package/dist/electron-build/setup/setup-store.js.map +1 -0
  393. package/dist/electron-build/social/channels/ChannelManager.js +444 -0
  394. package/dist/electron-build/social/channels/ChannelManager.js.map +1 -0
  395. package/dist/electron-build/social/channels/DiapChannelBridge.js +451 -0
  396. package/dist/electron-build/social/channels/DiapChannelBridge.js.map +1 -0
  397. package/dist/electron-build/social/channels/InterestMatcher.js +135 -0
  398. package/dist/electron-build/social/channels/InterestMatcher.js.map +1 -0
  399. package/dist/electron-build/social/channels/types.js +21 -0
  400. package/dist/electron-build/social/channels/types.js.map +1 -0
  401. package/dist/electron-build/social/global-shared-context.js +368 -0
  402. package/dist/electron-build/social/global-shared-context.js.map +1 -0
  403. package/dist/electron-build/social/heartbeat.js +882 -0
  404. package/dist/electron-build/social/heartbeat.js.map +1 -0
  405. package/dist/electron-build/storage/did-catalog-bridge.js +314 -0
  406. package/dist/electron-build/storage/did-catalog-bridge.js.map +1 -0
  407. package/dist/electron-build/storage/did-catalog.js +272 -0
  408. package/dist/electron-build/storage/did-catalog.js.map +1 -0
  409. package/dist/electron-build/utils/auto-update.js +140 -558
  410. package/dist/electron-build/utils/auto-update.js.map +1 -1
  411. package/dist/electron-build/utils/module-context.js +98 -0
  412. package/dist/electron-build/utils/module-context.js.map +1 -0
  413. package/dist/electron-build/utils/runtime-bootstrap.js +745 -0
  414. package/dist/electron-build/utils/runtime-bootstrap.js.map +1 -0
  415. package/dist/electron-build/utils/update-manager.js +770 -0
  416. package/dist/electron-build/utils/update-manager.js.map +1 -0
  417. package/dist/electron-build/utils/update-state.js +406 -0
  418. package/dist/electron-build/utils/update-state.js.map +1 -0
  419. package/dist/electron-build/utils/version-info.js +562 -0
  420. package/dist/electron-build/utils/version-info.js.map +1 -0
  421. package/dist/electron-build/web/i18n.js +146 -0
  422. package/dist/electron-build/web/i18n.js.map +1 -0
  423. package/dist/electron-build/web/routes-x402-info.js +232 -0
  424. package/dist/electron-build/web/routes-x402-info.js.map +1 -0
  425. package/dist/electron-build/web/server-storage.js +390 -0
  426. package/dist/electron-build/web/server-storage.js.map +1 -0
  427. package/dist/electron-build/web/server-types.js +52 -0
  428. package/dist/electron-build/web/server-types.js.map +1 -0
  429. package/dist/electron-build/web/task-deps.js +41 -0
  430. package/dist/electron-build/web/task-deps.js.map +1 -0
  431. package/dist/index.js +28 -27
  432. package/dist/llm/system-prompt/registry.js +6 -3
  433. package/dist/utils/auto-update.js +138 -525
  434. package/dist/utils/module-context.js +59 -0
  435. package/dist/utils/runtime-bootstrap.js +682 -0
  436. package/dist/utils/update-cli.js +82 -0
  437. package/dist/utils/update-health.js +401 -0
  438. package/dist/utils/update-manager.js +716 -0
  439. package/dist/utils/update-state.js +353 -0
  440. package/dist/utils/version-info.js +510 -0
  441. package/package.json +1 -1
  442. package/scripts/build-cli.js +32 -151
  443. package/scripts/postinstall.js +153 -76
@@ -0,0 +1,670 @@
1
+ "use strict";
2
+ /**
3
+ * task-runner.ts — M1 薄层 ①: Task Runner (M1–M4 收口版)
4
+ *
5
+ * `bolloon task "<任务>" --budget 0.05` → Goal → (顾问) → 购买 → 执行 → 证据 → 报告卡
6
+ * `bolloon task --resume <goalId>` → 统一恢复决策 (与 Supervisor 同一个函数)
7
+ *
8
+ * 收口要点 (leo 2026-09-18 收口计划):
9
+ * · Goal / Run **先建**: 任何一条失败路径都返回报告卡, 不抛栈、不返回空 runId
10
+ * · 证据只走 `bridgeTransactionToRunGoal` (不再自己维护第二套证据写法)
11
+ * · 交易记录写 `resourceOutcome` (安装/执行/契约/判据) + `verificationTrust`
12
+ * · 失败映射: 付了但资源没跑成 → `delivery_failed`; 跑了但输出不合契约 → `verification_failed`
13
+ * · local-dev 永远 self-attested, 永不 `verified`
14
+ * · 非幂等保护: 已有执行证据的任务续跑时**不重复执行**
15
+ * · 故障注入钩子 `BOLLOON_TASK_FAULT` (仅测试用; 不设即无行为差异)
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.M1_DEFAULTS = void 0;
52
+ exports.defaultRequestId = defaultRequestId;
53
+ exports.deriveSkillInput = deriveSkillInput;
54
+ exports.extractConclusion = extractConclusion;
55
+ exports.extractSources = extractSources;
56
+ exports.defaultCriteria = defaultCriteria;
57
+ exports.installBundle = installBundle;
58
+ exports.ensureLocalListing = ensureLocalListing;
59
+ exports.refetchDeliveredContent = refetchDeliveredContent;
60
+ exports.mapFailureStatus = mapFailureStatus;
61
+ exports.failureStageFor = failureStageFor;
62
+ exports.hasExecutionEvidence = hasExecutionEvidence;
63
+ exports.goalAlreadyExecuted = goalAlreadyExecuted;
64
+ exports.runTask = runTask;
65
+ exports.decideTaskRecovery = decideTaskRecovery;
66
+ exports.resumeTask = resumeTask;
67
+ const os = __importStar(require("os"));
68
+ const path = __importStar(require("path"));
69
+ const fs = __importStar(require("fs"));
70
+ const crypto = __importStar(require("crypto"));
71
+ const goal_store_js_1 = require("../goal-store.js");
72
+ const run_store_js_1 = require("../run-store.js");
73
+ const transaction_store_js_1 = require("../x402/transaction-store.js");
74
+ const goal_run_bridge_js_1 = require("../x402/goal-run-bridge.js");
75
+ const trade_js_1 = require("../x402/trade.js");
76
+ const paid_info_store_js_1 = require("../x402/paid-info-store.js");
77
+ const payment_recovery_js_1 = require("../x402/payment-recovery.js");
78
+ const resource_contract_js_1 = require("../x402/resource-contract.js");
79
+ const resource_advisor_js_1 = require("./resource-advisor.js");
80
+ const task_budget_js_1 = require("./task-budget.js");
81
+ const report_card_js_1 = require("./report-card.js");
82
+ const local_seller_js_1 = require("./local-seller.js");
83
+ /** M1 默认值 (本地 Registry; 价格必须 ≤ 单次上限 0.02) */
84
+ exports.M1_DEFAULTS = {
85
+ localPrice: '0.012',
86
+ currency: 'USDC',
87
+ network: 'base-sepolia',
88
+ localPayTo: '0x1111111111111111111111111111111111111111',
89
+ buyerDid: 'did:key:zTaskBuyer',
90
+ };
91
+ // ── 工具 ────────────────────────────────────────────────────────────────────
92
+ /**
93
+ * 同一个 (任务 + 预算) 派生**同一个 requestId** —— 这是"重跑不重复付款"的关键:
94
+ * 进程被杀后重新执行同样的任务, trade 层的幂等短路会复用已有交易, 不会第二次扣款。
95
+ */
96
+ function defaultRequestId(task, taskBudget) {
97
+ const h = crypto.createHash('sha256').update(`${task.trim()}|${taskBudget}`).digest('hex').slice(0, 16);
98
+ return `task-${h}`;
99
+ }
100
+ /** 故障注入 (只给验收用; 未设置 = 完全无行为差异) */
101
+ function faultPoint(name) {
102
+ const want = process.env.BOLLOON_TASK_FAULT;
103
+ if (!want || want !== name)
104
+ return;
105
+ if (process.env.BOLLOON_TASK_FAULT_MODE === 'exit')
106
+ process.exit(97); // 模拟进程被杀
107
+ process.kill(process.pid, 'SIGKILL');
108
+ }
109
+ /** 从任务文本 + 契约 inputSchema 推导输入 (确定性; M1 不做语义抽取, 用 --input 兜底) */
110
+ function deriveSkillInput(contract, task) {
111
+ const schema = contract?.inputSchema || {};
112
+ const required = Array.isArray(schema.required) ? schema.required : [];
113
+ const props = schema.properties || {};
114
+ const MARKET_RE = /(日本|美国|欧盟|东南亚|韩国|德国|英国|法国|加拿大|澳大利亚|印度|中东|拉美|巴西|越南|泰国)/;
115
+ const market = (task.match(MARKET_RE) || [])[0] || '';
116
+ const cleanProduct = (t) => t
117
+ .replace(MARKET_RE, ' ')
118
+ .replace(/判断|这款|这个|是否|适合|不适合|进入|市场|帮我|看下|看一下|能不能|可否|调研|建议/g, ' ')
119
+ .replace(/[,。、,.?!?!::;;]/g, ' ')
120
+ .replace(/\s+/g, ' ')
121
+ .trim();
122
+ const fields = Array.from(new Set([...required, ...Object.keys(props)]));
123
+ const out = {};
124
+ for (const key of fields) {
125
+ const p = props[key] || {};
126
+ const isRequired = required.includes(key);
127
+ const type = String(p.type || 'string');
128
+ if (type === 'number' || type === 'integer') {
129
+ const n = task.match(/\d+(\.\d+)?/);
130
+ if (n)
131
+ out[key] = Number(n[0]); // 任务里真有数字才填 (可选字段也不硬塞)
132
+ continue;
133
+ }
134
+ if (/market|国家|市场|地区|country|region/i.test(key)) {
135
+ if (market)
136
+ out[key] = market;
137
+ else if (isRequired)
138
+ out[key] = task.slice(0, 40);
139
+ continue;
140
+ }
141
+ if (/product|商品|品名|item|name/i.test(key)) {
142
+ const prod = cleanProduct(task);
143
+ if (prod.length >= 2)
144
+ out[key] = prod.slice(0, 60);
145
+ else if (isRequired)
146
+ out[key] = task.slice(0, 60);
147
+ continue;
148
+ }
149
+ if (isRequired)
150
+ out[key] = task.slice(0, 200);
151
+ }
152
+ return out;
153
+ }
154
+ /** 结论抽取: 优先显式字段, 不猜语义 */
155
+ function extractConclusion(output) {
156
+ if (!output || typeof output !== 'object')
157
+ return {};
158
+ const o = output;
159
+ for (const k of ['conclusion', 'verdict', 'recommendation', 'summary', '结论']) {
160
+ if (typeof o[k] === 'string' && o[k].trim())
161
+ return { conclusion: o[k].trim().slice(0, 160) };
162
+ }
163
+ if (typeof o.suitable === 'boolean')
164
+ return { conclusion: o.suitable ? '适合' : '不适合' };
165
+ return {};
166
+ }
167
+ function extractSources(output) {
168
+ const o = output;
169
+ if (!o || typeof o !== 'object')
170
+ return [];
171
+ const raw = o.sources || o.findings?.map((f) => f?.source).filter(Boolean) || [];
172
+ const list = [];
173
+ for (const s of Array.isArray(raw) ? raw : []) {
174
+ if (typeof s === 'string')
175
+ list.push(s);
176
+ else if (s && typeof s === 'object')
177
+ list.push(String(s.url || s.ref || s.name || JSON.stringify(s).slice(0, 60)));
178
+ }
179
+ return list;
180
+ }
181
+ /** 默认判据 (来自资源契约, 可判定) */
182
+ function defaultCriteria(contract) {
183
+ const v = contract?.verification || {};
184
+ const req = (v.requiredFields || []).slice(0, 4).join(', ');
185
+ const ev = (v.evidenceFields || []).slice(0, 3).join(', ');
186
+ return [
187
+ `输出包含契约要求字段 (${req || 'requiredFields'})`,
188
+ `输出带可核验来源 (${ev || 'sources'})`,
189
+ '结论可读 (conclusion/verdict)',
190
+ ];
191
+ }
192
+ function safeJoin(dir, rel) {
193
+ if (!rel || path.isAbsolute(rel) || rel.includes('..'))
194
+ return null;
195
+ const full = path.join(dir, rel);
196
+ if (!full.startsWith(dir))
197
+ return null;
198
+ return full;
199
+ }
200
+ function installBundle(content, installDir) {
201
+ let bundle;
202
+ try {
203
+ bundle = JSON.parse(content);
204
+ }
205
+ catch (e) {
206
+ return { ok: false, files: 0, error: `交付内容不是合法 JSON 包: ${String(e?.message || e).slice(0, 80)}` };
207
+ }
208
+ const files = bundle?.files || {};
209
+ const rels = Object.keys(files);
210
+ if (rels.length === 0)
211
+ return { ok: false, files: 0, error: '交付包里没有文件' };
212
+ try {
213
+ for (const rel of rels) {
214
+ const dest = safeJoin(installDir, rel);
215
+ if (!dest)
216
+ return { ok: false, files: 0, error: `包内路径非法 (越界): ${rel}` };
217
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
218
+ fs.writeFileSync(dest, String(files[rel]), 'utf8');
219
+ }
220
+ }
221
+ catch (e) {
222
+ return { ok: false, files: 0, error: `安装失败: ${String(e?.message || e).slice(0, 80)}` };
223
+ }
224
+ return { ok: true, files: rels.length };
225
+ }
226
+ /** 本地 Registry: 若技能没有报价, 就按技能目录发布一条本地报价 (确定性 id = 技能名) */
227
+ async function ensureLocalListing(opts) {
228
+ const existing = (await (0, paid_info_store_js_1.listInfo)(opts.home)).find((i) => String(i.id) === opts.skillName);
229
+ if (existing)
230
+ return { itemId: existing.id, created: false };
231
+ const SHARE = await Promise.resolve().then(() => __importStar(require('../skill-share.js')));
232
+ const collected = await SHARE.collectSkillBundle(opts.skillDir, { name: opts.skillName });
233
+ if (!collected?.ok || !collected?.bundle)
234
+ return { itemId: '', created: false, error: `打包技能失败: ${collected?.error || '未知'}` };
235
+ const did = (await (0, local_seller_js_1.ensureSellerIdentity)(opts.home)).did || 'did:key:zLocalSeller';
236
+ const item = await (0, paid_info_store_js_1.publishInfo)({
237
+ id: opts.skillName,
238
+ title: opts.skillName,
239
+ category: 'skill',
240
+ content: JSON.stringify(collected.bundle),
241
+ description: `本地可执行技能 ${opts.skillName}`,
242
+ price: { amount: String(opts.price ?? exports.M1_DEFAULTS.localPrice), currency: exports.M1_DEFAULTS.currency, network: exports.M1_DEFAULTS.network, payTo: String(opts.payTo ?? exports.M1_DEFAULTS.localPayTo) },
243
+ source: { kind: 'self', refs: [opts.skillDir], note: `skill=${opts.skillName}@${opts.version || ''}` },
244
+ provider: { did, name: '本机卖方' },
245
+ }, { home: opts.home });
246
+ return { itemId: item.id, created: true };
247
+ }
248
+ /**
249
+ * "只补交付, 不重付" (M2 第 ② 类恢复点):
250
+ * 付款已经发生过 (记录里有凭据), 但内容没拿到 → 拿**同一个支付凭据**再向卖方取一次内容。
251
+ * 卖方会重新校验这个凭据 (幂等), 不会再产生一笔付款。
252
+ */
253
+ async function refetchDeliveredContent(opts) {
254
+ if (!opts.receipt)
255
+ return { ok: false, error: '记录里没有支付凭据, 无法补交付 (需要人工/对账)' };
256
+ try {
257
+ const res = await fetch(opts.url, { headers: { 'X-PAYMENT': opts.receipt } });
258
+ if (!res.ok)
259
+ return { ok: false, error: `补交付被卖方拒绝: HTTP ${res.status}` };
260
+ const env = await res.json().catch(() => null);
261
+ const content = String(env?.content ?? '');
262
+ if (!content)
263
+ return { ok: false, error: '卖方返回里没有内容' };
264
+ return { ok: true, content };
265
+ }
266
+ catch (e) {
267
+ return { ok: false, error: `补交付请求失败: ${String(e?.message || e).slice(0, 100)}` };
268
+ }
269
+ }
270
+ /**
271
+ * M4 出口口径 (纯函数, 可单测): 技能**产出了输出**但契约不过 → 验真失败; 压根没产出 → 交付失败。
272
+ */
273
+ function mapFailureStatus(opts) {
274
+ return opts.producedOutput && !opts.contractOk ? 'verification_failed' : 'delivery_failed';
275
+ }
276
+ /** 失败阶段 (M4 归责用): 装不上 → install; 没产出 → execute; 产出但不合契约 → output_contract */
277
+ function failureStageFor(opts) {
278
+ if (!opts.installOk)
279
+ return 'install';
280
+ if (!opts.producedOutput)
281
+ return 'execute';
282
+ if (!opts.contractOk)
283
+ return 'output_contract';
284
+ return undefined;
285
+ }
286
+ /** 判断一笔交易是否已经有"资源被执行过"的证据 (用于非幂等保护) */
287
+ function hasExecutionEvidence(rec) {
288
+ return rec?.resourceOutcome?.executed === true || rec?.execution?.ok === true;
289
+ }
290
+ /**
291
+ * 非幂等保护的完整判据: 交易记录**或** Run 轨迹里任一证明"执行过" → 不许再执行一遍。
292
+ * (真跑抓到过: 只查交易记录时, "执行完但还没写回交易就被杀"的任务续跑会重复执行非幂等技能。)
293
+ */
294
+ async function goalAlreadyExecuted(goal) {
295
+ for (const runId of (goal?.runs || [])) {
296
+ try {
297
+ const run = await (0, run_store_js_1.readRun)(runId);
298
+ const hit = (run?.steps || []).some((st) => st.tool === 'skill_exec' && st.ok === true);
299
+ if (hit)
300
+ return true;
301
+ }
302
+ catch { /* 读不到就当没有, 但交易记录那边还会兜一层 */ }
303
+ }
304
+ return false;
305
+ }
306
+ // ── 主流程 ──────────────────────────────────────────────────────────────────
307
+ async function runTask(opts) {
308
+ const home = opts.home ?? os.homedir();
309
+ const cwd = opts.cwd ?? process.cwd();
310
+ const stages = [];
311
+ const t0 = Date.now();
312
+ let lastMs = t0;
313
+ const mark = (stage, note) => {
314
+ const now = Date.now();
315
+ stages.push({ stage, note, ms: now - lastMs });
316
+ lastMs = now;
317
+ opts.onStage?.(stage, note);
318
+ };
319
+ const blankBudget = (why) => ({ taskBudget: 0, perPurchase: 0, daily: 0, requested: {}, clamped: { task: false, perPurchase: false, daily: false }, why });
320
+ // ① 预算 (唯一可以在没有 Goal 的情况下返回失败的一步: 预算非法 == 记账本身无意义)
321
+ const parsed = (0, task_budget_js_1.resolveTaskBudget)({ taskBudget: opts.budget, perPurchase: opts.perPurchase, daily: opts.daily });
322
+ if (!parsed.ok || !parsed.plan) {
323
+ const card = (0, report_card_js_1.buildReportCard)({ task: opts.task, executed: false, paid: false, blocker: `预算不合法: ${parsed.error}`, evidenceRef: {} });
324
+ return { ok: false, card, text: (0, report_card_js_1.renderReportCard)(card), stages, budget: blankBudget([String(parsed.error)]), outputIssues: [] };
325
+ }
326
+ const budget = parsed.plan;
327
+ mark('prepare', `任务: ${opts.task} · 预算 ${budget.taskBudget} USDC`);
328
+ // ② Goal + Run 先建 (此后每条失败路径都带 goalId/runId, 且可续跑)
329
+ const criteria0 = ['任务完成并留下完整证据'];
330
+ const reusedGoal = opts.reuseGoalId ? await (0, goal_store_js_1.readGoal)(opts.reuseGoalId) : null;
331
+ let goal = reusedGoal;
332
+ if (!goal) {
333
+ try {
334
+ goal = await (0, goal_store_js_1.createGoal)({ objective: opts.task, successCriteria: criteria0, constraints: [`预算 ≤ ${budget.taskBudget} ${exports.M1_DEFAULTS.currency}`], createdBy: 'cli:task' });
335
+ }
336
+ catch (e) {
337
+ const msg = String(e?.message || e).slice(0, 200);
338
+ mark('report', '初始化未就绪 → 没有创建 Goal, 也没有花钱');
339
+ const card = (0, report_card_js_1.buildReportCard)({ task: opts.task, executed: false, paid: false, conclusion: '证据不足', blocker: `本机还没初始化好, 无法记账也不会花钱: ${msg}`, evidenceRef: {}, budgetLines: budget.why });
340
+ return { ok: false, card, text: (0, report_card_js_1.renderReportCard)(card), stages, budget, outputIssues: [] };
341
+ }
342
+ }
343
+ const run = await (0, run_store_js_1.startRun)({ surface: 'cli', goal: opts.task, goalId: goal.goalId });
344
+ await (0, goal_store_js_1.attachRun)(goal.goalId, run.runId);
345
+ const fail = async (stage, note, cardOpts, runStatus = 'needs_human') => {
346
+ mark(stage, note);
347
+ await (0, run_store_js_1.finishRun)(run.runId, { status: runStatus, summary: note.slice(0, 200) });
348
+ const card = (0, report_card_js_1.buildReportCard)({ ...cardOpts, evidenceRef: { goalId: goal.goalId, runId: run.runId, transactionId: cardOpts.evidenceRef?.transactionId }, budgetLines: [...budget.why, ...(cardOpts.budgetLines || [])] });
349
+ return { ok: false, card, text: (0, report_card_js_1.renderReportCard)(card), goalId: goal.goalId, runId: run.runId, transactionId: card.evidenceRef.transactionId, stages, budget, outputIssues: cardOpts.blocker ? [cardOpts.blocker] : [] };
350
+ };
351
+ // ③ 顾问: 自动判断缺什么能力
352
+ const advisor = await (0, resource_advisor_js_1.adviseResource)({ task: opts.task, home, cwd, skillPaths: opts.skillPaths });
353
+ const advisorBrief = { needed: advisor.needed, reason: advisor.reason, skill: advisor.chosen?.name, why: advisor.chosen?.why || [] };
354
+ await (0, run_store_js_1.recordStep)(run.runId, { tool: 'resource_advise', ok: advisor.needed, summary: advisor.chosen ? `选中 ${advisor.chosen.name}@${advisor.chosen.version} (分数 ${advisor.chosen.score})` : advisor.reason, error: advisor.needed ? undefined : advisor.reason });
355
+ if (!advisor.needed || !advisor.chosen) {
356
+ const r = await fail('report', '没有可用的可执行资源 → 不买, 如实报告', {
357
+ task: opts.task, executed: false, paid: false, conclusion: '证据不足',
358
+ blocker: `缺少能完成这个任务的外部能力, 且本地 Registry 里没有匹配的可执行 Skill。${advisor.reason}`,
359
+ evidenceRef: {},
360
+ });
361
+ return { ...r, advisor: advisorBrief };
362
+ }
363
+ const chosen = advisor.chosen;
364
+ mark('prepare', `顾问判断缺能力 → 选 "${chosen.name}" (分数 ${chosen.score}): ${chosen.why.slice(0, 2).join(' / ') || '名字匹配'}`);
365
+ // ④ 报价 (本地 Registry 没报价就发布一条, 如实留痕)
366
+ let listing = chosen.listing;
367
+ let listingCreated = false;
368
+ if (!listing) {
369
+ const pub = await ensureLocalListing({ skillName: chosen.name, skillDir: chosen.dir, home, price: opts.price, payTo: opts.payTo, version: chosen.version });
370
+ if (!pub.itemId) {
371
+ const r = await fail('report', `无法把技能变成可购买资源: ${pub.error}`, {
372
+ task: opts.task, executed: false, paid: false, conclusion: '证据不足',
373
+ blocker: `技能 "${chosen.name}" 无法变成可购买资源: ${pub.error}`,
374
+ skill: { name: chosen.name, version: chosen.version, dir: chosen.dir }, evidenceRef: {},
375
+ });
376
+ return { ...r, advisor: advisorBrief };
377
+ }
378
+ listingCreated = pub.created;
379
+ mark('acquire', `本地 Registry 里没有 "${chosen.name}" 的报价 → 已按技能目录发布本地报价 (itemId=${pub.itemId})`);
380
+ listing = { itemId: pub.itemId, title: chosen.name, amount: String(opts.price ?? exports.M1_DEFAULTS.localPrice), currency: exports.M1_DEFAULTS.currency, network: exports.M1_DEFAULTS.network, payTo: String(opts.payTo ?? exports.M1_DEFAULTS.localPayTo) };
381
+ }
382
+ // ⑤ 预算门 (付款前必须看得到价格与影响; 三层各自会拦)
383
+ const impact = (0, task_budget_js_1.previewPurchaseImpact)(budget, listing.amount);
384
+ const decision = (0, task_budget_js_1.checkPurchaseAllowed)({ amount: listing.amount, plan: budget });
385
+ if (!decision.allowed) {
386
+ const r = await fail('report', `预算门拒绝 (${decision.layer}): ${decision.reason}`, {
387
+ task: opts.task, executed: false, paid: false, conclusion: '证据不足',
388
+ blocker: `购买被预算门拦下 (${decision.layer}): ${decision.reason}`,
389
+ skill: { name: chosen.name, version: chosen.version },
390
+ cost: { amount: listing.amount, currency: listing.currency, network: listing.network },
391
+ evidenceRef: {}, budgetLines: impact,
392
+ });
393
+ return { ...r, advisor: advisorBrief };
394
+ }
395
+ // ⑤.5 判据 (合同契约生成, 确认后才可能判完成)
396
+ const criteria = defaultCriteria(chosen.contract);
397
+ if (!reusedGoal)
398
+ await (0, goal_store_js_1.setCriteria)(goal.goalId, { criteria, source: 'user', confirm: true, by: 'cli:task' });
399
+ // ⑥ 买 (支付逻辑全在 trade.ts; 这里只给本地卖方地址)
400
+ mark('acquire', impact.join(' · '));
401
+ faultPoint('before_payment');
402
+ const seller = await (0, local_seller_js_1.startLocalSeller)();
403
+ const requestId = opts.requestId || defaultRequestId(opts.task, budget.taskBudget);
404
+ let trade;
405
+ try {
406
+ trade = await (0, trade_js_1.buyInfoAsTransaction)({
407
+ url: `${seller.url}/api/x402/info/${listing.itemId}`,
408
+ requestId,
409
+ buyerDid: opts.buyerDid || exports.M1_DEFAULTS.buyerDid,
410
+ privateKey: opts.walletKey,
411
+ allowLocalDev: opts.allowLocalDev ?? true,
412
+ maxPaymentAmount: String(budget.perPurchase),
413
+ taskBudget: String(budget.taskBudget),
414
+ network: listing.network,
415
+ expectItemId: listing.itemId,
416
+ service: 'x402-skill',
417
+ goalId: goal.goalId,
418
+ runId: run.runId,
419
+ home,
420
+ });
421
+ }
422
+ finally {
423
+ await seller.close();
424
+ }
425
+ faultPoint('after_payment');
426
+ const trust = trade?.record?.chainSettled === true ? 'verified' : 'self-attested';
427
+ const payment = {
428
+ mode: String(trade?.record?.paymentMode || 'none'),
429
+ amount: listing.amount,
430
+ currency: listing.currency,
431
+ network: listing.network,
432
+ txHash: trade?.record?.txHash,
433
+ chainSettled: trade?.record?.chainSettled === true,
434
+ trust,
435
+ reused: trade?.reused === true,
436
+ };
437
+ const paid = payment.mode !== 'none' && (payment.chainSettled || payment.mode === 'local-dev');
438
+ await (0, run_store_js_1.recordStep)(run.runId, {
439
+ tool: 'x402_buy',
440
+ ok: trade?.ok === true,
441
+ summary: `${payment.mode} · ${listing.amount} ${listing.currency} · 结算=${payment.chainSettled}`,
442
+ error: trade?.ok ? undefined : String(trade?.error || trade?.status || '').slice(0, 160),
443
+ });
444
+ // 内容没拿到 (复用的交易不带内容, 或交付阶段被打断) → 补交付, 不重付
445
+ let deliveredContent = String(trade?.envelope?.content ?? '');
446
+ let redelivered = false;
447
+ if (!deliveredContent && trade?.record?.paymentReceipt) {
448
+ const seller2 = await (0, local_seller_js_1.startLocalSeller)();
449
+ let ref;
450
+ try {
451
+ ref = await refetchDeliveredContent({ url: `${seller2.url}/api/x402/info/${listing.itemId}`, receipt: String(trade.record.paymentReceipt) });
452
+ }
453
+ finally {
454
+ await seller2.close();
455
+ }
456
+ if (ref.ok) {
457
+ deliveredContent = String(ref.content || '');
458
+ redelivered = true;
459
+ trade = { ...trade, ok: true };
460
+ mark('acquire', '已付款但没交付 → 用同一支付凭据补交付 (没有再付款)');
461
+ await (0, run_store_js_1.recordStep)(run.runId, { tool: 'x402_redeliver', ok: true, summary: '补交付成功 (同一凭据, 无第二笔付款)' });
462
+ }
463
+ else {
464
+ await (0, run_store_js_1.recordStep)(run.runId, { tool: 'x402_redeliver', ok: false, summary: ref.error });
465
+ }
466
+ }
467
+ if (!trade?.ok) {
468
+ // 失败映射 (M4): 付款事实不确定 → needs_human, 绝不自动重付
469
+ const rec = trade?.record;
470
+ if (rec) {
471
+ const r2 = await (0, goal_run_bridge_js_1.bridgeTransactionToRunGoal)(rec, { runId: run.runId, goalId: goal.goalId, executionOk: false, goalCriteriaHit: false, summary: `${chosen.name}@${chosen.version}` });
472
+ void r2;
473
+ }
474
+ const uncertain = String(trade?.status || '') === 'payment_required' && trade?.payment?.settlementUncertain === true;
475
+ return {
476
+ ...(await fail('report', `付款/交付失败: ${trade?.error || trade?.status} → 不执行, 不伪装成功`, {
477
+ task: opts.task, executed: false, paid, conclusion: '证据不足',
478
+ blocker: `${uncertain ? '付款状态不确定 (先对账, 不许重付): ' : '卡在购买这一步: '}${String(trade?.error || trade?.status)}`,
479
+ skill: { name: chosen.name, version: chosen.version },
480
+ cost: { amount: listing.amount, currency: listing.currency, network: listing.network },
481
+ lifecycle: String(trade?.status || ''), evidenceRef: { transactionId: trade?.transactionId },
482
+ }, uncertain ? 'needs_human' : 'failed')),
483
+ advisor: advisorBrief, payment,
484
+ };
485
+ }
486
+ // ⑦ 保真 + 安装
487
+ const content = deliveredContent;
488
+ const installDir = path.join(home, '.bolloon', 'tasks', run.runId, 'skills', chosen.name);
489
+ fs.mkdirSync(installDir, { recursive: true });
490
+ const installed = installBundle(content, installDir);
491
+ let fidelityScore = '未通过';
492
+ let fidelityIssues = [];
493
+ if (installed.ok) {
494
+ const fidelity = await (0, resource_contract_js_1.verifyInstallFidelity)({ content, rec: trade?.record, installDir });
495
+ fidelityScore = fidelity.ok ? '通过' : '未通过';
496
+ fidelityIssues = fidelity.issues || [];
497
+ }
498
+ else {
499
+ fidelityIssues = [installed.error || '安装失败'];
500
+ }
501
+ await (0, run_store_js_1.recordStep)(run.runId, { tool: 'resource_install', ok: fidelityScore === '通过', summary: `${installed.files} 个文件 → ${installDir}`, error: fidelityIssues[0] });
502
+ faultPoint('after_install');
503
+ // ⑧ 执行 (真跑技能代码) + 输出契约校验
504
+ mark('execute', `执行 ${chosen.name}`);
505
+ faultPoint('before_execute');
506
+ const loaded = await (0, resource_contract_js_1.loadResourceContract)(installDir);
507
+ const contract = loaded.ok && loaded.contract ? loaded.contract : chosen.contract;
508
+ const input = opts.input ?? deriveSkillInput(contract, opts.task);
509
+ const exec = await (0, resource_contract_js_1.executeContractSkill)({
510
+ contract,
511
+ skillDir: installDir,
512
+ input,
513
+ allowedTools: ['skill_exec', 'read_file'],
514
+ allowCodeExecution: true,
515
+ });
516
+ const outChk = (0, resource_contract_js_1.validateResourceOutput)(contract, exec.output);
517
+ const sources = extractSources(exec.output);
518
+ const concl = extractConclusion(exec.output);
519
+ await (0, run_store_js_1.recordStep)(run.runId, {
520
+ tool: 'skill_exec',
521
+ ok: exec.execution.ok === true && outChk.ok,
522
+ summary: `输出契约=${outChk.ok ? '通过' : '未通过'} · 来源 ${sources.length} 个`,
523
+ error: (outChk.issues || [])[0] || exec.execution.reason,
524
+ args: input,
525
+ });
526
+ faultPoint('after_execute'); // 执行事实已进 Run 轨迹后才允许被杀 (续跑据此判定"已执行过")
527
+ // ⑨ 统一的"资源结果" + 失败映射 + 证据桥
528
+ const executionOk = exec.execution.ok === true && outChk.ok;
529
+ const goalCriteriaHit = outChk.ok && sources.length > 0 && !!concl.conclusion;
530
+ const evidenceOk = fidelityScore === '通过' && executionOk && goalCriteriaHit;
531
+ let rec = (await (0, transaction_store_js_1.updateTransaction)(trade.transactionId, {
532
+ execution: { ...exec.execution, ok: exec.execution.ok === true, reason: exec.execution.reason },
533
+ verificationTrust: trust,
534
+ resourceOutcome: {
535
+ installed: fidelityScore === '通过',
536
+ executed: exec.execution.ok === true,
537
+ outputContract: outChk.ok ? 'pass' : 'fail',
538
+ criteriaHit: goalCriteriaHit,
539
+ failureStage: evidenceOk ? undefined : failureStageFor({ installOk: fidelityScore === '通过', producedOutput: exec.output !== undefined, contractOk: outChk.ok }),
540
+ },
541
+ event: { kind: 'resource_outcome', detail: `installed=${fidelityScore === '通过'} executed=${exec.execution.ok === true} contract=${outChk.ok ? 'pass' : 'fail'} criteria=${goalCriteriaHit}` },
542
+ }, home)) ?? trade.record;
543
+ if (paid && !evidenceOk) {
544
+ // M4 口径: 技能**产出了输出**但契约不过 → verification_failed; 压根没产出 (崩/超时/没装上) → delivery_failed
545
+ const producedOutput = exec.output !== undefined;
546
+ const target = mapFailureStatus({ producedOutput, contractOk: outChk.ok });
547
+ rec = (await (0, transaction_store_js_1.setTransactionStatus)(trade.transactionId, target, `资源未达标: install=${fidelityScore} exec=${exec.execution.ok === true} contract=${outChk.ok ? 'pass' : 'fail'}`, home)) ?? rec;
548
+ }
549
+ const bridge = await (0, goal_run_bridge_js_1.bridgeTransactionToRunGoal)(rec, {
550
+ runId: run.runId,
551
+ goalId: goal.goalId,
552
+ executionOk,
553
+ goalCriteriaHit,
554
+ summary: `${chosen.name}@${chosen.version}`,
555
+ });
556
+ await (0, goal_store_js_1.markCriterion)(goal.goalId, 0, outChk.ok, `输出契约 ${outChk.ok ? '通过' : '未通过'}`);
557
+ await (0, goal_store_js_1.markCriterion)(goal.goalId, 1, sources.length > 0, `来源 ${sources.length} 个`);
558
+ await (0, goal_store_js_1.markCriterion)(goal.goalId, 2, !!concl.conclusion, concl.conclusion || '无结论字段');
559
+ // ⑩ 报告卡
560
+ const card = (0, report_card_js_1.buildReportCard)({
561
+ task: opts.task,
562
+ conclusion: evidenceOk ? concl.conclusion || '已完成' : '证据不足',
563
+ conclusionDetail: evidenceOk ? undefined : (outChk.ok ? fidelityIssues[0] : (outChk.issues || [])[0]),
564
+ skill: { name: chosen.name, version: chosen.version, dir: installDir },
565
+ cost: { amount: listing.amount, currency: listing.currency, network: listing.network },
566
+ payment: { mode: payment.mode, chainSettled: payment.chainSettled, trust: payment.trust, txHash: payment.txHash },
567
+ sources,
568
+ outputContract: outChk.ok ? '通过' : '未通过',
569
+ resourceVerified: fidelityScore,
570
+ evidenceComplete: evidenceOk,
571
+ executed: exec.execution.ok === true,
572
+ paid,
573
+ stage: 'report',
574
+ durationMs: Date.now() - t0,
575
+ evidenceRef: { goalId: goal.goalId, runId: run.runId, transactionId: trade?.transactionId },
576
+ budgetLines: [...budget.why, ...impact],
577
+ blocker: evidenceOk ? undefined : (outChk.ok ? undefined : `输出不符合资源契约: ${(outChk.issues || [])[0] || '未知'}`),
578
+ });
579
+ await (0, run_store_js_1.finishRun)(run.runId, {
580
+ status: evidenceOk ? 'done' : 'needs_human',
581
+ summary: evidenceOk ? `任务完成: ${concl.conclusion || '已产出'}` : '未达标 (证据/契约不完整)',
582
+ evidence: [`bridge: step=${bridge.stepWritten} evidence=${bridge.evidenceWritten} goal=${bridge.goalEvidenceWritten}`],
583
+ });
584
+ if (evidenceOk)
585
+ await (0, goal_store_js_1.completeGoalIfEligible)(goal.goalId);
586
+ mark('report', card.status);
587
+ return {
588
+ ok: card.status === '已完成',
589
+ card,
590
+ text: (0, report_card_js_1.renderReportCard)(card),
591
+ goalId: goal.goalId,
592
+ runId: run.runId,
593
+ transactionId: trade?.transactionId,
594
+ stages,
595
+ budget,
596
+ advisor: advisorBrief,
597
+ payment,
598
+ execution: { ok: exec.execution.ok === true, reason: exec.execution.reason, output: exec.output },
599
+ outputIssues: [...(outChk.issues || []), ...fidelityIssues],
600
+ listingCreated,
601
+ };
602
+ }
603
+ /**
604
+ * 任务的恢复决策 —— **CLI 的 `task --resume` 与 Supervisor 都只能调这一个函数**。
605
+ * 它把交易层 `planTransactionRecovery` 的结论与 Goal/Run 的现状合起来, 给出唯一行动。
606
+ */
607
+ async function decideTaskRecovery(opts) {
608
+ const home = opts.home ?? os.homedir();
609
+ const goal = await (0, goal_store_js_1.readGoal)(opts.goalId);
610
+ if (!goal)
611
+ return { action: 'closed', reason: `找不到 Goal ${opts.goalId}`, mustNotRepay: true, alreadyExecuted: false };
612
+ const all = await (0, transaction_store_js_1.listTransactions)(home);
613
+ let txs = all.filter((t) => t.goalId === opts.goalId);
614
+ if (txs.length === 0) {
615
+ // 同 (任务+预算) 派生的 requestId 是幂等的: 目标可能是"复用已有交易"跑出来的,
616
+ // 那笔交易的 goalId 还是最早的 Goal → 按 requestId 找回它 (否则会误判成"没付过"而重复付款)。
617
+ const m = String((goal.constraints || []).join(' ')).match(/预算 ≤ ([0-9.]+)/);
618
+ const budget = m ? Number(m[1]) : 0.05;
619
+ const rid = defaultRequestId(goal.objective, budget);
620
+ txs = all.filter((t) => t.requestId === rid);
621
+ }
622
+ const latest = txs.sort((a, b) => String(b.startedAt).localeCompare(String(a.startedAt)))[0];
623
+ if (!latest) {
624
+ return { action: 'retry_payment', reason: '这个目标还没有过交易 → 从头跑 (没有钱可重复付)', mustNotRepay: false, alreadyExecuted: false };
625
+ }
626
+ const plan = (0, payment_recovery_js_1.planTransactionRecovery)(latest);
627
+ const alreadyExecuted = hasExecutionEvidence(latest) || await goalAlreadyExecuted(goal);
628
+ if (alreadyExecuted && plan.action !== 'complete') {
629
+ // 非幂等保护: 已经执行过就别再跑一遍, 只报告现状
630
+ return { action: 'already_executed', reason: `这笔交易的资源已经执行过 (${latest.status}), 不重复执行非幂等操作 — ${plan.reason}`, mustNotRepay: true, alreadyExecuted: true, transactionId: latest.transactionId };
631
+ }
632
+ return { action: plan.action, reason: plan.reason, mustNotRepay: !!plan.mustNotRepay, alreadyExecuted, transactionId: latest.transactionId };
633
+ }
634
+ /** 按 `decideTaskRecovery` 的结论接着做 (CLI 与 Supervisor 共用同一条路径) */
635
+ async function resumeTask(opts) {
636
+ const home = opts.home ?? os.homedir();
637
+ const goal = await (0, goal_store_js_1.readGoal)(opts.goalId);
638
+ if (!goal) {
639
+ const card = (0, report_card_js_1.buildReportCard)({ task: `(goal ${opts.goalId})`, executed: false, paid: false, conclusion: '证据不足', blocker: `找不到这个 Goal: ${opts.goalId}`, evidenceRef: { goalId: opts.goalId } });
640
+ return { ok: false, resumed: false, action: 'closed', reason: 'goal 不存在', mustNotRepay: false, card, text: (0, report_card_js_1.renderReportCard)(card), goalId: opts.goalId };
641
+ }
642
+ const decision = await decideTaskRecovery({ goalId: opts.goalId, home });
643
+ const base = { action: decision.action, reason: decision.reason, mustNotRepay: decision.mustNotRepay, goalId: opts.goalId, transactionId: decision.transactionId };
644
+ const rec = decision.transactionId ? (await (0, transaction_store_js_1.listTransactions)(home)).find((t) => t.transactionId === decision.transactionId) : undefined;
645
+ if (decision.action === 'complete') {
646
+ const card = (0, report_card_js_1.buildReportCard)({
647
+ task: goal.objective, conclusion: '已完成', executed: true, paid: true, lifecycle: rec?.status,
648
+ outputContract: '通过', resourceVerified: '通过', evidenceComplete: true,
649
+ payment: rec ? { mode: String(rec.paymentMode), chainSettled: rec.chainSettled === true, trust: String(rec.verificationTrust || '') } : undefined,
650
+ evidenceRef: { goalId: opts.goalId, transactionId: decision.transactionId },
651
+ });
652
+ return { ...base, ok: true, resumed: false, card, text: (0, report_card_js_1.renderReportCard)(card) };
653
+ }
654
+ // 可自动继续的三类: 没付过(retry_payment) / 已付未交付(deliver) / 已交付待执行验真(verify)
655
+ const continuable = ['retry_payment', 'deliver', 'verify'].includes(decision.action);
656
+ if (!continuable) {
657
+ const card = (0, report_card_js_1.buildReportCard)({
658
+ task: goal.objective, executed: decision.alreadyExecuted, paid: true, conclusion: '证据不足',
659
+ blocker: decision.alreadyExecuted
660
+ ? `资源已经执行过, 但这次结果不达标 (${decision.reason}) → 需要你处理, 我没有重复执行也没有再花钱`
661
+ : `这笔交易不能自动继续 (${decision.reason}) → 需要你处理, 我没有再花钱`,
662
+ lifecycle: rec?.status, evidenceRef: { goalId: opts.goalId, transactionId: decision.transactionId },
663
+ });
664
+ return { ...base, ok: false, resumed: false, card, text: (0, report_card_js_1.renderReportCard)(card) };
665
+ }
666
+ // retry_payment / deliver / verify → 走同一条闭环 (requestId 派生确定 ⇒ 不会重复扣款)
667
+ const r = await runTask({ task: goal.objective, home, cwd: opts.cwd, skillPaths: opts.skillPaths, input: opts.input, allowLocalDev: opts.allowLocalDev, walletKey: opts.walletKey, reuseGoalId: opts.goalId, onStage: opts.onStage });
668
+ return { ...base, ok: r.ok, resumed: true, card: r.card, text: r.text, runId: r.runId, transactionId: r.transactionId || decision.transactionId };
669
+ }
670
+ //# sourceMappingURL=task-runner.js.map