@bolloon/bolloon-agent 0.4.28 → 0.4.30
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/contacts/chain.js +579 -0
- package/dist/agents/contacts/cli.js +158 -0
- package/dist/agents/contacts/consent.js +124 -0
- package/dist/agents/contacts/grant-payload.js +45 -0
- package/dist/agents/contacts/grants.js +451 -0
- package/dist/agents/contacts/policy.js +264 -0
- package/dist/agents/contacts/preview-types.js +6 -0
- package/dist/agents/contacts/providers.js +341 -0
- package/dist/agents/contacts/store.js +326 -0
- package/dist/agents/contacts/tools.js +154 -0
- package/dist/agents/contacts/types.js +148 -0
- package/dist/agents/pi-sdk-tools.js +3 -1
- package/dist/agents/pi-sdk.js +14 -1
- package/dist/cli/update-commands.js +349 -0
- package/dist/cli-entry.js +41 -55
- 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/contacts/chain.js +619 -0
- package/dist/electron-build/agents/contacts/chain.js.map +1 -0
- package/dist/electron-build/agents/contacts/consent.js +163 -0
- package/dist/electron-build/agents/contacts/consent.js.map +1 -0
- package/dist/electron-build/agents/contacts/grant-payload.js +52 -0
- package/dist/electron-build/agents/contacts/grant-payload.js.map +1 -0
- package/dist/electron-build/agents/contacts/grants.js +500 -0
- package/dist/electron-build/agents/contacts/grants.js.map +1 -0
- package/dist/electron-build/agents/contacts/policy.js +271 -0
- package/dist/electron-build/agents/contacts/policy.js.map +1 -0
- package/dist/electron-build/agents/contacts/preview-types.js +8 -0
- package/dist/electron-build/agents/contacts/preview-types.js.map +1 -0
- package/dist/electron-build/agents/contacts/providers.js +384 -0
- package/dist/electron-build/agents/contacts/providers.js.map +1 -0
- package/dist/electron-build/agents/contacts/store.js +370 -0
- package/dist/electron-build/agents/contacts/store.js.map +1 -0
- package/dist/electron-build/agents/contacts/tools.js +159 -0
- package/dist/electron-build/agents/contacts/tools.js.map +1 -0
- package/dist/electron-build/agents/contacts/types.js +166 -0
- package/dist/electron-build/agents/contacts/types.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 +3335 -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 +291 -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 +58 -27
- package/dist/llm/system-prompt/registry.js +6 -3
- package/dist/security/tool-gate.js +4 -0
- 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/dist/web/mobile-contacts.js +329 -0
- package/dist/web/mobile-core.js +481 -15
- package/dist/web/mobile.html +32 -0
- package/dist/web/mobile.js +139 -0
- package/dist/web/routes-contacts.js +420 -0
- package/dist/web/server.js +5 -0
- package/package.json +1 -1
- package/scripts/build-cli.js +32 -151
- package/scripts/postinstall.js +153 -76
|
@@ -0,0 +1,830 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.MinimaxLLM = exports.PiAIModel = void 0;
|
|
37
|
+
exports.setSystemPrependProvider = setSystemPrependProvider;
|
|
38
|
+
exports.getSystemPrependProvider = getSystemPrependProvider;
|
|
39
|
+
exports.initPiAI = initPiAI;
|
|
40
|
+
exports.getModel = getModel;
|
|
41
|
+
exports.isModelAvailable = isModelAvailable;
|
|
42
|
+
exports.getMinimax = getMinimax;
|
|
43
|
+
exports.initMinimax = initMinimax;
|
|
44
|
+
exports.getChatErrorLessons = getChatErrorLessons;
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const undici_1 = require("undici");
|
|
48
|
+
/**
|
|
49
|
+
* 外部 system 注入钩子.
|
|
50
|
+
* 调用方 (e.g. auto-evolve-loop) 用 setSystemPrependProvider() 注册一个返回字符串的函数,
|
|
51
|
+
* generateText 在拼 finalMessages 时, 把返回的字符串作为最前一个 system message.
|
|
52
|
+
*
|
|
53
|
+
* 用途: P2P 协作时把"行级 reserve 状态"实时塞给 LLM,
|
|
54
|
+
* 让 LLM 主动避开对方正在改的代码行.
|
|
55
|
+
*
|
|
56
|
+
* 返回 '' / null / undefined → 不注入.
|
|
57
|
+
*/
|
|
58
|
+
let _prependProvider = null;
|
|
59
|
+
function setSystemPrependProvider(p) {
|
|
60
|
+
_prependProvider = p;
|
|
61
|
+
}
|
|
62
|
+
function getSystemPrependProvider() {
|
|
63
|
+
return _prependProvider;
|
|
64
|
+
}
|
|
65
|
+
class PiAIModel {
|
|
66
|
+
config;
|
|
67
|
+
provider;
|
|
68
|
+
/** 单次 LLM HTTP 请求硬上限 (ms), 防止上游卡住挂死整个 loop. 可通过 BOLLOON_LLM_TIMEOUT 覆盖. */
|
|
69
|
+
requestTimeoutMs;
|
|
70
|
+
constructor(config) {
|
|
71
|
+
this.config = config;
|
|
72
|
+
this.provider = config.provider;
|
|
73
|
+
const envTimeout = Number(process.env.BOLLOON_LLM_TIMEOUT);
|
|
74
|
+
this.requestTimeoutMs = Number.isFinite(envTimeout) && envTimeout > 0 ? envTimeout : 120_000;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 把外部 signal 和内部 timeout 合并: 任一触发都 abort.
|
|
78
|
+
* - 外部 signal 优先 (用户主动 abort)
|
|
79
|
+
* - 否则套 120s timeout
|
|
80
|
+
* - 任一不合法 (非 AbortSignal 实例) 时退到无 signal
|
|
81
|
+
*/
|
|
82
|
+
combinedSignal(external) {
|
|
83
|
+
const valid = external instanceof AbortSignal ? external : undefined;
|
|
84
|
+
// Node 18+ 支持 AbortSignal.timeout, 旧版本兜底用 setTimeout 构造
|
|
85
|
+
if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function') {
|
|
86
|
+
const timeoutSignal = AbortSignal.timeout(this.requestTimeoutMs);
|
|
87
|
+
if (!valid)
|
|
88
|
+
return timeoutSignal;
|
|
89
|
+
// 合并两个 signal
|
|
90
|
+
const ctrl = new AbortController();
|
|
91
|
+
const onAbort = () => ctrl.abort();
|
|
92
|
+
valid.addEventListener('abort', onAbort, { once: true });
|
|
93
|
+
timeoutSignal.addEventListener('abort', onAbort, { once: true });
|
|
94
|
+
if (valid.aborted || timeoutSignal.aborted)
|
|
95
|
+
ctrl.abort();
|
|
96
|
+
return ctrl.signal;
|
|
97
|
+
}
|
|
98
|
+
return valid;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 与 LLM 对话.
|
|
102
|
+
*
|
|
103
|
+
* 支持三种调用形式:
|
|
104
|
+
* - 旧: chat(message: string, context?: string, signal?)
|
|
105
|
+
* 单一 user message + 附加 system context. 简单场景用.
|
|
106
|
+
* - 新: chat(messages: ChatMessage[], context?: string, signal?)
|
|
107
|
+
* 完整 messages 数组, 含 user/assistant/tool/system role.
|
|
108
|
+
* 工具调用场景必用 — 否则 LLM 看不到工具结果.
|
|
109
|
+
* - pivot loop 兼容: chat(context: string, systemPrompt: string, signal?)
|
|
110
|
+
* 第二参超过 2K 时视为 system prompt 覆盖, 避免把 46K context 当 user message 发送.
|
|
111
|
+
*
|
|
112
|
+
* 2026-06-17 (M3.5 调试): buildContext() 之前把所有 history 序列化成单字符串,
|
|
113
|
+
* LLM 看不到 tool 调用的真实结果,导致 CLI loop 卡死.
|
|
114
|
+
* 现在 messages 数组版本保留 role 语义, LLM 能正确看到工具返回.
|
|
115
|
+
*/
|
|
116
|
+
async chat(messageOrMessages, contextOrSystemPrompt, signal, tools) {
|
|
117
|
+
const systemPrompt = await this.buildSystemPromptAsync(contextOrSystemPrompt);
|
|
118
|
+
let messages;
|
|
119
|
+
if (Array.isArray(messageOrMessages)) {
|
|
120
|
+
messages = [{ role: 'system', content: systemPrompt }, ...messageOrMessages];
|
|
121
|
+
}
|
|
122
|
+
else if (contextOrSystemPrompt && contextOrSystemPrompt.length > 2000) {
|
|
123
|
+
const baseSystem = await this.buildSystemPromptAsync(undefined);
|
|
124
|
+
messages = [
|
|
125
|
+
{ role: 'system', content: baseSystem + '\n\n' + contextOrSystemPrompt },
|
|
126
|
+
{ role: 'user', content: messageOrMessages }
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
messages = [
|
|
131
|
+
{ role: 'system', content: systemPrompt },
|
|
132
|
+
{ role: 'user', content: messageOrMessages }
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
const response = await this.generateText({
|
|
137
|
+
messages,
|
|
138
|
+
temperature: 0.8,
|
|
139
|
+
maxTokens: 16384, // 2026-06-17: 提到 16384 — agent 注入 16K+ system prompt + 8K tool defs 时, 8K 撞上限返回空 content (见 memory: bolloon-llm-empty-large-prompt)
|
|
140
|
+
signal,
|
|
141
|
+
tools, // pass through for native tool calling
|
|
142
|
+
});
|
|
143
|
+
return { reply: response.reply, toolCalls: response.toolCalls };
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
// abort 不当作错误, 透传一个 sentinel 让上层能识别
|
|
147
|
+
if (signal?.aborted || error?.name === 'AbortError') {
|
|
148
|
+
throw error; // 上层 try/catch 处理
|
|
149
|
+
}
|
|
150
|
+
const { ErrorLessonStore, planRecovery, MAX_RECOVERY_ATTEMPTS, classifyApiError } = await Promise.resolve().then(() => __importStar(require('./error-lessons.js')));
|
|
151
|
+
const store = (chatErrorLessons ??= new ErrorLessonStore());
|
|
152
|
+
const baseLesson = store.learn(error);
|
|
153
|
+
if (baseLesson.isNewLesson) {
|
|
154
|
+
console.warn(`[llm-lesson] 新错误教训: ${baseLesson.classified.category} (${baseLesson.classified.pattern}) → ${baseLesson.classified.recovery}`);
|
|
155
|
+
}
|
|
156
|
+
// 2026-08-11 (Hermes error_classifier + recovery hints): 分类后真正执行恢复动作 —
|
|
157
|
+
// 429/5xx → 退避重试; network → 重试 1 次; context overflow → 上层 compact (标注);
|
|
158
|
+
// auth → 不重试 (报错给用户). 之前只学习教训不重试, HTTP 429/5xx 直接失败返回.
|
|
159
|
+
for (let attempt = 0; attempt < MAX_RECOVERY_ATTEMPTS; attempt++) {
|
|
160
|
+
const classified = classifyApiError(error);
|
|
161
|
+
const plan = planRecovery(classified, attempt);
|
|
162
|
+
if (!plan.shouldRetry)
|
|
163
|
+
break; // 不可恢复 / 已到 retry-once 上限
|
|
164
|
+
const backoffMs = plan.backoffMs;
|
|
165
|
+
console.warn(`[llm-recovery] ${classified.category} attempt ${attempt + 1}/${MAX_RECOVERY_ATTEMPTS}, 退避 ${backoffMs}ms 重试`);
|
|
166
|
+
await new Promise((r) => setTimeout(r, backoffMs));
|
|
167
|
+
try {
|
|
168
|
+
const response = await this.generateText({
|
|
169
|
+
messages,
|
|
170
|
+
temperature: 0.8,
|
|
171
|
+
maxTokens: 16384,
|
|
172
|
+
signal,
|
|
173
|
+
tools,
|
|
174
|
+
});
|
|
175
|
+
return { reply: response.reply, toolCalls: response.toolCalls };
|
|
176
|
+
}
|
|
177
|
+
catch (retryErr) {
|
|
178
|
+
if (signal?.aborted || retryErr?.name === 'AbortError')
|
|
179
|
+
throw retryErr;
|
|
180
|
+
error = retryErr; // 记录最后一次错误, 循环继续重试 (backoff 递增)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
console.error('PiAI chat error:', error);
|
|
184
|
+
// 2026-06-15: 真实 error 信息 + 明确告诉 LLM "这是 API 错, 不要 retry"
|
|
185
|
+
// 旧版: "抱歉,AI服务暂时不可用。" → LLM 看到 isTooShort=false(< 50 但 > 0),
|
|
186
|
+
// needsMoreWork 不会触发, 但 hasError 模式 (含 "error" / "失败") 会判定要继续修
|
|
187
|
+
// 新版: 让 LLM 立即停止循环, 直接展示给用户
|
|
188
|
+
// 2026-08-04: 带上 error.cause (undici 网络错误根因如 "other side closed" 在 cause 里)
|
|
189
|
+
const causeMsg = error?.cause?.message ? ` (cause: ${String(error.cause.message).slice(0, 150)})` : '';
|
|
190
|
+
const errMsg = ((error?.message || '') + causeMsg).slice(0, 300);
|
|
191
|
+
return {
|
|
192
|
+
reply: `[AI 服务调用失败] ${errMsg}\n\n这是一个**底层 API 错误**(401 / 鉴权失败 / 网络中断 / 配额耗尽等),不是你的任务有问题。**请直接把这个错误消息回复给用户,不要再循环尝试。**`,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async summarize(text, context) {
|
|
197
|
+
const prompt = this.buildSummarizePrompt(text, context);
|
|
198
|
+
try {
|
|
199
|
+
const response = await this.generateText({
|
|
200
|
+
messages: [
|
|
201
|
+
{ role: 'system', content: 'You are a professional document summarizer.' },
|
|
202
|
+
{ role: 'user', content: prompt }
|
|
203
|
+
],
|
|
204
|
+
temperature: 0.7
|
|
205
|
+
});
|
|
206
|
+
const qualityScore = this.estimateQuality(text, response.reply);
|
|
207
|
+
return { summary: response.reply, qualityScore };
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.error('PiAI summarize error:', error);
|
|
211
|
+
return {
|
|
212
|
+
summary: text.substring(0, 500) + '...',
|
|
213
|
+
qualityScore: 0.5
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async improveContent(content, requirements, context) {
|
|
218
|
+
const prompt = this.buildImprovePrompt(content, requirements, context);
|
|
219
|
+
try {
|
|
220
|
+
const response = await this.generateText({
|
|
221
|
+
messages: [
|
|
222
|
+
{ role: 'system', content: 'You are a professional document editor and improver.' },
|
|
223
|
+
{ role: 'user', content: prompt }
|
|
224
|
+
],
|
|
225
|
+
temperature: 0.8
|
|
226
|
+
});
|
|
227
|
+
return response.reply;
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
console.error('PiAI improve error:', error);
|
|
231
|
+
return content;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async generateText(options) {
|
|
235
|
+
const { messages, temperature = 0.7, maxTokens = 4096, signal, tools } = options;
|
|
236
|
+
// 工具清单: 代码侧 schema → 进 system prompt (作为额外 system message)
|
|
237
|
+
let finalMessages = messages;
|
|
238
|
+
// 1) 外部 prepend (e.g. P2P 行级 reserve 状态), 拼到最前
|
|
239
|
+
if (_prependProvider) {
|
|
240
|
+
try {
|
|
241
|
+
const pre = await _prependProvider();
|
|
242
|
+
if (pre && typeof pre === 'string' && pre.trim()) {
|
|
243
|
+
finalMessages = [{ role: 'system', content: pre }, ...finalMessages];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
console.warn('[pi-ai] systemPrepend 失败:', err?.message?.slice(0, 100));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
let openaiTools;
|
|
251
|
+
if (tools && tools.length > 0) {
|
|
252
|
+
// 预格式化的 tools (含参数 schema) → 直接使用
|
|
253
|
+
if (typeof tools[0] === 'object' && tools[0]?.type === 'function') {
|
|
254
|
+
openaiTools = tools;
|
|
255
|
+
const toolDescriptions = tools.map(t => `- ${t.function.name}: ${t.function.description || ''} ${Object.keys(t.function.parameters?.properties || {}).length > 0 ? `(${Object.keys(t.function.parameters.properties).join(', ')})` : ''}`).join('\n');
|
|
256
|
+
finalMessages = [{ role: 'system', content: `可用工具:\n${toolDescriptions}` }, ...messages];
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
switch (this.provider) {
|
|
260
|
+
case 'openai':
|
|
261
|
+
case 'minimax':
|
|
262
|
+
case 'deepseek':
|
|
263
|
+
case 'kimi':
|
|
264
|
+
case 'glm':
|
|
265
|
+
case 'qwen':
|
|
266
|
+
case 'mimo':
|
|
267
|
+
case 'grok':
|
|
268
|
+
return this.callOpenAI(finalMessages, temperature, maxTokens, signal, openaiTools);
|
|
269
|
+
case 'anthropic':
|
|
270
|
+
return this.callAnthropic(finalMessages, temperature, maxTokens, signal);
|
|
271
|
+
case 'ollama':
|
|
272
|
+
return this.callOllama(finalMessages, temperature, signal);
|
|
273
|
+
case 'openrouter':
|
|
274
|
+
return this.callOpenRouter(finalMessages, temperature, maxTokens, signal);
|
|
275
|
+
case 'gemini':
|
|
276
|
+
return this.callGemini(finalMessages, temperature, maxTokens, signal);
|
|
277
|
+
case 'local':
|
|
278
|
+
return this.callLocal(finalMessages, temperature, signal);
|
|
279
|
+
default:
|
|
280
|
+
throw new Error(`Unsupported provider: ${this.provider}`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
getApiKey() {
|
|
284
|
+
return this.config.apiKey || this.getEnvApiKey();
|
|
285
|
+
}
|
|
286
|
+
getEnvApiKey() {
|
|
287
|
+
const envVars = {
|
|
288
|
+
openai: process.env.OPENAI_API_KEY || '',
|
|
289
|
+
anthropic: process.env.ANTHROPIC_API_KEY || '',
|
|
290
|
+
ollama: '',
|
|
291
|
+
openrouter: process.env.OPENROUTER_API_KEY || '',
|
|
292
|
+
gemini: process.env.GEMINI_API_KEY || '',
|
|
293
|
+
minimax: process.env.MINIMAX_API_KEY || '',
|
|
294
|
+
deepseek: process.env.DEEPSEEK_API_KEY || '',
|
|
295
|
+
kimi: process.env.KIMI_API_KEY || process.env.MOONSHOT_API_KEY || '',
|
|
296
|
+
glm: process.env.GLM_API_KEY || process.env.ZHIPU_API_KEY || '',
|
|
297
|
+
qwen: process.env.QWEN_API_KEY || process.env.DASHSCOPE_API_KEY || '',
|
|
298
|
+
mimo: process.env.MIMO_API_KEY || '',
|
|
299
|
+
grok: process.env.XAI_API_KEY || '',
|
|
300
|
+
local: ''
|
|
301
|
+
};
|
|
302
|
+
return envVars[this.provider] || '';
|
|
303
|
+
}
|
|
304
|
+
getBaseUrl() {
|
|
305
|
+
if (this.config.baseUrl) {
|
|
306
|
+
return this.config.baseUrl;
|
|
307
|
+
}
|
|
308
|
+
// 允许通过 OPENAI_BASE_URL 等环境变量覆盖默认 base URL
|
|
309
|
+
const baseUrls = {
|
|
310
|
+
openai: process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1',
|
|
311
|
+
anthropic: 'https://api.anthropic.com/v1',
|
|
312
|
+
ollama: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
|
|
313
|
+
openrouter: process.env.OPENROUTER_BASE_URL || 'https://openrouter.ai/api/v1',
|
|
314
|
+
gemini: 'https://generativelanguage.googleapis.com/v1beta',
|
|
315
|
+
minimax: process.env.MINIMAX_BASE_URL || 'https://api.minimaxi.com/v1',
|
|
316
|
+
deepseek: process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com/v1',
|
|
317
|
+
kimi: process.env.KIMI_BASE_URL || process.env.MOONSHOT_BASE_URL || 'https://api.moonshot.cn/v1',
|
|
318
|
+
glm: process.env.GLM_BASE_URL || process.env.ZHIPU_BASE_URL || 'https://open.bigmodel.cn/api/paas/v4',
|
|
319
|
+
qwen: process.env.QWEN_BASE_URL || process.env.DASHSCOPE_BASE_URL || 'https://dashscope.aliyuncs.com/compatible-mode/v1',
|
|
320
|
+
// 小米 MiMo: 走 OpenAI 兼容 API, 官方 endpoint
|
|
321
|
+
mimo: process.env.MIMO_BASE_URL || 'https://api.xiaomi.com/v1',
|
|
322
|
+
grok: process.env.XAI_BASE_URL || 'https://api.x.ai/v1',
|
|
323
|
+
local: 'http://localhost:11434'
|
|
324
|
+
};
|
|
325
|
+
return baseUrls[this.provider];
|
|
326
|
+
}
|
|
327
|
+
mapModel() {
|
|
328
|
+
// 2026-08-04: 型号全面更新 (官方文档确认):
|
|
329
|
+
// OpenAI gpt-5.6 (alias→Sol) / Anthropic claude-sonnet-5 / Gemini gemini-3.5-flash (pro 线最新, 3.5 仅 flash)
|
|
330
|
+
// Grok grok-4.5 / Kimi kimi-k3 / GLM glm-5.2 / Qwen qwen3-max
|
|
331
|
+
const modelMap = {
|
|
332
|
+
openai: this.config.model || process.env.OPENAI_MODEL || 'gpt-5.6',
|
|
333
|
+
anthropic: this.config.model || process.env.ANTHROPIC_MODEL || 'claude-sonnet-5',
|
|
334
|
+
ollama: this.config.model || 'llama4',
|
|
335
|
+
openrouter: this.config.model || process.env.OPENROUTER_MODEL || 'anthropic/claude-sonnet-5',
|
|
336
|
+
gemini: this.config.model || process.env.GEMINI_MODEL || 'gemini-3.5-flash',
|
|
337
|
+
minimax: this.config.model || process.env.MINIMAX_MODEL || 'MiniMax-M3',
|
|
338
|
+
// 2026-07-17: deepseek-chat (V3) 官方已下线, 迁 deepseek-v4-flash
|
|
339
|
+
deepseek: this.config.model || process.env.DEEPSEEK_MODEL || 'deepseek-v4-flash',
|
|
340
|
+
kimi: this.config.model || process.env.KIMI_MODEL || process.env.MOONSHOT_MODEL || 'kimi-k3',
|
|
341
|
+
glm: this.config.model || process.env.GLM_MODEL || process.env.ZHIPU_MODEL || 'glm-5.2',
|
|
342
|
+
qwen: this.config.model || process.env.QWEN_MODEL || process.env.DASHSCOPE_MODEL || 'qwen3-max',
|
|
343
|
+
// 小米 MiMo (openai 兼容) — env override 优先, 默认 mimo-v2.5-pro
|
|
344
|
+
mimo: this.config.model || process.env.MIMO_MODEL || 'mimo-v2.5-pro',
|
|
345
|
+
grok: this.config.model || process.env.XAI_MODEL || 'grok-4.5',
|
|
346
|
+
local: this.config.model || 'llama4'
|
|
347
|
+
};
|
|
348
|
+
return modelMap[this.provider];
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* 2026-09-15: 出网前把 messages 规整成 wire 形状.
|
|
352
|
+
*
|
|
353
|
+
* 背景 (真跑复现 + 逐项对照, 见 wiki log 2026-09-15): DeepSeek 思考模式 (deepseek-v4-*)
|
|
354
|
+
* 在**请求带 tools** 时, 任何 assistant 消息缺 `reasoning_content` 字段 →
|
|
355
|
+
* HTTP 400 "The `reasoning_content` in the thinking mode must be passed back to the API".
|
|
356
|
+
* 复现: 同一个 17 条消息的真实请求体, 不带 tools → 200; 带上 tools → 400;
|
|
357
|
+
* 给每条 assistant 补 `reasoning_content:""` → 带 tools 也 200。
|
|
358
|
+
* 表现: 多轮工具循环 (第 2 轮起) 直接断, 用户看到 "AI 服务调用失败"。
|
|
359
|
+
*
|
|
360
|
+
* 处置: 只对 deepseek 生效 (唯一实测过的 provider); 有原文用原文, 没有就补空串 —
|
|
361
|
+
* 空串已被官方接受, 且不改变语义 (思维链不是给模型看的历史内容)。
|
|
362
|
+
* 其他 provider 原样透传 (OpenAI 系对未知字段更敏感, 不做无证据的改动)。
|
|
363
|
+
*/
|
|
364
|
+
prepareWireMessages(messages) {
|
|
365
|
+
const echoReasoning = this.provider === 'deepseek';
|
|
366
|
+
if (!echoReasoning)
|
|
367
|
+
return messages;
|
|
368
|
+
return messages.map((m) => m.role === 'assistant'
|
|
369
|
+
? { role: 'assistant', content: m.content ?? '', reasoning_content: m.reasoningContent ?? '' }
|
|
370
|
+
: m);
|
|
371
|
+
}
|
|
372
|
+
async callOpenAI(messages, temperature, maxTokens, signal, tools) {
|
|
373
|
+
const apiKey = this.getApiKey();
|
|
374
|
+
if (!apiKey) {
|
|
375
|
+
throw new Error('OPENAI_API_KEY not set');
|
|
376
|
+
}
|
|
377
|
+
const requestBody = {
|
|
378
|
+
model: this.mapModel(),
|
|
379
|
+
messages: this.prepareWireMessages(messages),
|
|
380
|
+
temperature,
|
|
381
|
+
max_tokens: maxTokens
|
|
382
|
+
};
|
|
383
|
+
// Bug 3: 传入原生 tools 参数 + tool_choice auto, LLM 返回结构化 tool_calls
|
|
384
|
+
if (tools && tools.length > 0) {
|
|
385
|
+
requestBody.tools = tools;
|
|
386
|
+
requestBody.tool_choice = 'auto';
|
|
387
|
+
}
|
|
388
|
+
let lastFinishReason = '';
|
|
389
|
+
const _t0 = Date.now();
|
|
390
|
+
// 2026-08-04 (二修): 弃用全局 fetch — node 内置 fetch 的 keep-alive 连接池会积累"僵尸连接"
|
|
391
|
+
// (被对端关闭后仍留在池里), 后续请求复用即 "other side closed"; 且 node 内置 fetch
|
|
392
|
+
// 会静默忽略 npm undici Agent 的 dispatcher (实测 localPort 不变), 导致重试仍在复用坏连接.
|
|
393
|
+
// 改用 npm undici 的 request(): 独立连接池 + 重试传 dispatcher 真正生效 (新 TCP 连接).
|
|
394
|
+
let retryAgent = null;
|
|
395
|
+
for (let attempt = 0; attempt < 4; attempt++) {
|
|
396
|
+
const _tFetch = Date.now();
|
|
397
|
+
let statusCode = 0;
|
|
398
|
+
let body;
|
|
399
|
+
try {
|
|
400
|
+
const reqInit = {
|
|
401
|
+
method: 'POST',
|
|
402
|
+
headers: {
|
|
403
|
+
'Content-Type': 'application/json',
|
|
404
|
+
'Authorization': `Bearer ${apiKey}`
|
|
405
|
+
},
|
|
406
|
+
body: JSON.stringify(requestBody),
|
|
407
|
+
signal: this.combinedSignal(signal),
|
|
408
|
+
};
|
|
409
|
+
if (retryAgent)
|
|
410
|
+
reqInit.dispatcher = retryAgent;
|
|
411
|
+
const res = await (0, undici_1.request)(`${this.getBaseUrl()}/chat/completions`, reqInit);
|
|
412
|
+
statusCode = res.statusCode;
|
|
413
|
+
body = res.body;
|
|
414
|
+
}
|
|
415
|
+
catch (err) {
|
|
416
|
+
// 网络层瞬时错误 (undici "terminated" / "other side closed" / ECONNRESET / socket hang up / fetch failed 等)
|
|
417
|
+
// 退避重试最多 3 次 (1s/2s/4s), 每次用全新 Agent 新连接 — 之前直接抛给 chat()
|
|
418
|
+
// 变成 "[AI 服务调用失败] terminated" 打断 agent 流程.
|
|
419
|
+
// abort (用户主动 / 120s 超时) 不重试, 原样抛出.
|
|
420
|
+
if (err?.name === 'AbortError' || signal?.aborted)
|
|
421
|
+
throw err;
|
|
422
|
+
const netMsg = String(err?.message || err?.cause?.message || '');
|
|
423
|
+
const isNetworkErr = /terminated|other side closed|ECONNRESET|socket hang up|fetch failed|network|ETIMEDOUT|ECONNREFUSED|UND_ERR/i.test(netMsg);
|
|
424
|
+
if (attempt < 3 && isNetworkErr) {
|
|
425
|
+
const backoff = 1000 * (2 ** attempt);
|
|
426
|
+
console.warn(`[pi-ai] 网络错误 attempt ${attempt + 1}/4: ${netMsg.slice(0, 120)}, 退避 ${backoff}ms 重试 (新连接)`);
|
|
427
|
+
retryAgent?.destroy().catch(() => { });
|
|
428
|
+
retryAgent = new undici_1.Agent({ connect: { timeout: 30_000 } });
|
|
429
|
+
await new Promise(resolve => setTimeout(resolve, backoff));
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
throw err;
|
|
433
|
+
}
|
|
434
|
+
const _tResp = Date.now();
|
|
435
|
+
if (statusCode < 200 || statusCode >= 300) {
|
|
436
|
+
const errBody = await body.text().catch(() => '(no body)');
|
|
437
|
+
console.log(`[pi-ai DEBUG] OpenAI 错误 ${statusCode}: ${String(errBody).slice(0, 500)}`);
|
|
438
|
+
console.log(`[pi-ai DEBUG] 请求体: model=${requestBody.model}, messages=${requestBody.messages?.length}, max_tokens=${requestBody.max_tokens}, baseUrl=${this.getBaseUrl()}`);
|
|
439
|
+
if (process.env.BOLLOON_DUMP_BODY === '1') {
|
|
440
|
+
try {
|
|
441
|
+
const fsx = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
442
|
+
const p = `/tmp/bolloon-req-${Date.now()}.json`;
|
|
443
|
+
fsx.writeFileSync(p, JSON.stringify(requestBody, null, 2));
|
|
444
|
+
console.log(`[pi-ai DEBUG] 失败请求体已落盘: ${p}`);
|
|
445
|
+
}
|
|
446
|
+
catch { /* 调试用, 失败忽略 */ }
|
|
447
|
+
}
|
|
448
|
+
retryAgent?.destroy().catch(() => { });
|
|
449
|
+
throw new Error(`OpenAI API error: ${statusCode} ${String(errBody).slice(0, 300)}`);
|
|
450
|
+
}
|
|
451
|
+
const data = await body.json();
|
|
452
|
+
const _tParse = Date.now();
|
|
453
|
+
const choice = data.choices?.[0];
|
|
454
|
+
const content = choice?.message?.content || '';
|
|
455
|
+
const toolCalls = choice?.message?.tool_calls;
|
|
456
|
+
// 2026-09-15: 思考模式思维链 — 原样存回 history, 下一轮必须回带 (见 prepareWireMessages)
|
|
457
|
+
const reasoningContent = choice?.message?.reasoning_content || undefined;
|
|
458
|
+
lastFinishReason = choice?.finish_reason || '';
|
|
459
|
+
// Bug 7: tool_calls 存在时不走重试 — LLM 选工具时 content 空是合法的
|
|
460
|
+
if (content || (toolCalls && toolCalls.length > 0)) {
|
|
461
|
+
if (lastFinishReason === 'length') {
|
|
462
|
+
console.warn(`[pi-ai] hit max_tokens ceiling (model=${this.mapModel()}, max_tokens=${maxTokens}) — caller should trim prompt or raise cap`);
|
|
463
|
+
}
|
|
464
|
+
const _tAfter = Date.now();
|
|
465
|
+
const promptBytes = JSON.stringify(messages).length;
|
|
466
|
+
console.log(`[pi-ai timing] total=${_tAfter - _t0}ms attempt=${attempt + 1} fetch=${_tResp - _tFetch}ms parse=${_tParse - _tResp}ms reply=${content.length}B toolCalls=${toolCalls?.length ?? 0} model=${this.mapModel()} prompt=${promptBytes}B`);
|
|
467
|
+
retryAgent?.destroy().catch(() => { });
|
|
468
|
+
return { reply: content, toolCalls: toolCalls && toolCalls.length > 0 ? toolCalls : undefined, reasoningContent };
|
|
469
|
+
}
|
|
470
|
+
console.warn(`[pi-ai] attempt ${attempt + 1}/3: 空 content (finish_reason=${lastFinishReason}), 退避 1.5s 重试`);
|
|
471
|
+
const _tSleep = Date.now();
|
|
472
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
473
|
+
console.log(`[pi-ai timing] attempt=${attempt + 1} empty; backoff=${Date.now() - _tSleep}ms; total=${Date.now() - _t0}ms so far`);
|
|
474
|
+
}
|
|
475
|
+
console.warn(`[pi-ai] 3 次重试都返回空 content (finish_reason=${lastFinishReason})`);
|
|
476
|
+
retryAgent?.destroy().catch(() => { });
|
|
477
|
+
return { reply: '' };
|
|
478
|
+
}
|
|
479
|
+
async callAnthropic(messages, temperature, maxTokens, signal) {
|
|
480
|
+
const apiKey = this.getApiKey();
|
|
481
|
+
if (!apiKey) {
|
|
482
|
+
throw new Error('ANTHROPIC_API_KEY not set');
|
|
483
|
+
}
|
|
484
|
+
const systemMessage = messages.find(m => m.role === 'system')?.content || '';
|
|
485
|
+
const userMessages = messages.filter(m => m.role !== 'system');
|
|
486
|
+
const response = await fetch(`${this.getBaseUrl()}/messages`, {
|
|
487
|
+
method: 'POST',
|
|
488
|
+
headers: {
|
|
489
|
+
'Content-Type': 'application/json',
|
|
490
|
+
'x-api-key': apiKey,
|
|
491
|
+
'anthropic-version': '2023-06-01',
|
|
492
|
+
'anthropic-dangerous-direct-browser-access': 'true'
|
|
493
|
+
},
|
|
494
|
+
body: JSON.stringify({
|
|
495
|
+
model: this.mapModel(),
|
|
496
|
+
messages: userMessages,
|
|
497
|
+
system: systemMessage,
|
|
498
|
+
temperature,
|
|
499
|
+
max_tokens: maxTokens
|
|
500
|
+
}),
|
|
501
|
+
signal: this.combinedSignal(signal),
|
|
502
|
+
});
|
|
503
|
+
if (!response.ok) {
|
|
504
|
+
throw new Error(`Anthropic API error: ${response.status}`);
|
|
505
|
+
}
|
|
506
|
+
const data = await response.json();
|
|
507
|
+
return { reply: data.content?.[0]?.text || '' };
|
|
508
|
+
}
|
|
509
|
+
async callOllama(messages, temperature, signal) {
|
|
510
|
+
const response = await fetch(`${this.getBaseUrl()}/api/chat`, {
|
|
511
|
+
method: 'POST',
|
|
512
|
+
headers: {
|
|
513
|
+
'Content-Type': 'application/json'
|
|
514
|
+
},
|
|
515
|
+
body: JSON.stringify({
|
|
516
|
+
model: this.mapModel(),
|
|
517
|
+
messages,
|
|
518
|
+
temperature,
|
|
519
|
+
stream: false
|
|
520
|
+
}),
|
|
521
|
+
signal: this.combinedSignal(signal),
|
|
522
|
+
});
|
|
523
|
+
if (!response.ok) {
|
|
524
|
+
throw new Error(`Ollama API error: ${response.status}`);
|
|
525
|
+
}
|
|
526
|
+
const data = await response.json();
|
|
527
|
+
return { reply: data.message?.content || '' };
|
|
528
|
+
}
|
|
529
|
+
async callOpenRouter(messages, temperature, maxTokens, signal) {
|
|
530
|
+
const apiKey = this.getApiKey();
|
|
531
|
+
if (!apiKey) {
|
|
532
|
+
throw new Error('OPENROUTER_API_KEY not set');
|
|
533
|
+
}
|
|
534
|
+
const response = await fetch(`${this.getBaseUrl()}/chat/completions`, {
|
|
535
|
+
method: 'POST',
|
|
536
|
+
headers: {
|
|
537
|
+
'Content-Type': 'application/json',
|
|
538
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
539
|
+
'HTTP-Referer': 'https://openclaw.ai',
|
|
540
|
+
'X-Title': 'OpenClaw'
|
|
541
|
+
},
|
|
542
|
+
body: JSON.stringify({
|
|
543
|
+
model: this.mapModel(),
|
|
544
|
+
messages,
|
|
545
|
+
temperature,
|
|
546
|
+
max_tokens: maxTokens
|
|
547
|
+
}),
|
|
548
|
+
signal: this.combinedSignal(signal),
|
|
549
|
+
});
|
|
550
|
+
if (!response.ok) {
|
|
551
|
+
throw new Error(`OpenRouter API error: ${response.status}`);
|
|
552
|
+
}
|
|
553
|
+
const data = await response.json();
|
|
554
|
+
return { reply: data.choices?.[0]?.message?.content || '' };
|
|
555
|
+
}
|
|
556
|
+
async callGemini(messages, temperature, maxTokens, signal) {
|
|
557
|
+
const apiKey = this.getApiKey();
|
|
558
|
+
if (!apiKey) {
|
|
559
|
+
throw new Error('GEMINI_API_KEY not set');
|
|
560
|
+
}
|
|
561
|
+
const contents = messages
|
|
562
|
+
.filter(m => m.role !== 'system')
|
|
563
|
+
.map(m => ({
|
|
564
|
+
role: m.role === 'assistant' ? 'model' : 'user',
|
|
565
|
+
parts: [{ text: m.content }]
|
|
566
|
+
}));
|
|
567
|
+
const systemInstruction = messages.find(m => m.role === 'system')?.content;
|
|
568
|
+
const response = await fetch(`${this.getBaseUrl()}/models/${this.mapModel()}:generateContent?key=${apiKey}`, {
|
|
569
|
+
method: 'POST',
|
|
570
|
+
headers: {
|
|
571
|
+
'Content-Type': 'application/json'
|
|
572
|
+
},
|
|
573
|
+
body: JSON.stringify({
|
|
574
|
+
contents,
|
|
575
|
+
systemInstruction: systemInstruction ? { parts: [{ text: systemInstruction }] } : undefined,
|
|
576
|
+
generationConfig: {
|
|
577
|
+
temperature,
|
|
578
|
+
maxOutputTokens: maxTokens
|
|
579
|
+
}
|
|
580
|
+
}),
|
|
581
|
+
signal: this.combinedSignal(signal),
|
|
582
|
+
});
|
|
583
|
+
if (!response.ok) {
|
|
584
|
+
throw new Error(`Gemini API error: ${response.status}`);
|
|
585
|
+
}
|
|
586
|
+
const data = await response.json();
|
|
587
|
+
return { reply: data.candidates?.[0]?.content?.parts?.[0]?.text || '' };
|
|
588
|
+
}
|
|
589
|
+
async callLocal(messages, temperature, signal) {
|
|
590
|
+
return this.callOllama(messages, temperature, signal);
|
|
591
|
+
}
|
|
592
|
+
// 注: callLocal 直接代理 ollama. 工具清单由 generateText 在外层拼到 messages, 这里 messages 已是 finalMessages.
|
|
593
|
+
async buildSystemPromptAsync(context) {
|
|
594
|
+
// 走 layer registry: 装配所有相关 layer (身份/行为/工具/角色/渠道)
|
|
595
|
+
try {
|
|
596
|
+
const { assembleSystemPrompt, SYSTEM_PROMPT_VERSION } = await Promise.resolve(`${'./system-prompt/registry.js'}`).then(s => __importStar(require(s))).catch(() => Promise.resolve().then(() => __importStar(require('./system-prompt/registry.js'))));
|
|
597
|
+
// channel = 本机 (PI SDK 直接调就是 local)
|
|
598
|
+
// role = 由 prompt context 决定 (默认 expert)
|
|
599
|
+
const ctx = context ? { channel: 'local', role: 'expert' } : { channel: 'local', role: 'expert' };
|
|
600
|
+
const result = await assembleSystemPrompt(ctx);
|
|
601
|
+
return `${result.text}\n\n## User Working Directory\n${context || process.cwd()}\n\n## bolloon-runtime\n${SYSTEM_PROMPT_VERSION} · layers: ${result.layerIds.join(',')}`;
|
|
602
|
+
}
|
|
603
|
+
catch (err) {
|
|
604
|
+
// 降级: 旧硬编码 (layer registry 不可用时不挂)
|
|
605
|
+
console.warn('[pi-ai] layer registry 不可用, 降级:', err.message?.slice(0, 100));
|
|
606
|
+
const envDetails = this.getEnvironmentDetails();
|
|
607
|
+
return `You are a friendly AI assistant in a P2P document collaboration network.
|
|
608
|
+
|
|
609
|
+
## User Working Directory
|
|
610
|
+
${context || process.cwd()}
|
|
611
|
+
|
|
612
|
+
## Environment
|
|
613
|
+
${envDetails}`;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
// 同步版: 旧调用点 (buildSystemPrompt 是同步)
|
|
617
|
+
// 保留但内部用 sync fallback; 后续可改成 async
|
|
618
|
+
buildSystemPrompt(context) {
|
|
619
|
+
const envDetails = this.getEnvironmentDetails();
|
|
620
|
+
return `You are a friendly AI assistant in a P2P document collaboration network.
|
|
621
|
+
|
|
622
|
+
## User Working Directory
|
|
623
|
+
${context || process.cwd()}
|
|
624
|
+
|
|
625
|
+
## Environment
|
|
626
|
+
${envDetails}`;
|
|
627
|
+
}
|
|
628
|
+
getEnvironmentDetails() {
|
|
629
|
+
return `
|
|
630
|
+
## Available Workflows
|
|
631
|
+
- read - Read documents
|
|
632
|
+
- summarize - Summarize documents
|
|
633
|
+
- improve - Improve documents
|
|
634
|
+
- collaborate - Multi-agent collaboration
|
|
635
|
+
- query - Query status
|
|
636
|
+
- report - Generate reports
|
|
637
|
+
|
|
638
|
+
## System Capabilities
|
|
639
|
+
- Document processing (Markdown, Text, PDF, DOCX)
|
|
640
|
+
- Multi-agent collaboration (P2P network)
|
|
641
|
+
- Workflow engine (constraint layer)
|
|
642
|
+
- Quality assessment and auto-send
|
|
643
|
+
|
|
644
|
+
## Current Time
|
|
645
|
+
${new Date().toISOString()}`;
|
|
646
|
+
}
|
|
647
|
+
buildSummarizePrompt(text, context) {
|
|
648
|
+
const maxLength = 8000;
|
|
649
|
+
const truncatedText = text.length > maxLength ? text.substring(0, maxLength) + '...' : text;
|
|
650
|
+
let prompt = `Please generate a concise and accurate summary for the following document:
|
|
651
|
+
|
|
652
|
+
${truncatedText}
|
|
653
|
+
|
|
654
|
+
Please output in the following format:
|
|
655
|
+
## Summary
|
|
656
|
+
[Write summary here]
|
|
657
|
+
|
|
658
|
+
## Quality Self-Assessment
|
|
659
|
+
[Score 1-10, with reasoning]`;
|
|
660
|
+
if (context) {
|
|
661
|
+
prompt = `Context: ${context}
|
|
662
|
+
|
|
663
|
+
${prompt}`;
|
|
664
|
+
}
|
|
665
|
+
return prompt;
|
|
666
|
+
}
|
|
667
|
+
buildImprovePrompt(content, requirements, context) {
|
|
668
|
+
const maxLength = 8000;
|
|
669
|
+
const truncatedContent = content.length > maxLength ? content.substring(0, maxLength) + '...' : content;
|
|
670
|
+
let prompt = `Please improve the document according to the following requirements:
|
|
671
|
+
|
|
672
|
+
Requirements: ${requirements}
|
|
673
|
+
|
|
674
|
+
Original Document:
|
|
675
|
+
${truncatedContent}
|
|
676
|
+
|
|
677
|
+
Please output only the improved document without additional explanation.`;
|
|
678
|
+
if (context) {
|
|
679
|
+
prompt = `Context: ${context}
|
|
680
|
+
|
|
681
|
+
${prompt}`;
|
|
682
|
+
}
|
|
683
|
+
return prompt;
|
|
684
|
+
}
|
|
685
|
+
estimateQuality(original, summary) {
|
|
686
|
+
const coverageRatio = summary.length / Math.max(original.length, 1);
|
|
687
|
+
const hasKeyPoints = /\d+\s*[.。]/.test(summary);
|
|
688
|
+
const decentLength = summary.length > 100 && summary.length < original.length * 0.5;
|
|
689
|
+
let score = 0.5;
|
|
690
|
+
if (coverageRatio > 0.1 && coverageRatio < 0.5)
|
|
691
|
+
score += 0.2;
|
|
692
|
+
if (hasKeyPoints)
|
|
693
|
+
score += 0.15;
|
|
694
|
+
if (decentLength)
|
|
695
|
+
score += 0.15;
|
|
696
|
+
return Math.min(1, score);
|
|
697
|
+
}
|
|
698
|
+
async shouldAutoSend(qualityScore, threshold = 0.7) {
|
|
699
|
+
return qualityScore >= threshold;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
exports.PiAIModel = PiAIModel;
|
|
703
|
+
exports.MinimaxLLM = PiAIModel;
|
|
704
|
+
let modelInstance = null;
|
|
705
|
+
/** 2026-08-07: bolloon-config.json 优先, 旧 llm-config.json 兜底 (迁移期兼容) */
|
|
706
|
+
function resolveConfigPath() {
|
|
707
|
+
const home = process.env.HOME || '/tmp';
|
|
708
|
+
const base = path.join(home, '.bolloon');
|
|
709
|
+
for (const name of ['bolloon-config.json', 'llm-config.json']) {
|
|
710
|
+
const p = path.join(base, name);
|
|
711
|
+
try {
|
|
712
|
+
if (fs.existsSync(p))
|
|
713
|
+
return p;
|
|
714
|
+
}
|
|
715
|
+
catch { /* continue */ }
|
|
716
|
+
}
|
|
717
|
+
return null;
|
|
718
|
+
}
|
|
719
|
+
function detectProvider() {
|
|
720
|
+
// 首先检查配置文件(优先级最高)
|
|
721
|
+
try {
|
|
722
|
+
const configPath = resolveConfigPath();
|
|
723
|
+
if (configPath) {
|
|
724
|
+
const configData = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
725
|
+
if (configData.activeProvider && configData.providers[configData.activeProvider]) {
|
|
726
|
+
console.log('[PiAIModel] Detected provider from config:', configData.activeProvider);
|
|
727
|
+
return configData.activeProvider;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
catch { }
|
|
732
|
+
// 然后检查环境变量
|
|
733
|
+
if (process.env.OPENAI_API_KEY)
|
|
734
|
+
return 'openai';
|
|
735
|
+
if (process.env.ANTHROPIC_API_KEY)
|
|
736
|
+
return 'anthropic';
|
|
737
|
+
if (process.env.OPENROUTER_API_KEY)
|
|
738
|
+
return 'openrouter';
|
|
739
|
+
if (process.env.GEMINI_API_KEY)
|
|
740
|
+
return 'gemini';
|
|
741
|
+
if (process.env.OLLAMA_BASE_URL)
|
|
742
|
+
return 'ollama';
|
|
743
|
+
if (process.env.MINIMAX_API_KEY)
|
|
744
|
+
return 'minimax';
|
|
745
|
+
if (process.env.DEEPSEEK_API_KEY)
|
|
746
|
+
return 'deepseek';
|
|
747
|
+
if (process.env.KIMI_API_KEY || process.env.MOONSHOT_API_KEY)
|
|
748
|
+
return 'kimi';
|
|
749
|
+
if (process.env.GLM_API_KEY || process.env.ZHIPU_API_KEY)
|
|
750
|
+
return 'glm';
|
|
751
|
+
if (process.env.QWEN_API_KEY || process.env.DASHSCOPE_API_KEY)
|
|
752
|
+
return 'qwen';
|
|
753
|
+
if (process.env.MIMO_API_KEY)
|
|
754
|
+
return 'mimo';
|
|
755
|
+
if (process.env.XAI_API_KEY)
|
|
756
|
+
return 'grok';
|
|
757
|
+
return 'openai';
|
|
758
|
+
}
|
|
759
|
+
function detectModel(provider) {
|
|
760
|
+
const defaults = {
|
|
761
|
+
openai: 'gpt-5.6',
|
|
762
|
+
anthropic: 'claude-sonnet-5',
|
|
763
|
+
ollama: 'llama4',
|
|
764
|
+
openrouter: 'anthropic/claude-sonnet-5',
|
|
765
|
+
gemini: 'gemini-3.5-flash',
|
|
766
|
+
minimax: 'MiniMax-M3',
|
|
767
|
+
// 2026-07-17: V3 官方下线, 迁 V4
|
|
768
|
+
deepseek: 'deepseek-v4-flash',
|
|
769
|
+
kimi: 'kimi-k3',
|
|
770
|
+
glm: 'glm-5.2',
|
|
771
|
+
qwen: 'qwen3-max',
|
|
772
|
+
// 小米 MiMo 默认走最新旗舰版 (v2.5-Pro); 2026-06 当前公开版
|
|
773
|
+
mimo: 'mimo-v2.5-pro',
|
|
774
|
+
grok: 'grok-4.5',
|
|
775
|
+
local: 'llama4'
|
|
776
|
+
};
|
|
777
|
+
return defaults[provider];
|
|
778
|
+
}
|
|
779
|
+
function initPiAI(config = {}) {
|
|
780
|
+
const provider = config.provider || detectProvider();
|
|
781
|
+
const model = config.model || detectModel(provider);
|
|
782
|
+
console.log('[PiAIModel] Initializing with provider:', provider, 'model:', model);
|
|
783
|
+
// 如果没有提供 apiKey,从配置文件读取
|
|
784
|
+
let apiKey = config.apiKey;
|
|
785
|
+
if (!apiKey) {
|
|
786
|
+
try {
|
|
787
|
+
const configPath = resolveConfigPath();
|
|
788
|
+
if (configPath) {
|
|
789
|
+
const configData = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
790
|
+
const providerConfig = configData.providers[provider];
|
|
791
|
+
if (providerConfig?.apiKey) {
|
|
792
|
+
apiKey = providerConfig.apiKey;
|
|
793
|
+
console.log('[PiAIModel] Loaded apiKey from config for', provider);
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
catch (e) {
|
|
798
|
+
console.log('[PiAIModel] Error reading apiKey from config:', e);
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
modelInstance = new PiAIModel({
|
|
802
|
+
provider,
|
|
803
|
+
apiKey,
|
|
804
|
+
baseUrl: config.baseUrl,
|
|
805
|
+
model
|
|
806
|
+
});
|
|
807
|
+
console.log('[PiAIModel] Model instance created, provider:', provider);
|
|
808
|
+
return modelInstance;
|
|
809
|
+
}
|
|
810
|
+
function getModel() {
|
|
811
|
+
if (!modelInstance) {
|
|
812
|
+
throw new Error('PiAI not initialized. Call initPiAI first.');
|
|
813
|
+
}
|
|
814
|
+
return modelInstance;
|
|
815
|
+
}
|
|
816
|
+
function isModelAvailable() {
|
|
817
|
+
return modelInstance !== null;
|
|
818
|
+
}
|
|
819
|
+
function getMinimax() {
|
|
820
|
+
return getModel();
|
|
821
|
+
}
|
|
822
|
+
function initMinimax(config = {}) {
|
|
823
|
+
return initPiAI(config);
|
|
824
|
+
}
|
|
825
|
+
/** 2026-08-11: 会话级 LLM 错误教训存储 (Hermes error_classifier 模式) — 同类错误只学一次 */
|
|
826
|
+
let chatErrorLessons = null;
|
|
827
|
+
function getChatErrorLessons() {
|
|
828
|
+
return chatErrorLessons;
|
|
829
|
+
}
|
|
830
|
+
//# sourceMappingURL=pi-ai.js.map
|