@bolloon/bolloon-agent 0.4.28 → 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 (435) hide show
  1. package/bin/bolloon.cjs +18 -148
  2. package/bin/bolloon.cmd +6 -3
  3. package/dist/agents/pi-sdk-tools.js +3 -1
  4. package/dist/agents/pi-sdk.js +4 -1
  5. package/dist/cli/update-commands.js +349 -0
  6. package/dist/cli-entry.js +41 -55
  7. package/dist/electron-build/agents/agent-gateway.js +169 -0
  8. package/dist/electron-build/agents/agent-gateway.js.map +1 -0
  9. package/dist/electron-build/agents/agent-identity-store.js +212 -0
  10. package/dist/electron-build/agents/agent-identity-store.js.map +1 -0
  11. package/dist/electron-build/agents/agent-identity.js +196 -0
  12. package/dist/electron-build/agents/agent-identity.js.map +1 -0
  13. package/dist/electron-build/agents/agent-manifest-protocol.js +151 -0
  14. package/dist/electron-build/agents/agent-manifest-protocol.js.map +1 -0
  15. package/dist/electron-build/agents/agent-registry.js +217 -0
  16. package/dist/electron-build/agents/agent-registry.js.map +1 -0
  17. package/dist/electron-build/agents/agent-reputation.js +60 -0
  18. package/dist/electron-build/agents/agent-reputation.js.map +1 -0
  19. package/dist/electron-build/agents/agent-service-client.js +186 -0
  20. package/dist/electron-build/agents/agent-service-client.js.map +1 -0
  21. package/dist/electron-build/agents/browser-cdp.js +765 -0
  22. package/dist/electron-build/agents/browser-cdp.js.map +1 -0
  23. package/dist/electron-build/agents/computer-use.js +341 -0
  24. package/dist/electron-build/agents/computer-use.js.map +1 -0
  25. package/dist/electron-build/agents/constraint-layer.js +210 -0
  26. package/dist/electron-build/agents/constraint-layer.js.map +1 -0
  27. package/dist/electron-build/agents/decision-store.js +292 -0
  28. package/dist/electron-build/agents/decision-store.js.map +1 -0
  29. package/dist/electron-build/agents/deny-pipeline.js +125 -0
  30. package/dist/electron-build/agents/deny-pipeline.js.map +1 -0
  31. package/dist/electron-build/agents/economic-policy.js +172 -0
  32. package/dist/electron-build/agents/economic-policy.js.map +1 -0
  33. package/dist/electron-build/agents/error-classifier.js +125 -0
  34. package/dist/electron-build/agents/error-classifier.js.map +1 -0
  35. package/dist/electron-build/agents/execution-supervisor.js +539 -0
  36. package/dist/electron-build/agents/execution-supervisor.js.map +1 -0
  37. package/dist/electron-build/agents/external-events.js +171 -0
  38. package/dist/electron-build/agents/external-events.js.map +1 -0
  39. package/dist/electron-build/agents/gateway-join.js +315 -0
  40. package/dist/electron-build/agents/gateway-join.js.map +1 -0
  41. package/dist/electron-build/agents/gateway-network.js +505 -0
  42. package/dist/electron-build/agents/gateway-network.js.map +1 -0
  43. package/dist/electron-build/agents/goal-criteria.js +133 -0
  44. package/dist/electron-build/agents/goal-criteria.js.map +1 -0
  45. package/dist/electron-build/agents/goal-resume.js +364 -0
  46. package/dist/electron-build/agents/goal-resume.js.map +1 -0
  47. package/dist/electron-build/agents/goal-store.js +587 -0
  48. package/dist/electron-build/agents/goal-store.js.map +1 -0
  49. package/dist/electron-build/agents/intent-classifier.js +104 -0
  50. package/dist/electron-build/agents/intent-classifier.js.map +1 -0
  51. package/dist/electron-build/agents/iroh-secret.js +70 -0
  52. package/dist/electron-build/agents/iroh-secret.js.map +1 -0
  53. package/dist/electron-build/agents/loop-review.js +101 -0
  54. package/dist/electron-build/agents/loop-review.js.map +1 -0
  55. package/dist/electron-build/agents/memory-recall.js +154 -0
  56. package/dist/electron-build/agents/memory-recall.js.map +1 -0
  57. package/dist/electron-build/agents/p2p-document-tools.js +328 -0
  58. package/dist/electron-build/agents/p2p-document-tools.js.map +1 -0
  59. package/dist/electron-build/agents/parse-tool-call.js +564 -0
  60. package/dist/electron-build/agents/parse-tool-call.js.map +1 -0
  61. package/dist/electron-build/agents/patch-tool.js +205 -0
  62. package/dist/electron-build/agents/patch-tool.js.map +1 -0
  63. package/dist/electron-build/agents/payment-approval.js +183 -0
  64. package/dist/electron-build/agents/payment-approval.js.map +1 -0
  65. package/dist/electron-build/agents/payment-gate.js +139 -0
  66. package/dist/electron-build/agents/payment-gate.js.map +1 -0
  67. package/dist/electron-build/agents/permission-mode.js +124 -0
  68. package/dist/electron-build/agents/permission-mode.js.map +1 -0
  69. package/dist/electron-build/agents/pi-harness.js +268 -0
  70. package/dist/electron-build/agents/pi-harness.js.map +1 -0
  71. package/dist/electron-build/agents/pi-sdk-session-factory.js +117 -0
  72. package/dist/electron-build/agents/pi-sdk-session-factory.js.map +1 -0
  73. package/dist/electron-build/agents/pi-sdk-session-manager.js +335 -0
  74. package/dist/electron-build/agents/pi-sdk-session-manager.js.map +1 -0
  75. package/dist/electron-build/agents/pi-sdk-tools.js +4042 -0
  76. package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -0
  77. package/dist/electron-build/agents/pi-sdk-types.js +17 -0
  78. package/dist/electron-build/agents/pi-sdk-types.js.map +1 -0
  79. package/dist/electron-build/agents/pi-sdk.js +3325 -0
  80. package/dist/electron-build/agents/pi-sdk.js.map +1 -0
  81. package/dist/electron-build/agents/plan-store.js +212 -0
  82. package/dist/electron-build/agents/plan-store.js.map +1 -0
  83. package/dist/electron-build/agents/pre-tool-validator.js +200 -0
  84. package/dist/electron-build/agents/pre-tool-validator.js.map +1 -0
  85. package/dist/electron-build/agents/process-runner.js +148 -0
  86. package/dist/electron-build/agents/process-runner.js.map +1 -0
  87. package/dist/electron-build/agents/react-loop.js +131 -0
  88. package/dist/electron-build/agents/react-loop.js.map +1 -0
  89. package/dist/electron-build/agents/resource-store.js +180 -0
  90. package/dist/electron-build/agents/resource-store.js.map +1 -0
  91. package/dist/electron-build/agents/resource-token.js +118 -0
  92. package/dist/electron-build/agents/resource-token.js.map +1 -0
  93. package/dist/electron-build/agents/resource-wallet.js +84 -0
  94. package/dist/electron-build/agents/resource-wallet.js.map +1 -0
  95. package/dist/electron-build/agents/run-store.js +854 -0
  96. package/dist/electron-build/agents/run-store.js.map +1 -0
  97. package/dist/electron-build/agents/runner-resolver.js +267 -0
  98. package/dist/electron-build/agents/runner-resolver.js.map +1 -0
  99. package/dist/electron-build/agents/session-store.js +294 -0
  100. package/dist/electron-build/agents/session-store.js.map +1 -0
  101. package/dist/electron-build/agents/shell-guard.js +465 -0
  102. package/dist/electron-build/agents/shell-guard.js.map +1 -0
  103. package/dist/electron-build/agents/shell-tool.js +102 -0
  104. package/dist/electron-build/agents/shell-tool.js.map +1 -0
  105. package/dist/electron-build/agents/skill-loader.js +216 -0
  106. package/dist/electron-build/agents/skill-loader.js.map +1 -0
  107. package/dist/electron-build/agents/skill-readiness.js +174 -0
  108. package/dist/electron-build/agents/skill-readiness.js.map +1 -0
  109. package/dist/electron-build/agents/skill-share.js +394 -0
  110. package/dist/electron-build/agents/skill-share.js.map +1 -0
  111. package/dist/electron-build/agents/skill-supervisor-link.js +75 -0
  112. package/dist/electron-build/agents/skill-supervisor-link.js.map +1 -0
  113. package/dist/electron-build/agents/skill-writer.js +347 -0
  114. package/dist/electron-build/agents/skill-writer.js.map +1 -0
  115. package/dist/electron-build/agents/skills-manager.js +763 -0
  116. package/dist/electron-build/agents/skills-manager.js.map +1 -0
  117. package/dist/electron-build/agents/supervisor-host.js +294 -0
  118. package/dist/electron-build/agents/supervisor-host.js.map +1 -0
  119. package/dist/electron-build/agents/task/local-seller.js +188 -0
  120. package/dist/electron-build/agents/task/local-seller.js.map +1 -0
  121. package/dist/electron-build/agents/task/report-card.js +152 -0
  122. package/dist/electron-build/agents/task/report-card.js.map +1 -0
  123. package/dist/electron-build/agents/task/resource-advisor.js +222 -0
  124. package/dist/electron-build/agents/task/resource-advisor.js.map +1 -0
  125. package/dist/electron-build/agents/task/task-budget.js +111 -0
  126. package/dist/electron-build/agents/task/task-budget.js.map +1 -0
  127. package/dist/electron-build/agents/task/task-runner.js +670 -0
  128. package/dist/electron-build/agents/task/task-runner.js.map +1 -0
  129. package/dist/electron-build/agents/task-state.js +266 -0
  130. package/dist/electron-build/agents/task-state.js.map +1 -0
  131. package/dist/electron-build/agents/tool-registry.js +141 -0
  132. package/dist/electron-build/agents/tool-registry.js.map +1 -0
  133. package/dist/electron-build/agents/treasury-bridge.js +165 -0
  134. package/dist/electron-build/agents/treasury-bridge.js.map +1 -0
  135. package/dist/electron-build/agents/user-questions.js +223 -0
  136. package/dist/electron-build/agents/user-questions.js.map +1 -0
  137. package/dist/electron-build/agents/verify-recipe.js +90 -0
  138. package/dist/electron-build/agents/verify-recipe.js.map +1 -0
  139. package/dist/electron-build/agents/workflow-engine.js +222 -0
  140. package/dist/electron-build/agents/workflow-engine.js.map +1 -0
  141. package/dist/electron-build/agents/workflow-pivot-loop.js +988 -0
  142. package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -0
  143. package/dist/electron-build/agents/write-staging.js +133 -0
  144. package/dist/electron-build/agents/write-staging.js.map +1 -0
  145. package/dist/electron-build/agents/x402/goal-run-bridge.js +115 -0
  146. package/dist/electron-build/agents/x402/goal-run-bridge.js.map +1 -0
  147. package/dist/electron-build/agents/x402/milestone-settlement.js +163 -0
  148. package/dist/electron-build/agents/x402/milestone-settlement.js.map +1 -0
  149. package/dist/electron-build/agents/x402/paid-info-protocol.js +274 -0
  150. package/dist/electron-build/agents/x402/paid-info-protocol.js.map +1 -0
  151. package/dist/electron-build/agents/x402/paid-info-store.js +409 -0
  152. package/dist/electron-build/agents/x402/paid-info-store.js.map +1 -0
  153. package/dist/electron-build/agents/x402/paid-info-tools.js +346 -0
  154. package/dist/electron-build/agents/x402/paid-info-tools.js.map +1 -0
  155. package/dist/electron-build/agents/x402/payment-recovery.js +330 -0
  156. package/dist/electron-build/agents/x402/payment-recovery.js.map +1 -0
  157. package/dist/electron-build/agents/x402/resource-contract.js +533 -0
  158. package/dist/electron-build/agents/x402/resource-contract.js.map +1 -0
  159. package/dist/electron-build/agents/x402/settlement-state.js +432 -0
  160. package/dist/electron-build/agents/x402/settlement-state.js.map +1 -0
  161. package/dist/electron-build/agents/x402/trade.js +294 -0
  162. package/dist/electron-build/agents/x402/trade.js.map +1 -0
  163. package/dist/electron-build/agents/x402/transaction-protocol.js +109 -0
  164. package/dist/electron-build/agents/x402/transaction-protocol.js.map +1 -0
  165. package/dist/electron-build/agents/x402/transaction-store.js +404 -0
  166. package/dist/electron-build/agents/x402/transaction-store.js.map +1 -0
  167. package/dist/electron-build/agents/x402/x402Pay.js +377 -0
  168. package/dist/electron-build/agents/x402/x402Pay.js.map +1 -0
  169. package/dist/electron-build/bollharness-integration/context-router-judgment.js +269 -0
  170. package/dist/electron-build/bollharness-integration/context-router-judgment.js.map +1 -0
  171. package/dist/electron-build/bollharness-integration/context-router.js +584 -0
  172. package/dist/electron-build/bollharness-integration/context-router.js.map +1 -0
  173. package/dist/electron-build/bollharness-integration/gate-state-machine.js +362 -0
  174. package/dist/electron-build/bollharness-integration/gate-state-machine.js.map +1 -0
  175. package/dist/electron-build/bollharness-integration/gate-transition-hooks.js +136 -0
  176. package/dist/electron-build/bollharness-integration/gate-transition-hooks.js.map +1 -0
  177. package/dist/electron-build/bollharness-integration/guard-checker.js +400 -0
  178. package/dist/electron-build/bollharness-integration/guard-checker.js.map +1 -0
  179. package/dist/electron-build/bollharness-integration/index.js +123 -0
  180. package/dist/electron-build/bollharness-integration/index.js.map +1 -0
  181. package/dist/electron-build/bollharness-integration/integration.js +531 -0
  182. package/dist/electron-build/bollharness-integration/integration.js.map +1 -0
  183. package/dist/electron-build/bollharness-integration/skill-adapter.js +608 -0
  184. package/dist/electron-build/bollharness-integration/skill-adapter.js.map +1 -0
  185. package/dist/electron-build/bootstrap/bootstrap.js +173 -0
  186. package/dist/electron-build/bootstrap/bootstrap.js.map +1 -0
  187. package/dist/electron-build/bootstrap/context-collector.js +358 -0
  188. package/dist/electron-build/bootstrap/context-collector.js.map +1 -0
  189. package/dist/electron-build/bootstrap/context-hierarchy.js +262 -0
  190. package/dist/electron-build/bootstrap/context-hierarchy.js.map +1 -0
  191. package/dist/electron-build/bootstrap/context-manager.js +211 -0
  192. package/dist/electron-build/bootstrap/context-manager.js.map +1 -0
  193. package/dist/electron-build/bootstrap/context-os.js +277 -0
  194. package/dist/electron-build/bootstrap/context-os.js.map +1 -0
  195. package/dist/electron-build/bootstrap/event-log.js +203 -0
  196. package/dist/electron-build/bootstrap/event-log.js.map +1 -0
  197. package/dist/electron-build/bootstrap/exhaust-scrubber.js +277 -0
  198. package/dist/electron-build/bootstrap/exhaust-scrubber.js.map +1 -0
  199. package/dist/electron-build/bootstrap/lifecycle-hooks.js +282 -0
  200. package/dist/electron-build/bootstrap/lifecycle-hooks.js.map +1 -0
  201. package/dist/electron-build/bootstrap/memory-compressor.js +377 -0
  202. package/dist/electron-build/bootstrap/memory-compressor.js.map +1 -0
  203. package/dist/electron-build/bootstrap/persona-loader.js +219 -0
  204. package/dist/electron-build/bootstrap/persona-loader.js.map +1 -0
  205. package/dist/electron-build/bootstrap/project-context.js +162 -0
  206. package/dist/electron-build/bootstrap/project-context.js.map +1 -0
  207. package/dist/electron-build/bootstrap/project-state.js +205 -0
  208. package/dist/electron-build/bootstrap/project-state.js.map +1 -0
  209. package/dist/electron-build/bootstrap/session-window.js +162 -0
  210. package/dist/electron-build/bootstrap/session-window.js.map +1 -0
  211. package/dist/electron-build/bootstrap/vector-index.js +291 -0
  212. package/dist/electron-build/bootstrap/vector-index.js.map +1 -0
  213. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +22 -0
  214. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js.map +1 -0
  215. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/clobShared.js +86 -0
  216. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/clobShared.js.map +1 -0
  217. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +37 -0
  218. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/createOrder.js.map +1 -0
  219. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +20 -0
  220. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getMarket.js.map +1 -0
  221. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +29 -0
  222. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getOrders.js.map +1 -0
  223. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +28 -0
  224. package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js.map +1 -0
  225. package/dist/electron-build/constraint-runtime/src/tools/SafeSDK/deploySafe.js +10 -0
  226. package/dist/electron-build/constraint-runtime/src/tools/SafeSDK/deploySafe.js.map +1 -0
  227. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/autoPay.js +68 -0
  228. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/autoPay.js.map +1 -0
  229. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/createWallet.js +14 -0
  230. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/createWallet.js.map +1 -0
  231. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/getBalance.js +17 -0
  232. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/getBalance.js.map +1 -0
  233. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/importWallet.js +59 -0
  234. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/importWallet.js.map +1 -0
  235. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/sendTransaction.js +29 -0
  236. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/sendTransaction.js.map +1 -0
  237. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/signMessage.js +14 -0
  238. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/signMessage.js.map +1 -0
  239. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/transferToken.js +29 -0
  240. package/dist/electron-build/constraint-runtime/src/tools/WalletTools/transferToken.js.map +1 -0
  241. package/dist/electron-build/constraints/index.js +11 -0
  242. package/dist/electron-build/constraints/index.js.map +1 -0
  243. package/dist/electron-build/context-compaction/auto-compact.js +182 -0
  244. package/dist/electron-build/context-compaction/auto-compact.js.map +1 -0
  245. package/dist/electron-build/context-compaction/budget-gate.js +32 -0
  246. package/dist/electron-build/context-compaction/budget-gate.js.map +1 -0
  247. package/dist/electron-build/context-compaction/budget-reduce.js +39 -0
  248. package/dist/electron-build/context-compaction/budget-reduce.js.map +1 -0
  249. package/dist/electron-build/context-compaction/context-collapse.js +71 -0
  250. package/dist/electron-build/context-compaction/context-collapse.js.map +1 -0
  251. package/dist/electron-build/context-compaction/index.js +38 -0
  252. package/dist/electron-build/context-compaction/index.js.map +1 -0
  253. package/dist/electron-build/context-compaction/microcompact.js +55 -0
  254. package/dist/electron-build/context-compaction/microcompact.js.map +1 -0
  255. package/dist/electron-build/context-compaction/pipeline.js +128 -0
  256. package/dist/electron-build/context-compaction/pipeline.js.map +1 -0
  257. package/dist/electron-build/context-compaction/snip.js +50 -0
  258. package/dist/electron-build/context-compaction/snip.js.map +1 -0
  259. package/dist/electron-build/context-compaction/token-estimator.js +40 -0
  260. package/dist/electron-build/context-compaction/token-estimator.js.map +1 -0
  261. package/dist/electron-build/context-compaction/types.js +21 -0
  262. package/dist/electron-build/context-compaction/types.js.map +1 -0
  263. package/dist/electron-build/cron/tick-lock.js +247 -0
  264. package/dist/electron-build/cron/tick-lock.js.map +1 -0
  265. package/dist/electron-build/documents/reader.js +131 -0
  266. package/dist/electron-build/documents/reader.js.map +1 -0
  267. package/dist/electron-build/documents/store.js +220 -0
  268. package/dist/electron-build/documents/store.js.map +1 -0
  269. package/dist/electron-build/external-engines/delegate-handle.js +76 -0
  270. package/dist/electron-build/external-engines/delegate-handle.js.map +1 -0
  271. package/dist/electron-build/external-engines/delegate.js +225 -0
  272. package/dist/electron-build/external-engines/delegate.js.map +1 -0
  273. package/dist/electron-build/external-engines/discovery.js +448 -0
  274. package/dist/electron-build/external-engines/discovery.js.map +1 -0
  275. package/dist/electron-build/external-engines/types.js +13 -0
  276. package/dist/electron-build/external-engines/types.js.map +1 -0
  277. package/dist/electron-build/hooks/hooks-engine.js +367 -0
  278. package/dist/electron-build/hooks/hooks-engine.js.map +1 -0
  279. package/dist/electron-build/judgeness/reflect.js +100 -0
  280. package/dist/electron-build/judgeness/reflect.js.map +1 -0
  281. package/dist/electron-build/judgeness/store.js +536 -0
  282. package/dist/electron-build/judgeness/store.js.map +1 -0
  283. package/dist/electron-build/judgeness/types.js +21 -0
  284. package/dist/electron-build/judgeness/types.js.map +1 -0
  285. package/dist/electron-build/llm/config-store.js +551 -0
  286. package/dist/electron-build/llm/config-store.js.map +1 -0
  287. package/dist/electron-build/llm/error-lessons.js +76 -0
  288. package/dist/electron-build/llm/error-lessons.js.map +1 -0
  289. package/dist/electron-build/llm/pi-ai.js +830 -0
  290. package/dist/electron-build/llm/pi-ai.js.map +1 -0
  291. package/dist/electron-build/llm/system-prompt/registry.js +318 -0
  292. package/dist/electron-build/llm/system-prompt/registry.js.map +1 -0
  293. package/dist/electron-build/llm/system-prompt/strip-hibsml.js +55 -0
  294. package/dist/electron-build/llm/system-prompt/strip-hibsml.js.map +1 -0
  295. package/dist/electron-build/locales/en.js +32 -0
  296. package/dist/electron-build/locales/en.js.map +1 -0
  297. package/dist/electron-build/locales/zh.js +30 -0
  298. package/dist/electron-build/locales/zh.js.map +1 -0
  299. package/dist/electron-build/lsp/lsp-manager.js +327 -0
  300. package/dist/electron-build/lsp/lsp-manager.js.map +1 -0
  301. package/dist/electron-build/lsp/lsp-tools.js +226 -0
  302. package/dist/electron-build/lsp/lsp-tools.js.map +1 -0
  303. package/dist/electron-build/migration/external-agent-migrator.js +451 -0
  304. package/dist/electron-build/migration/external-agent-migrator.js.map +1 -0
  305. package/dist/electron-build/network/agent-network.js +775 -0
  306. package/dist/electron-build/network/agent-network.js.map +1 -0
  307. package/dist/electron-build/network/goal-event-bridge.js +62 -0
  308. package/dist/electron-build/network/goal-event-bridge.js.map +1 -0
  309. package/dist/electron-build/network/iroh-integration.js +117 -0
  310. package/dist/electron-build/network/iroh-integration.js.map +1 -0
  311. package/dist/electron-build/network/iroh-transport.js +550 -0
  312. package/dist/electron-build/network/iroh-transport.js.map +1 -0
  313. package/dist/electron-build/network/p2p.js +1103 -0
  314. package/dist/electron-build/network/p2p.js.map +1 -0
  315. package/dist/electron-build/network/storage/adapters/json-adapter.js +416 -0
  316. package/dist/electron-build/network/storage/adapters/json-adapter.js.map +1 -0
  317. package/dist/electron-build/network/storage/types.js +18 -0
  318. package/dist/electron-build/network/storage/types.js.map +1 -0
  319. package/dist/electron-build/orbitdb/agent-tools.js +402 -0
  320. package/dist/electron-build/orbitdb/agent-tools.js.map +1 -0
  321. package/dist/electron-build/orbitdb/cid-database.js +284 -0
  322. package/dist/electron-build/orbitdb/cid-database.js.map +1 -0
  323. package/dist/electron-build/orbitdb/context-store.js +99 -0
  324. package/dist/electron-build/orbitdb/context-store.js.map +1 -0
  325. package/dist/electron-build/orbitdb/ipfs-node.js +120 -0
  326. package/dist/electron-build/orbitdb/ipfs-node.js.map +1 -0
  327. package/dist/electron-build/orbitdb/kanban-store.js +299 -0
  328. package/dist/electron-build/orbitdb/kanban-store.js.map +1 -0
  329. package/dist/electron-build/orbitdb/task-store.js +155 -0
  330. package/dist/electron-build/orbitdb/task-store.js.map +1 -0
  331. package/dist/electron-build/orbitdb/trajectory-store.js +194 -0
  332. package/dist/electron-build/orbitdb/trajectory-store.js.map +1 -0
  333. package/dist/electron-build/orbitdb/ui-cid.js +77 -0
  334. package/dist/electron-build/orbitdb/ui-cid.js.map +1 -0
  335. package/dist/electron-build/pi-ecosystem-a2ui/index.js +89 -0
  336. package/dist/electron-build/pi-ecosystem-a2ui/index.js.map +1 -0
  337. package/dist/electron-build/pi-ecosystem-goals/index.js +512 -0
  338. package/dist/electron-build/pi-ecosystem-goals/index.js.map +1 -0
  339. package/dist/electron-build/pi-ecosystem-judgment/adaptive-scan.js +325 -0
  340. package/dist/electron-build/pi-ecosystem-judgment/adaptive-scan.js.map +1 -0
  341. package/dist/electron-build/pi-ecosystem-judgment/causal-judge.js +492 -0
  342. package/dist/electron-build/pi-ecosystem-judgment/causal-judge.js.map +1 -0
  343. package/dist/electron-build/pi-ecosystem-judgment/cleanup.js +167 -0
  344. package/dist/electron-build/pi-ecosystem-judgment/cleanup.js.map +1 -0
  345. package/dist/electron-build/pi-ecosystem-judgment/decision.js +321 -0
  346. package/dist/electron-build/pi-ecosystem-judgment/decision.js.map +1 -0
  347. package/dist/electron-build/pi-ecosystem-judgment/detect-hook.js +175 -0
  348. package/dist/electron-build/pi-ecosystem-judgment/detect-hook.js.map +1 -0
  349. package/dist/electron-build/pi-ecosystem-judgment/distill-prompt.js +232 -0
  350. package/dist/electron-build/pi-ecosystem-judgment/distill-prompt.js.map +1 -0
  351. package/dist/electron-build/pi-ecosystem-judgment/distillation.js +304 -0
  352. package/dist/electron-build/pi-ecosystem-judgment/distillation.js.map +1 -0
  353. package/dist/electron-build/pi-ecosystem-judgment/evolve-judgment.js +176 -0
  354. package/dist/electron-build/pi-ecosystem-judgment/evolve-judgment.js.map +1 -0
  355. package/dist/electron-build/pi-ecosystem-judgment/human-value-pipeline.js +65 -0
  356. package/dist/electron-build/pi-ecosystem-judgment/human-value-pipeline.js.map +1 -0
  357. package/dist/electron-build/pi-ecosystem-judgment/human-value-store.js +808 -0
  358. package/dist/electron-build/pi-ecosystem-judgment/human-value-store.js.map +1 -0
  359. package/dist/electron-build/pi-ecosystem-judgment/index.js +508 -0
  360. package/dist/electron-build/pi-ecosystem-judgment/index.js.map +1 -0
  361. package/dist/electron-build/pi-ecosystem-judgment/injection-gate.js +334 -0
  362. package/dist/electron-build/pi-ecosystem-judgment/injection-gate.js.map +1 -0
  363. package/dist/electron-build/pi-ecosystem-judgment/monitor-gate.js +228 -0
  364. package/dist/electron-build/pi-ecosystem-judgment/monitor-gate.js.map +1 -0
  365. package/dist/electron-build/pi-ecosystem-judgment/value-injection.js +598 -0
  366. package/dist/electron-build/pi-ecosystem-judgment/value-injection.js.map +1 -0
  367. package/dist/electron-build/pi-ecosystem-mcp/index.js +643 -0
  368. package/dist/electron-build/pi-ecosystem-mcp/index.js.map +1 -0
  369. package/dist/electron-build/pi-ecosystem-mcp/ui-tools.js +116 -0
  370. package/dist/electron-build/pi-ecosystem-mcp/ui-tools.js.map +1 -0
  371. package/dist/electron-build/pi-ecosystem-subagents/index.js +352 -0
  372. package/dist/electron-build/pi-ecosystem-subagents/index.js.map +1 -0
  373. package/dist/electron-build/security/builtin-guards.js +133 -0
  374. package/dist/electron-build/security/builtin-guards.js.map +1 -0
  375. package/dist/electron-build/security/context-router-tool.js +111 -0
  376. package/dist/electron-build/security/context-router-tool.js.map +1 -0
  377. package/dist/electron-build/security/input-scanner.js +263 -0
  378. package/dist/electron-build/security/input-scanner.js.map +1 -0
  379. package/dist/electron-build/security/react-harness.js +148 -0
  380. package/dist/electron-build/security/react-harness.js.map +1 -0
  381. package/dist/electron-build/security/tool-gate.js +287 -0
  382. package/dist/electron-build/security/tool-gate.js.map +1 -0
  383. package/dist/electron-build/setup/setup-store.js +648 -0
  384. package/dist/electron-build/setup/setup-store.js.map +1 -0
  385. package/dist/electron-build/social/channels/ChannelManager.js +444 -0
  386. package/dist/electron-build/social/channels/ChannelManager.js.map +1 -0
  387. package/dist/electron-build/social/channels/DiapChannelBridge.js +451 -0
  388. package/dist/electron-build/social/channels/DiapChannelBridge.js.map +1 -0
  389. package/dist/electron-build/social/channels/InterestMatcher.js +135 -0
  390. package/dist/electron-build/social/channels/InterestMatcher.js.map +1 -0
  391. package/dist/electron-build/social/channels/types.js +21 -0
  392. package/dist/electron-build/social/channels/types.js.map +1 -0
  393. package/dist/electron-build/social/global-shared-context.js +368 -0
  394. package/dist/electron-build/social/global-shared-context.js.map +1 -0
  395. package/dist/electron-build/social/heartbeat.js +882 -0
  396. package/dist/electron-build/social/heartbeat.js.map +1 -0
  397. package/dist/electron-build/storage/did-catalog-bridge.js +314 -0
  398. package/dist/electron-build/storage/did-catalog-bridge.js.map +1 -0
  399. package/dist/electron-build/storage/did-catalog.js +272 -0
  400. package/dist/electron-build/storage/did-catalog.js.map +1 -0
  401. package/dist/electron-build/utils/auto-update.js +140 -558
  402. package/dist/electron-build/utils/auto-update.js.map +1 -1
  403. package/dist/electron-build/utils/module-context.js +98 -0
  404. package/dist/electron-build/utils/module-context.js.map +1 -0
  405. package/dist/electron-build/utils/runtime-bootstrap.js +745 -0
  406. package/dist/electron-build/utils/runtime-bootstrap.js.map +1 -0
  407. package/dist/electron-build/utils/update-manager.js +770 -0
  408. package/dist/electron-build/utils/update-manager.js.map +1 -0
  409. package/dist/electron-build/utils/update-state.js +406 -0
  410. package/dist/electron-build/utils/update-state.js.map +1 -0
  411. package/dist/electron-build/utils/version-info.js +562 -0
  412. package/dist/electron-build/utils/version-info.js.map +1 -0
  413. package/dist/electron-build/web/i18n.js +146 -0
  414. package/dist/electron-build/web/i18n.js.map +1 -0
  415. package/dist/electron-build/web/routes-x402-info.js +232 -0
  416. package/dist/electron-build/web/routes-x402-info.js.map +1 -0
  417. package/dist/electron-build/web/server-storage.js +390 -0
  418. package/dist/electron-build/web/server-storage.js.map +1 -0
  419. package/dist/electron-build/web/server-types.js +52 -0
  420. package/dist/electron-build/web/server-types.js.map +1 -0
  421. package/dist/electron-build/web/task-deps.js +41 -0
  422. package/dist/electron-build/web/task-deps.js.map +1 -0
  423. package/dist/index.js +28 -27
  424. package/dist/llm/system-prompt/registry.js +6 -3
  425. package/dist/utils/auto-update.js +138 -525
  426. package/dist/utils/module-context.js +59 -0
  427. package/dist/utils/runtime-bootstrap.js +682 -0
  428. package/dist/utils/update-cli.js +82 -0
  429. package/dist/utils/update-health.js +401 -0
  430. package/dist/utils/update-manager.js +716 -0
  431. package/dist/utils/update-state.js +353 -0
  432. package/dist/utils/version-info.js +510 -0
  433. package/package.json +1 -1
  434. package/scripts/build-cli.js +32 -151
  435. package/scripts/postinstall.js +153 -76
