@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
@@ -1,566 +1,179 @@
1
1
  /**
2
- * npm 自动更新检查器
2
+ * auto-update.ts — 启动时后台检查的**薄适配层** (2026-09-19 重写)
3
3
  *
4
- * 功能:
5
- * - 启动时(后台、节流)检查 npm 注册表是否有新版本
6
- * - 检测到新版本时自动下载并安装最新版本(可按需关闭)
7
- * - 支持增量更新(只更新有变化的包)
4
+ * 这里以前是"多套更新逻辑中的一套": 自己拼 package.json 路径、自己打 registry、
5
+ * 自己 `npm install -g`、自己重启。现在它只剩两件事:
6
+ * ① 启动时决定"要不要检查" (开关 / 节流 / 显式屏蔽)
7
+ * ② 把结论**通知**给用户
8
+ * 真正的检查 / 计划 / 执行全在 `update-manager.ts` —— 一份逻辑, 一个事实。
8
9
  *
9
- * 设计要点:
10
- * - 全局安装位置通过 `npm root -g` / `npm prefix -g` 动态探测,
11
- * 不再依赖写死的路径,兼容 nvm / homebrew / 默认 prefix。
12
- * - 运行中的包版本优先从全局安装位置(npm root -g 动态探测)读取,
13
- * 开发态下若 cwd 的 package.json 就是本包则回退到 cwd,不受任意工作目录影响。
14
- * - 检查频率受节流缓存约束(默认 24h 一次),不会每次启动都打 npm。
15
- */
16
- import { execSync } from 'child_process';
17
- import * as fs from 'fs';
18
- import * as path from 'path';
19
- import * as https from 'https';
20
- import * as http from 'http';
21
- // ANSI 颜色
10
+ * **行为变更 (刻意, 2026-09-19)**: 旧默认是"发现新版本 → 自动安装 → 自动重启"。
11
+ * 新默认是"发现新版本 → 只通知"。理由: Bolloon 有长期运行 / Supervisor / 持久化任务 /
12
+ * 支付恢复, 自动替换运行时可能打断正在执行的 Goal。要自动装需显式打开
13
+ * `config.json` 的 `autoInstall: true` (再加 `autoRestart: true` 才自动重启),
14
+ * 或用 `BOLLOON_AUTO_UPDATE=1` 临时覆盖。
15
+ */
16
+ import { checkForUpdate, applyUpdate, compareVersions, } from './update-manager.js';
17
+ import { readUpdatePrefs } from './update-state.js';
18
+ import { resolveBolloonHome } from '../setup/setup-store.js';
19
+ import { PKG_NAME, CONSTRAINT_PKG_NAME } from './version-info.js';
22
20
  const RESET = '\x1b[0m';
23
- const BOLD = '\x1b[1m';
24
- const CYAN = '\x1b[36m';
25
21
  const GREEN = '\x1b[32m';
26
22
  const YELLOW = '\x1b[33m';
27
- const MAGENTA = '\x1b[35m';
28
- const PKG_NAME = '@bolloon/bolloon-agent';
29
- const BOLLOON_DIR = path.join(process.env.HOME || process.env.USERPROFILE || '/tmp', '.bolloon');
30
- const UPDATE_CACHE = path.join(BOLLOON_DIR, '.update-check.json');
31
- /** 2026-08-07: CLI 交互模式下静音自动更新通知 (避免后台检查污染 TUI 屏幕) */
23
+ const CYAN = '\x1b[36m';
24
+ /** 2026-08-07: CLI 交互模式下静音后台通知 (避免污染 TUI 屏幕) */
32
25
  let notifyQuiet = false;
33
26
  export function setNotifyQuiet(v) {
34
27
  notifyQuiet = v;
35
28
  }
