@bolloon/bolloon-agent 0.1.35 → 0.1.37
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/README.md +1 -1
- package/dist/agents/p2p-chat-tools.js +6 -6
- package/dist/agents/permission-mode.js +115 -0
- package/dist/agents/pi-sdk.js +435 -25
- package/dist/agents/pre-tool-validator.js +194 -0
- package/dist/agents/workflow-pivot-loop.js +113 -12
- package/dist/bollharness-integration/context-router.js +2 -2
- package/dist/bollharness-integration/guard-checker.js +1 -1
- package/dist/bootstrap/bootstrap.js +3 -0
- package/dist/bootstrap/context-collector.js +17 -1
- package/dist/bootstrap/context-hierarchy.js +218 -0
- package/dist/bootstrap/lifecycle-hooks.js +86 -24
- package/dist/bootstrap/project-context.js +10 -3
- package/dist/context-compaction/auto-compact.js +144 -0
- package/dist/context-compaction/budget-gate.js +28 -0
- package/dist/context-compaction/budget-reduce.js +35 -0
- package/dist/context-compaction/context-collapse.js +66 -0
- package/dist/context-compaction/index.js +21 -0
- package/dist/context-compaction/microcompact.js +51 -0
- package/dist/context-compaction/pipeline.js +123 -0
- package/dist/context-compaction/snip.js +45 -0
- package/dist/context-compaction/token-estimator.js +35 -0
- package/dist/context-compaction/types.js +19 -0
- package/dist/heartbeat/HealthMonitor.js +3 -2
- package/dist/index.js +38 -2
- package/dist/llm/llm-judgment-client.js +32 -30
- package/dist/llm/pi-ai.js +103 -16
- package/dist/llm/system-prompt/health.js +129 -0
- package/dist/llm/system-prompt/registry.js +246 -0
- package/dist/llm/system-prompt/strip-hibsml.js +51 -0
- package/dist/llm/tool-manifest/ask_user_input.js +35 -0
- package/dist/llm/tool-manifest/bash.js +23 -0
- package/dist/llm/tool-manifest/create_file.js +24 -0
- package/dist/llm/tool-manifest/fetch_sports_data.js +26 -0
- package/dist/llm/tool-manifest/image_search.js +24 -0
- package/dist/llm/tool-manifest/index.js +69 -0
- package/dist/llm/tool-manifest/mcp.js +43 -0
- package/dist/llm/tool-manifest/message_compose.js +31 -0
- package/dist/llm/tool-manifest/places.js +83 -0
- package/dist/llm/tool-manifest/present_files.js +21 -0
- package/dist/llm/tool-manifest/recipe.js +40 -0
- package/dist/llm/tool-manifest/recommend_apps.js +23 -0
- package/dist/llm/tool-manifest/str_replace.js +27 -0
- package/dist/llm/tool-manifest/types.js +7 -0
- package/dist/llm/tool-manifest/view.js +24 -0
- package/dist/llm/tool-manifest/weather.js +27 -0
- package/dist/llm/tool-manifest/web.js +51 -0
- package/dist/network/p2p-direct.js +23 -0
- package/dist/network/source-intent-broadcaster.js +203 -0
- package/dist/network/source-intent.js +100 -0
- package/dist/pi-ecosystem-judgment/adaptive-scan.js +48 -0
- package/dist/pi-ecosystem-judgment/injection-gate.js +54 -12
- package/dist/pi-ecosystem-judgment/value-injection.js +8 -2
- package/dist/security/context-router-tool.js +1 -1
- package/dist/security/input-scanner.js +223 -0
- package/dist/web/client.js +3089 -4458
- package/dist/web/index.html +58 -67
- package/dist/web/server.js +299 -117
- package/dist/web/style.css +531 -249
- package/dist/web/ui/message-renderer.js +352 -0
- package/dist/web/ui/step-timeline.js +279 -0
- package/package.json +2 -2
- package/.auto-evolve-calls +0 -1
- package/.last-auto-evolve-baseline +0 -1
- package/Bolloon.md +0 -103
- package/dist/agents/constraint-layer.js.map +0 -1
- package/dist/agents/pi-sdk.js.map +0 -1
- package/dist/agents/workflow-engine.js.map +0 -1
- package/dist/bollharness/src/index.js +0 -5
- package/dist/bollharness/src/scripts/checks/check_adr_plan_numbering.js +0 -6
- package/dist/bollharness/src/scripts/checks/check_api_types.js +0 -45
- package/dist/bollharness/src/scripts/checks/check_artifact_link.js +0 -146
- package/dist/bollharness/src/scripts/checks/check_bridge_deps.js +0 -6
- package/dist/bollharness/src/scripts/checks/check_bugfix_binding.js +0 -6
- package/dist/bollharness/src/scripts/checks/check_bugfix_binding_ci.js +0 -6
- package/dist/bollharness/src/scripts/checks/check_doc_file_references.js +0 -6
- package/dist/bollharness/src/scripts/checks/check_doc_freshness.js +0 -135
- package/dist/bollharness/src/scripts/checks/check_doc_links.js +0 -31
- package/dist/bollharness/src/scripts/checks/check_file_existence_claims.js +0 -6
- package/dist/bollharness/src/scripts/checks/check_fragment_integrity.js +0 -34
- package/dist/bollharness/src/scripts/checks/check_hook_installed.js +0 -63
- package/dist/bollharness/src/scripts/checks/check_issue_closure.js +0 -41
- package/dist/bollharness/src/scripts/checks/check_mcp_parity.js +0 -6
- package/dist/bollharness/src/scripts/checks/check_security.js +0 -48
- package/dist/bollharness/src/scripts/checks/check_skill_parity.js +0 -6
- package/dist/bollharness/src/scripts/checks/check_versions.js +0 -6
- package/dist/bollharness/src/scripts/checks/finding.js +0 -13
- package/dist/bollharness/src/scripts/checks/next_decision_number.js +0 -20
- package/dist/bollharness/src/scripts/checks/regenerate_magic_docs.js +0 -6
- package/dist/bollharness/src/scripts/ci/detect_rebaseline_triggers.js +0 -8
- package/dist/bollharness/src/scripts/ci/scan_subprocess_cfg.js +0 -8
- package/dist/bollharness/src/scripts/ci/scan_verify_artifacts.js +0 -8
- package/dist/bollharness/src/scripts/ci/scan_yaml_schema.js +0 -8
- package/dist/bollharness/src/scripts/context_router.js +0 -67
- package/dist/bollharness/src/scripts/deploy-guard.js +0 -157
- package/dist/bollharness/src/scripts/guard-feedback.js +0 -192
- package/dist/bollharness/src/scripts/guard_router.js +0 -158
- package/dist/bollharness/src/scripts/hooks/_hook_output.js +0 -6
- package/dist/bollharness/src/scripts/hooks/auto-python3.js +0 -6
- package/dist/bollharness/src/scripts/hooks/deploy-progress-on-session-end.js +0 -6
- package/dist/bollharness/src/scripts/hooks/failure-analyzer.js +0 -6
- package/dist/bollharness/src/scripts/hooks/gate-judgment-inject.js +0 -92
- package/dist/bollharness/src/scripts/hooks/gate-transition-judgment.js +0 -63
- package/dist/bollharness/src/scripts/hooks/inbox-ack.js +0 -6
- package/dist/bollharness/src/scripts/hooks/inbox-inject-on-start.js +0 -6
- package/dist/bollharness/src/scripts/hooks/inbox-validate.js +0 -6
- package/dist/bollharness/src/scripts/hooks/inbox-write-ledger.js +0 -6
- package/dist/bollharness/src/scripts/hooks/initializer-agent.js +0 -6
- package/dist/bollharness/src/scripts/hooks/loop-detection.js +0 -73
- package/dist/bollharness/src/scripts/hooks/owner-guard.js +0 -6
- package/dist/bollharness/src/scripts/hooks/precompact.js +0 -6
- package/dist/bollharness/src/scripts/hooks/review-agent-gatekeeper.js +0 -6
- package/dist/bollharness/src/scripts/hooks/risk-tracker.js +0 -108
- package/dist/bollharness/src/scripts/hooks/sanitize-on-read.js +0 -6
- package/dist/bollharness/src/scripts/hooks/session-reflection.js +0 -7
- package/dist/bollharness/src/scripts/hooks/session-start-magic-docs.js +0 -7
- package/dist/bollharness/src/scripts/hooks/session-start-reset-risk.js +0 -7
- package/dist/bollharness/src/scripts/hooks/session-start-toolkit-reminder.js +0 -7
- package/dist/bollharness/src/scripts/hooks/stop-evaluator.js +0 -157
- package/dist/bollharness/src/scripts/hooks/tool-call-counter.js +0 -6
- package/dist/bollharness/src/scripts/hooks/trace-analyzer.js +0 -10
- package/dist/bollharness/src/scripts/install/install-trust-token.js +0 -7
- package/dist/bollharness/src/scripts/install/multi_project_registry.js +0 -9
- package/dist/bollharness/src/scripts/install/phase2_auto.js +0 -21
- package/dist/bollharness/src/scripts/install/pre_commit_installer.js +0 -6
- package/dist/bollharness/src/scripts/install/tier_selector.js +0 -7
- package/dist/bollharness/src/scripts/install/transcript_miner.js +0 -7
- package/dist/bollharness/src/scripts/lib/claim_patterns.js +0 -10
- package/dist/bollharness/src/scripts/lib/sanitize_patterns.js +0 -12
- package/dist/bollharness/src/scripts/sanitize.js +0 -6
- package/dist/bollharness-integration/context-router-judgment.js.map +0 -1
- package/dist/bollharness-integration/context-router.js.map +0 -1
- package/dist/bollharness-integration/gate-state-machine.js.map +0 -1
- package/dist/bollharness-integration/gate-transition-hooks.js.map +0 -1
- package/dist/bollharness-integration/guard-checker.js.map +0 -1
- package/dist/bollharness-integration/index.js.map +0 -1
- package/dist/bollharness-integration/integration.js.map +0 -1
- package/dist/bollharness-integration/llm/pi-ai.d.ts +0 -60
- package/dist/bollharness-integration/pi-ecosystem-colony/index.d.ts +0 -153
- package/dist/bollharness-integration/pi-ecosystem-goals/index.d.ts +0 -136
- package/dist/bollharness-integration/pi-ecosystem-judgment/decision.d.ts +0 -117
- package/dist/bollharness-integration/pi-ecosystem-judgment/distillation.d.ts +0 -78
- package/dist/bollharness-integration/pi-ecosystem-judgment/index.d.ts +0 -139
- package/dist/bollharness-integration/pi-ecosystem-mcp/index.d.ts +0 -127
- package/dist/bollharness-integration/pi-ecosystem-subagents/index.d.ts +0 -95
- package/dist/bollharness-integration/skill-adapter.js.map +0 -1
- package/dist/constraint-runtime/src/_archive_helper.js +0 -9
- package/dist/constraint-runtime/src/agent/coordinator.js +0 -48
- package/dist/constraint-runtime/src/agent/index.js +0 -1
- package/dist/constraint-runtime/src/assistant/index.js +0 -12
- package/dist/constraint-runtime/src/bootstrap/index.js +0 -12
- package/dist/constraint-runtime/src/bootstrap_graph.js +0 -13
- package/dist/constraint-runtime/src/bridge/index.js +0 -12
- package/dist/constraint-runtime/src/buddy/index.js +0 -12
- package/dist/constraint-runtime/src/cli/index.js +0 -12
- package/dist/constraint-runtime/src/command_graph.js +0 -10
- package/dist/constraint-runtime/src/commands.js +0 -60
- package/dist/constraint-runtime/src/components/index.js +0 -12
- package/dist/constraint-runtime/src/constants/index.js +0 -12
- package/dist/constraint-runtime/src/constraint/budget.js +0 -22
- package/dist/constraint-runtime/src/constraint/budget.js.map +0 -1
- package/dist/constraint-runtime/src/constraint/index.js +0 -2
- package/dist/constraint-runtime/src/constraint/permission.js +0 -20
- package/dist/constraint-runtime/src/constraint/permission.js.map +0 -1
- package/dist/constraint-runtime/src/context.js +0 -30
- package/dist/constraint-runtime/src/coordinator/index.js +0 -12
- package/dist/constraint-runtime/src/cost_hook.js +0 -4
- package/dist/constraint-runtime/src/cost_tracker.js +0 -8
- package/dist/constraint-runtime/src/deferred_init.js +0 -10
- package/dist/constraint-runtime/src/direct_modes.js +0 -6
- package/dist/constraint-runtime/src/dynamic-tool-loader.js +0 -85
- package/dist/constraint-runtime/src/entrypoints/index.js +0 -12
- package/dist/constraint-runtime/src/execution_registry.js +0 -44
- package/dist/constraint-runtime/src/history.js +0 -9
- package/dist/constraint-runtime/src/hooks/index.js +0 -12
- package/dist/constraint-runtime/src/index.js +0 -26
- package/dist/constraint-runtime/src/ink.js +0 -4
- package/dist/constraint-runtime/src/keybindings/index.js +0 -12
- package/dist/constraint-runtime/src/memdir/index.js +0 -12
- package/dist/constraint-runtime/src/migrations/index.js +0 -12
- package/dist/constraint-runtime/src/models.js +0 -1
- package/dist/constraint-runtime/src/models.js.map +0 -1
- package/dist/constraint-runtime/src/moreright/index.js +0 -12
- package/dist/constraint-runtime/src/native_ts/index.js +0 -12
- package/dist/constraint-runtime/src/output_styles/index.js +0 -12
- package/dist/constraint-runtime/src/parity_audit.js +0 -12
- package/dist/constraint-runtime/src/plugins/index.js +0 -12
- package/dist/constraint-runtime/src/port_manifest.js +0 -11
- package/dist/constraint-runtime/src/prefetch.js +0 -9
- package/dist/constraint-runtime/src/query.js +0 -1
- package/dist/constraint-runtime/src/remote/index.js +0 -12
- package/dist/constraint-runtime/src/remote_runtime.js +0 -9
- package/dist/constraint-runtime/src/runtime/index.js +0 -1
- package/dist/constraint-runtime/src/runtime/session.js +0 -35
- package/dist/constraint-runtime/src/schemas/index.js +0 -12
- package/dist/constraint-runtime/src/screens/index.js +0 -12
- package/dist/constraint-runtime/src/server/index.js +0 -12
- package/dist/constraint-runtime/src/services/index.js +0 -12
- package/dist/constraint-runtime/src/session_store.js +0 -22
- package/dist/constraint-runtime/src/setup.js +0 -30
- package/dist/constraint-runtime/src/skills/index.js +0 -1
- package/dist/constraint-runtime/src/skills/skill-registry.js +0 -28
- package/dist/constraint-runtime/src/state/index.js +0 -12
- package/dist/constraint-runtime/src/system_init.js +0 -20
- package/dist/constraint-runtime/src/thinking/engine.js +0 -42
- package/dist/constraint-runtime/src/thinking/index.js +0 -1
- package/dist/constraint-runtime/src/tool_pool.js +0 -8
- package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +0 -7
- package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +0 -7
- package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +0 -7
- package/dist/constraint-runtime/src/tools/PolymarketSDK/cancelOrder.js +0 -6
- package/dist/constraint-runtime/src/tools/PolymarketSDK/createOrder.js +0 -6
- package/dist/constraint-runtime/src/tools/PolymarketSDK/getMarket.js +0 -5
- package/dist/constraint-runtime/src/tools/PolymarketSDK/getOrders.js +0 -6
- package/dist/constraint-runtime/src/tools/PolymarketSDK/listMarkets.js +0 -4
- package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +0 -6
- package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +0 -8
- package/dist/constraint-runtime/src/tools/SafeSDK/deploySafe.js +0 -6
- package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +0 -6
- package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +0 -6
- package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +0 -6
- package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +0 -6
- package/dist/constraint-runtime/src/tools/WalletTools/autoPay.js +0 -29
- package/dist/constraint-runtime/src/tools/WalletTools/createWallet.js +0 -10
- package/dist/constraint-runtime/src/tools/WalletTools/getBalance.js +0 -13
- package/dist/constraint-runtime/src/tools/WalletTools/importWallet.js +0 -22
- package/dist/constraint-runtime/src/tools/WalletTools/sendTransaction.js +0 -25
- package/dist/constraint-runtime/src/tools/WalletTools/signMessage.js +0 -10
- package/dist/constraint-runtime/src/tools/WalletTools/transferToken.js +0 -25
- package/dist/constraint-runtime/src/tools.js +0 -80
- package/dist/constraint-runtime/src/transcript.js +0 -19
- package/dist/constraint-runtime/src/types/index.js +0 -12
- package/dist/constraint-runtime/src/upstream_proxy/index.js +0 -12
- package/dist/constraint-runtime/src/utils/index.js +0 -12
- package/dist/constraint-runtime/src/vim/index.js +0 -12
- package/dist/constraint-runtime/src/voice/index.js +0 -12
- package/dist/constraints/index.js.map +0 -1
- package/dist/documents/reader.js.map +0 -1
- package/dist/llm/config-store.js.map +0 -1
- package/dist/llm/pi-ai.js.map +0 -1
- package/dist/network/agent-network.js.map +0 -1
- package/dist/network/iroh-integration.js.map +0 -1
- package/dist/network/iroh-transport.js.map +0 -1
- package/dist/network/p2p.js.map +0 -1
- package/dist/network/storage/adapters/json-adapter.js.map +0 -1
- package/dist/pi-ecosystem-colony/index.js.map +0 -1
- package/dist/pi-ecosystem-goals/index.js.map +0 -1
- package/dist/pi-ecosystem-judgment/decision.js.map +0 -1
- package/dist/pi-ecosystem-judgment/distillation.js.map +0 -1
- package/dist/pi-ecosystem-judgment/human-value-store.js.map +0 -1
- package/dist/pi-ecosystem-judgment/index.js.map +0 -1
- package/dist/pi-ecosystem-judgment/value-injection.js.map +0 -1
- package/dist/pi-ecosystem-mcp/index.js.map +0 -1
- package/dist/pi-ecosystem-subagents/index.js.map +0 -1
- package/dist/social/ant-colony/AdaptiveHeartbeat.js.map +0 -1
- package/dist/social/ant-colony/PheromoneEngine.js.map +0 -1
- package/dist/social/ant-colony/types.js.map +0 -1
- package/dist/social/channels/ChannelManager.js.map +0 -1
- package/dist/social/channels/DiapChannelBridge.js.map +0 -1
- package/dist/social/channels/InterestMatcher.js.map +0 -1
- package/dist/social/channels/types.js.map +0 -1
- package/dist/social/global-shared-context.js.map +0 -1
- package/dist/social/heartbeat.js.map +0 -1
- package/lefthook.yml +0 -29
- package/scripts/auto-evolve-loop.ts +0 -376
- package/scripts/auto-evolve-oneshot.sh +0 -155
- package/scripts/auto-evolve-snapshot.sh +0 -136
- package/scripts/build-cli.js +0 -216
- package/scripts/build-web.ts +0 -82
- package/scripts/detect-schema-changes.sh +0 -48
- package/scripts/diff-reviewer.ts +0 -159
- package/scripts/postinstall.js +0 -153
- package/scripts/weekly-report.ts +0 -364
- package/src/agents/agent-manifest-protocol.ts +0 -117
- package/src/agents/constraint-layer.ts +0 -309
- package/src/agents/iroh-secret.ts +0 -32
- package/src/agents/p2p-chat-tools.ts +0 -383
- package/src/agents/p2p-document-tools.ts +0 -347
- package/src/agents/pi-sdk.ts +0 -2462
- package/src/agents/protocol.ts +0 -398
- package/src/agents/shell-guard.ts +0 -417
- package/src/agents/shell-tool.ts +0 -103
- package/src/agents/skill-loader.ts +0 -202
- package/src/agents/subagent-manager.ts +0 -553
- package/src/agents/workflow-engine.ts +0 -332
- package/src/agents/workflow-pivot-loop.ts +0 -675
- package/src/bollharness/.sanitize-report.json +0 -13
- package/src/bollharness/CLAUDE.md +0 -73
- package/src/bollharness/LICENSE +0 -21
- package/src/bollharness/README.md +0 -143
- package/src/bollharness/README.zh-CN.md +0 -131
- package/src/bollharness/package.json +0 -20
- package/src/bollharness/reference/SOURCE-COMMIT.txt +0 -3
- package/src/bollharness/reference/boll-reference/scripts/hooks/.sanitize-report.json +0 -12
- package/src/bollharness/reference/boll-reference/scripts/hooks/find-boll-root.sh +0 -27
- package/src/bollharness/reference/boll-reference/scripts/hooks/precompact.sh +0 -57
- package/src/bollharness/reference/boll-reference/scripts/hooks/stop-evaluator.md +0 -57
- package/src/bollharness/schemas/metrics-jsonl-allowlist.json +0 -67
- package/src/bollharness/scripts/checks/next_decision_number.sh +0 -48
- package/src/bollharness/scripts/ci/count-components.sh +0 -65
- package/src/bollharness/scripts/context-fragments/artifact-linkage.md +0 -14
- package/src/bollharness/scripts/context-fragments/auth-consumers.md +0 -17
- package/src/bollharness/scripts/context-fragments/bridge-constitution.md +0 -13
- package/src/bollharness/scripts/context-fragments/catalyst-distributed.md +0 -18
- package/src/bollharness/scripts/context-fragments/closure-checklist.md +0 -13
- package/src/bollharness/scripts/context-fragments/contract-consumers.md +0 -15
- package/src/bollharness/scripts/context-fragments/db-shared-structures.md +0 -15
- package/src/bollharness/scripts/context-fragments/fixed-three-layers.md +0 -19
- package/src/bollharness/scripts/context-fragments/general-dev-principles.md +0 -11
- package/src/bollharness/scripts/context-fragments/issue-first.md +0 -8
- package/src/bollharness/scripts/context-fragments/mcp-parity.md +0 -16
- package/src/bollharness/scripts/context-fragments/pi-agent-operations.md +0 -108
- package/src/bollharness/scripts/context-fragments/protocol-consumers.md +0 -15
- package/src/bollharness/scripts/context-fragments/run-events-consumers.md +0 -15
- package/src/bollharness/scripts/context-fragments/scene-fidelity.md +0 -13
- package/src/bollharness/scripts/context-fragments/truth-source-hierarchy.md +0 -15
- package/src/bollharness/scripts/context-fragments/two-language.md +0 -15
- package/src/bollharness/scripts/context-fragments/version-sources.md +0 -14
- package/src/bollharness/scripts/hooks/find-project-root.sh +0 -47
- package/src/bollharness/scripts/hooks/inbox-poll.sh +0 -78
- package/src/bollharness/scripts/hooks/precompact.sh +0 -56
- package/src/bollharness/scripts/hooks/stop-evaluator.md +0 -83
- package/src/bollharness/scripts/sync-from-upstream.sh +0 -281
- package/src/bollharness/src/index.ts +0 -5
- package/src/bollharness/src/scripts/checks/check_adr_plan_numbering.ts +0 -11
- package/src/bollharness/src/scripts/checks/check_api_types.ts +0 -52
- package/src/bollharness/src/scripts/checks/check_artifact_link.ts +0 -156
- package/src/bollharness/src/scripts/checks/check_bridge_deps.ts +0 -11
- package/src/bollharness/src/scripts/checks/check_bugfix_binding.ts +0 -11
- package/src/bollharness/src/scripts/checks/check_bugfix_binding_ci.ts +0 -11
- package/src/bollharness/src/scripts/checks/check_doc_file_references.ts +0 -11
- package/src/bollharness/src/scripts/checks/check_doc_freshness.ts +0 -141
- package/src/bollharness/src/scripts/checks/check_doc_links.ts +0 -36
- package/src/bollharness/src/scripts/checks/check_file_existence_claims.ts +0 -11
- package/src/bollharness/src/scripts/checks/check_fragment_integrity.ts +0 -40
- package/src/bollharness/src/scripts/checks/check_hook_installed.ts +0 -70
- package/src/bollharness/src/scripts/checks/check_issue_closure.ts +0 -51
- package/src/bollharness/src/scripts/checks/check_mcp_parity.ts +0 -11
- package/src/bollharness/src/scripts/checks/check_security.ts +0 -54
- package/src/bollharness/src/scripts/checks/check_skill_parity.ts +0 -11
- package/src/bollharness/src/scripts/checks/check_versions.ts +0 -11
- package/src/bollharness/src/scripts/checks/finding.ts +0 -35
- package/src/bollharness/src/scripts/checks/next_decision_number.ts +0 -24
- package/src/bollharness/src/scripts/checks/regenerate_magic_docs.ts +0 -11
- package/src/bollharness/src/scripts/ci/detect_rebaseline_triggers.ts +0 -14
- package/src/bollharness/src/scripts/ci/scan_subprocess_cfg.ts +0 -14
- package/src/bollharness/src/scripts/ci/scan_verify_artifacts.ts +0 -14
- package/src/bollharness/src/scripts/ci/scan_yaml_schema.ts +0 -14
- package/src/bollharness/src/scripts/context_router.ts +0 -76
- package/src/bollharness/src/scripts/deploy-guard.ts +0 -182
- package/src/bollharness/src/scripts/guard-feedback.ts +0 -215
- package/src/bollharness/src/scripts/guard_router.ts +0 -194
- package/src/bollharness/src/scripts/hooks/_hook_output.js +0 -3
- package/src/bollharness/src/scripts/hooks/_hook_output.ts +0 -11
- package/src/bollharness/src/scripts/hooks/auto-python3.ts +0 -10
- package/src/bollharness/src/scripts/hooks/deploy-progress-on-session-end.ts +0 -10
- package/src/bollharness/src/scripts/hooks/failure-analyzer.ts +0 -10
- package/src/bollharness/src/scripts/hooks/gate-judgment-inject.ts +0 -111
- package/src/bollharness/src/scripts/hooks/gate-transition-judgment.ts +0 -74
- package/src/bollharness/src/scripts/hooks/inbox-ack.ts +0 -10
- package/src/bollharness/src/scripts/hooks/inbox-inject-on-start.ts +0 -10
- package/src/bollharness/src/scripts/hooks/inbox-validate.ts +0 -10
- package/src/bollharness/src/scripts/hooks/inbox-write-ledger.ts +0 -10
- package/src/bollharness/src/scripts/hooks/initializer-agent.ts +0 -10
- package/src/bollharness/src/scripts/hooks/loop-detection.ts +0 -83
- package/src/bollharness/src/scripts/hooks/owner-guard.ts +0 -10
- package/src/bollharness/src/scripts/hooks/precompact.ts +0 -10
- package/src/bollharness/src/scripts/hooks/review-agent-gatekeeper.ts +0 -10
- package/src/bollharness/src/scripts/hooks/risk-tracker.ts +0 -121
- package/src/bollharness/src/scripts/hooks/sanitize-on-read.ts +0 -10
- package/src/bollharness/src/scripts/hooks/session-reflection.ts +0 -12
- package/src/bollharness/src/scripts/hooks/session-start-magic-docs.ts +0 -12
- package/src/bollharness/src/scripts/hooks/session-start-reset-risk.ts +0 -12
- package/src/bollharness/src/scripts/hooks/session-start-toolkit-reminder.ts +0 -12
- package/src/bollharness/src/scripts/hooks/stop-evaluator.ts +0 -164
- package/src/bollharness/src/scripts/hooks/tool-call-counter.ts +0 -10
- package/src/bollharness/src/scripts/hooks/trace-analyzer.ts +0 -14
- package/src/bollharness/src/scripts/install/install-trust-token.ts +0 -13
- package/src/bollharness/src/scripts/install/multi_project_registry.ts +0 -13
- package/src/bollharness/src/scripts/install/phase2_auto.ts +0 -28
- package/src/bollharness/src/scripts/install/pre_commit_installer.ts +0 -10
- package/src/bollharness/src/scripts/install/tier_selector.ts +0 -10
- package/src/bollharness/src/scripts/install/transcript_miner.ts +0 -13
- package/src/bollharness/src/scripts/lib/claim_patterns.ts +0 -11
- package/src/bollharness/src/scripts/lib/sanitize_patterns.ts +0 -13
- package/src/bollharness/src/scripts/sanitize.ts +0 -9
- package/src/bollharness/templates/persona/default.json +0 -19
- package/src/bollharness/templates/scaffold/.gitignore.append +0 -16
- package/src/bollharness/templates/scaffold/CLAUDE.md +0 -89
- package/src/bollharness-integration/channel-judgment-engine.ts +0 -634
- package/src/bollharness-integration/context-chain-router.ts +0 -474
- package/src/bollharness-integration/context-router-judgment.ts +0 -339
- package/src/bollharness-integration/context-router.ts +0 -583
- package/src/bollharness-integration/gate-state-machine.ts +0 -444
- package/src/bollharness-integration/gate-transition-hooks.ts +0 -137
- package/src/bollharness-integration/guard-checker.ts +0 -451
- package/src/bollharness-integration/index.ts +0 -195
- package/src/bollharness-integration/integration.ts +0 -538
- package/src/bollharness-integration/judgment-prompts.yaml +0 -535
- package/src/bollharness-integration/llm-judgment-engine.ts +0 -712
- package/src/bollharness-integration/skill-adapter.ts +0 -646
- package/src/bootstrap/bootstrap.ts +0 -132
- package/src/bootstrap/context-collector.ts +0 -342
- package/src/bootstrap/lifecycle-hooks.ts +0 -176
- package/src/bootstrap/project-context.ts +0 -163
- package/src/cli/interface.ts +0 -211
- package/src/cli-entry.ts +0 -304
- package/src/constraints/index.ts +0 -6
- package/src/documents/reader.ts +0 -85
- package/src/documents/store.ts +0 -252
- package/src/electron-preload.ts +0 -25
- package/src/electron.ts +0 -200
- package/src/heartbeat/DaemonManager.ts +0 -283
- package/src/heartbeat/HealthMonitor.ts +0 -316
- package/src/heartbeat/StartupVerifier.ts +0 -223
- package/src/heartbeat/Watchdog.ts +0 -208
- package/src/heartbeat/index.ts +0 -109
- package/src/heartbeat/self-improve-bus.ts +0 -110
- package/src/heartbeat/types.ts +0 -82
- package/src/index.ts +0 -1690
- package/src/llm/audio-config-store.ts +0 -246
- package/src/llm/config-store.ts +0 -400
- package/src/llm/llm-judgment-client.ts +0 -470
- package/src/llm/pi-ai.ts +0 -558
- package/src/llm/video-config-store.ts +0 -257
- package/src/network/agent-network.ts +0 -800
- package/src/network/hybrid-messenger.ts +0 -199
- package/src/network/iroh-bootstrap.ts +0 -57
- package/src/network/iroh-discovery.ts +0 -208
- package/src/network/iroh-integration.ts +0 -158
- package/src/network/iroh-transport.ts +0 -637
- package/src/network/known-peers.ts +0 -102
- package/src/network/p2p-direct.ts +0 -240
- package/src/network/p2p-secret.ts +0 -153
- package/src/network/p2p.ts +0 -964
- package/src/network/storage/adapters/json-adapter.ts +0 -454
- package/src/network/storage/index.ts +0 -203
- package/src/network/storage/types.ts +0 -166
- package/src/security/builtin-guards.ts +0 -162
- package/src/security/context-router-tool.ts +0 -122
- package/src/security/react-harness.ts +0 -177
- package/src/security/tool-gate.ts +0 -294
- package/src/social/ant-colony/index.js +0 -19
- package/src/social/channels/ChannelManager.ts +0 -485
- package/src/social/channels/DiapChannelBridge.ts +0 -501
- package/src/social/channels/InterestMatcher.ts +0 -189
- package/src/social/channels/agent-workflow-config.json +0 -214
- package/src/social/channels/agent-workflow-config.yaml +0 -334
- package/src/social/channels/channel-agent-session.ts +0 -407
- package/src/social/channels/channel-heartbeat-agent.ts +0 -622
- package/src/social/channels/diap-doc-parser.ts +0 -282
- package/src/social/channels/harness-workflow-integrator.ts +0 -594
- package/src/social/channels/index.ts +0 -22
- package/src/social/channels/types.ts +0 -115
- package/src/social/global-shared-context.ts +0 -506
- package/src/social/heartbeat.ts +0 -1057
- package/src/social/persona/enhanced-persona.ts +0 -359
- package/src/types.d.ts +0 -12
- package/src/utils/auto-evolve-policy.ts +0 -138
- package/src/utils/auto-update.ts +0 -482
- package/src/utils/clamp.ts +0 -5
- package/src/web/agent-delegate-server.ts +0 -148
- package/src/web/api-config.html +0 -520
- package/src/web/client.js +0 -4898
- package/src/web/components/p2p/P2PModal.tsx +0 -416
- package/src/web/components/p2p/index.ts +0 -566
- package/src/web/components/p2p/index.tsx +0 -297
- package/src/web/components/p2p/p2p-connection.ts +0 -338
- package/src/web/components/p2p/p2p-identity.ts +0 -92
- package/src/web/components/p2p/p2p-manager.ts +0 -147
- package/src/web/components/p2p/p2p-messages.ts +0 -219
- package/src/web/components/p2p/p2p-modal.ts +0 -685
- package/src/web/components/p2p/p2p-store-memory.ts +0 -162
- package/src/web/components/p2p/p2p-tools.ts +0 -315
- package/src/web/components/p2p/types.ts +0 -170
- package/src/web/components/wallet-viem.mjs +0 -118
- package/src/web/design.md +0 -99
- package/src/web/icons/apple-touch-icon.png +0 -0
- package/src/web/icons/favicon-16x16.png +0 -0
- package/src/web/icons/favicon-192x192.png +0 -0
- package/src/web/icons/favicon-32x32.png +0 -0
- package/src/web/icons/favicon-48x48.png +0 -0
- package/src/web/icons/favicon-512x512.png +0 -0
- package/src/web/icons/favicon.icns +0 -0
- package/src/web/icons/favicon.ico +0 -0
- package/src/web/icons/icon.png +0 -0
- package/src/web/icons/image.png +0 -0
- package/src/web/index.html +0 -382
- package/src/web/iroh-delegate-transport.ts +0 -139
- package/src/web/manifest.json +0 -21
- package/src/web/server.ts +0 -5571
- package/src/web/style.css +0 -4455
- package/staging/auto-evolve/clean-001/.review-verdict +0 -9
- package/staging/auto-evolve/clean-001/clean-001.patch +0 -14
- package/staging/auto-evolve/e2e-001/.patch-id +0 -1
- package/staging/auto-evolve/e2e-001/.review-verdict +0 -12
- package/staging/auto-evolve/e2e-001/e2e-001.patch +0 -11
- package/staging/auto-evolve/test-bad/.review-verdict +0 -12
- package/staging/auto-evolve/test-bad/test-bad.patch +0 -11
- package/tsconfig.cli.json +0 -16
- package/tsconfig.electron.json +0 -20
- package/tsconfig.json +0 -18
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Snip — 第 2 层: 裁掉老 history
|
|
3
|
+
*
|
|
4
|
+
* 论文: feature flag 关闭 (默认), 用户开启后才生效
|
|
5
|
+
* 开启环境变量: BOLLOON_SNIP_ENABLED=1
|
|
6
|
+
*
|
|
7
|
+
* 行为: 只保留最近 N 对 user/assistant (默认 20 对)
|
|
8
|
+
* 工具结果消息按其所属 round 一起保留
|
|
9
|
+
*
|
|
10
|
+
* 失败静默: 异常 → 返回原 history
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_KEEP_PAIRS = 20;
|
|
13
|
+
export function isSnipEnabled() {
|
|
14
|
+
return process.env.BOLLOON_SNIP_ENABLED === '1';
|
|
15
|
+
}
|
|
16
|
+
export function snip(history, opts = {}) {
|
|
17
|
+
try {
|
|
18
|
+
if (opts.skip || !isSnipEnabled()) {
|
|
19
|
+
return { history, applied: false, detail: isSnipEnabled() ? 'skipped' : 'feature flag off' };
|
|
20
|
+
}
|
|
21
|
+
const keepPairs = opts.snipKeepPairs ?? DEFAULT_KEEP_PAIRS;
|
|
22
|
+
// 从后往前数 N 对 user/assistant 边界
|
|
23
|
+
let pairsFound = 0;
|
|
24
|
+
let cutFrom = -1;
|
|
25
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
26
|
+
const m = history[i];
|
|
27
|
+
if (m.role === 'user') {
|
|
28
|
+
pairsFound++;
|
|
29
|
+
if (pairsFound >= keepPairs) {
|
|
30
|
+
cutFrom = i;
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (cutFrom <= 0) {
|
|
36
|
+
return { history, applied: false, detail: 'history too short' };
|
|
37
|
+
}
|
|
38
|
+
const out = history.slice(cutFrom);
|
|
39
|
+
return { history: out, applied: true, detail: `kept last ${keepPairs} pairs, dropped ${cutFrom} older messages` };
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
console.warn('[compactor] snip failed (silent, returning original):', err);
|
|
43
|
+
return { history, applied: false, detail: 'error' };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Estimator — 4 字符 ≈ 1 token 的粗估
|
|
3
|
+
*
|
|
4
|
+
* 为什么不引 tiktoken 依赖:
|
|
5
|
+
* - bolloon 默认 npm 用户, 引依赖增加 install 体积
|
|
6
|
+
* - Claude Code 论文也指出: 精确 token 计数不是关键, 渐进压缩才是
|
|
7
|
+
* - 4 字符/token 在中文/英文混合场景下误差约 ±20%, 对预算判定足够
|
|
8
|
+
*
|
|
9
|
+
* 失败静默: 任何异常 → 返回估算值 (不抛错)
|
|
10
|
+
*/
|
|
11
|
+
const CHARS_PER_TOKEN = 4;
|
|
12
|
+
export function estimateTokens(messages) {
|
|
13
|
+
let total = 0;
|
|
14
|
+
for (const m of messages) {
|
|
15
|
+
total += Math.ceil((m.content?.length || 0) / CHARS_PER_TOKEN);
|
|
16
|
+
if (m.toolResult) {
|
|
17
|
+
try {
|
|
18
|
+
const s = typeof m.toolResult === 'string' ? m.toolResult : JSON.stringify(m.toolResult);
|
|
19
|
+
total += Math.ceil(s.length / CHARS_PER_TOKEN);
|
|
20
|
+
}
|
|
21
|
+
catch { /* circular ref, ignore */ }
|
|
22
|
+
}
|
|
23
|
+
if (m.toolCall) {
|
|
24
|
+
try {
|
|
25
|
+
const s = typeof m.toolCall === 'string' ? m.toolCall : JSON.stringify(m.toolCall);
|
|
26
|
+
total += Math.ceil(s.length / CHARS_PER_TOKEN);
|
|
27
|
+
}
|
|
28
|
+
catch { /* ignore */ }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return total;
|
|
32
|
+
}
|
|
33
|
+
export function estimateStringTokens(s) {
|
|
34
|
+
return Math.ceil(s.length / CHARS_PER_TOKEN);
|
|
35
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Compaction — 类型定义
|
|
3
|
+
*
|
|
4
|
+
* 严格对齐 Claude Code 论文 5 层压缩流水线:
|
|
5
|
+
* 1. Budget Reduction (单条消息大小限制)
|
|
6
|
+
* 2. Snip (裁掉老历史, feature flag 关闭)
|
|
7
|
+
* 3. Microcompact (cache-aware 细粒度压缩, 老 tool_result 折叠)
|
|
8
|
+
* 4. Context Collapse (读时虚拟投影, 非破坏)
|
|
9
|
+
* 5. Auto-Compact (LLM 摘要, 兜底)
|
|
10
|
+
*
|
|
11
|
+
* 关键不变量:
|
|
12
|
+
* - 第 1-3 层不破坏 messageHistory 内存结构, 只改 buildContext 输出
|
|
13
|
+
* - 第 4 层读时投影, 绝不改 messageHistory
|
|
14
|
+
* - 第 5 层破坏 messageHistory, 把 N 对折叠成 1 条 summary
|
|
15
|
+
*
|
|
16
|
+
* 类型设计: Message 在本模块内独立定义, 靠 structural typing 与 pi-sdk.ts 的 Message 兼容.
|
|
17
|
+
* 不 import pi-sdk 避免循环依赖.
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
@@ -231,9 +231,10 @@ export class HealthMonitor {
|
|
|
231
231
|
async pingLLM(minimax) {
|
|
232
232
|
const start = Date.now();
|
|
233
233
|
try {
|
|
234
|
-
//
|
|
234
|
+
// 2026-06-15: signal 位置正确传 undefined (chat signature 是 (message, context?, signal?))
|
|
235
|
+
// 之前传 { maxTokens: 1 } 被当 signal, Node 22+ undici 强类型 AbortSignal 校验 throw
|
|
235
236
|
if (minimax.chat) {
|
|
236
|
-
await minimax.chat('ping', 'test',
|
|
237
|
+
await minimax.chat('ping', 'test', undefined);
|
|
237
238
|
}
|
|
238
239
|
else if (minimax.ping) {
|
|
239
240
|
await minimax.ping();
|
package/dist/index.js
CHANGED
|
@@ -978,6 +978,34 @@ async function runNonInteractive(args, comm) {
|
|
|
978
978
|
console.log(`✅ 结果已保存到: ${output}`);
|
|
979
979
|
return;
|
|
980
980
|
}
|
|
981
|
+
if (tool === 'prompt' && prompt) {
|
|
982
|
+
// 2026-06-15: --prompt "text" 走直接调 a.prompt(prompt) 路径, 避开 runToolCommand
|
|
983
|
+
// (case 'prompt' 内的 [text] = args 从 toolArgs 取值是空数组, 永远报"缺少 prompt 文本"是 CLI bug)
|
|
984
|
+
const startTime = Date.now();
|
|
985
|
+
const a = await getAgent();
|
|
986
|
+
try {
|
|
987
|
+
const response = await a.prompt(prompt);
|
|
988
|
+
const elapsed = Date.now() - startTime;
|
|
989
|
+
if (json) {
|
|
990
|
+
console.log(JSON.stringify({ success: true, response, elapsedMs: elapsed }, null, 2));
|
|
991
|
+
}
|
|
992
|
+
else {
|
|
993
|
+
console.log(response);
|
|
994
|
+
console.log(`\n耗时: ${elapsed}ms`);
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
catch (e) {
|
|
998
|
+
const error = e?.message || String(e);
|
|
999
|
+
if (json) {
|
|
1000
|
+
console.log(JSON.stringify({ success: false, error }, null, 2));
|
|
1001
|
+
}
|
|
1002
|
+
else {
|
|
1003
|
+
console.log(`\n错误: ${error}`);
|
|
1004
|
+
}
|
|
1005
|
+
process.exit(1);
|
|
1006
|
+
}
|
|
1007
|
+
return;
|
|
1008
|
+
}
|
|
981
1009
|
if (tool) {
|
|
982
1010
|
await runToolCommand(tool, toolArgs, !!json, comm);
|
|
983
1011
|
}
|
|
@@ -1367,7 +1395,9 @@ async function main() {
|
|
|
1367
1395
|
s.banner();
|
|
1368
1396
|
s.section('系统初始化');
|
|
1369
1397
|
const hasOpenAI = !!process.env.OPENAI_API_KEY;
|
|
1370
|
-
|
|
1398
|
+
// 2026-06-15: 修复 — 之前 anthropic 401 是因为 shell env 残留的旧 ANTHROPIC_API_KEY 抢了 provider 选择
|
|
1399
|
+
// 用 BOLLOON_LLM_PROVIDER env 显式覆盖, 否则还是按 env hasXxx 顺序自动选
|
|
1400
|
+
const hasAnthropic = !!process.env.ANTHROPIC_API_KEY && !process.env.BOLLOON_LLM_PROVIDER;
|
|
1371
1401
|
const hasMinimax = !!process.env.MINIMAX_API_KEY;
|
|
1372
1402
|
const hasDeepSeek = !!process.env.DEEPSEEK_API_KEY;
|
|
1373
1403
|
const hasKimi = !!(process.env.KIMI_API_KEY || process.env.MOONSHOT_API_KEY);
|
|
@@ -1447,9 +1477,15 @@ async function main() {
|
|
|
1447
1477
|
s.divider();
|
|
1448
1478
|
if (mode === 'web') {
|
|
1449
1479
|
const port = parseInt(process.env.PORT || '54188');
|
|
1480
|
+
// 2026-06-16: BOLLOON_DEV_MODE=1 或 selfImprove=true 启动项 → 开发者模式, 启用自迭代 (健康监控+自改总线)
|
|
1481
|
+
// 默认用户模式: 不自迭代, 自改卡片不自动出现, 仍可 POST /api/self-improve/trigger 手动触发
|
|
1482
|
+
const selfImprove = process.env.BOLLOON_DEV_MODE === '1' || process.env.BOLLOON_DEV_MODE === 'true';
|
|
1483
|
+
if (selfImprove) {
|
|
1484
|
+
console.log('[startup] BOLLOON_DEV_MODE=1, 开发者模式: 自迭代已启用');
|
|
1485
|
+
}
|
|
1450
1486
|
const { createWebServer, openBrowser } = await import('./web/server.js');
|
|
1451
1487
|
s.info(`启动 Web 服务端口 ${port}...`);
|
|
1452
|
-
const { port: actualPort } = await createWebServer(port);
|
|
1488
|
+
const { port: actualPort } = await createWebServer(port, { selfImprove });
|
|
1453
1489
|
s.success(`浏览器已打开 → http://localhost:${actualPort}`);
|
|
1454
1490
|
openBrowser(`http://localhost:${actualPort}`);
|
|
1455
1491
|
}
|
|
@@ -6,19 +6,31 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { llmConfigStore } from './config-store.js';
|
|
8
8
|
import { PiAIModel } from './pi-ai.js';
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
const LAYERS_DIR = path.join(__dirname, 'system-prompt', 'layers');
|
|
14
|
+
/**
|
|
15
|
+
* 从 layer 读 .md 文件作为系统 prompt
|
|
16
|
+
* 失败时降级到兜底字符串 (不挂)
|
|
17
|
+
*/
|
|
18
|
+
async function loadRoleLayer(layerId, fallback) {
|
|
19
|
+
const [group, ...rest] = layerId.split('.');
|
|
20
|
+
const path2md = path.join(LAYERS_DIR, group, `${rest.join('.')}.md`);
|
|
21
|
+
try {
|
|
22
|
+
return await fs.readFile(path2md, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return fallback;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
9
28
|
// 预定义的判断 Prompt 配置
|
|
10
29
|
export const JUDGMENT_PROMPTS = {
|
|
11
30
|
// 默认判断 Prompt
|
|
12
31
|
default: {
|
|
13
|
-
systemPrompt:
|
|
14
|
-
|
|
15
|
-
核心原则:
|
|
16
|
-
1. 第一性原理:追问问题的本质,而非表面现象
|
|
17
|
-
2. 多角度思考:考虑不同视角和影响因素
|
|
18
|
-
3. 上下文感知:理解对话历史和隐含意图
|
|
19
|
-
4. 动态评估:根据实际情况判断复杂性
|
|
20
|
-
|
|
21
|
-
你的判断会影响后续的智能体协作方式,请认真分析。`,
|
|
32
|
+
systemPrompt: '',
|
|
33
|
+
systemPromptResolver: () => loadRoleLayer('role.expert', '你是一个专业的 AI 任务分析专家. '),
|
|
22
34
|
userPromptTemplate: `【当前输入】
|
|
23
35
|
{user_input}
|
|
24
36
|
|
|
@@ -73,16 +85,8 @@ export const JUDGMENT_PROMPTS = {
|
|
|
73
85
|
},
|
|
74
86
|
// 架构相关问题
|
|
75
87
|
architecture: {
|
|
76
|
-
systemPrompt:
|
|
77
|
-
|
|
78
|
-
- 设计可扩展的系统架构
|
|
79
|
-
- 权衡技术方案
|
|
80
|
-
- 识别架构风险
|
|
81
|
-
|
|
82
|
-
你相信:
|
|
83
|
-
- 本质和实现必须分离
|
|
84
|
-
- 好的架构从简单规则中生长
|
|
85
|
-
- 复杂性应该被控制而非消除`,
|
|
88
|
+
systemPrompt: '',
|
|
89
|
+
systemPromptResolver: () => loadRoleLayer('role.architect', '你是一个经验丰富的系统架构师. '),
|
|
86
90
|
userPromptTemplate: `【架构设计问题】
|
|
87
91
|
{user_input}
|
|
88
92
|
|
|
@@ -108,11 +112,8 @@ export const JUDGMENT_PROMPTS = {
|
|
|
108
112
|
},
|
|
109
113
|
// 代码相关问题
|
|
110
114
|
code: {
|
|
111
|
-
systemPrompt:
|
|
112
|
-
|
|
113
|
-
- 编写清晰、可维护的代码
|
|
114
|
-
- 遵循最佳实践
|
|
115
|
-
- 处理边界情况`,
|
|
115
|
+
systemPrompt: '',
|
|
116
|
+
systemPromptResolver: () => loadRoleLayer('role.implementer', '你是一个高效的代码实现专家. '),
|
|
116
117
|
userPromptTemplate: `【代码问题】
|
|
117
118
|
{user_input}
|
|
118
119
|
|
|
@@ -134,11 +135,8 @@ export const JUDGMENT_PROMPTS = {
|
|
|
134
135
|
},
|
|
135
136
|
// 安全相关问题
|
|
136
137
|
security: {
|
|
137
|
-
systemPrompt:
|
|
138
|
-
|
|
139
|
-
- 评估威胁模型
|
|
140
|
-
- 设计安全方案
|
|
141
|
-
- 遵循安全最佳实践`,
|
|
138
|
+
systemPrompt: '',
|
|
139
|
+
systemPromptResolver: () => loadRoleLayer('role.security', '你是一个严格的安全专家. '),
|
|
142
140
|
userPromptTemplate: `【安全问题】
|
|
143
141
|
{user_input}
|
|
144
142
|
|
|
@@ -221,8 +219,12 @@ export class LLMJudgmentClient {
|
|
|
221
219
|
}
|
|
222
220
|
try {
|
|
223
221
|
// 调用 LLM
|
|
222
|
+
// 优先用 systemPromptResolver (从 layer 读), fallback 静态 systemPrompt
|
|
223
|
+
const systemPrompt = this.promptConfig.systemPromptResolver
|
|
224
|
+
? await this.promptConfig.systemPromptResolver()
|
|
225
|
+
: this.promptConfig.systemPrompt;
|
|
224
226
|
const messages = [
|
|
225
|
-
{ role: 'system', content:
|
|
227
|
+
{ role: 'system', content: systemPrompt },
|
|
226
228
|
{ role: 'user', content: userPrompt }
|
|
227
229
|
];
|
|
228
230
|
const response = await this.model.chat(userPrompt);
|
package/dist/llm/pi-ai.js
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
|
+
/**
|
|
4
|
+
* 外部 system 注入钩子.
|
|
5
|
+
* 调用方 (e.g. auto-evolve-loop) 用 setSystemPrependProvider() 注册一个返回字符串的函数,
|
|
6
|
+
* generateText 在拼 finalMessages 时, 把返回的字符串作为最前一个 system message.
|
|
7
|
+
*
|
|
8
|
+
* 用途: P2P 协作时把"行级 reserve 状态"实时塞给 LLM,
|
|
9
|
+
* 让 LLM 主动避开对方正在改的代码行.
|
|
10
|
+
*
|
|
11
|
+
* 返回 '' / null / undefined → 不注入.
|
|
12
|
+
*/
|
|
13
|
+
let _prependProvider = null;
|
|
14
|
+
export function setSystemPrependProvider(p) {
|
|
15
|
+
_prependProvider = p;
|
|
16
|
+
}
|
|
17
|
+
export function getSystemPrependProvider() {
|
|
18
|
+
return _prependProvider;
|
|
19
|
+
}
|
|
3
20
|
export class PiAIModel {
|
|
4
21
|
config;
|
|
5
22
|
provider;
|
|
@@ -8,7 +25,7 @@ export class PiAIModel {
|
|
|
8
25
|
this.provider = config.provider;
|
|
9
26
|
}
|
|
10
27
|
async chat(message, context, signal) {
|
|
11
|
-
const systemPrompt = this.
|
|
28
|
+
const systemPrompt = await this.buildSystemPromptAsync(context);
|
|
12
29
|
const messages = [
|
|
13
30
|
{ role: 'system', content: systemPrompt },
|
|
14
31
|
{ role: 'user', content: message }
|
|
@@ -17,6 +34,7 @@ export class PiAIModel {
|
|
|
17
34
|
const response = await this.generateText({
|
|
18
35
|
messages,
|
|
19
36
|
temperature: 0.8,
|
|
37
|
+
maxTokens: 8192, // 2026-06-15: 提到 8192, 避免长回答 (含表格/代码块) 被截断
|
|
20
38
|
signal,
|
|
21
39
|
});
|
|
22
40
|
return { reply: response };
|
|
@@ -27,7 +45,14 @@ export class PiAIModel {
|
|
|
27
45
|
throw error; // 上层 try/catch 处理
|
|
28
46
|
}
|
|
29
47
|
console.error('PiAI chat error:', error);
|
|
30
|
-
|
|
48
|
+
// 2026-06-15: 真实 error 信息 + 明确告诉 LLM "这是 API 错, 不要 retry"
|
|
49
|
+
// 旧版: "抱歉,AI服务暂时不可用。" → LLM 看到 isTooShort=false(< 50 但 > 0),
|
|
50
|
+
// needsMoreWork 不会触发, 但 hasError 模式 (含 "error" / "失败") 会判定要继续修
|
|
51
|
+
// 新版: 让 LLM 立即停止循环, 直接展示给用户
|
|
52
|
+
const errMsg = (error?.message || '').slice(0, 300);
|
|
53
|
+
return {
|
|
54
|
+
reply: `[AI 服务调用失败] ${errMsg}\n\n这是一个**底层 API 错误**(401 / 鉴权失败 / 网络中断 / 配额耗尽等),不是你的任务有问题。**请直接把这个错误消息回复给用户,不要再循环尝试。**`,
|
|
55
|
+
};
|
|
31
56
|
}
|
|
32
57
|
}
|
|
33
58
|
async summarize(text, context) {
|
|
@@ -69,7 +94,39 @@ export class PiAIModel {
|
|
|
69
94
|
}
|
|
70
95
|
}
|
|
71
96
|
async generateText(options) {
|
|
72
|
-
const { messages, temperature = 0.7, maxTokens = 4096, signal } = options;
|
|
97
|
+
const { messages, temperature = 0.7, maxTokens = 4096, signal, tools } = options;
|
|
98
|
+
// 工具清单: 代码侧 schema → 进 system prompt (作为额外 system message)
|
|
99
|
+
let finalMessages = messages;
|
|
100
|
+
// 1) 外部 prepend (e.g. P2P 行级 reserve 状态), 拼到最前
|
|
101
|
+
if (_prependProvider) {
|
|
102
|
+
try {
|
|
103
|
+
const pre = await _prependProvider();
|
|
104
|
+
if (pre && typeof pre === 'string' && pre.trim()) {
|
|
105
|
+
finalMessages = [{ role: 'system', content: pre }, ...finalMessages];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
console.warn('[pi-ai] systemPrepend 失败:', err?.message?.slice(0, 100));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (tools && tools.length > 0) {
|
|
113
|
+
try {
|
|
114
|
+
const { getToolManifest, formatForPrompt } = await import('./tool-manifest/index.js');
|
|
115
|
+
const manifests = tools
|
|
116
|
+
.map((id) => getToolManifest(id))
|
|
117
|
+
.filter((m) => m !== undefined);
|
|
118
|
+
if (manifests.length > 0) {
|
|
119
|
+
const toolPrompt = formatForPrompt(manifests);
|
|
120
|
+
finalMessages = [
|
|
121
|
+
{ role: 'system', content: toolPrompt },
|
|
122
|
+
...messages,
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
console.warn('[pi-ai] tool-manifest 加载失败:', err.message?.slice(0, 100));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
73
130
|
switch (this.provider) {
|
|
74
131
|
case 'openai':
|
|
75
132
|
case 'minimax':
|
|
@@ -77,17 +134,17 @@ export class PiAIModel {
|
|
|
77
134
|
case 'kimi':
|
|
78
135
|
case 'glm':
|
|
79
136
|
case 'qwen':
|
|
80
|
-
return this.callOpenAI(
|
|
137
|
+
return this.callOpenAI(finalMessages, temperature, maxTokens, signal);
|
|
81
138
|
case 'anthropic':
|
|
82
|
-
return this.callAnthropic(
|
|
139
|
+
return this.callAnthropic(finalMessages, temperature, maxTokens, signal);
|
|
83
140
|
case 'ollama':
|
|
84
|
-
return this.callOllama(
|
|
141
|
+
return this.callOllama(finalMessages, temperature, signal);
|
|
85
142
|
case 'openrouter':
|
|
86
|
-
return this.callOpenRouter(
|
|
143
|
+
return this.callOpenRouter(finalMessages, temperature, maxTokens, signal);
|
|
87
144
|
case 'gemini':
|
|
88
|
-
return this.callGemini(
|
|
145
|
+
return this.callGemini(finalMessages, temperature, maxTokens, signal);
|
|
89
146
|
case 'local':
|
|
90
|
-
return this.callLocal(
|
|
147
|
+
return this.callLocal(finalMessages, temperature, signal);
|
|
91
148
|
default:
|
|
92
149
|
throw new Error(`Unsupported provider: ${this.provider}`);
|
|
93
150
|
}
|
|
@@ -152,19 +209,23 @@ export class PiAIModel {
|
|
|
152
209
|
if (!apiKey) {
|
|
153
210
|
throw new Error('OPENAI_API_KEY not set');
|
|
154
211
|
}
|
|
212
|
+
const requestBody = {
|
|
213
|
+
model: this.mapModel(),
|
|
214
|
+
messages,
|
|
215
|
+
temperature,
|
|
216
|
+
max_tokens: maxTokens
|
|
217
|
+
};
|
|
155
218
|
const response = await fetch(`${this.getBaseUrl()}/chat/completions`, {
|
|
156
219
|
method: 'POST',
|
|
157
220
|
headers: {
|
|
158
221
|
'Content-Type': 'application/json',
|
|
159
222
|
'Authorization': `Bearer ${apiKey}`
|
|
160
223
|
},
|
|
161
|
-
body: JSON.stringify(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}),
|
|
167
|
-
signal,
|
|
224
|
+
body: JSON.stringify(requestBody),
|
|
225
|
+
// 2026-06-15: signal 字段防御 — Node 22+ undici 强类型 AbortSignal, 非 AbortSignal 实例
|
|
226
|
+
// (e.g. 误传的 { maxTokens: 1 } 对象) 会 throw "Expected signal to be AbortSignal".
|
|
227
|
+
// 若不是 AbortSignal, 退到无 signal 调用, fetch 自然支持 timeout 由外层控制.
|
|
228
|
+
signal: signal instanceof AbortSignal ? signal : undefined,
|
|
168
229
|
});
|
|
169
230
|
if (!response.ok) {
|
|
170
231
|
throw new Error(`OpenAI API error: ${response.status}`);
|
|
@@ -285,6 +346,32 @@ export class PiAIModel {
|
|
|
285
346
|
async callLocal(messages, temperature, signal) {
|
|
286
347
|
return this.callOllama(messages, temperature, signal);
|
|
287
348
|
}
|
|
349
|
+
// 注: callLocal 直接代理 ollama. 工具清单由 generateText 在外层拼到 messages, 这里 messages 已是 finalMessages.
|
|
350
|
+
async buildSystemPromptAsync(context) {
|
|
351
|
+
// 走 layer registry: 装配所有相关 layer (身份/行为/工具/角色/渠道)
|
|
352
|
+
try {
|
|
353
|
+
const { assembleSystemPrompt, SYSTEM_PROMPT_VERSION } = await import('./system-prompt/registry.js').catch(() => import('./system-prompt/registry.js'));
|
|
354
|
+
// channel = 本机 (PI SDK 直接调就是 local)
|
|
355
|
+
// role = 由 prompt context 决定 (默认 expert)
|
|
356
|
+
const ctx = context ? { channel: 'local', role: 'expert' } : { channel: 'local', role: 'expert' };
|
|
357
|
+
const result = await assembleSystemPrompt(ctx);
|
|
358
|
+
return `${result.text}\n\n## User Working Directory\n${context || process.cwd()}\n\n## bolloon-runtime\n${SYSTEM_PROMPT_VERSION} · layers: ${result.layerIds.join(',')}`;
|
|
359
|
+
}
|
|
360
|
+
catch (err) {
|
|
361
|
+
// 降级: 旧硬编码 (layer registry 不可用时不挂)
|
|
362
|
+
console.warn('[pi-ai] layer registry 不可用, 降级:', err.message?.slice(0, 100));
|
|
363
|
+
const envDetails = this.getEnvironmentDetails();
|
|
364
|
+
return `You are a friendly AI assistant in a P2P document collaboration network.
|
|
365
|
+
|
|
366
|
+
## User Working Directory
|
|
367
|
+
${context || process.cwd()}
|
|
368
|
+
|
|
369
|
+
## Environment
|
|
370
|
+
${envDetails}`;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// 同步版: 旧调用点 (buildSystemPrompt 是同步)
|
|
374
|
+
// 保留但内部用 sync fallback; 后续可改成 async
|
|
288
375
|
buildSystemPrompt(context) {
|
|
289
376
|
const envDetails = this.getEnvironmentDetails();
|
|
290
377
|
return `You are a friendly AI assistant in a P2P document collaboration network.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* system-prompt health — 每层 lifecycle 状态扫描
|
|
3
|
+
*
|
|
4
|
+
* 严格对齐 deusyu 论文 "Harness Gardening 3-6 月" + walkinglabs Lifecycle 4-stage
|
|
5
|
+
* + 马书 ch05+ch13 systemPromptSection + 89 FF 的版本/owner 治理思想.
|
|
6
|
+
*
|
|
7
|
+
* 设计:
|
|
8
|
+
* - 输入: 完整 layer list (assembleSystemPrompt 返回的 layers[])
|
|
9
|
+
* - 输出: 每层 health 状态 (ok | stale | overdue-review | missing-frontmatter)
|
|
10
|
+
* - 失败静默: 任何 layer 读失败 → 标 'missing-frontmatter' 而非抛错
|
|
11
|
+
*
|
|
12
|
+
* 决策 (cross-repo_caveats 选边):
|
|
13
|
+
* - dynamic layers (function source) → 标 'ok' (last_reviewed_at = now), 视作 runtime-managed
|
|
14
|
+
* - frontmatter author 拒绝 'llm-judge' 之外的不合法值 → 标 'missing-frontmatter'
|
|
15
|
+
*/
|
|
16
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
17
|
+
/** 兼容运行时: dynamic layer 没有 meta, 视作 'dynamic' (last_reviewed = now) */
|
|
18
|
+
function isDynamic(l) {
|
|
19
|
+
return l.source === 'function';
|
|
20
|
+
}
|
|
21
|
+
/** 评估单层 health */
|
|
22
|
+
export function evaluateLayer(l, now = new Date()) {
|
|
23
|
+
if (isDynamic(l)) {
|
|
24
|
+
return {
|
|
25
|
+
id: l.id,
|
|
26
|
+
health: 'dynamic',
|
|
27
|
+
ageDays: 0,
|
|
28
|
+
ttlDays: -1,
|
|
29
|
+
remainingDays: -1,
|
|
30
|
+
author: l.meta?.author ?? 'runtime',
|
|
31
|
+
lastReviewedAt: now.toISOString(),
|
|
32
|
+
active: false, // 由 caller (assembleSystemPrompt) 决定
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (!l.meta) {
|
|
36
|
+
// frontmatter 解析失败或缺失
|
|
37
|
+
return {
|
|
38
|
+
id: l.id,
|
|
39
|
+
health: 'missing-frontmatter',
|
|
40
|
+
ageDays: -1,
|
|
41
|
+
ttlDays: -1,
|
|
42
|
+
remainingDays: -1,
|
|
43
|
+
author: null,
|
|
44
|
+
lastReviewedAt: null,
|
|
45
|
+
active: false,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const reviewedAt = new Date(l.meta.lastReviewedAt).getTime();
|
|
49
|
+
if (isNaN(reviewedAt)) {
|
|
50
|
+
return {
|
|
51
|
+
id: l.id,
|
|
52
|
+
health: 'missing-frontmatter',
|
|
53
|
+
ageDays: -1,
|
|
54
|
+
ttlDays: l.meta.ttlDays,
|
|
55
|
+
remainingDays: -1,
|
|
56
|
+
author: l.meta.author,
|
|
57
|
+
lastReviewedAt: l.meta.lastReviewedAt,
|
|
58
|
+
active: false,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const ageMs = now.getTime() - reviewedAt;
|
|
62
|
+
const ageDays = Math.floor(ageMs / DAY_MS);
|
|
63
|
+
const remainingDays = l.meta.ttlDays - ageDays;
|
|
64
|
+
let health;
|
|
65
|
+
if (remainingDays < 0) {
|
|
66
|
+
health = 'overdue-review';
|
|
67
|
+
}
|
|
68
|
+
else if (remainingDays < l.meta.ttlDays * 0.2) {
|
|
69
|
+
health = 'stale'; // 剩余 < 20% ttl 触发告警
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
health = 'ok';
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
id: l.id,
|
|
76
|
+
health,
|
|
77
|
+
ageDays,
|
|
78
|
+
ttlDays: l.meta.ttlDays,
|
|
79
|
+
remainingDays,
|
|
80
|
+
author: l.meta.author,
|
|
81
|
+
lastReviewedAt: l.meta.lastReviewedAt,
|
|
82
|
+
notes: l.meta.notes,
|
|
83
|
+
active: false, // caller 决定
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** 评估整组 layer (输入: assembleSystemPrompt 返回的 layers[]) */
|
|
87
|
+
export function evaluateLayers(layers, now = new Date()) {
|
|
88
|
+
const entries = layers.map((l) => evaluateLayer(l, now));
|
|
89
|
+
return summarize(entries, now);
|
|
90
|
+
}
|
|
91
|
+
/** 汇总: 给一批 entries 算 counts */
|
|
92
|
+
function summarize(entries, now) {
|
|
93
|
+
const counts = { ok: 0, stale: 0, overdue: 0, missing: 0, dynamic: 0 };
|
|
94
|
+
for (const e of entries) {
|
|
95
|
+
if (e.health === 'ok')
|
|
96
|
+
counts.ok++;
|
|
97
|
+
else if (e.health === 'stale')
|
|
98
|
+
counts.stale++;
|
|
99
|
+
else if (e.health === 'overdue-review')
|
|
100
|
+
counts.overdue++;
|
|
101
|
+
else if (e.health === 'missing-frontmatter')
|
|
102
|
+
counts.missing++;
|
|
103
|
+
else if (e.health === 'dynamic')
|
|
104
|
+
counts.dynamic++;
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
scannedAt: now.toISOString(),
|
|
108
|
+
total: entries.length,
|
|
109
|
+
okCount: counts.ok,
|
|
110
|
+
staleCount: counts.stale,
|
|
111
|
+
overdueCount: counts.overdue,
|
|
112
|
+
missingCount: counts.missing,
|
|
113
|
+
dynamicCount: counts.dynamic,
|
|
114
|
+
entries,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** 标记当前 context 下激活的 layer (在 assembleSystemPrompt 调用后用) */
|
|
118
|
+
export function markActive(report, activeIds) {
|
|
119
|
+
return {
|
|
120
|
+
...report,
|
|
121
|
+
entries: report.entries.map((e) => ({ ...e, active: activeIds.has(e.id) })),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// ============================================================
|
|
125
|
+
// 测试钩子
|
|
126
|
+
// ============================================================
|
|
127
|
+
export function _resetHealthForTest() {
|
|
128
|
+
// 无内部状态, 保留 API 一致
|
|
129
|
+
}
|