@@ -0,0 +1,390 @@
1
+ "use strict";
2
+ /**
3
+ * server-storage.ts — server.ts 拆出的持久化层
4
+ *
5
+ * 包含:
6
+ * - loadChannels / saveChannels + 去重 + 写盘保护
7
+ * - loadSession / saveSession + 50MB 内存保护
8
+ * - loadTheme / saveTheme
9
+ * - 任务队列 (loadTaskQueue / saveTaskQueue / executeTask)
10
+ *
11
+ * 从 src/web/server.ts 抽出 (2026-07-06).
12
+ * Channel / Session / Task / SessionMessage / SessionSummary type 来自 ./server-types.ts.
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.getLastChannelsWriteAt = getLastChannelsWriteAt;
49
+ exports.updateChannels = updateChannels;
50
+ exports.loadChannels = loadChannels;
51
+ exports.saveChannels = saveChannels;
52
+ exports.loadSession = loadSession;
53
+ exports.saveSession = saveSession;
54
+ exports.loadTheme = loadTheme;
55
+ exports.saveTheme = saveTheme;
56
+ exports.isTaskExecuting = isTaskExecuting;
57
+ exports.getExecutingTaskId = getExecutingTaskId;
58
+ exports.markTaskOrbitReady = markTaskOrbitReady;
59
+ exports.disableTaskOrbitStore = disableTaskOrbitStore;
60
+ exports.loadTaskQueue = loadTaskQueue;
61
+ exports.saveTaskQueue = saveTaskQueue;
62
+ exports.claimTtlSeconds = claimTtlSeconds;
63
+ exports.claimTaskForExecution = claimTaskForExecution;
64
+ exports.claimNextPendingTask = claimNextPendingTask;
65
+ exports.heartbeatTaskExecution = heartbeatTaskExecution;
66
+ exports.releaseStaleClaims = releaseStaleClaims;
67
+ exports.startTaskExecution = startTaskExecution;
68
+ exports.endTaskExecution = endTaskExecution;
69
+ const fs = __importStar(require("fs/promises"));
70
+ const server_types_js_1 = require("./server-types.js");
71
+ const session_window_js_1 = require("../bootstrap/session-window.js");
72
+ const task_deps_js_1 = require("./task-deps.js");
73
+ // 写盘去重: 上次写盘内容, 用于跳过幂等调用
74
+ let lastChannelsJson = '';
75
+ // 写盘保护: 任何调用 saveChannels 后更新
76
+ let lastChannelsWriteAt = 0;
77
+ // 2026-07-24: 简单的互斥锁, 防止并发 loadChannels→modify→saveChannels 的经典 read-modify-write 竞争
78
+ let channelsLock = Promise.resolve();
79
+ function getLastChannelsWriteAt() {
80
+ return lastChannelsWriteAt;
81
+ }
82
+ /** 对 channels 执行原子化的 read-modify-write, 自带互斥锁 */
83
+ async function updateChannels(fn) {
84
+ const run = channelsLock.then(async () => {
85
+ const chs = await rawLoadChannels();
86
+ const result = fn(chs);
87
+ await rawSaveChannels(result);
88
+ return result;
89
+ });
90
+ // 2026-08-02 fix: 失败不毒化锁链 — 之前 channelsLock = channelsLock.then(...),
91
+ // 某次 fn 抛错 → 整个链变 rejected → 之后所有 updateChannels 直接 reject,
92
+ // fn 不再执行 → UI 创建 channel 偶发"不落盘" (静默丢失).
93
+ channelsLock = run.catch((e) => {
94
+ console.error('[updateChannels] 失败 (已隔离, 不影响后续操作):', e?.message || e);
95
+ return undefined;
96
+ });
97
+ return run;
98
+ }
99
+ async function rawLoadChannels() {
100
+ try {
101
+ const data = await fs.readFile(server_types_js_1.CHANNELS_PATH, 'utf-8');
102
+ return JSON.parse(data);
103
+ }
104
+ catch (readErr) {
105
+ // 2026-07-24: 主文件损坏时尝试从 .tmp 恢复
106
+ if (readErr?.code !== 'ENOENT') {
107
+ console.warn('[loadChannels] channels.json 解析失败, 尝试从 .tmp 恢复:', readErr?.message?.slice(0, 80));
108
+ try {
109
+ const tmpData = await fs.readFile(server_types_js_1.CHANNELS_PATH + '.tmp', 'utf-8');
110
+ const recovered = JSON.parse(tmpData);
111
+ console.log(`[loadChannels] 从 .tmp 恢复成功: ${recovered.length} 个 channel`);
112
+ // 立即把恢复的内容写回主文件
113
+ await fs.writeFile(server_types_js_1.CHANNELS_PATH, tmpData, 'utf-8');
114
+ return recovered;
115
+ }
116
+ catch (tmpErr) {
117
+ console.warn('[loadChannels] .tmp 恢复也失败:', tmpErr?.message?.slice(0, 80));
118
+ }
119
+ }
120
+ return [];
121
+ }
122
+ }
123
+ async function rawSaveChannels(channels) {
124
+ const sanitized = channels.map(ch => {
125
+ const { didDocument: _omit, ...rest } = ch;
126
+ return rest;
127
+ });
128
+ const jsonStr = JSON.stringify(sanitized, null, 2);
129
+ if (jsonStr === lastChannelsJson)
130
+ return;
131
+ lastChannelsJson = jsonStr;
132
+ console.log('[saveChannels] 保存频道数据, 数量:', sanitized.length);
133
+ // 2026-07-24: 原子写入 — 先写 .tmp 再 rename, 防止崩溃导致 channels.json 损坏
134
+ const tmpPath = server_types_js_1.CHANNELS_PATH + '.tmp';
135
+ await fs.writeFile(tmpPath, jsonStr, 'utf-8');
136
+ await fs.rename(tmpPath, server_types_js_1.CHANNELS_PATH);
137
+ lastChannelsWriteAt = Date.now();
138
+ }
139
+ async function loadChannels() {
140
+ return rawLoadChannels();
141
+ }
142
+ async function saveChannels(channels) {
143
+ return rawSaveChannels(channels);
144
+ }
145
+ /**
146
+ * loadSession 加 L0 window fallback 链 (2026-07-07 P0-B):
147
+ * 1) full session.json (主路径)
148
+ * 2) full 超 50MB 拒加载 → 读 <key>.window.json
149
+ * 3) window 也没有 → 返回 null (前端 fallback "你好! 我是 Bolloon Agent")
150
+ */
151
+ async function loadSession(channelId, sessionId) {
152
+ const key = sessionId ? `${channelId}:${sessionId}` : channelId;
153
+ const sessionPath = `${server_types_js_1.SESSION_CACHE_PATH}/${key}.json`;
154
+ const sid = sessionId || 'default';
155
+ try {
156
+ // 内存保护: 拒绝加载过大的 session 文件 (> 50MB 视为异常, 避免 OOM)
157
+ const stat = await fs.stat(sessionPath);
158
+ if (stat.size > 50 * 1024 * 1024) {
159
+ console.warn(`[loadSession] session 过大 (${stat.size} bytes): ${key}, fallback to window`);
160
+ return await loadSessionWindowFallback(channelId, sid);
161
+ }
162
+ const data = await fs.readFile(sessionPath, 'utf-8');
163
+ return JSON.parse(data);
164
+ }
165
+ catch {
166
+ // 文件不存在 → 仍尝试 window (可能上次 session 删了, window 还在)
167
+ return await loadSessionWindowFallback(channelId, sid);
168
+ }
169
+ }
170
+ /** window-only fallback: 窗口消息填入 Session.messages, 其他字段填占位 */
171
+ async function loadSessionWindowFallback(channelId, sessionId) {
172
+ const win = await (0, session_window_js_1.loadWindow)(channelId, sessionId);
173
+ if (!win || win.messages.length === 0)
174
+ return null;
175
+ console.log(`[loadSession] window fallback for ${channelId}: ${sessionId}, ${win.messages.length} msgs (${win.totalBehind} behind)`);
176
+ // WindowEntry → SessionMessage 映射 (id/timestamp 缺失时补占位)
177
+ const messages = win.messages.map((m, idx) => ({
178
+ id: m.id || `win-${win.lastUpdated}-${idx}`,
179
+ type: (m.type === 'user' || m.type === 'ai' ? m.type : 'user'),
180
+ content: m.content,
181
+ timestamp: m.timestamp || win.lastUpdated,
182
+ metadata: m.metadata,
183
+ }));
184
+ return {
185
+ channelId,
186
+ sessionId,
187
+ messages,
188
+ lastUpdated: win.lastUpdated,
189
+ _windowOnly: true,
190
+ _totalBehind: win.totalBehind,
191
+ };
192
+ }
193
+ async function saveSession(session) {
194
+ const key = session.sessionId ? `${session.channelId}:${session.sessionId}` : session.channelId;
195
+ const sessionPath = `${server_types_js_1.SESSION_CACHE_PATH}/${key}.json`;
196
+ await fs.writeFile(sessionPath, JSON.stringify(session, null, 2));
197
+ // L0 窗口联动 (2026-07-07): 同步写最近 30 条到 <key>.window.json
198
+ // 失败静默 — 不阻塞主对话流
199
+ try {
200
+ await (0, session_window_js_1.saveWindow)(session.channelId, session.sessionId || 'default', session.messages || [], { windowSize: 30 });
201
+ }
202
+ catch (e) {
203
+ console.warn(`[saveSession] window write failed for ${key}: ${e?.message || e}`);
204
+ }
205
+ }
206
+ async function loadTheme() {
207
+ try {
208
+ const data = await fs.readFile(server_types_js_1.THEME_PATH, 'utf-8');
209
+ return JSON.parse(data);
210
+ }
211
+ catch {
212
+ return { theme: 'light', agentId: '' };
213
+ }
214
+ }
215
+ async function saveTheme(theme, agentId) {
216
+ await fs.writeFile(server_types_js_1.THEME_PATH, JSON.stringify({ theme, agentId }, null, 2));
217
+ }
218
+ // ==================== Task Queue & Workflow System ====================
219
+ let isExecutingTask = false;
220
+ let executionTaskId = null;
221
+ function isTaskExecuting() {
222
+ return isExecutingTask;
223
+ }
224
+ function getExecutingTaskId() {
225
+ return executionTaskId;
226
+ }
227
+ // ==================== 任务队列 ====================
228
+ // 2026-08-12 (Task6): 任务队列以 OrbitDB 为主存储 (去中心化/跨设备同步), 本地文件作 fallback.
229
+ // orbit 由 server 启动时 warmTaskOrbitStore() 预热成功后调 markTaskOrbitReady() 置位;
230
+ // 未置位 (测试/离线) 自动回退本地文件.
231
+ let _taskOrbitReady = false;
232
+ /** server 启动 warm 成功后调用, 启用 orbitdb 主存储 (测试可调用 disableTaskOrbitStore 关闭) */
233
+ function markTaskOrbitReady() { _taskOrbitReady = true; }
234
+ /** 禁用 orbitdb 任务存储 (测试隔离用) */
235
+ function disableTaskOrbitStore() { _taskOrbitReady = false; }
236
+ function taskOrbitReady() { return _taskOrbitReady; }
237
+ async function loadTaskQueue() {
238
+ // OrbitDB 主存储优先
239
+ if (taskOrbitReady()) {
240
+ try {
241
+ const { getTaskOrbitStore } = await Promise.resolve().then(() => __importStar(require('../orbitdb/task-store.js')));
242
+ const tasks = await getTaskOrbitStore().loadTasks();
243
+ if (Array.isArray(tasks))
244
+ return tasks;
245
+ }
246
+ catch { /* orbit 读失败 → fallback 本地 */ }
247
+ }
248
+ try {
249
+ const data = await fs.readFile(server_types_js_1.TASK_QUEUE_PATH, 'utf-8');
250
+ return JSON.parse(data);
251
+ }
252
+ catch {
253
+ return [];
254
+ }
255
+ }
256
+ async function saveTaskQueue(tasks) {
257
+ // 本地双写 (备份 + fallback 源)
258
+ await fs.writeFile(server_types_js_1.TASK_QUEUE_PATH, JSON.stringify(tasks, null, 2));
259
+ // OrbitDB 主存储同步 (尽力而为)
260
+ if (taskOrbitReady()) {
261
+ try {
262
+ const { getTaskOrbitStore } = await Promise.resolve().then(() => __importStar(require('../orbitdb/task-store.js')));
263
+ await getTaskOrbitStore().saveTasks(tasks);
264
+ }
265
+ catch { /* orbit 写失败静默, 本地已备份 */ }
266
+ }
267
+ }
268
+ // ==================== 任务认领 CAS (2026-08-11, Hermes kanban 模式) ====================
269
+ // kanban_db.py: "WAL + BEGIN IMMEDIATE + compare-and-swap on tasks.status/claim_lock —
270
+ // 至多一个 worker 能认领任务, 输家看到 0 行受影响就退出, 无重试循环, 无分布式锁."
271
+ // Bolloon 对应: 任务队列是 JSON 文件, 用进程内互斥链 (withTaskQueueLock) 序列化
272
+ // load→CAS(status==='pending'→'running')→save, 输家返回 null/not-pending, 不重试.
273
+ let taskQueueLock = Promise.resolve();
274
+ function withTaskQueueLock(fn) {
275
+ const run = taskQueueLock.then(fn);
276
+ taskQueueLock = run.then(() => undefined, () => undefined);
277
+ return run;
278
+ }
279
+ /** 认领 TTL 默认 15min (BOLLOON_CLAIM_TTL_SECONDS 可调) — Hermes DEFAULT_CLAIM_TTL_SECONDS=15*60 */
280
+ function claimTtlSeconds() {
281
+ const v = Number(process.env.BOLLOON_CLAIM_TTL_SECONDS || '');
282
+ return v > 0 ? v : 15 * 60;
283
+ }
284
+ /**
285
+ * CAS 认领指定任务: 只有 status==='pending' 才能认领成功 (原子翻成 running).
286
+ * 认领点强制父依赖不变式 (Hermes kanban): 任一父未 completed/cancelled → 不认领, 返回 'parents-undone'.
287
+ * 认领写 claim_expires (TTL) — 崩溃/卡死后由 releaseStaleClaims 释放, 锁不泄漏.
288
+ */
289
+ async function claimTaskForExecution(taskId) {
290
+ if (isExecutingTask)
291
+ return 'busy';
292
+ return withTaskQueueLock(async () => {
293
+ if (isExecutingTask)
294
+ return 'busy';
295
+ const tasks = await loadTaskQueue();
296
+ const t = tasks.find((x) => x.id === taskId);
297
+ if (!t || t.status !== 'pending')
298
+ return 'not-pending';
299
+ // 父依赖不变式: 父未完成 → 拒绝认领 (依赖悬空时任务不可执行)
300
+ if (!(0, task_deps_js_1.parentsSatisfied)(t, tasks))
301
+ return 'parents-undone';
302
+ t.status = 'running';
303
+ t.claimExpires = Date.now() + claimTtlSeconds() * 1000;
304
+ t.updatedAt = new Date().toISOString();
305
+ await saveTaskQueue(tasks);
306
+ isExecutingTask = true;
307
+ executionTaskId = taskId;
308
+ return 'claimed';
309
+ });
310
+ }
311
+ /**
312
+ * CAS 认领下一个 pending 任务; 无任务/已被认领 → null (输家不重试).
313
+ * 只认领父依赖满足的 pending — 父未完成的任务跳过 (等父 done 后可被认领), 不阻塞队列.
314
+ */
315
+ async function claimNextPendingTask() {
316
+ if (isExecutingTask)
317
+ return null;
318
+ return withTaskQueueLock(async () => {
319
+ if (isExecutingTask)
320
+ return null;
321
+ const tasks = await loadTaskQueue();
322
+ const t = tasks.find((x) => x.status === 'pending' && (0, task_deps_js_1.parentsSatisfied)(x, tasks));
323
+ if (!t)
324
+ return null;
325
+ t.status = 'running';
326
+ t.claimExpires = Date.now() + claimTtlSeconds() * 1000;
327
+ t.updatedAt = new Date().toISOString();
328
+ await saveTaskQueue(tasks);
329
+ isExecutingTask = true;
330
+ executionTaskId = t.id;
331
+ return t;
332
+ });
333
+ }
334
+ /**
335
+ * 心跳续期 (Hermes kanban_heartbeat): 执行中有实质进展时调用, 把 claim_expires 推到 now+TTL.
336
+ * CAS: 只续期当前执行中的任务 (executionTaskId 匹配 + status==='running').
337
+ */
338
+ async function heartbeatTaskExecution(taskId) {
339
+ return withTaskQueueLock(async () => {
340
+ if (executionTaskId !== taskId)
341
+ return false;
342
+ const tasks = await loadTaskQueue();
343
+ const t = tasks.find((x) => x.id === taskId);
344
+ if (!t || t.status !== 'running')
345
+ return false;
346
+ t.claimExpires = Date.now() + claimTtlSeconds() * 1000;
347
+ t.updatedAt = new Date().toISOString();
348
+ await saveTaskQueue(tasks);
349
+ return true;
350
+ });
351
+ }
352
+ /**
353
+ * 释放过期认领 (Hermes release_stale_claims): 扫所有 running 且 claim_expires 已过期的任务
354
+ * → 释放 in-memory 锁 + 任务回 pending (可重新认领执行). 防 executeTask 卡死/崩溃后锁泄漏.
355
+ * 返回释放数量. 安全可频繁调用.
356
+ */
357
+ async function releaseStaleClaims() {
358
+ return withTaskQueueLock(async () => {
359
+ const now = Date.now();
360
+ const tasks = await loadTaskQueue();
361
+ const stale = tasks.filter((t) => t.status === 'running' && t.claimExpires !== undefined && t.claimExpires < now);
362
+ if (stale.length === 0)
363
+ return 0;
364
+ for (const t of stale) {
365
+ t.status = 'pending';
366
+ t.claimExpires = undefined;
367
+ t.updatedAt = new Date().toISOString();
368
+ }
369
+ await saveTaskQueue(tasks);
370
+ // 当前执行锁指向过期任务 → 一并释放 (卡死的 executeTask 其锁也失效)
371
+ if (executionTaskId && stale.some((t) => t.id === executionTaskId)) {
372
+ isExecutingTask = false;
373
+ executionTaskId = null;
374
+ }
375
+ return stale.length;
376
+ });
377
+ }
378
+ /** 执行 task 的 helper 标记 (server.ts 内部 still 持有 lock) */
379
+ function startTaskExecution(taskId) {
380
+ if (isExecutingTask)
381
+ return false;
382
+ isExecutingTask = true;
383
+ executionTaskId = taskId;
384
+ return true;
385
+ }
386
+ function endTaskExecution() {
387
+ isExecutingTask = false;
388
+ executionTaskId = null;
389
+ }
390
+ //# sourceMappingURL=server-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-storage.js","sourceRoot":"","sources":["../../../src/web/server-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * server-types.ts — server.ts 拆出的纯类型 + 常量 + 路径
4
+ *
5
+ * 从 src/web/server.ts 抽出 (2026-07-06).
6
+ * 0 副作用, 0 模块级 state, 只放 type / interface / const 路径.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.REMOTE_CACHE_FILE = exports.IPFS_ENDPOINT = exports.TASK_QUEUE_PATH = exports.THEME_PATH = exports.CHANNELS_PATH = exports.SESSION_CACHE_PATH = exports.SHARED_SESSION_PATH = void 0;
43
+ const path = __importStar(require("path"));
44
+ const HOME = process.env.HOME || process.env.USERPROFILE || '/tmp';
45
+ exports.SHARED_SESSION_PATH = path.join(HOME, '.bolloon', 'sessions');
46
+ exports.SESSION_CACHE_PATH = path.join(exports.SHARED_SESSION_PATH, 'cache');
47
+ exports.CHANNELS_PATH = path.join(exports.SHARED_SESSION_PATH, 'channels.json');
48
+ exports.THEME_PATH = path.join(exports.SHARED_SESSION_PATH, 'theme.json');
49
+ exports.TASK_QUEUE_PATH = path.join(exports.SHARED_SESSION_PATH, 'task-queue.json');
50
+ exports.IPFS_ENDPOINT = 'http://127.0.0.1:5001';
51
+ exports.REMOTE_CACHE_FILE = path.join(HOME, '.bolloon', 'remote-channels-cache.json');
52
+ //# sourceMappingURL=server-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-types.js","sourceRoot":"","sources":["../../../src/web/server-types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,MAAY,IAAI,iCAAa;AAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC;AAEtD,QAAA,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9D,QAAA,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAA,mBAAmB,EAAE,OAAO,CAAC,CAAC;AAC7D,QAAA,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAA,mBAAmB,EAAE,eAAe,CAAC,CAAC;AAChE,QAAA,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAA,mBAAmB,EAAE,YAAY,CAAC,CAAC;AAC1D,QAAA,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAA,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;AACpE,QAAA,aAAa,GAAG,uBAAuB,CAAC;AACxC,QAAA,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,4BAA4B,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /**
3
+ * task-deps.ts — 任务父依赖校验 (借鉴 Hermes kanban 认领点父依赖不变式:
4
+ * claim 时强制检查所有父任务 done/archived, 否则 demote 回 todo)
5
+ *
6
+ * 纯函数。bolloon 终态语义: completed/cancelled 视为父已结束 (依赖解除);
7
+ * failed 视为父未成功 (子任务不满足前提, 阻塞等人工决策)。
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.parentsSatisfied = parentsSatisfied;
11
+ exports.unsatisfiedParents = unsatisfiedParents;
12
+ const PARENT_DONE_STATUSES = new Set(['completed', 'cancelled']);
13
+ /** 父依赖是否满足: 无父 / 父全部 completed|cancelled → true; 父 missing/failed/running/pending → false */
14
+ function parentsSatisfied(task, allTasks) {
15
+ const parentIds = task?.parentIds;
16
+ if (!parentIds || parentIds.length === 0)
17
+ return true;
18
+ for (const pid of parentIds) {
19
+ const parent = allTasks.find((t) => t.id === pid);
20
+ // 父不存在 → 保守阻塞 (依赖悬空, 等人工修复)
21
+ if (!parent)
22
+ return false;
23
+ if (!PARENT_DONE_STATUSES.has(parent.status))
24
+ return false;
25
+ }
26
+ return true;
27
+ }
28
+ /** 列出未满足的父任务 id (诊断用) */
29
+ function unsatisfiedParents(task, allTasks) {
30
+ const parentIds = task?.parentIds;
31
+ if (!parentIds || parentIds.length === 0)
32
+ return [];
33
+ const out = [];
34
+ for (const pid of parentIds) {
35
+ const parent = allTasks.find((t) => t.id === pid);
36
+ if (!parent || !PARENT_DONE_STATUSES.has(parent.status))
37
+ out.push(pid);
38
+ }
39
+ return out;
40
+ }
41
+ //# sourceMappingURL=task-deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-deps.js","sourceRoot":"","sources":["../../../src/web/task-deps.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;AAYH,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAEtF,6FAA6F;AAC7F,0BACE,IAA0C,EAC1C,QAA+C;IAE/C,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,CAAC;IAClC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QAClD,4BAA4B;QAC5B,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yBAAyB;AACzB,4BACE,IAA0C,EAC1C,QAA+C;IAE/C,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,CAAC;IAClC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/dist/index.js CHANGED
@@ -3616,32 +3616,33 @@ async function runToolCommand(tool, args, outputJson, comm, model, prompt) {
3616
3616
  }