36
- /**
37
- * 通知用户。使用 stderr,避免在交互式 CLI 模式下 stdout 被吞掉。
38
- */
29
+ /** 通知用户。用 stderr, 避免交互式 CLI 模式下 stdout 被 Ink 接管/吞掉。 */
39
30
  function notify(msg, color = RESET) {
40
31
  if (notifyQuiet)
41
32
  return;
42
- process.stderr.write(`${color}${msg}${RESET}`);
43
- }
44
- function httpGet(url) {
45
- return new Promise((resolve, reject) => {
46
- const client = url.startsWith('https') ? https : http;
47
- const req = client.get(url, { timeout: 10000 }, (res) => {
48
- let data = '';
49
- res.on('data', (chunk) => data += chunk);
50
- res.on('end', () => resolve(data));
51
- });
52
- req.on('error', reject);
53
- req.on('timeout', () => {
54
- req.destroy();
55
- reject(new Error('请求超时'));
56
- });
57
- });
58
- }
59
- /**
60
- * 读取某目录下的 package.json 版本号
61
- */
62
- function readVersion(dir) {
63
- if (!dir)
64
- return null;
65
- const pkgPath = path.join(dir, 'package.json');
66
- try {
67
- if (fs.existsSync(pkgPath)) {
68
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
69
- return pkg.version || null;
70
- }
71
- }
72
- catch {
73
- // 忽略
74
- }
75
- return null;
76
- }
77
- /**
78
- * 获取 bolloon 全局安装目录(动态探测,兼容多种 npm 安装方式)。
79
- * 同时兼容 ESM(Node) 与 CJS(Electron) 上下文,不依赖 import.meta。
80
- */
81
- function getGlobalBolloonDir() {
82
- const candidates = [];
83
- // 1. npm root -g(最可靠)
84
- try {
85
- const npmRoot = execSync('npm root -g', { encoding: 'utf-8', timeout: 8000 }).trim();
86
- if (npmRoot)
87
- candidates.push(path.join(npmRoot, '@bolloon', 'bolloon-agent'));
88
- }
89
- catch {
90
- // 忽略
91
- }
92
- // 2. npm prefix -g
93
- try {
94
- const npmPrefix = execSync('npm prefix -g', { encoding: 'utf-8', timeout: 8000 }).trim();
95
- if (npmPrefix)
96
- candidates.push(path.join(npmPrefix, 'lib', 'node_modules', '@bolloon', 'bolloon-agent'));
97
- }
98
- catch {
99
- // 忽略
100
- }
101
- // 3. nvm 各版本目录
102
- const home = process.env.HOME || '';
103
- const nvmBase = path.join(home, '.nvm', 'versions', 'node');
104
- try {
105
- if (fs.existsSync(nvmBase)) {
106
- for (const ver of fs.readdirSync(nvmBase)) {
107
- candidates.push(path.join(nvmBase, ver, 'lib', 'node_modules', '@bolloon', 'bolloon-agent'));
108
- }
109
- }
110
- }
111
- catch {
112
- // 忽略
113
- }
114
- // 4. 常见写死路径兜底
115
- candidates.push(path.join(home, '.npm-global', 'lib', 'node_modules', '@bolloon', 'bolloon-agent'), '/usr/local/lib/node_modules/@bolloon/bolloon-agent', '/opt/homebrew/lib/node_modules/@bolloon/bolloon-agent', path.join(home, 'node_modules', '@bolloon', 'bolloon-agent'));
116
- for (const p of candidates) {
117
- if (fs.existsSync(path.join(p, 'package.json')))
118
- return p;
119
- }
120
- return null;
121
- }
122
- /**
123
- * 获取当前安装的包版本。
124
- * 主包优先用「全局安装位置」;开发态下若 cwd 的 package.json 就是本包则回退到 cwd。
125
- * 不再无差别回退到 cwd(避免全局启动时误读用户工作目录的版本)。
126
- */
127
- function getInstalledVersion(packageName) {
128
- if (packageName === PKG_NAME) {
129
- const fromGlobal = readVersion(getGlobalBolloonDir());
130
- if (fromGlobal)
131
- return fromGlobal;
132
- // 开发态:仅在 cwd 的 package.json 确为本包时才采用
133
- const cwdPkg = path.join(process.cwd(), 'package.json');
134
- try {
135
- if (fs.existsSync(cwdPkg)) {
136
- const data = JSON.parse(fs.readFileSync(cwdPkg, 'utf-8'));
137
- if (data.name === PKG_NAME && data.version)
138
- return data.version;
139
- }
140
- }
141
- catch {
142
- // 忽略
143
- }
144
- }
145
- // 其它包:检查本地 node_modules
146
- const packageJsonPath = findPackageJson(packageName);
147
- if (packageJsonPath) {
148
- return readVersion(path.dirname(packageJsonPath));
149
- }
150
- return null;
151
- }
152
- /**
153
- * 查找包的 package.json 路径
154
- */
155
- function findPackageJson(packageName) {
156
- const checkPaths = [
157
- path.join(process.cwd(), 'node_modules', packageName, 'package.json'),
158
- path.join(process.cwd(), 'node_modules', '@' + packageName.split('/')[0], packageName.split('/')[1] || '', 'package.json'),
159
- ];
160
- for (const p of checkPaths) {
161
- if (fs.existsSync(p))
162
- return p;
163
- }
164
- return null;
165
- }
166
- /**
167
- * 检查 npm 注册表获取最新版本
168
- */
169
- async function getLatestVersion(packageName) {
170
- try {
171
- const encodedName = encodeURIComponent(packageName);
172
- const url = `https://registry.npmjs.org/${encodedName}`;
173
- const response = await httpGet(url);
174
- const data = JSON.parse(response);
175
- return data['dist-tags']?.latest || null;
176
- }
177
- catch (e) {
178
- return null;
179
- }
33
+ process.stderr.write(`${color}${msg}${RESET}\n`);
180
34
  }
