@bolloon/bolloon-agent 0.4.27 → 0.4.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/bolloon.cjs +18 -148
- package/bin/bolloon.cmd +6 -3
- package/dist/agents/execution-supervisor.js +21 -0
- package/dist/agents/pi-sdk-tools.js +3 -1
- package/dist/agents/pi-sdk.js +4 -1
- package/dist/agents/task/local-seller.js +149 -0
- package/dist/agents/task/report-card.js +146 -0
- package/dist/agents/task/resource-advisor.js +182 -0
- package/dist/agents/task/task-budget.js +103 -0
- package/dist/agents/task/task-runner.js +618 -0
- package/dist/agents/x402/goal-run-bridge.js +10 -6
- package/dist/agents/x402/resource-contract.js +12 -1
- package/dist/cli/update-commands.js +349 -0
- package/dist/cli-entry.js +133 -53
- package/dist/electron-build/agents/agent-gateway.js +169 -0
- package/dist/electron-build/agents/agent-gateway.js.map +1 -0
- package/dist/electron-build/agents/agent-identity-store.js +212 -0
- package/dist/electron-build/agents/agent-identity-store.js.map +1 -0
- package/dist/electron-build/agents/agent-identity.js +196 -0
- package/dist/electron-build/agents/agent-identity.js.map +1 -0
- package/dist/electron-build/agents/agent-manifest-protocol.js +151 -0
- package/dist/electron-build/agents/agent-manifest-protocol.js.map +1 -0
- package/dist/electron-build/agents/agent-registry.js +217 -0
- package/dist/electron-build/agents/agent-registry.js.map +1 -0
- package/dist/electron-build/agents/agent-reputation.js +60 -0
- package/dist/electron-build/agents/agent-reputation.js.map +1 -0
- package/dist/electron-build/agents/agent-service-client.js +186 -0
- package/dist/electron-build/agents/agent-service-client.js.map +1 -0
- package/dist/electron-build/agents/browser-cdp.js +765 -0
- package/dist/electron-build/agents/browser-cdp.js.map +1 -0
- package/dist/electron-build/agents/computer-use.js +341 -0
- package/dist/electron-build/agents/computer-use.js.map +1 -0
- package/dist/electron-build/agents/constraint-layer.js +210 -0
- package/dist/electron-build/agents/constraint-layer.js.map +1 -0
- package/dist/electron-build/agents/decision-store.js +292 -0
- package/dist/electron-build/agents/decision-store.js.map +1 -0
- package/dist/electron-build/agents/deny-pipeline.js +125 -0
- package/dist/electron-build/agents/deny-pipeline.js.map +1 -0
- package/dist/electron-build/agents/economic-policy.js +172 -0
- package/dist/electron-build/agents/economic-policy.js.map +1 -0
- package/dist/electron-build/agents/error-classifier.js +125 -0
- package/dist/electron-build/agents/error-classifier.js.map +1 -0
- package/dist/electron-build/agents/execution-supervisor.js +539 -0
- package/dist/electron-build/agents/execution-supervisor.js.map +1 -0
- package/dist/electron-build/agents/external-events.js +171 -0
- package/dist/electron-build/agents/external-events.js.map +1 -0
- package/dist/electron-build/agents/gateway-join.js +315 -0
- package/dist/electron-build/agents/gateway-join.js.map +1 -0
- package/dist/electron-build/agents/gateway-network.js +505 -0
- package/dist/electron-build/agents/gateway-network.js.map +1 -0
- package/dist/electron-build/agents/goal-criteria.js +133 -0
- package/dist/electron-build/agents/goal-criteria.js.map +1 -0
- package/dist/electron-build/agents/goal-resume.js +364 -0
- package/dist/electron-build/agents/goal-resume.js.map +1 -0
- package/dist/electron-build/agents/goal-store.js +587 -0
- package/dist/electron-build/agents/goal-store.js.map +1 -0
- package/dist/electron-build/agents/intent-classifier.js +104 -0
- package/dist/electron-build/agents/intent-classifier.js.map +1 -0
- package/dist/electron-build/agents/iroh-secret.js +70 -0
- package/dist/electron-build/agents/iroh-secret.js.map +1 -0
- package/dist/electron-build/agents/loop-review.js +101 -0
- package/dist/electron-build/agents/loop-review.js.map +1 -0
- package/dist/electron-build/agents/memory-recall.js +154 -0
- package/dist/electron-build/agents/memory-recall.js.map +1 -0
- package/dist/electron-build/agents/p2p-document-tools.js +328 -0
- package/dist/electron-build/agents/p2p-document-tools.js.map +1 -0
- package/dist/electron-build/agents/parse-tool-call.js +564 -0
- package/dist/electron-build/agents/parse-tool-call.js.map +1 -0
- package/dist/electron-build/agents/patch-tool.js +205 -0
- package/dist/electron-build/agents/patch-tool.js.map +1 -0
- package/dist/electron-build/agents/payment-approval.js +183 -0
- package/dist/electron-build/agents/payment-approval.js.map +1 -0
- package/dist/electron-build/agents/payment-gate.js +139 -0
- package/dist/electron-build/agents/payment-gate.js.map +1 -0
- package/dist/electron-build/agents/permission-mode.js +124 -0
- package/dist/electron-build/agents/permission-mode.js.map +1 -0
- package/dist/electron-build/agents/pi-harness.js +268 -0
- package/dist/electron-build/agents/pi-harness.js.map +1 -0
- package/dist/electron-build/agents/pi-sdk-session-factory.js +117 -0
- package/dist/electron-build/agents/pi-sdk-session-factory.js.map +1 -0
- package/dist/electron-build/agents/pi-sdk-session-manager.js +335 -0
- package/dist/electron-build/agents/pi-sdk-session-manager.js.map +1 -0
- package/dist/electron-build/agents/pi-sdk-tools.js +4042 -0
- package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -0
- package/dist/electron-build/agents/pi-sdk-types.js +17 -0
- package/dist/electron-build/agents/pi-sdk-types.js.map +1 -0
- package/dist/electron-build/agents/pi-sdk.js +3325 -0
- package/dist/electron-build/agents/pi-sdk.js.map +1 -0
- package/dist/electron-build/agents/plan-store.js +212 -0
- package/dist/electron-build/agents/plan-store.js.map +1 -0
- package/dist/electron-build/agents/pre-tool-validator.js +200 -0
- package/dist/electron-build/agents/pre-tool-validator.js.map +1 -0
- package/dist/electron-build/agents/process-runner.js +148 -0
- package/dist/electron-build/agents/process-runner.js.map +1 -0
- package/dist/electron-build/agents/react-loop.js +131 -0
- package/dist/electron-build/agents/react-loop.js.map +1 -0
- package/dist/electron-build/agents/resource-store.js +180 -0
- package/dist/electron-build/agents/resource-store.js.map +1 -0
- package/dist/electron-build/agents/resource-token.js +118 -0
- package/dist/electron-build/agents/resource-token.js.map +1 -0
- package/dist/electron-build/agents/resource-wallet.js +84 -0
- package/dist/electron-build/agents/resource-wallet.js.map +1 -0
- package/dist/electron-build/agents/run-store.js +854 -0
- package/dist/electron-build/agents/run-store.js.map +1 -0
- package/dist/electron-build/agents/runner-resolver.js +267 -0
- package/dist/electron-build/agents/runner-resolver.js.map +1 -0
- package/dist/electron-build/agents/session-store.js +294 -0
- package/dist/electron-build/agents/session-store.js.map +1 -0
- package/dist/electron-build/agents/shell-guard.js +465 -0
- package/dist/electron-build/agents/shell-guard.js.map +1 -0
- package/dist/electron-build/agents/shell-tool.js +102 -0
- package/dist/electron-build/agents/shell-tool.js.map +1 -0
- package/dist/electron-build/agents/skill-loader.js +216 -0
- package/dist/electron-build/agents/skill-loader.js.map +1 -0
- package/dist/electron-build/agents/skill-readiness.js +174 -0
- package/dist/electron-build/agents/skill-readiness.js.map +1 -0
- package/dist/electron-build/agents/skill-share.js +394 -0
- package/dist/electron-build/agents/skill-share.js.map +1 -0
- package/dist/electron-build/agents/skill-supervisor-link.js +75 -0
- package/dist/electron-build/agents/skill-supervisor-link.js.map +1 -0
- package/dist/electron-build/agents/skill-writer.js +347 -0
- package/dist/electron-build/agents/skill-writer.js.map +1 -0
- package/dist/electron-build/agents/skills-manager.js +763 -0
- package/dist/electron-build/agents/skills-manager.js.map +1 -0
- package/dist/electron-build/agents/supervisor-host.js +294 -0
- package/dist/electron-build/agents/supervisor-host.js.map +1 -0
- package/dist/electron-build/agents/task/local-seller.js +188 -0
- package/dist/electron-build/agents/task/local-seller.js.map +1 -0
- package/dist/electron-build/agents/task/report-card.js +152 -0
- package/dist/electron-build/agents/task/report-card.js.map +1 -0
- package/dist/electron-build/agents/task/resource-advisor.js +222 -0
- package/dist/electron-build/agents/task/resource-advisor.js.map +1 -0
- package/dist/electron-build/agents/task/task-budget.js +111 -0
- package/dist/electron-build/agents/task/task-budget.js.map +1 -0
- package/dist/electron-build/agents/task/task-runner.js +670 -0
- package/dist/electron-build/agents/task/task-runner.js.map +1 -0
- package/dist/electron-build/agents/task-state.js +266 -0
- package/dist/electron-build/agents/task-state.js.map +1 -0
- package/dist/electron-build/agents/tool-registry.js +141 -0
- package/dist/electron-build/agents/tool-registry.js.map +1 -0
- package/dist/electron-build/agents/treasury-bridge.js +165 -0
- package/dist/electron-build/agents/treasury-bridge.js.map +1 -0
- package/dist/electron-build/agents/user-questions.js +223 -0
- package/dist/electron-build/agents/user-questions.js.map +1 -0
- package/dist/electron-build/agents/verify-recipe.js +90 -0
- package/dist/electron-build/agents/verify-recipe.js.map +1 -0
- package/dist/electron-build/agents/workflow-engine.js +222 -0
- package/dist/electron-build/agents/workflow-engine.js.map +1 -0
- package/dist/electron-build/agents/workflow-pivot-loop.js +988 -0
- package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -0
- package/dist/electron-build/agents/write-staging.js +133 -0
- package/dist/electron-build/agents/write-staging.js.map +1 -0
- package/dist/electron-build/agents/x402/goal-run-bridge.js +115 -0
- package/dist/electron-build/agents/x402/goal-run-bridge.js.map +1 -0
- package/dist/electron-build/agents/x402/milestone-settlement.js +163 -0
- package/dist/electron-build/agents/x402/milestone-settlement.js.map +1 -0
- package/dist/electron-build/agents/x402/paid-info-protocol.js +274 -0
- package/dist/electron-build/agents/x402/paid-info-protocol.js.map +1 -0
- package/dist/electron-build/agents/x402/paid-info-store.js +409 -0
- package/dist/electron-build/agents/x402/paid-info-store.js.map +1 -0
- package/dist/electron-build/agents/x402/paid-info-tools.js +346 -0
- package/dist/electron-build/agents/x402/paid-info-tools.js.map +1 -0
- package/dist/electron-build/agents/x402/payment-recovery.js +330 -0
- package/dist/electron-build/agents/x402/payment-recovery.js.map +1 -0
- package/dist/electron-build/agents/x402/resource-contract.js +533 -0
- package/dist/electron-build/agents/x402/resource-contract.js.map +1 -0
- package/dist/electron-build/agents/x402/settlement-state.js +432 -0
- package/dist/electron-build/agents/x402/settlement-state.js.map +1 -0
- package/dist/electron-build/agents/x402/trade.js +294 -0
- package/dist/electron-build/agents/x402/trade.js.map +1 -0
- package/dist/electron-build/agents/x402/transaction-protocol.js +109 -0
- package/dist/electron-build/agents/x402/transaction-protocol.js.map +1 -0
- package/dist/electron-build/agents/x402/transaction-store.js +404 -0
- package/dist/electron-build/agents/x402/transaction-store.js.map +1 -0
- package/dist/electron-build/agents/x402/x402Pay.js +377 -0
- package/dist/electron-build/agents/x402/x402Pay.js.map +1 -0
- package/dist/electron-build/bollharness-integration/context-router-judgment.js +269 -0
- package/dist/electron-build/bollharness-integration/context-router-judgment.js.map +1 -0
- package/dist/electron-build/bollharness-integration/context-router.js +584 -0
- package/dist/electron-build/bollharness-integration/context-router.js.map +1 -0
- package/dist/electron-build/bollharness-integration/gate-state-machine.js +362 -0
- package/dist/electron-build/bollharness-integration/gate-state-machine.js.map +1 -0
- package/dist/electron-build/bollharness-integration/gate-transition-hooks.js +136 -0
- package/dist/electron-build/bollharness-integration/gate-transition-hooks.js.map +1 -0
- package/dist/electron-build/bollharness-integration/guard-checker.js +400 -0
- package/dist/electron-build/bollharness-integration/guard-checker.js.map +1 -0
- package/dist/electron-build/bollharness-integration/index.js +123 -0
- package/dist/electron-build/bollharness-integration/index.js.map +1 -0
- package/dist/electron-build/bollharness-integration/integration.js +531 -0
- package/dist/electron-build/bollharness-integration/integration.js.map +1 -0
- package/dist/electron-build/bollharness-integration/skill-adapter.js +608 -0
- package/dist/electron-build/bollharness-integration/skill-adapter.js.map +1 -0
- package/dist/electron-build/bootstrap/bootstrap.js +173 -0
- package/dist/electron-build/bootstrap/bootstrap.js.map +1 -0
- package/dist/electron-build/bootstrap/context-collector.js +358 -0
- package/dist/electron-build/bootstrap/context-collector.js.map +1 -0
- package/dist/electron-build/bootstrap/context-hierarchy.js +262 -0
- package/dist/electron-build/bootstrap/context-hierarchy.js.map +1 -0
- package/dist/electron-build/bootstrap/context-manager.js +211 -0
- package/dist/electron-build/bootstrap/context-manager.js.map +1 -0
- package/dist/electron-build/bootstrap/context-os.js +277 -0
- package/dist/electron-build/bootstrap/context-os.js.map +1 -0
- package/dist/electron-build/bootstrap/event-log.js +203 -0
- package/dist/electron-build/bootstrap/event-log.js.map +1 -0
- package/dist/electron-build/bootstrap/exhaust-scrubber.js +277 -0
- package/dist/electron-build/bootstrap/exhaust-scrubber.js.map +1 -0
- package/dist/electron-build/bootstrap/lifecycle-hooks.js +282 -0
- package/dist/electron-build/bootstrap/lifecycle-hooks.js.map +1 -0
- package/dist/electron-build/bootstrap/memory-compressor.js +377 -0
- package/dist/electron-build/bootstrap/memory-compressor.js.map +1 -0
- package/dist/electron-build/bootstrap/persona-loader.js +219 -0
- package/dist/electron-build/bootstrap/persona-loader.js.map +1 -0
- package/dist/electron-build/bootstrap/project-context.js +162 -0
- package/dist/electron-build/bootstrap/project-context.js.map +1 -0
- package/dist/electron-build/bootstrap/project-state.js +205 -0
- package/dist/electron-build/bootstrap/project-state.js.map +1 -0
- package/dist/electron-build/bootstrap/session-window.js +162 -0
- package/dist/electron-build/bootstrap/session-window.js.map +1 -0
- package/dist/electron-build/bootstrap/vector-index.js +291 -0
- package/dist/electron-build/bootstrap/vector-index.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +22 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/clobShared.js +86 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/clobShared.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +37 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/createOrder.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +20 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getMarket.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +29 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/getOrders.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +28 -0
- package/dist/electron-build/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/SafeSDK/deploySafe.js +10 -0
- package/dist/electron-build/constraint-runtime/src/tools/SafeSDK/deploySafe.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/autoPay.js +68 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/autoPay.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/createWallet.js +14 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/createWallet.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/getBalance.js +17 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/getBalance.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/importWallet.js +59 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/importWallet.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/sendTransaction.js +29 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/sendTransaction.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/signMessage.js +14 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/signMessage.js.map +1 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/transferToken.js +29 -0
- package/dist/electron-build/constraint-runtime/src/tools/WalletTools/transferToken.js.map +1 -0
- package/dist/electron-build/constraints/index.js +11 -0
- package/dist/electron-build/constraints/index.js.map +1 -0
- package/dist/electron-build/context-compaction/auto-compact.js +182 -0
- package/dist/electron-build/context-compaction/auto-compact.js.map +1 -0
- package/dist/electron-build/context-compaction/budget-gate.js +32 -0
- package/dist/electron-build/context-compaction/budget-gate.js.map +1 -0
- package/dist/electron-build/context-compaction/budget-reduce.js +39 -0
- package/dist/electron-build/context-compaction/budget-reduce.js.map +1 -0
- package/dist/electron-build/context-compaction/context-collapse.js +71 -0
- package/dist/electron-build/context-compaction/context-collapse.js.map +1 -0
- package/dist/electron-build/context-compaction/index.js +38 -0
- package/dist/electron-build/context-compaction/index.js.map +1 -0
- package/dist/electron-build/context-compaction/microcompact.js +55 -0
- package/dist/electron-build/context-compaction/microcompact.js.map +1 -0
- package/dist/electron-build/context-compaction/pipeline.js +128 -0
- package/dist/electron-build/context-compaction/pipeline.js.map +1 -0
- package/dist/electron-build/context-compaction/snip.js +50 -0
- package/dist/electron-build/context-compaction/snip.js.map +1 -0
- package/dist/electron-build/context-compaction/token-estimator.js +40 -0
- package/dist/electron-build/context-compaction/token-estimator.js.map +1 -0
- package/dist/electron-build/context-compaction/types.js +21 -0
- package/dist/electron-build/context-compaction/types.js.map +1 -0
- package/dist/electron-build/cron/tick-lock.js +247 -0
- package/dist/electron-build/cron/tick-lock.js.map +1 -0
- package/dist/electron-build/documents/reader.js +131 -0
- package/dist/electron-build/documents/reader.js.map +1 -0
- package/dist/electron-build/documents/store.js +220 -0
- package/dist/electron-build/documents/store.js.map +1 -0
- package/dist/electron-build/external-engines/delegate-handle.js +76 -0
- package/dist/electron-build/external-engines/delegate-handle.js.map +1 -0
- package/dist/electron-build/external-engines/delegate.js +225 -0
- package/dist/electron-build/external-engines/delegate.js.map +1 -0
- package/dist/electron-build/external-engines/discovery.js +448 -0
- package/dist/electron-build/external-engines/discovery.js.map +1 -0
- package/dist/electron-build/external-engines/types.js +13 -0
- package/dist/electron-build/external-engines/types.js.map +1 -0
- package/dist/electron-build/hooks/hooks-engine.js +367 -0
- package/dist/electron-build/hooks/hooks-engine.js.map +1 -0
- package/dist/electron-build/judgeness/reflect.js +100 -0
- package/dist/electron-build/judgeness/reflect.js.map +1 -0
- package/dist/electron-build/judgeness/store.js +536 -0
- package/dist/electron-build/judgeness/store.js.map +1 -0
- package/dist/electron-build/judgeness/types.js +21 -0
- package/dist/electron-build/judgeness/types.js.map +1 -0
- package/dist/electron-build/llm/config-store.js +551 -0
- package/dist/electron-build/llm/config-store.js.map +1 -0
- package/dist/electron-build/llm/error-lessons.js +76 -0
- package/dist/electron-build/llm/error-lessons.js.map +1 -0
- package/dist/electron-build/llm/pi-ai.js +830 -0
- package/dist/electron-build/llm/pi-ai.js.map +1 -0
- package/dist/electron-build/llm/system-prompt/registry.js +318 -0
- package/dist/electron-build/llm/system-prompt/registry.js.map +1 -0
- package/dist/electron-build/llm/system-prompt/strip-hibsml.js +55 -0
- package/dist/electron-build/llm/system-prompt/strip-hibsml.js.map +1 -0
- package/dist/electron-build/locales/en.js +32 -0
- package/dist/electron-build/locales/en.js.map +1 -0
- package/dist/electron-build/locales/zh.js +30 -0
- package/dist/electron-build/locales/zh.js.map +1 -0
- package/dist/electron-build/lsp/lsp-manager.js +327 -0
- package/dist/electron-build/lsp/lsp-manager.js.map +1 -0
- package/dist/electron-build/lsp/lsp-tools.js +226 -0
- package/dist/electron-build/lsp/lsp-tools.js.map +1 -0
- package/dist/electron-build/migration/external-agent-migrator.js +451 -0
- package/dist/electron-build/migration/external-agent-migrator.js.map +1 -0
- package/dist/electron-build/network/agent-network.js +775 -0
- package/dist/electron-build/network/agent-network.js.map +1 -0
- package/dist/electron-build/network/goal-event-bridge.js +62 -0
- package/dist/electron-build/network/goal-event-bridge.js.map +1 -0
- package/dist/electron-build/network/iroh-integration.js +117 -0
- package/dist/electron-build/network/iroh-integration.js.map +1 -0
- package/dist/electron-build/network/iroh-transport.js +550 -0
- package/dist/electron-build/network/iroh-transport.js.map +1 -0
- package/dist/electron-build/network/p2p.js +1103 -0
- package/dist/electron-build/network/p2p.js.map +1 -0
- package/dist/electron-build/network/storage/adapters/json-adapter.js +416 -0
- package/dist/electron-build/network/storage/adapters/json-adapter.js.map +1 -0
- package/dist/electron-build/network/storage/types.js +18 -0
- package/dist/electron-build/network/storage/types.js.map +1 -0
- package/dist/electron-build/orbitdb/agent-tools.js +402 -0
- package/dist/electron-build/orbitdb/agent-tools.js.map +1 -0
- package/dist/electron-build/orbitdb/cid-database.js +284 -0
- package/dist/electron-build/orbitdb/cid-database.js.map +1 -0
- package/dist/electron-build/orbitdb/context-store.js +99 -0
- package/dist/electron-build/orbitdb/context-store.js.map +1 -0
- package/dist/electron-build/orbitdb/ipfs-node.js +120 -0
- package/dist/electron-build/orbitdb/ipfs-node.js.map +1 -0
- package/dist/electron-build/orbitdb/kanban-store.js +299 -0
- package/dist/electron-build/orbitdb/kanban-store.js.map +1 -0
- package/dist/electron-build/orbitdb/task-store.js +155 -0
- package/dist/electron-build/orbitdb/task-store.js.map +1 -0
- package/dist/electron-build/orbitdb/trajectory-store.js +194 -0
- package/dist/electron-build/orbitdb/trajectory-store.js.map +1 -0
- package/dist/electron-build/orbitdb/ui-cid.js +77 -0
- package/dist/electron-build/orbitdb/ui-cid.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-a2ui/index.js +89 -0
- package/dist/electron-build/pi-ecosystem-a2ui/index.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-goals/index.js +512 -0
- package/dist/electron-build/pi-ecosystem-goals/index.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/adaptive-scan.js +325 -0
- package/dist/electron-build/pi-ecosystem-judgment/adaptive-scan.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/causal-judge.js +492 -0
- package/dist/electron-build/pi-ecosystem-judgment/causal-judge.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/cleanup.js +167 -0
- package/dist/electron-build/pi-ecosystem-judgment/cleanup.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/decision.js +321 -0
- package/dist/electron-build/pi-ecosystem-judgment/decision.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/detect-hook.js +175 -0
- package/dist/electron-build/pi-ecosystem-judgment/detect-hook.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/distill-prompt.js +232 -0
- package/dist/electron-build/pi-ecosystem-judgment/distill-prompt.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/distillation.js +304 -0
- package/dist/electron-build/pi-ecosystem-judgment/distillation.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/evolve-judgment.js +176 -0
- package/dist/electron-build/pi-ecosystem-judgment/evolve-judgment.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/human-value-pipeline.js +65 -0
- package/dist/electron-build/pi-ecosystem-judgment/human-value-pipeline.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/human-value-store.js +808 -0
- package/dist/electron-build/pi-ecosystem-judgment/human-value-store.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/index.js +508 -0
- package/dist/electron-build/pi-ecosystem-judgment/index.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/injection-gate.js +334 -0
- package/dist/electron-build/pi-ecosystem-judgment/injection-gate.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/monitor-gate.js +228 -0
- package/dist/electron-build/pi-ecosystem-judgment/monitor-gate.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-judgment/value-injection.js +598 -0
- package/dist/electron-build/pi-ecosystem-judgment/value-injection.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-mcp/index.js +643 -0
- package/dist/electron-build/pi-ecosystem-mcp/index.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-mcp/ui-tools.js +116 -0
- package/dist/electron-build/pi-ecosystem-mcp/ui-tools.js.map +1 -0
- package/dist/electron-build/pi-ecosystem-subagents/index.js +352 -0
- package/dist/electron-build/pi-ecosystem-subagents/index.js.map +1 -0
- package/dist/electron-build/security/builtin-guards.js +133 -0
- package/dist/electron-build/security/builtin-guards.js.map +1 -0
- package/dist/electron-build/security/context-router-tool.js +111 -0
- package/dist/electron-build/security/context-router-tool.js.map +1 -0
- package/dist/electron-build/security/input-scanner.js +263 -0
- package/dist/electron-build/security/input-scanner.js.map +1 -0
- package/dist/electron-build/security/react-harness.js +148 -0
- package/dist/electron-build/security/react-harness.js.map +1 -0
- package/dist/electron-build/security/tool-gate.js +287 -0
- package/dist/electron-build/security/tool-gate.js.map +1 -0
- package/dist/electron-build/setup/setup-store.js +648 -0
- package/dist/electron-build/setup/setup-store.js.map +1 -0
- package/dist/electron-build/social/channels/ChannelManager.js +444 -0
- package/dist/electron-build/social/channels/ChannelManager.js.map +1 -0
- package/dist/electron-build/social/channels/DiapChannelBridge.js +451 -0
- package/dist/electron-build/social/channels/DiapChannelBridge.js.map +1 -0
- package/dist/electron-build/social/channels/InterestMatcher.js +135 -0
- package/dist/electron-build/social/channels/InterestMatcher.js.map +1 -0
- package/dist/electron-build/social/channels/types.js +21 -0
- package/dist/electron-build/social/channels/types.js.map +1 -0
- package/dist/electron-build/social/global-shared-context.js +368 -0
- package/dist/electron-build/social/global-shared-context.js.map +1 -0
- package/dist/electron-build/social/heartbeat.js +882 -0
- package/dist/electron-build/social/heartbeat.js.map +1 -0
- package/dist/electron-build/storage/did-catalog-bridge.js +314 -0
- package/dist/electron-build/storage/did-catalog-bridge.js.map +1 -0
- package/dist/electron-build/storage/did-catalog.js +272 -0
- package/dist/electron-build/storage/did-catalog.js.map +1 -0
- package/dist/electron-build/utils/auto-update.js +140 -558
- package/dist/electron-build/utils/auto-update.js.map +1 -1
- package/dist/electron-build/utils/module-context.js +98 -0
- package/dist/electron-build/utils/module-context.js.map +1 -0
- package/dist/electron-build/utils/runtime-bootstrap.js +745 -0
- package/dist/electron-build/utils/runtime-bootstrap.js.map +1 -0
- package/dist/electron-build/utils/update-manager.js +770 -0
- package/dist/electron-build/utils/update-manager.js.map +1 -0
- package/dist/electron-build/utils/update-state.js +406 -0
- package/dist/electron-build/utils/update-state.js.map +1 -0
- package/dist/electron-build/utils/version-info.js +562 -0
- package/dist/electron-build/utils/version-info.js.map +1 -0
- package/dist/electron-build/web/i18n.js +146 -0
- package/dist/electron-build/web/i18n.js.map +1 -0
- package/dist/electron-build/web/routes-x402-info.js +232 -0
- package/dist/electron-build/web/routes-x402-info.js.map +1 -0
- package/dist/electron-build/web/server-storage.js +390 -0
- package/dist/electron-build/web/server-storage.js.map +1 -0
- package/dist/electron-build/web/server-types.js +52 -0
- package/dist/electron-build/web/server-types.js.map +1 -0
- package/dist/electron-build/web/task-deps.js +41 -0
- package/dist/electron-build/web/task-deps.js.map +1 -0
- package/dist/index.js +28 -27
- package/dist/llm/system-prompt/registry.js +6 -3
- package/dist/utils/auto-update.js +138 -525
- package/dist/utils/module-context.js +59 -0
- package/dist/utils/runtime-bootstrap.js +682 -0
- package/dist/utils/update-cli.js +82 -0
- package/dist/utils/update-health.js +401 -0
- package/dist/utils/update-manager.js +716 -0
- package/dist/utils/update-state.js +353 -0
- package/dist/utils/version-info.js +510 -0
- package/package.json +1 -1
- package/scripts/build-cli.js +32 -151
- package/scripts/postinstall.js +153 -76
|
@@ -35,7 +35,18 @@ const CAPABILITY_WORDS = ['schema_valid', 'source_declared', 'content_hash_bound
|
|
|
35
35
|
*/
|
|
36
36
|
export function parseResourceContract(frontmatter, opts = {}) {
|
|
37
37
|
const fm = frontmatter || {};
|
|
38
|
-
|
|
38
|
+
// 手写 SKILL.md 的 `resource: {…}` 常被最小 YAML 解析器当成**字符串**留下 → 这里两种都吃。
|
|
39
|
+
// (真跑抓到过: 夹具技能因此被判"没有资源契约字段", 顾问直接看不到任何可执行资源。)
|
|
40
|
+
let resObj = fm.resource;
|
|
41
|
+
if (typeof resObj === 'string') {
|
|
42
|
+
try {
|
|
43
|
+
resObj = JSON.parse(resObj);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
resObj = undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const raw = resObj && typeof resObj === 'object' ? resObj : fm;
|
|
39
50
|
const issues = [];
|
|
40
51
|
const name = String(raw?.name || opts.skillName || fm.name || '').trim();
|
|
41
52
|
const version = String(raw?.version || opts.skillVersion || fm.version || '').trim();
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* update-commands.ts — `bolloon --version` / `bolloon update` / `bolloon doctor` 的实现
|
|
3
|
+
* (Phase 1-7 的对外出口, 2026-09-19)
|
|
4
|
+
*
|
|
5
|
+
* 三个命令都只读同一个 `VersionInfo` / `UpdateState`, 不各自拼字符串:
|
|
6
|
+
* --version [--verbose|--json] 版本身份 (普通 / 诊断 / 机器)
|
|
7
|
+
* update [--plan|--status|--history|--now] 检查(默认) / 计划 / 状态 / 历史 / 执行
|
|
8
|
+
* doctor 安装入口 + 版本事实 + 更新状态的自洽性
|
|
9
|
+
*
|
|
10
|
+
* 退出码 (供脚本用, 稳定约定):
|
|
11
|
+
* 0 正常 (检查成功 / 更新成功 / doctor healthy|degraded)
|
|
12
|
+
* 1 执行失败 (更新失败 / doctor failed)
|
|
13
|
+
* 2 检查不可用 (离线 / registry 不可用 / 读不到本地版本) —— 与"没有更新"区分开
|
|
14
|
+
*/
|
|
15
|
+
import { resolveBolloonHome } from '../setup/setup-store.js';
|
|
16
|
+
import { collectVersionInfo, renderVersionText, renderVersionJson, } from '../utils/version-info.js';
|
|
17
|
+
import { checkForUpdate, buildUpdatePlan, renderUpdatePlan, applyUpdate, readUpdateStatus, readHistory, renderHistory, updateSummaryFor, compareVersions, } from '../utils/update-manager.js';
|
|
18
|
+
import { runDoctor, renderDoctor } from '../utils/update-health.js';
|
|
19
|
+
import { detectRuntimeReport, bootstrapRuntimes, renderRuntimeReport, renderBootstrapPlan, RUNTIME_MIN, readRuntimeConfigWithFallback, } from '../utils/runtime-bootstrap.js';
|
|
20
|
+
const RESET = '\x1b[0m';
|
|
21
|
+
const BOLD = '\x1b[1m';
|
|
22
|
+
const CYAN = '\x1b[38;2;196;214;64m';
|
|
23
|
+
const GREEN = '\x1b[38;2;34;197;94m';
|
|
24
|
+
const YELLOW = '\x1b[38;2;245;158;11m';
|
|
25
|
+
const RED = '\x1b[38;2;239;68;68m';
|
|
26
|
+
const out = (s) => process.stdout.write(s + '\n');
|
|
27
|
+
const err = (s) => process.stderr.write(s + '\n');
|
|
28
|
+
// ── 版本 ────────────────────────────────────────────────────────────────────
|
|
29
|
+
export async function runVersionCommand(args = []) {
|
|
30
|
+
// 2026-09-19 (leo): 子命令一律**裸词**, 不再带 `--` 前缀 (只有 `--version` 本身保留 --)
|
|
31
|
+
// 为了不打断已经有脚本/肌肉记忆的用法, 旧的 `--verbose` / `--json` 仍然被接受。
|
|
32
|
+
const json = args.includes('json') || args.includes('--json');
|
|
33
|
+
const verbose = args.includes('verbose') || args.includes('--verbose') || args.includes('-V') || args.includes('all');
|
|
34
|
+
const home = resolveBolloonHome();
|
|
35
|
+
const update = await updateSummaryFor(home).catch(() => null);
|
|
36
|
+
// 运行时配置 (leo 2026-09-19: 展示安装信息时要展示这些配置)。
|
|
37
|
+
// 普通版做浅探测 (路径 + 版本); verbose/json 做**真执行验证** (git 建临时仓库/python 真跑脚本/node 真加载 CLI)。
|
|
38
|
+
const runtime = await detectRuntimeReport({ home, deep: verbose || json }).catch(() => null);
|
|
39
|
+
const rtCfg = await readRuntimeConfigWithFallback(home).catch(() => ({}));
|
|
40
|
+
const runtimeConfigBacked = Boolean(rtCfg.node);
|
|
41
|
+
// 机器版也要完整身份 (git commit / npm / Python) —— "给问题报告用"就必须有这些;
|
|
42
|
+
// 只有启动横幅那种高频场景才走 light。
|
|
43
|
+
const info = collectVersionInfo({ home, update, runtime, runtimeConfigBacked, light: false });
|
|
44
|
+
if (json) {
|
|
45
|
+
out(renderVersionJson(info));
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
if (!verbose) {
|
|
49
|
+
// 普通版: 首次问"我运行的到底是什么"时也顺手把更新事实刷新一次
|
|
50
|
+
// (不发通知, 只是别让用户看到永远空白的"尚未检查"; 迁移自旧缓存时 lastCheckStatus 为 null)
|
|
51
|
+
if (!info.update || !info.update.lastCheckAt || !info.update.lastCheckStatus) {
|
|
52
|
+
const r = await checkForUpdate({ home, force: false }).catch(() => null);
|
|
53
|
+
if (r) {
|
|
54
|
+
const fresh = await updateSummaryFor(home).catch(() => null);
|
|
55
|
+
if (fresh)
|
|
56
|
+
info.update = fresh;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
out(renderVersionText(info, { verbose }));
|
|
61
|
+
if (verbose) {
|
|
62
|
+
out('');
|
|
63
|
+
out('提示: bolloon --version json 给脚本/问题报告用; bolloon doctor 看安装是否自洽。');
|
|
64
|
+
}
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
// ── 更新状态渲染 ────────────────────────────────────────────────────────────
|
|
68
|
+
function statusConclusion(status, latest, current) {
|
|
69
|
+
switch (status) {
|
|
70
|
+
case 'up_to_date': return `${GREEN}已是最新${RESET} (${current})`;
|
|
71
|
+
case 'update_available': return `${YELLOW}有新版可用${RESET} (${current} → ${latest || '未知'})`;
|
|
72
|
+
case 'check_skipped': return `${CYAN}使用缓存结论${RESET} (未打网络)`;
|
|
73
|
+
case 'offline': return `${RED}离线${RESET} — 连不上 npm registry, ${BOLD}不能判定为最新${RESET}`;
|
|
74
|
+
case 'registry_unavailable': return `${RED}registry 不可用${RESET} — ${BOLD}不能判定为最新${RESET}`;
|
|
75
|
+
case 'local_version_unknown': return `${RED}读不到本地版本${RESET} — 不判断是否有更新`;
|
|
76
|
+
case 'unsupported_installation': {
|
|
77
|
+
// 仍然把"和最新比到底差多少"说清楚 —— 不支持自动更新 ≠ 不需要知道有没有新版
|
|
78
|
+
const cmp = !latest ? '' : compareVersions(current, latest) < 0 ? ` — 已有更新版 ${latest}, 需按该安装方式手动升级` : ` — 本地 ${current} 已是 registry 上最新`;
|
|
79
|
+
return `${YELLOW}当前安装方式不支持自动更新${RESET}${cmp}`;
|
|
80
|
+
}
|
|
81
|
+
default: return '尚未检查';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export function renderCheckResult(r) {
|
|
85
|
+
const L = [];
|
|
86
|
+
L.push(`当前版本: ${r.currentVersion}`);
|
|
87
|
+
L.push(`最新版本: ${r.latestVersion || '未知'}`);
|
|
88
|
+
L.push(`更新通道: ${r.channel} (来源: ${r.source})`);
|
|
89
|
+
L.push(`安装方式: ${r.installMethod}`);
|
|
90
|
+
L.push(`检查时间: ${r.checkedAt}${r.fromCache ? ' (缓存)' : ''}`);
|
|
91
|
+
L.push(`结论: ${statusConclusion(r.status, r.latestVersion, r.currentVersion)}`);
|
|
92
|
+
if (r.reason)
|
|
93
|
+
L.push(`说明: ${r.reason}`);
|
|
94
|
+
L.push('');
|
|
95
|
+
if (r.status === 'update_available') {
|
|
96
|
+
L.push(`下一步: ${BOLD}bolloon update plan${RESET} 看计划, ${BOLD}bolloon update now${RESET} 执行更新`);
|
|
97
|
+
}
|
|
98
|
+
else if (r.status === 'unsupported_installation') {
|
|
99
|
+
L.push('下一步: 按上面"说明"里对应安装方式更新 (源码目录: git pull && npm install && npm run build:all)');
|
|
100
|
+
}
|
|
101
|
+
else if (r.status === 'offline' || r.status === 'registry_unavailable') {
|
|
102
|
+
L.push('下一步: 检查网络/代理后重跑 `bolloon update`; 也可以 `bolloon update status` 看上次结论');
|
|
103
|
+
}
|
|
104
|
+
else if (r.status === 'local_version_unknown') {
|
|
105
|
+
L.push('下一步: 重新安装 (npm install -g @bolloon/bolloon-agent) 以恢复 package.json');
|
|
106
|
+
}
|
|
107
|
+
return L.join('\n');
|
|
108
|
+
}
|
|
109
|
+
export function renderStatusReport(s) {
|
|
110
|
+
const L = [];
|
|
111
|
+
const lu = s.lastUpdate;
|
|
112
|
+
L.push(`${BOLD}更新状态${RESET}`);
|
|
113
|
+
L.push(`当前版本: ${s.currentVersion}`);
|
|
114
|
+
L.push(`最新版本: ${s.latestVersion || (s.lastCheckStatus ? '未知' : '尚未检查')}`);
|
|
115
|
+
L.push(`是否最新: ${statusConclusion(s.lastCheckStatus, s.latestVersion, s.currentVersion)}`);
|
|
116
|
+
L.push(`更新通道: ${s.channel}`);
|
|
117
|
+
L.push(`安装方式: ${s.installMethod}`);
|
|
118
|
+
L.push(`安装目录: ${s.installDir}`);
|
|
119
|
+
L.push(`运行入口: ${s.entryPath}`);
|
|
120
|
+
L.push(`最近检查: ${s.lastCheckAt || '从未'}${s.lastCheckReason ? ` (${s.lastCheckReason})` : ''}`);
|
|
121
|
+
L.push(`最近更新: ${lu ? `${lu.at} ${lu.from} → ${lu.to} [${lu.status}]${lu.reason ? ` ${lu.reason}` : ''}` : '无记录'}`);
|
|
122
|
+
L.push(`最近失败: ${s.lastFailure ? `${s.lastFailure.at} @${s.lastFailure.stage}: ${s.lastFailure.reason}` : '无'}`);
|
|
123
|
+
L.push(`需要重启: ${s.needsRestart ? '是 (新版已就位, 重启后生效)' : '否'}`);
|
|
124
|
+
L.push(`更新锁: ${s.lock ? `有 (pid ${s.lock.pid}, ${s.lock.at}${s.lock.stale ? ', 已陈旧' : ''})` : '无'}`);
|
|
125
|
+
L.push(`开关: 检查更新=${s.prefs.checkUpdates} (${s.prefs.sources.checkUpdates}) · 自动安装=${s.prefs.autoInstall} (${s.prefs.sources.autoInstall}) · 自动重启=${s.prefs.autoRestart} (${s.prefs.sources.autoRestart})`);
|
|
126
|
+
return L.join('\n');
|
|
127
|
+
}
|
|
128
|
+
// ── update 子命令 ───────────────────────────────────────────────────────────
|
|
129
|
+
export async function runUpdateCommand(args = []) {
|
|
130
|
+
const home = resolveBolloonHome();
|
|
131
|
+
// 裸词优先 (bolloon update plan / status / history / now / wait / force / json),
|
|
132
|
+
// 同时兼容旧的 --plan / --status / ... 写法 (已有脚本不断裂)。
|
|
133
|
+
const has = (...f) => f.some((x) => args.includes(x));
|
|
134
|
+
const json = has('json', '--json');
|
|
135
|
+
// ── 状态 ──
|
|
136
|
+
if (has('status', '--status')) {
|
|
137
|
+
const s = await readUpdateStatus({ home });
|
|
138
|
+
if (json) {
|
|
139
|
+
out(JSON.stringify(s, null, 2));
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
out(renderStatusReport(s));
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
// ── 历史 ──
|
|
146
|
+
if (has('history', '--history')) {
|
|
147
|
+
const idx = args.findIndex((a) => a === 'history' || a === '--history');
|
|
148
|
+
const n = parseInt(args[idx + 1] || '10', 10);
|
|
149
|
+
const recs = await readHistory(Number.isFinite(n) && n > 0 ? n : 10, home);
|
|
150
|
+
if (json) {
|
|
151
|
+
out(JSON.stringify(recs, null, 2));
|
|
152
|
+
return 0;
|
|
153
|
+
}
|
|
154
|
+
out(renderHistory(recs));
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
// ── 计划 ──
|
|
158
|
+
if (has('plan', '--plan')) {
|
|
159
|
+
const plan = await buildUpdatePlan({ home, force: true });
|
|
160
|
+
if (json) {
|
|
161
|
+
out(JSON.stringify(plan, null, 2));
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
out(renderUpdatePlan(plan));
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
// ── 执行 ──
|
|
168
|
+
if (has('now', '--now')) {
|
|
169
|
+
const wait = has('wait', '--wait');
|
|
170
|
+
const force = has('force', '--force', '-f');
|
|
171
|
+
const plan = await buildUpdatePlan({ home, force: true });
|
|
172
|
+
if (!json)
|
|
173
|
+
out(renderUpdatePlan(plan));
|
|
174
|
+
if (!plan.ok && plan.blockers.length > 0) {
|
|
175
|
+
if (json)
|
|
176
|
+
out(JSON.stringify({ stage: 'blocked', reason: plan.blockers.join('; ') }, null, 2));
|
|
177
|
+
err(`${RED}✗ 更新被阻塞${RESET}: ${plan.blockers.join('; ')}`);
|
|
178
|
+
return 1;
|
|
179
|
+
}
|
|
180
|
+
if (!plan.targetVersion) {
|
|
181
|
+
if (json)
|
|
182
|
+
out(JSON.stringify({ stage: 'succeeded', ok: true, reason: '已是最新', from: plan.currentVersion, to: plan.currentVersion }, null, 2));
|
|
183
|
+
out(`${GREEN}✓ 已是最新, 无需更新${RESET} (${plan.currentVersion})`);
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
const res = await applyUpdate({
|
|
187
|
+
home,
|
|
188
|
+
strategy: wait ? 'wait' : 'now',
|
|
189
|
+
force,
|
|
190
|
+
onStage: json ? undefined : (stage, detail) => out(` [${stage}] ${detail}`),
|
|
191
|
+
});
|
|
192
|
+
if (json) {
|
|
193
|
+
out(JSON.stringify(res, null, 2));
|
|
194
|
+
return res.ok ? 0 : 1;
|
|
195
|
+
}
|
|
196
|
+
if (res.ok) {
|
|
197
|
+
out(`${GREEN}✓ 更新成功${RESET}: ${res.from} → ${res.to} (${(res.durationMs / 1000).toFixed(1)}s)`);
|
|
198
|
+
out(' 正在做更新后健康检查...');
|
|
199
|
+
const health = await runDoctor({ bolloonHome: home }).catch(() => null);
|
|
200
|
+
if (health) {
|
|
201
|
+
out(renderDoctor(health));
|
|
202
|
+
}
|
|
203
|
+
out(`${YELLOW}请重启 bolloon 以使用新版本${RESET}`);
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
if (res.stage === 'blocked') {
|
|
207
|
+
err(`${YELLOW}! ${res.reason}${RESET}`);
|
|
208
|
+
return 1;
|
|
209
|
+
}
|
|
210
|
+
err(`${RED}✗ 更新失败${RESET} (${res.stage}): ${res.reason}`);
|
|
211
|
+
err(` 旧版本仍在: ${res.from} — 可继续使用; 详情: bolloon update status`);
|
|
212
|
+
if (res.stage === 'rolled_back')
|
|
213
|
+
err(` 已回滚到 ${res.from}`);
|
|
214
|
+
return 1;
|
|
215
|
+
}
|
|
216
|
+
// ── 默认: 只检查, 给清晰结论 (显式命令 = 忽略节流) ──
|
|
217
|
+
const r = await checkForUpdate({ home, force: true });
|
|
218
|
+
if (json) {
|
|
219
|
+
out(JSON.stringify(r, null, 2));
|
|
220
|
+
return r.status === 'offline' || r.status === 'registry_unavailable' || r.status === 'local_version_unknown' ? 2 : 0;
|
|
221
|
+
}
|
|
222
|
+
out(renderCheckResult(r));
|
|
223
|
+
if (r.status !== 'up_to_date' && r.status !== 'check_skipped') {
|
|
224
|
+
out('');
|
|
225
|
+
out(`${YELLOW}提示${RESET}: 本次只检查, 没有安装任何东西。`);
|
|
226
|
+
}
|
|
227
|
+
if (r.status === 'offline' || r.status === 'registry_unavailable' || r.status === 'local_version_unknown')
|
|
228
|
+
return 2;
|
|
229
|
+
if (r.status === 'update_available' && compareVersions(r.currentVersion, r.latestVersion || r.currentVersion) >= 0)
|
|
230
|
+
return 0;
|
|
231
|
+
return 0;
|
|
232
|
+
}
|
|
233
|
+
// ── doctor ──────────────────────────────────────────────────────────────────
|
|
234
|
+
export async function runDoctorCommand(args = []) {
|
|
235
|
+
const home = resolveBolloonHome();
|
|
236
|
+
const json = args.includes('json') || args.includes('--json');
|
|
237
|
+
const skipNetwork = args.includes('offline') || args.includes('--offline');
|
|
238
|
+
const rep = await runDoctor({ bolloonHome: home, skipNetwork });
|
|
239
|
+
if (json) {
|
|
240
|
+
out(JSON.stringify(rep, null, 2));
|
|
241
|
+
return rep.grade === 'failed' ? 1 : 0;
|
|
242
|
+
}
|
|
243
|
+
out(renderDoctor(rep));
|
|
244
|
+
return rep.grade === 'failed' ? 1 : 0;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* `bolloon runtime [check|install|report|json|dry-run|yes]`
|
|
248
|
+
* check/report —— 只看 (Phase 5 报告: 四个运行时 + 五项能力)
|
|
249
|
+
* install —— 真安装缺失的运行时 (需要 yes; 不偷偷 sudo)
|
|
250
|
+
* dry-run —— 只显示将执行的命令
|
|
251
|
+
* json —— 机器可读
|
|
252
|
+
* 也是 `bolloon setup repair-runtime` 的同一实现 (只有一份)。
|
|
253
|
+
*/
|
|
254
|
+
export async function runRuntimeCommand(args = []) {
|
|
255
|
+
const home = resolveBolloonHome();
|
|
256
|
+
const json = args.includes('json') || args.includes('--json');
|
|
257
|
+
const dryRun = args.includes('dry-run') || args.includes('--dry-run');
|
|
258
|
+
const yes = args.includes('yes') || args.includes('--yes') || args.includes('-y');
|
|
259
|
+
const verbose = args.includes('verbose') || args.includes('--verbose');
|
|
260
|
+
const install = args.includes('install') || args.includes('repair') || args.includes('repair-runtime');
|
|
261
|
+
const wantPlan = args.includes('plan') || dryRun;
|
|
262
|
+
if (args.includes('help') || args.includes('--help')) {
|
|
263
|
+
out(`${BOLD}bolloon runtime${RESET} — 运行时 (Node/npm/Git/Python) 检查与安装`);
|
|
264
|
+
out('');
|
|
265
|
+
for (const [id, v] of Object.entries(RUNTIME_MIN))
|
|
266
|
+
out(` ${id.padEnd(7)} 最低 ${v.min.padEnd(8)} ${v.why}`);
|
|
267
|
+
out('');
|
|
268
|
+
out(' bolloon runtime 检查并给报告 (真执行验证)');
|
|
269
|
+
out(' bolloon runtime verbose 同上 + 路径/来源/验证时间');
|
|
270
|
+
out(' bolloon runtime plan 只看安装计划 (要装什么/用哪个包管理器/是否要管理员权限)');
|
|
271
|
+
out(' bolloon runtime install yes 真安装缺失项 (不偷偷 sudo; 需要管理员权限时会明确说)');
|
|
272
|
+
out(' bolloon runtime dry-run 只显示将执行的命令');
|
|
273
|
+
out(' bolloon runtime json 机器可读');
|
|
274
|
+
return 0;
|
|
275
|
+
}
|
|
276
|
+
if (wantPlan && !install) {
|
|
277
|
+
const before = await detectRuntimeReport({ home, deep: false });
|
|
278
|
+
const { planBootstrap } = await import('../utils/runtime-bootstrap.js');
|
|
279
|
+
const plan = planBootstrap(before.facts);
|
|
280
|
+
if (json) {
|
|
281
|
+
out(JSON.stringify({ report: before, plan }, null, 2));
|
|
282
|
+
return before.ok ? 0 : 1;
|
|
283
|
+
}
|
|
284
|
+
out(renderBootstrapPlan(plan));
|
|
285
|
+
return before.ok ? 0 : 1;
|
|
286
|
+
}
|
|
287
|
+
if (install && !json) {
|
|
288
|
+
// Phase 3: 真正改变系统之前先显示一次计划 (装什么/用什么装/要不要管理员权限/是否改 PATH)
|
|
289
|
+
const before = await detectRuntimeReport({ home, deep: false });
|
|
290
|
+
const { planBootstrap } = await import('../utils/runtime-bootstrap.js');
|
|
291
|
+
out(renderBootstrapPlan(planBootstrap(before.facts)));
|
|
292
|
+
out('');
|
|
293
|
+
if (install && !yes)
|
|
294
|
+
out(`${YELLOW}未带 yes: 只显示计划, 不执行安装${RESET} (加 yes 才真装)`);
|
|
295
|
+
}
|
|
296
|
+
// 只看 (check/report): 不经过安装流程, 免得打印"未获得同意"这种与本次目的无关的话
|
|
297
|
+
if (!install && !dryRun) {
|
|
298
|
+
const fresh = await detectRuntimeReport({ home, deep: true });
|
|
299
|
+
if (json) {
|
|
300
|
+
out(JSON.stringify(fresh, null, 2));
|
|
301
|
+
return fresh.ok ? 0 : 1;
|
|
302
|
+
}
|
|
303
|
+
out(renderRuntimeReport(fresh, { verbose }));
|
|
304
|
+
return fresh.ok ? 0 : 1;
|
|
305
|
+
}
|
|
306
|
+
const rep = await bootstrapRuntimes({
|
|
307
|
+
home,
|
|
308
|
+
dryRun,
|
|
309
|
+
yes: install ? yes : false,
|
|
310
|
+
onProgress: json ? undefined : (m) => out(` ${m}`),
|
|
311
|
+
});
|
|
312
|
+
if (json) {
|
|
313
|
+
out(JSON.stringify(rep, null, 2));
|
|
314
|
+
return rep.ok ? 0 : 1;
|
|
315
|
+
}
|
|
316
|
+
out(renderRuntimeReport(rep, { verbose: true }));
|
|
317
|
+
if (!rep.ok) {
|
|
318
|
+
out('');
|
|
319
|
+
out(`${YELLOW}不宣布安装成功${RESET}: ${rep.missing.concat(rep.belowMinimum).join(', ') || '运行时未全部就绪'}`);
|
|
320
|
+
return 1;
|
|
321
|
+
}
|
|
322
|
+
return 0;
|
|
323
|
+
}
|
|
324
|
+
export const UPDATE_HELP = `
|
|
325
|
+
${BOLD}版本与更新:${RESET} (子命令一律裸词, 不带 -- 前缀)
|
|
326
|
+
bolloon --version 版本 + 安装方式/目录/入口/通道/上游/是否最新
|
|
327
|
+
bolloon --version verbose 诊断版 (构建时间/git/Node/npm/Python/配置目录/最近更新)
|
|
328
|
+
bolloon --version json 机器版 (同一份 VersionInfo, 给脚本与问题报告)
|
|
329
|
+
bolloon update 只检查并给结论 (不安装任何东西)
|
|
330
|
+
bolloon update plan 更新计划: 要更新什么 / 不会动什么 / 风险检查
|
|
331
|
+
bolloon update status 更新状态: 最近检查/最近更新/失败/是否需重启/开关
|
|
332
|
+
bolloon update history [N] 最近 N 次更新 (时间 · 版本变化 · 结果 · 耗时 · 原因)
|
|
333
|
+
bolloon update now 真正执行更新 (默认先看计划)
|
|
334
|
+
bolloon update now wait 等当前 Run 结束后再更新 (有长期任务时的默认建议)
|
|
335
|
+
bolloon doctor 安装入口 + 版本事实 + 更新状态 + 运行时 是否自洽
|
|
336
|
+
bolloon doctor json 同上, 机器可读
|
|
337
|
+
bolloon runtime [plan|install|json] 运行时 (Node/npm/Git/Python) 检查与安装 (install 需显式 yes)
|
|
338
|
+
|
|
339
|
+
${BOLD}开关 (config.json):${RESET}
|
|
340
|
+
checkUpdates (默认 true) 启动时后台检查
|
|
341
|
+
autoInstall (默认 false) 自动安装 —— 默认关, 需显式打开
|
|
342
|
+
autoRestart (默认 false) 装完自动重启
|
|
343
|
+
${BOLD}环境变量 (临时覆盖, 不落盘):${RESET}
|
|
344
|
+
BOLLOON_SKIP_UPDATE=1 本次不检查
|
|
345
|
+
BOLLOON_AUTO_UPDATE=1 本次允许自动安装
|
|
346
|
+
BOLLOON_UPDATE_CHANNEL=stable|beta|dev
|
|
347
|
+
|
|
348
|
+
${BOLD}退出码:${RESET} 0 正常 · 1 执行失败 · 2 检查不可用 (离线/registry 不可用/读不到本地版本)
|
|
349
|
+
`;
|
package/dist/cli-entry.js
CHANGED
|
@@ -20,6 +20,8 @@ import { fileURLToPath } from 'url';
|
|
|
20
20
|
import { printBanner } from './cli/loading-tui.js';
|
|
21
21
|
import { discoverEngines, delegateToEngine } from './external-engines/index.js';
|
|
22
22
|
import { x402CheckBalance, x402Fetch } from './agents/x402/x402Pay.js';
|
|
23
|
+
import { runVersionCommand, runUpdateCommand, runDoctorCommand, runRuntimeCommand, UPDATE_HELP } from './cli/update-commands.js';
|
|
24
|
+
import { collectVersionInfo } from './utils/version-info.js';
|
|
23
25
|
import { createRequire } from 'module';
|
|
24
26
|
const _require = createRequire(import.meta.url);
|
|
25
27
|
const isWindows = process.platform === 'win32';
|
|
@@ -31,18 +33,8 @@ const CYAN = _fg(0xc4, 0xd6, 0x40); // #c4d640
|
|
|
31
33
|
const YELLOW = _fg(0xf5, 0x9e, 0x0b); // #f59e0b
|
|
32
34
|
const GREEN = _fg(0x22, 0xc5, 0x5e); // #22c55e
|
|
33
35
|
const MAGENTA = _fg(0xef, 0x44, 0x44); // #ef4444
|
|
34
|
-
// 版本信息 — 2026-
|
|
35
|
-
const VERSION = (
|
|
36
|
-
try {
|
|
37
|
-
const entryDir = path.dirname(fileURLToPath(import.meta.url));
|
|
38
|
-
const pkgPath = path.resolve(entryDir, '..', 'package.json');
|
|
39
|
-
const raw = fs.readFileSync(pkgPath, 'utf-8');
|
|
40
|
-
return JSON.parse(raw).version || '0.0.0';
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return '0.0.0';
|
|
44
|
-
}
|
|
45
|
-
})();
|
|
36
|
+
// 版本信息 — 2026-09-19: 统一走 version-info 的**唯一版本解析** (不再各读一遍 package.json)
|
|
37
|
+
const VERSION = collectVersionInfo({ light: true }).packageVersion;
|
|
46
38
|
function log(msg, color = RESET) {
|
|
47
39
|
console.log(`${color}${msg}${RESET}`);
|
|
48
40
|
}
|
|
@@ -58,12 +50,14 @@ ${BOLD}选项:${RESET}
|
|
|
58
50
|
--gui, -g 启动图形界面 (Electron)
|
|
59
51
|
--web, -w 启动 Web UI (浏览器)
|
|
60
52
|
--cli, -c 启动命令行界面
|
|
61
|
-
--version, -v
|
|
53
|
+
--version, -v 显示版本 (bolloon --version verbose / bolloon --version json)
|
|
62
54
|
--help, -h 显示帮助信息
|
|
63
55
|
|
|
64
56
|
${BOLD}命令:${RESET}
|
|
65
57
|
bolloon setup 初始化向导 (你的称呼 + 模型供应商 + API key + 连通性测试)
|
|
66
|
-
bolloon update [
|
|
58
|
+
bolloon update [plan|status|history|now] 检查更新 / 计划 / 状态 / 历史 / 执行 (默认只检查)
|
|
59
|
+
bolloon doctor 安装入口 + 版本事实 + 更新状态自洽性诊断
|
|
60
|
+
bolloon runtime [plan|install] 运行时 (Node/npm/Git/Python) 检查与安装
|
|
67
61
|
bolloon model [name] [model] 列出 / 切换模型供应商 (如: bolloon model deepseek deepseek-v4-flash)
|
|
68
62
|
bolloon model key <name> 配置某供应商的 API key (隐藏输入, 不回显)
|
|
69
63
|
bolloon model test [name] 测试供应商连通性
|
|
@@ -80,9 +74,11 @@ ${BOLD}示例:${RESET}
|
|
|
80
74
|
bolloon --web # 启动 Web UI
|
|
81
75
|
bolloon --cli # 命令行模式
|
|
82
76
|
bolloon model # 查看当前模型供应商
|
|
83
|
-
bolloon
|
|
84
|
-
bolloon update
|
|
85
|
-
bolloon update
|
|
77
|
+
bolloon update # 检查更新 (只读, 不改任何东西)
|
|
78
|
+
bolloon update plan # 看更新计划与风险检查
|
|
79
|
+
bolloon update now # 真正执行更新
|
|
80
|
+
bolloon doctor # 我这台机器的 Bolloon 是否自洽
|
|
81
|
+
${UPDATE_HELP}
|
|
86
82
|
|
|
87
83
|
${BOLD}环境变量:${RESET}
|
|
88
84
|
MINIMAX_API_KEY MiniMax API 密钥
|
|
@@ -134,7 +130,10 @@ function parseArgs() {
|
|
|
134
130
|
switch (mode) {
|
|
135
131
|
case '-v':
|
|
136
132
|
case '--version':
|
|
137
|
-
|
|
133
|
+
// 2026-09-19: --version 现在分三层 (普通/--verbose/--json), 参数必须往下传
|
|
134
|
+
return { mode: 'version', args: args.slice(1) };
|
|
135
|
+
case 'version':
|
|
136
|
+
return { mode: 'version', args: args.slice(1) };
|
|
138
137
|
case '-h':
|
|
139
138
|
case '--help':
|
|
140
139
|
return { mode: 'help', args: [] };
|
|
@@ -154,6 +153,12 @@ function parseArgs() {
|
|
|
154
153
|
// 2026-08-06: 子命令形式 (去掉 -- 前缀)
|
|
155
154
|
case 'update':
|
|
156
155
|
return { mode: 'update', args: args.slice(1) };
|
|
156
|
+
// 2026-09-19: 安装入口/版本事实/更新状态 自洽性诊断
|
|
157
|
+
case 'doctor':
|
|
158
|
+
return { mode: 'doctor', args: args.slice(1) };
|
|
159
|
+
// 2026-09-19: 运行时 (Node/npm/Git/Python) 检查与安装
|
|
160
|
+
case 'runtime':
|
|
161
|
+
return { mode: 'runtime', args: args.slice(1) };
|
|
157
162
|
case 'model':
|
|
158
163
|
return { mode: 'model', args: args.slice(1) };
|
|
159
164
|
// 2026-09-18: 智能体工具执行轨迹 + 本机 P2P 连接信息 (递给名片/小工具用)
|
|
@@ -161,6 +166,9 @@ function parseArgs() {
|
|
|
161
166
|
return { mode: 'trace', args: args.slice(1) };
|
|
162
167
|
case 'p2p':
|
|
163
168
|
return { mode: 'p2p', args: args.slice(1) };
|
|
169
|
+
// 2026-09-18: M1 唯一入口 —— 一个任务 → 一个 Skill → 一个报告卡
|
|
170
|
+
case 'task':
|
|
171
|
+
return { mode: 'task', args: args.slice(1) };
|
|
164
172
|
// 2026-09-13: 初始化向导 (用户身份 + 模型供应商 + API key)
|
|
165
173
|
case 'setup':
|
|
166
174
|
case 'init':
|
|
@@ -290,48 +298,102 @@ async function handleX402Command(x402Args) {
|
|
|
290
298
|
console.error(`未知 x402 子命令: ${sub}`);
|
|
291
299
|
process.exit(1);
|
|
292
300
|
}
|
|
293
|
-
/** update 子命令:
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
301
|
+
/** update 子命令: 2026-09-19 起统一走 src/cli/update-commands.ts 的 runUpdateCommand
|
|
302
|
+
* (旧实现只有"检查/--now"两种行为, 且各自拼一套版本信息 —— 已删除, 避免两套事实) */
|
|
303
|
+
/** model 子命令: 列出 / 切换模型供应商 (bolloon model [name] [model]) */
|
|
304
|
+
/**
|
|
305
|
+
* `bolloon trace [runId] [--json] [--last N]`
|
|
306
|
+
* 把 Run 的**工具执行轨迹**(真跑过什么工具、结果、耗时)导出来:
|
|
307
|
+
* 无参 → 列出最近几次运行 + 每步摘要; 带 runId → 输出完整轨迹 (文本或 JSON)。
|
|
308
|
+
* 文本格式与小工具/别的智能体对齐, 可直接复制粘贴交换。
|
|
309
|
+
*/
|
|
310
|
+
/**
|
|
311
|
+
* `bolloon task "<任务>" --budget 0.05 [--input '<json>'] [--json]`
|
|
312
|
+
* `bolloon task --resume <goalId>`
|
|
313
|
+
*
|
|
314
|
+
* M1 唯一入口 (leo 2026-09-18 冻结规则 ①): 用户只给任务和预算,
|
|
315
|
+
* 不点名 Skill、不看内部状态。进度只报 4 个用户态, 结论在报告卡里。
|
|
316
|
+
*/
|
|
317
|
+
async function handleTaskCommand(taskArgs) {
|
|
318
|
+
const { runTask, resumeTask } = await import('./agents/task/task-runner.js');
|
|
319
|
+
const wantJson = taskArgs.includes('--json');
|
|
320
|
+
const flag = (name) => {
|
|
321
|
+
const i = taskArgs.indexOf(name);
|
|
322
|
+
return i >= 0 ? taskArgs[i + 1] : undefined;
|
|
323
|
+
};
|
|
324
|
+
const resumeId = flag('--resume');
|
|
325
|
+
const budget = flag('--budget');
|
|
326
|
+
const perPurchase = flag('--per-purchase');
|
|
327
|
+
const daily = flag('--daily');
|
|
328
|
+
const inputRaw = flag('--input');
|
|
329
|
+
let input;
|
|
330
|
+
if (inputRaw !== undefined) {
|
|
331
|
+
try {
|
|
332
|
+
input = JSON.parse(inputRaw);
|
|
305
333
|
}
|
|
306
|
-
|
|
307
|
-
console.error(`${MAGENTA}
|
|
334
|
+
catch (e) {
|
|
335
|
+
console.error(`${MAGENTA}--input 不是合法 JSON: ${String(e?.message || e)}${RESET}`);
|
|
308
336
|
process.exit(1);
|
|
309
337
|
}
|
|
338
|
+
}
|
|
339
|
+
const STAGE_LABEL = { prepare: '准备中', acquire: '正在获取能力', execute: '正在执行', report: '报告' };
|
|
340
|
+
const onStage = (stage, note) => {
|
|
341
|
+
if (wantJson)
|
|
342
|
+
return;
|
|
343
|
+
console.error(` ${CYAN}${STAGE_LABEL[stage] || stage}${RESET} ${note}`);
|
|
344
|
+
};
|
|
345
|
+
if (resumeId) {
|
|
346
|
+
const r = await resumeTask({ goalId: resumeId, input, allowLocalDev: true });
|
|
347
|
+
if (wantJson)
|
|
348
|
+
console.log(JSON.stringify({ resumed: r.resumed, action: r.action, reason: r.reason, mustNotRepay: r.mustNotRepay, card: r.card }, null, 2));
|
|
349
|
+
else {
|
|
350
|
+
console.log('');
|
|
351
|
+
console.log(r.text);
|
|
352
|
+
console.log('');
|
|
353
|
+
}
|
|
354
|
+
process.exit(r.ok ? 0 : 1);
|
|
355
|
+
}
|
|
356
|
+
const words = taskArgs.filter((a, i) => {
|
|
357
|
+
if (a.startsWith('--'))
|
|
358
|
+
return false;
|
|
359
|
+
const prev = taskArgs[i - 1];
|
|
360
|
+
return !['--budget', '--per-purchase', '--daily', '--input'].includes(prev || '');
|
|
361
|
+
});
|
|
362
|
+
const task = words.join(' ').trim();
|
|
363
|
+
if (!task) {
|
|
364
|
+
console.log(`
|
|
365
|
+
${BOLD}bolloon task${RESET} — 给一个任务, 让智能体买到能力并做完它
|
|
366
|
+
|
|
367
|
+
${CYAN}bolloon task "判断这款厨房用品是否适合进入日本市场" --budget 0.05${RESET}
|
|
368
|
+
${CYAN}bolloon task --resume <goalId>${RESET}
|
|
369
|
+
|
|
370
|
+
选项:
|
|
371
|
+
--budget <USDC> 这笔任务最多花多少 (M1 硬上限 0.05; 不能中途扩大)
|
|
372
|
+
--per-purchase <USDC> 单次购买上限 (M1 硬上限 0.02)
|
|
373
|
+
--daily <USDC> 当日预算 (M1 硬上限 0.10)
|
|
374
|
+
--input '<json>' 显式给技能输入 (跳过自动推导)
|
|
375
|
+
--json 机器可读输出
|
|
376
|
+
`);
|
|
310
377
|
return;
|
|
311
378
|
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
console.log(` - ${p.name}: ${p.current} → ${p.latest}`);
|
|
322
|
-
console.log(`\n 运行 ${GREEN}bolloon update --now${RESET} 执行更新`);
|
|
379
|
+
const r = await runTask({ task, budget, perPurchase, daily, input, allowLocalDev: true, onStage });
|
|
380
|
+
if (wantJson) {
|
|
381
|
+
console.log(JSON.stringify({
|
|
382
|
+
ok: r.ok, status: r.card.status, conclusion: r.card.conclusion, card: r.card,
|
|
383
|
+
goalId: r.goalId, runId: r.runId, transactionId: r.transactionId,
|
|
384
|
+
advisor: r.advisor, payment: r.payment, outputIssues: r.outputIssues,
|
|
385
|
+
budget: { taskBudget: r.budget.taskBudget, perPurchase: r.budget.perPurchase, daily: r.budget.daily, clamped: r.budget.clamped },
|
|
386
|
+
stages: r.stages,
|
|
387
|
+
}, null, 2));
|
|
323
388
|
}
|
|
324
389
|
else {
|
|
325
|
-
console.log(
|
|
390
|
+
console.log('');
|
|
391
|
+
console.log(r.text);
|
|
392
|
+
console.log('');
|
|
326
393
|
}
|
|
394
|
+
// 一次性命令: 显式收尾 (DIAP/HTTP 句柄不该吊住进程)
|
|
395
|
+
process.exit(r.ok ? 0 : 1);
|
|
327
396
|
}
|
|
328
|
-
/** model 子命令: 列出 / 切换模型供应商 (bolloon model [name] [model]) */
|
|
329
|
-
/**
|
|
330
|
-
* `bolloon trace [runId] [--json] [--last N]`
|
|
331
|
-
* 把 Run 的**工具执行轨迹**(真跑过什么工具、结果、耗时)导出来:
|
|
332
|
-
* 无参 → 列出最近几次运行 + 每步摘要; 带 runId → 输出完整轨迹 (文本或 JSON)。
|
|
333
|
-
* 文本格式与小工具/别的智能体对齐, 可直接复制粘贴交换。
|
|
334
|
-
*/
|
|
335
397
|
async function handleTraceCommand(traceArgs) {
|
|
336
398
|
const { listRuns, readRun } = await import('./agents/run-store.js');
|
|
337
399
|
const { runToTraceText, runToTraceJson, summarizeTrace } = await import('./agents/trace-export.js');
|
|
@@ -426,6 +488,11 @@ async function handleSetupCommand(setupArgs) {
|
|
|
426
488
|
const i = setupArgs.indexOf(name);
|
|
427
489
|
return i >= 0 && i + 1 < setupArgs.length ? setupArgs[i + 1] : undefined;
|
|
428
490
|
};
|
|
491
|
+
if (setupArgs.includes('repair-runtime') || setupArgs.includes('--repair-runtime')) {
|
|
492
|
+
// Phase 7: 补装缺失运行时 (与 bolloon runtime install yes 同一实现)
|
|
493
|
+
console.log(`${BOLD}setup repair-runtime${RESET} — 检查并补装 Node/npm/Git/Python (不偷偷 sudo)`);
|
|
494
|
+
process.exit(await runRuntimeCommand(['install', 'yes']));
|
|
495
|
+
}
|
|
429
496
|
if (setupArgs.includes('--help') || setupArgs.includes('-h')) {
|
|
430
497
|
console.log(`${BOLD}bolloon setup${RESET} — 初始化 Bolloon (用户身份 + 模型供应商 + API key)`);
|
|
431
498
|
console.log('');
|
|
@@ -435,6 +502,7 @@ async function handleSetupCommand(setupArgs) {
|
|
|
435
502
|
console.log(' --model <名> 指定模型');
|
|
436
503
|
console.log(' --name <称呼> 你的称呼 (写入 ~/.bolloon/identity/user.json)');
|
|
437
504
|
console.log(' --no-test 跳过连通性测试');
|
|
505
|
+
console.log(' repair-runtime 检查并补装缺失运行时 (Node/npm/Git/Python)');
|
|
438
506
|
return;
|
|
439
507
|
}
|
|
440
508
|
const apiKey = val('--api-key');
|
|
@@ -641,7 +709,8 @@ async function main() {
|
|
|
641
709
|
const { mode, args } = parseArgs();
|
|
642
710
|
switch (mode) {
|
|
643
711
|
case 'version':
|
|
644
|
-
|
|
712
|
+
// 2026-09-19: 三层版本输出 (普通/--verbose/--json) 全走同一个 VersionInfo
|
|
713
|
+
process.exit(await runVersionCommand(args));
|
|
645
714
|
break;
|
|
646
715
|
case 'help':
|
|
647
716
|
printHelp();
|
|
@@ -665,7 +734,14 @@ async function main() {
|
|
|
665
734
|
break;
|
|
666
735
|
// 2026-08-06: 子命令 (bolloon update / bolloon model)
|
|
667
736
|
case 'update':
|
|
668
|
-
await
|
|
737
|
+
process.exit(await runUpdateCommand(args));
|
|
738
|
+
break;
|
|
739
|
+
case 'doctor':
|
|
740
|
+
process.exit(await runDoctorCommand(args));
|
|
741
|
+
break;
|
|
742
|
+
// 2026-09-19: 运行时检查/安装 (与 install.sh / postinstall / doctor 同一实现)
|
|
743
|
+
case 'runtime':
|
|
744
|
+
process.exit(await runRuntimeCommand(args));
|
|
669
745
|
break;
|
|
670
746
|
case 'model':
|
|
671
747
|
await handleModelCommand(args);
|
|
@@ -677,6 +753,10 @@ async function main() {
|
|
|
677
753
|
case 'p2p':
|
|
678
754
|
await handleP2pCommand(args);
|
|
679
755
|
break;
|
|
756
|
+
// 2026-09-18: M1 任务闭环 (bolloon task "<任务>" --budget 0.05 / --resume <goalId>)
|
|
757
|
+
case 'task':
|
|
758
|
+
await handleTaskCommand(args);
|
|
759
|
+
break;
|
|
680
760
|
// 2026-09-13: bolloon setup — 首次运行初始化向导
|
|
681
761
|
case 'setup':
|
|
682
762
|
await handleSetupCommand(args);
|