3617
3617
  // ==================== Update Commands ====================
3618
3618
  case 'update-check': {
3619
- const { checkForUpdates } = await import('./utils/auto-update.js');
3620
- const info = await checkForUpdates();
3621
- if (info && info.outdated) {
3622
- response = `📦 发现更新可用:\n\n` +
3623
- `当前版本: ${info.version}\n` +
3624
- `最新版本: ${info.latest}\n\n` +
3625
- `待更新包:\n${info.packages.map(p => ` - ${p.name}: ${p.current} → ${p.latest}`).join('\n')}\n\n` +
3626
- `运行 --update-now 进行更新`;
3627
- }
3628
- else {
3629
- response = `✅ 已是最新版本 (${info?.version || 'unknown'})`;
3630
- }
3619
+ // 2026-09-19: 统一走 Update Manager (唯一检查逻辑), 不再自己拼字符串结论
3620
+ const { checkForUpdate } = await import('./utils/update-manager.js');
3621
+ const r = await checkForUpdate({ force: true });
3622
+ const head = r.status === 'up_to_date' ? '✅ 已是最新版本'
3623
+ : r.status === 'update_available' ? '📦 发现更新可用'
3624
+ : r.status === 'offline' || r.status === 'registry_unavailable' ? '⚠ 无法检查更新 (这不代表是最新版)'
3625
+ : r.status === 'local_version_unknown' ? '⚠ 读不到本地版本 (不判断是否有更新)'
3626
+ : r.status === 'unsupported_installation' ? '⚠ 当前安装方式不支持自动更新'
3627
+ : 'ℹ 使用缓存结论';
3628
+ response = `${head}\n\n当前版本: ${r.currentVersion}\n最新版本: ${r.latestVersion || '未知'}\n安装方式: ${r.installMethod}\n结论: ${r.status}${r.reason ? `\n说明: ${r.reason}` : ''}`;
3629
+ if (r.status === 'update_available')
3630
+ response += `\n\n运行 bolloon update plan 看计划, bolloon update now 执行更新`;
3631
+ if (r.status === 'offline' || r.status === 'registry_unavailable' || r.status === 'local_version_unknown')
3632
+ error = response;
3631
3633
  break;
3632
3634
  }