181
- /**
182
- * 比较版本号
183
- */
184
- function compareVersions(current, latest) {
185
- const norm = (v) => v.replace(/^v/, '').split('-')[0].split('.').map(Number);
186
- const currentParts = norm(current);
187
- const latestParts = norm(latest);
188
- for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {
189
- const c = currentParts[i] || 0;
190
- const l = latestParts[i] || 0;
191
- if (c < l)
192
- return -1;
193
- if (c > l)
194
- return 1;
195
- }
196
- return 0;
197
- }
198
- /**
199
- * 检查 bolloon 相关包是否有更新
200
- */
201
- async function checkBolloonUpdates() {
202
- const packagesToCheck = [
203
- PKG_NAME,
204
- '@bolloon/constraint-runtime',
205
- ];
206
- const outdatedPackages = [];
207
- let hasUpdate = false;
208
- let currentVersion = '';
209
- let latestVersion = '';
210
- for (const pkg of packagesToCheck) {
211
- const installed = getInstalledVersion(pkg);
212
- if (!installed)
213
- continue;
214
- if (pkg === PKG_NAME) {
215
- currentVersion = installed;
216
- }
217
- const latest = await getLatestVersion(pkg);
218
- if (latest && compareVersions(installed, latest) < 0) {
219
- hasUpdate = true;
220
- latestVersion = latest;
221
- outdatedPackages.push({
222
- name: pkg,
223
- current: installed,
224
- wanted: latest,
225
- latest,
226
- location: pkg
227
- });
228
- }
229
- }
230
- if (outdatedPackages.length === 0) {
231
- return {
232
- name: PKG_NAME,
233
- version: currentVersion,
234
- latest: currentVersion,
235
- outdated: false,
236
- packages: []
237
- };
238
- }
35
+ export function checkResultToPackageInfo(r) {
36
+ const outdated = r.status === 'update_available' && !!r.latestVersion;
239
37
  return {
240
38
  name: PKG_NAME,
241
- version: currentVersion,
242
- latest: latestVersion,
243
- outdated: hasUpdate,
244
- packages: outdatedPackages
245
- };
246
- }
247
- /**
248
- * 使用 npm outdated 检查所有包的更新
249
- */
250
- function checkNpmOutdated() {
251
- try {
252
- const output = execSync('npm outdated --json', {
253
- encoding: 'utf-8',
254
- timeout: 30000,
255
- maxBuffer: 10 * 1024 * 1024,
256
- cwd: process.cwd()
257
- });
258
- if (!output.trim())
259
- return [];
260
- const data = JSON.parse(output);
261
- const packages = [];
262
- for (const [name, info] of Object.entries(data)) {
263
- const pkg = info;
264
- packages.push({
265
- name,
266
- current: pkg.current || '0.0.0',
267
- wanted: pkg.wanted || '0.0.0',
268
- latest: pkg.latest || '0.0.0',
269
- location: pkg.location || name
270
- });
271
- }
272
- return packages;
273
- }
274
- catch (e) {
275
- // npm outdated 在没有过时包时会返回非零退出码
276
- if (e.status !== 0 && !e.message?.includes('npm outdated')) {
277
- return [];
278
- }
279
- return [];
280
- }
281
- }
282
- /**
283
- * 解析 `name` 或 `name@version` 形式,未带版本时从 npm 解析 latest,
284
- * 拼成 `name@version`,避免 npm 被本地 package.json 的 semver 约束卡住。
285
- */
286
- async function resolveTargetsWithVersion(targets) {
287
- return Promise.all(targets.map(async (spec) => {
288
- const m = spec.match(/^(.+?)@([^@]+)$/);
289
- // 形如 @scope/name@1.2.3 或 name@1.2.3 且版本以数字开头 -> 已带版本
290
- if (m && m[2] && /^\d/.test(m[2]))
291
- return spec;
292
- const latest = await getLatestVersion(spec);
293
- return latest ? `${spec}@${latest}` : spec;
294
- }));
295
- }
296
- /**
297
- * 自动更新 npm 包, 传 `name@version` 形式的目标让 npm install 不被本地
298
- * package.json 的 semver 约束卡住(旧版只传 name 时, npm 看到本地
299
- * package.json 里 "^0.3.x" 已经满足就判 up to date, 永远升不上去)
300
- */
301
- async function updatePackagesWithVersion(packagesWithVersion) {
302
- const parsed = packagesWithVersion.map(spec => {
303
- const at = spec.lastIndexOf('@');
304
- if (at <= 0)
305
- return { name: spec, version: '' };
306
- return { name: spec.slice(0, at), version: spec.slice(at + 1) };
307
- });
308
- const targets = parsed.map(p => p.name);
309
- const before = new Map();
310
- for (const p of targets)
311
- before.set(p, getInstalledVersion(p));
312
- // 用 targetsWithVersion 直接拼命令 - 包含具体版本号, 不会被本地约束拦截
313
- const args = ['npm', 'install', '-g', ...packagesWithVersion];
314
- notify(`\n${CYAN}📦 正在更新包...${RESET}\n`, RESET);
315
- try {
316
- execSync(args.join(' '), {
317
- encoding: 'utf-8',
318
- timeout: 300000,
319
- stdio: 'inherit',
320
- // 全局安装与 cwd 无关,用中性目录避免本地 package.json 干扰
321
- cwd: process.env.TMPDIR || '/tmp'
322
- });
323
- }
324
- catch (e) {
325
- return {
326
- success: false,
327
- updated: false,
328
- message: '更新失败',
329
- error: e.message
330
- };
331
- }
332
- // install 退出码 0 并不等于"真的升上去了" ("up to date" 也是 0)。
333
- // 重新读取磁盘版本, 只有真的达到 latest 之一才算 updated。
334
- const upgraded = [];
335
- for (const p of parsed) {
336
- const after = getInstalledVersion(p.name);
337
- const was = before.get(p.name);
338
- if (after && was && compareVersions(was, after) < 0) {
339
- upgraded.push(p.name);
340
- }
341
- }
342
- if (upgraded.length > 0) {
343
- return {
344
- success: true,
345
- updated: true,
346
- message: `已更新: ${upgraded.join(', ')}`,
347
- updatedPackages: upgraded
348
- };
349
- }
350
- return {
351
- success: true,
352
- updated: false,
353
- message: '已是最新版本,无需重启',
354
- updatedPackages: []
39
+ version: r.currentVersion,
40
+ latest: r.latestVersion || r.currentVersion,
41
+ outdated,
42
+ packages: outdated
43
+ ? [{
44
+ name: PKG_NAME,
45
+ current: r.currentVersion,
46
+ wanted: r.latestVersion,
47
+ latest: r.latestVersion,
48
+ location: r.installMethod,
49
+ }]
50
+ : [],
355
51
  };
356
52
  }
357
53
  /**
358
- * 自动更新 npm 包(不传版本时自动解析 latest)
359
- */
360
- async function updatePackages(packages) {
361
- const targets = packages && packages.length > 0 ? packages : [PKG_NAME];
362
- const withVersion = await resolveTargetsWithVersion(targets);
363
- return updatePackagesWithVersion(withVersion);
364
- }
365
- function loadUpdateConfig() {
366
- const def = { autoUpdate: true, autoRestart: true, checkIntervalHours: 24 };
367
- try {
368
- const cfgPath = path.join(BOLLOON_DIR, 'config.json');
369
- if (fs.existsSync(cfgPath)) {
370
- const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf-8'));
371
- if (typeof cfg.autoUpdate === 'boolean')
372
- def.autoUpdate = cfg.autoUpdate;
373
- if (typeof cfg.autoRestart === 'boolean')
374
- def.autoRestart = cfg.autoRestart;
375
- }
376
- }
377
- catch {
378
- // 忽略
379
- }
380
- return def;
381
- }
382
- function readCache() {
383
- try {
384
- if (fs.existsSync(UPDATE_CACHE)) {
385
- return JSON.parse(fs.readFileSync(UPDATE_CACHE, 'utf-8'));
386
- }
387
- }
388
- catch {
389
- // 忽略
390
- }
391
- return {};
392
- }
393
- function writeCache(patch) {
394
- try {
395
- fs.mkdirSync(BOLLOON_DIR, { recursive: true });
396
- const merged = { ...readCache(), ...patch, lastCheck: Date.now() };
397
- fs.writeFileSync(UPDATE_CACHE, JSON.stringify(merged));
398
- }
399
- catch {
400
- // 忽略
401
- }
402
- }
403
- function shouldCheckNow(cfg) {
404
- const cache = readCache();
405
- const last = cache.lastCheck || 0;
406
- const interval = cfg.checkIntervalHours * 3600 * 1000;
407
- return Date.now() - last >= interval;
408
- }
409
- /**
410
- * 判断本次启动是否应执行自动更新检查。
411
- * 显式屏蔽(--no-update / BOLLOON_SKIP_UPDATE)始终优先。
412
- * 否则依据 config.json 的 autoUpdate(默认开启)或显式允许标志。
413
- */
414
- function resolveAutoUpdatePolicy() {
415
- const blockFlag = process.argv.includes('--no-update') || process.argv.includes('--skip-update');
416
- const blockEnv = process.env.BOLLOON_SKIP_UPDATE === 'true';
417
- const allowFlag = process.argv.includes('--update-check')
418
- || process.argv.includes('--update-now')
419
- || process.argv.includes('--allow-update');
420
- const allowEnv = process.env.BOLLOON_AUTO_UPDATE === '1';
421
- const cfg = loadUpdateConfig();
422
- const blocked = blockFlag || blockEnv;
423
- const enabled = cfg.autoUpdate || allowFlag || allowEnv;
424
- return { blocked, enabled, allowFlag, allowEnv, cfg };
425
- }
426
- /**
427
- * 检查并自动更新(启动时调用)
54
+ * 启动时的检查 (后台调用)。
428
55
  *
429
- * @param opts.force 忽略节流/配置强制检查
430
- * @param opts.onUpdated 安装成功且允许自动重启时调用(由调用方提供模式相关的重启逻辑,
431
- * 例如 Electron 用 app.relaunch(),Node 用 detached 重新 spawn)。
432
- * 若未提供或 autoRestart=false,则仅提示用户手动重启。
56
+ * @param opts.force 忽略节流与开关强制检查 (手动触发)
57
+ * @param opts.onUpdated 已安装新版本且允许自动重启时调用 (调用方给模式相关的重启逻辑);
58
+ * 未提供或 autoRestart=false 时只提示用户手动重启。
433
59
  */
434
60
  export async function checkAndUpdate(opts = {}) {
435
- const policy = resolveAutoUpdatePolicy();
436
- if (policy.blocked) {
61
+ const home = resolveBolloonHome();
62
+ const blocked = process.argv.includes('--no-update')
63
+ || process.argv.includes('--skip-update')
64
+ || process.env.BOLLOON_SKIP_UPDATE === '1'
65
+ || process.env.BOLLOON_SKIP_UPDATE === 'true';
66
+ if (blocked) {
437
67
  return { hasUpdate: false, info: null, updated: false, message: '跳过更新检查(已显式禁用)' };
438
68
  }
439
- if (!policy.enabled && !opts.force) {
440
- return { hasUpdate: false, info: null, updated: false, message: '自动更新已关闭 (config.json autoUpdate=false,或设置 BOLLOON_AUTO_UPDATE=1 开启)' };
441
- }
442
- // 节流:除非显式触发或强制,否则距离上次检查不足间隔就跳过
443
- if (!opts.force && !policy.allowFlag && !policy.allowEnv && !shouldCheckNow(policy.cfg)) {
444
- return { hasUpdate: false, info: null, updated: false, message: '距上次检查不足间隔,跳过' };
69
+ const prefs = await readUpdatePrefs({ home });
70
+ const explicit = opts.force
71
+ || process.argv.includes('--update-check')
72
+ || process.argv.includes('--update-now')
73
+ || process.argv.includes('--allow-update');
74
+ if (!prefs.checkUpdates && !explicit) {
75
+ return {
76
+ hasUpdate: false, info: null, updated: false,
77
+ message: '更新检查已关闭 (config.json checkUpdates=false; BOLLOON_SKIP_UPDATE=1 也可临时关闭)',
78
+ };
445
79
  }
446
- notify(`\n${CYAN}🔍 检查更新...${RESET}`, RESET);
80
+ let r;
447
81
  try {
448
- const bolloonInfo = await checkBolloonUpdates();
449
- if (bolloonInfo && bolloonInfo.outdated) {
450
- notify(`\n${YELLOW}⚠️ 发现新版本: ${bolloonInfo.latest}${RESET}\n`, RESET);
451
- notify(` 当前版本: ${bolloonInfo.version}\n`, RESET);
452
- notify(` 最新版本: ${bolloonInfo.latest}\n\n`, RESET);
453
- // 避免对同一个版本反复自动安装失败:记录上次尝试
454
- const cache = readCache();
455
- const lastAttempt = cache.lastAttempt || {};
456
- if (lastAttempt.version === bolloonInfo.latest && lastAttempt.ok === false && !opts.force) {
457
- notify(`${YELLOW}💡 该版本上次自动更新失败,请手动运行: bolloon --update-now${RESET}\n\n`, RESET);
458
- writeCache({ lastCheck: Date.now() });
82
+ r = await checkForUpdate({ home, force: !!explicit });
83
+ }
84
+ catch (e) {
85
+ // 检查失败**绝不**报"已是最新"
86
+ notify(`⚠ 更新检查失败: ${e?.message || e}`, YELLOW);
87
+ return { hasUpdate: false, info: null, updated: false, message: `检查失败: ${e?.message || e}` };
88
+ }
89
+ const info = checkResultToPackageInfo(r);
90
+ switch (r.status) {
91
+ case 'up_to_date':
92
+ notify(`✓ 已是最新版本 (${r.currentVersion})`, GREEN);
93
+ return { hasUpdate: false, info, updated: false, message: '已是最新版本' };
94
+ case 'update_available': {
95
+ notify(`⚠ 发现新版本: ${r.currentVersion} → ${r.latestVersion}`, YELLOW);
96
+ if (!prefs.autoInstall) {
97
+ notify(' 当前设置为**只通知不自动安装** (autoInstall=false)。更新: bolloon update plan → bolloon update now', CYAN);
459
98
  return {
460
- hasUpdate: true,
461
- info: bolloonInfo,
462
- updated: false,
463
- message: `更新 ${bolloonInfo.latest} 上次失败,需手动更新`
99
+ hasUpdate: true, info, updated: false,
100
+ message: `发现新版 ${r.latestVersion}(未自动安装;运行 bolloon update now 更新)`,
464
101
  };
465
102
  }
466
- // 自动更新(用户要求:检测到新版本包时自动更新)
467
- const targetsWithVersion = bolloonInfo.packages.map(p => `${p.name}@${p.latest}`);
468
- const result = await updatePackagesWithVersion(targetsWithVersion);
469
- if (result.success && result.updated) {
470
- writeCache({ lastAttempt: { version: bolloonInfo.latest, ok: true } });
471
- // 通知主进程更新完成
472
- process.emit('bolloon-update-complete', result);
473
- // 安装成功:按配置自动重启,或退回手动提示
474
- if (opts.onUpdated && policy.cfg.autoRestart) {
475
- notify(`\n${GREEN}✅ 已更新到 ${bolloonInfo.latest},即将自动重启以应用新版本...${RESET}\n\n`, RESET);
476
- // 调用方执行模式相关的重启(Electron: app.relaunch(); Node: detached spawn)。
477
- // 此调用预期会退出当前进程,不会返回。
103
+ notify(' 自动安装已开启 (autoInstall=true),执行更新...', CYAN);
104
+ const res = await applyUpdate({
105
+ home, strategy: 'now',
106
+ onStage: notifyQuiet ? undefined : (s, d) => notify(` [${s}] ${d}`),
107
+ });
108
+ if (res.ok) {
109
+ try {
110
+ process.emit('bolloon-update-complete', res);
111
+ }
112
+ catch { /* 忽略 */ }
113
+ if (opts.onUpdated && prefs.autoRestart) {
114
+ notify(`✅ 已更新到 ${res.to},即将自动重启以应用新版本...`, GREEN);
115
+ // 调用方执行模式相关的重启 (Electron: app.relaunch(); Node: detached spawn)。
116
+ // 预期不会返回; 兜底 exit 防"重启后还在旧进程里"。
478
117
  opts.onUpdated();
479
- // 兜底:若 onUpdated 意外返回,则手动退出
480
118
  process.exit(0);
481
119
  }
482
- notify(`\n${GREEN}✅ 已更新到 ${bolloonInfo.latest}!请重新启动应用${RESET}\n`, RESET);
483
- notify(`${YELLOW}💡 请重新运行 bolloon 以使用新版本${RESET}\n\n`, RESET);
484
- return {
485
- hasUpdate: true,
486
- info: bolloonInfo,
487
- updated: true,
488
- message: `已更新到 ${bolloonInfo.latest}`
489
- };
490
- }
491
- else if (result.success && !result.updated) {
492
- // npm 判定已是最新(未真正升级),记录失败避免反复尝试
493
- writeCache({ lastAttempt: { version: bolloonInfo.latest, ok: false } });
494
- notify(` ${YELLOW}⚠ 已是最新(无需重启)${RESET}\n\n`, RESET);
495
- return {
496
- hasUpdate: true,
497
- info: bolloonInfo,
498
- updated: false,
499
- message: '已是最新版本'
500
- };
501
- }
502
- else {
503
- writeCache({ lastAttempt: { version: bolloonInfo.latest, ok: false } });
504
- notify(` ${YELLOW}⚠ 自动更新失败: ${result.error}${RESET}\n`, RESET);
505
- notify(`${YELLOW}💡 可手动运行: bolloon --update-now${RESET}\n\n`, RESET);
506
- return {
507
- hasUpdate: true,
508
- info: bolloonInfo,
509
- updated: false,
510
- message: `更新失败: ${result.error}`
511
- };
120
+ notify(`✅ 已更新到 ${res.to}!请重新启动应用`, GREEN);
121
+ return { hasUpdate: true, info, updated: true, message: `已更新到 ${res.to}` };
512
122
  }
123
+ notify(`⚠ 更新未成功 (${res.stage}): ${res.reason}`, YELLOW);
124
+ notify(` 旧版本仍在 (${res.from}),可继续使用;详情: bolloon update status`, YELLOW);
125
+ return { hasUpdate: true, info, updated: false, message: `更新失败: ${res.reason}` };
513
126
  }
514
- else {
515
- notify(` ${GREEN}✓${RESET} 已是最新版本 (${bolloonInfo?.version || 'unknown'})\n`, RESET);
516
- writeCache({ lastAttempt: { version: '', ok: true } });
517
- return {
518
- hasUpdate: false,
519
- info: bolloonInfo,
520
- updated: false,
521
- message: '已是最新版本'
522
- };
523
- }
524
- }
525
- catch (e) {
526
- notify(` ${YELLOW}⚠${RESET} 更新检查失败: ${e.message}\n`, RESET);
527
- return {
528
- hasUpdate: false,
529
- info: null,
530
- updated: false,
531
- message: `检查失败: ${e.message}`
532
- };
533
- }
534
- }
535
- /**
536
- * 仅检查更新,不自动安装
537
- */
127
+ // 关键: 网络失败**绝不**显示"已是最新"
128
+ case 'offline':
129
+ notify('⚠ 无法检查更新: 离线 (连不上 npm registry) — 这不代表是最新版', YELLOW);
130
+ return { hasUpdate: false, info, updated: false, message: '更新检查失败(离线)' };
131
+ case 'registry_unavailable':
132
+ notify(`⚠ 无法检查更新: registry 不可用 (${r.reason || '未知'}) — 这不代表是最新版`, YELLOW);
133
+ return { hasUpdate: false, info, updated: false, message: '更新检查失败(registry 不可用)' };
134
+ case 'unsupported_installation':
135
+ return { hasUpdate: false, info, updated: false, message: `当前安装方式不支持自动更新 (${r.installMethod})` };
136
+ case 'local_version_unknown':
137
+ notify('⚠ 读不到本地版本,跳过更新判断', YELLOW);
138
+ return { hasUpdate: false, info, updated: false, message: '读不到本地版本' };
139
+ case 'check_skipped':
140
+ default:
141
+ return { hasUpdate: false, info, updated: false, message: '距上次检查不足间隔,跳过' };
142
+ }
143
+ }
144
+ /** 仅检查, 不安装 (兼容旧调用点; 结论来自同一个 Update Manager)。 */
538
145
  export async function checkForUpdates() {
539
- return await checkBolloonUpdates();
146
+ const r = await checkForUpdate({ home: resolveBolloonHome(), force: true });
147
+ return checkResultToPackageInfo(r);
540
148
  }
541
- /**
542
- * 手动触发更新
543
- */
544
- export async function performUpdate(packages) {
545
- return await updatePackages(packages);
149
+ /** 手动执行更新 (兼容旧调用点; 现在走同一条 applyUpdate 流水线)。 */
150
+ export async function performUpdate(_packages) {
151
+ const home = resolveBolloonHome();
152
+ const res = await applyUpdate({ home, strategy: 'now' });
153
+ return {
154
+ success: res.ok,
155
+ updated: res.ok,
156
+ message: res.ok ? `已更新到 ${res.to}` : (res.reason || '更新失败'),
157
+ updatedPackages: res.ok ? [PKG_NAME, CONSTRAINT_PKG_NAME] : [],
158
+ error: res.ok ? undefined : res.reason,
159
+ };
160
+ }
161
+ /** 版本比较 (旧导出, 转发到唯一实现)。 */
162
+ export function compareVersionsLegacy(a, b) {
163
+ return compareVersions(a, b);
546
164
  }
547
- // CLI 入口
165
+ // CLI 入口: `node dist/utils/auto-update.js [check|update]`
548
166
  if (process.argv[1]?.includes('auto-update')) {
549
167
  (async () => {
550
- const command = process.argv[2];
551
- switch (command) {
552
- case 'check':
553
- const info = await checkForUpdates();
554
- if (info) {
555
- console.log(JSON.stringify(info, null, 2));
556
- }
557
- break;
558
- case 'update':
559
- const result = await performUpdate(process.argv.slice(3));
560
- console.log(JSON.stringify(result, null, 2));
561
- break;
562
- default:
563
- await checkAndUpdate();
168
+ const cmd = process.argv[2];
169
+ if (cmd === 'check') {
170
+ console.log(JSON.stringify(await checkForUpdates(), null, 2));
171
+ }
172
+ else if (cmd === 'update') {
173
+ console.log(JSON.stringify(await performUpdate(), null, 2));
174
+ }
175
+ else {
176
+ console.log(JSON.stringify(await checkAndUpdate({ force: true }), null, 2));
564
177
  }
565
- })();
178
+ })().catch((e) => { console.error(e); process.exit(1); });
566
179
  }