3633
3635
  case 'update-now': {
3634
- const { performUpdate } = await import('./utils/auto-update.js');
3635
- const packages = args.length > 0 ? args : undefined;
3636
- const result = await performUpdate(packages);
3637
- if (result.success) {
3638
- response = `✅ 更新成功${result.updatedPackages ? `: ${result.updatedPackages.join(', ')}` : ''}`;
3639
- if (result.updated) {
3640
- response += `\n\n${YELLOW}请重新启动应用以使用新版本${RESET}`;
3641
- }
3636
+ // 2026-09-19: 统一走同一条 applyUpdate 流水线 (计划 + 锁 + 校验 + 回滚)
3637
+ const { applyUpdate } = await import('./utils/update-manager.js');
3638
+ const res = await applyUpdate({ strategy: 'now' });
3639
+ if (res.ok) {
3640
+ response = `✅ 更新成功: ${res.from} → ${res.to}\n\n${YELLOW}请重新启动应用以使用新版本${RESET}`;
3642
3641
  }
3643
3642
  else {
3644
- response = `❌ 更新失败: ${result.error}`;
3643
+ response = res.stage === 'blocked'
3644
+ ? `⚠ 更新被阻塞: ${res.reason}`
3645
+ : `❌ 更新失败 (${res.stage}): ${res.reason}\n旧版本仍在: ${res.from} — 可继续使用`;
3645
3646
  error = response;
3646
3647
  }
3647
3648
  break;
@@ -4471,12 +4472,12 @@ async function main() {
4471
4472
  printHelp();
4472
4473
  process.exit(0);
4473
4474
  }
4474
- // 启动自动更新检查(后台执行,不阻塞主流程)。
4475
- // 检测到新版本会自动安装;安装成功后自动重启以应用新版本。
4476
- // 可用 --no-update / BOLLOON_SKIP_UPDATE 关闭,
4477
- // 或用 config.json 的 autoUpdate:false / autoRestart:false / BOLLOON_AUTO_UPDATE=1 控制。
4478
- // 手动检查: bolloon --update-check
4479
- // 手动更新: bolloon --update-now [package]
4475
+ // 启动时后台检查更新 (不阻塞主流程)。
4476
+ // 2026-09-19 行为变更: **默认只通知, 不自动安装** —— 发现新版本会打印一行提示 +
4477
+ // "bolloon update plan / now"。要恢复自动安装需显式 config.json `autoInstall: true`
4478
+ // (+ `autoRestart: true` 才自动重启)。
4479
+ // 关闭本次检查: --no-update / BOLLOON_SKIP_UPDATE=1; 临时开自动装: BOLLOON_AUTO_UPDATE=1
4480
+ // 手动检查: bolloon update / bolloon update plan / bolloon doctor
4480
4481
  if (!args.updateCheck && !args.updateNow) {
4481
4482
  void (async () => {
4482
4483
  try {
@@ -12,10 +12,13 @@
12
12
  */
13
13
  import * as fs from 'fs/promises';
14
14
  import * as path from 'path';
15
- import { fileURLToPath } from 'url';
16
15
  import { stripHibsml } from './strip-hibsml.js';
17
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
18
- const LAYERS_DIR = path.join(__dirname, 'layers');
16
+ import { firstExisting, packageDirCandidates } from '../../utils/module-context.js';
17
+ // 2026-09-19: 原先是 path.dirname(fileURLToPath(import.meta.url)) + 'layers'.
18
+ // electron 构建是 CommonJS, 用 import.meta 直接 TS1343 (发布门过不去);
19
+ // 而且 electron 产物的同级目录里没有 .md, 光靠 __dirname 也读不到。
20
+ // 现在按 CJS同级 → dist/llm/system-prompt → src/llm/system-prompt 依次探测。
21
+ const LAYERS_DIR = firstExisting(packageDirCandidates(path.join('llm', 'system-prompt', 'layers')));
19
22
  // 2026-06-17: VERBOSE 开关 — BOLLOON_VERBOSE=1 时打 layer 读失败诊断
20
23
  // 默认静默 (每次 chat 跑 25 次 fs.readFile, 失败 spam 会污染终端)
21
24
  const VERBOSE = process.env.BOLLOON_VERBOSE === '1';