mixdog 1.3.5 → 1.4.1
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/NOTICE.md +2 -2
- package/README.md +2 -2
- package/package.json +2 -11
- package/scripts/check-voice-runtime-inputs.mjs +25 -0
- package/scripts/daemon-stub.mjs +1 -1
- package/scripts/gate-local.mjs +16 -5
- package/scripts/latest-guard.mjs +21 -9
- package/scripts/lib/isolated-test-env.mjs +10 -5
- package/scripts/lib/run-node-tests.mjs +37 -37
- package/scripts/lib/scoped-temp.d.mts +16 -0
- package/scripts/lib/scoped-temp.mjs +123 -0
- package/scripts/lib/stale-temp.mjs +44 -0
- package/scripts/native-release-status.mjs +2 -2
- package/scripts/post-release-check.mjs +1 -6
- package/scripts/pptx-kit-index.mjs +17 -4
- package/scripts/recall-history-cases.json +1 -1
- package/scripts/suite-health.mjs +20 -2
- package/scripts/test-data-dir.mjs +10 -7
- package/scripts/test.mjs +7 -11
- package/src/agents/reviewer/AGENT.md +7 -11
- package/src/agents/reviewer/agent.json +1 -1
- package/src/app.mjs +4 -0
- package/src/defaults/shipped-history.json +22 -1
- package/src/defaults/skills/browser-use/SKILL.md +62 -12
- package/src/defaults/skills/code-tidy/SKILL.md +142 -270
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
- package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
- package/src/defaults/skills/computer-use/SKILL.md +35 -9
- package/src/defaults/skills/setup/SKILL.md +22 -0
- package/src/defaults/skills/setup/references/actions.md +39 -5
- package/src/defaults/skills/setup/references/surfaces.md +11 -2
- package/src/defaults/skills/visualize/SKILL.md +2 -1
- package/src/lib/rules-builder.cjs +39 -20
- package/src/output-styles/common.md +2 -2
- package/src/output-styles/simple.md +1 -1
- package/src/rules/agent/AGENT.md +11 -10
- package/src/rules/lead/LEAD.md +23 -20
- package/src/rules/shared/05-tool-calls.md +5 -6
- package/src/rules/shared/10-tool-workflow.md +4 -0
- package/src/rules/shared/45-destructive.md +0 -2
- package/src/rules/shared/50-execution.md +2 -0
- package/src/rules/shared/60-verification.md +7 -5
- package/src/rules/shared/70-delivery.md +7 -9
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -6
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
- package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
- package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/config.mjs +17 -1
- package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +73 -68
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +57 -2
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
- package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +192 -133
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +7 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +159 -69
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +70 -33
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
- package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
- package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +25 -13
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +210 -20
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
- package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
- package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +136 -5
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
- package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +20 -12
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +48 -22
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
- package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
- package/src/runtime/agent/orchestrator/providers/registry.mjs +38 -0
- package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +49 -16
- package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +7 -6
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +9 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +798 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +280 -45
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
- package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +163 -22
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +132 -17
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +90 -22
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +51 -25
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +37 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +31 -3
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +20 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +5 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +49 -21
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +24 -14
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
- package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +130 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +27 -9
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +81 -8
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -8
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +12 -5
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +21 -5
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +9 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +24 -9
- package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +150 -0
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
- package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
- package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
- package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
- package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
- package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +81 -22
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +92 -3
- package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
- package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +79 -3
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
- package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +31 -6
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +110 -26
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +31 -5
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +22 -8
- package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +26 -4
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
- package/src/runtime/browser-bridge/action-schema.mjs +13 -2
- package/src/runtime/browser-bridge/client.mjs +73 -8
- package/src/runtime/browser-bridge/input-fields.mjs +8 -9
- package/src/runtime/browser-bridge/mail-links.mjs +107 -0
- package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
- package/src/runtime/channels/lib/config.mjs +6 -61
- package/src/runtime/channels/lib/crash-log.mjs +1 -1
- package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
- package/src/runtime/channels/lib/event-queue.mjs +3 -18
- package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
- package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
- package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
- package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
- package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
- package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
- package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
- package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
- package/src/runtime/channels/lib/scheduler.mjs +33 -147
- package/src/runtime/channels/lib/schedules-db.mjs +34 -11
- package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
- package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
- package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
- package/src/runtime/channels/lib/whisper-port.mjs +10 -1
- package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
- package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
- package/src/runtime/channels/lib/worker-main.mjs +10 -34
- package/src/runtime/computer-bridge/action-schema.mjs +42 -1
- package/src/runtime/computer-bridge/actions.mjs +9 -1
- package/src/runtime/computer-bridge/client.mjs +180 -8
- package/src/runtime/computer-bridge/core-actions.mjs +2 -2
- package/src/runtime/computer-bridge/error-recovery.mjs +28 -2
- package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
- package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
- package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
- package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
- package/src/runtime/connectors/gmail-app-password.mjs +172 -39
- package/src/runtime/connectors/google-mcp.mjs +10 -12
- package/src/runtime/local-provider/server-process.mjs +2 -1
- package/src/runtime/media/adapters/gemini-video.mjs +4 -1
- package/src/runtime/media/adapters/xai-media.mjs +2 -1
- package/src/runtime/memory/lib/embedding-worker.mjs +6 -3
- package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
- package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
- package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
- package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
- package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
- package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
- package/src/runtime/office/design/design-art-direction.mjs +29 -27
- package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
- package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
- package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
- package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
- package/src/runtime/office/quality/assurance-structure-docx.mjs +3 -1
- package/src/runtime/office/quality/design-review.mjs +1 -5
- package/src/runtime/office/quality/document-brief.mjs +1 -5
- package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
- package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
- package/src/runtime/session-search/session-search-db.mjs +73 -9
- package/src/runtime/session-search/session-search-ingest.mjs +110 -20
- package/src/runtime/shared/abort-race.mjs +89 -0
- package/src/runtime/shared/agent-avatar.d.mts +0 -1
- package/src/runtime/shared/agent-kind.mjs +4 -3
- package/src/runtime/shared/bot-owned-work.mjs +56 -0
- package/src/runtime/shared/bounded-download.mjs +8 -3
- package/src/runtime/shared/config.mjs +2 -13
- package/src/runtime/shared/connector-accounts.mjs +20 -10
- package/src/runtime/shared/connector-catalog.d.mts +29 -0
- package/src/runtime/shared/connector-catalog.mjs +150 -0
- package/src/runtime/shared/connector-triggers.mjs +22 -19
- package/src/runtime/shared/defaults-separation.mjs +2 -17
- package/src/runtime/shared/delegated-approval-host.mjs +103 -11
- package/src/runtime/shared/err-text.mjs +24 -15
- package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
- package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
- package/src/runtime/shared/file-permissions.d.mts +0 -8
- package/src/runtime/shared/file-permissions.mjs +0 -11
- package/src/runtime/shared/git-direct.test-support.mjs +19 -0
- package/src/runtime/shared/handoff-artifacts.d.mts +2 -1
- package/src/runtime/shared/handoff-artifacts.mjs +18 -8
- package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
- package/src/runtime/shared/heartbeat-interval.mjs +19 -0
- package/src/runtime/shared/idle-auto-clear-gate.mjs +126 -0
- package/src/runtime/shared/llm/cost.mjs +5 -1
- package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
- package/src/runtime/shared/loopback-listener.mjs +25 -2
- package/src/runtime/shared/mixy-presence.mjs +22 -0
- package/src/runtime/shared/model-route-chain.d.mts +7 -2
- package/src/runtime/shared/model-route-chain.mjs +22 -4
- package/src/runtime/shared/open-url.mjs +10 -0
- package/src/runtime/shared/orchestration.d.mts +2 -0
- package/src/runtime/shared/pg-schema-db.mjs +27 -16
- package/src/runtime/shared/profile-config.cjs +1 -1
- package/src/runtime/shared/prompt-origin.d.mts +4 -0
- package/src/runtime/shared/prompt-origin.mjs +21 -0
- package/src/runtime/shared/provider-accounts.mjs +7 -1
- package/src/runtime/shared/provider-display-name.mjs +29 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
- package/src/runtime/shared/routine-trigger.d.mts +2 -0
- package/src/runtime/shared/routine-trigger.mjs +10 -0
- package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
- package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
- package/src/runtime/shared/session-activity-signal.mjs +48 -1
- package/src/runtime/shared/session-scratch.mjs +37 -0
- package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
- package/src/runtime/shared/session-sidebar-host.mjs +7 -3
- package/src/runtime/shared/session-turn-prelude.mjs +18 -0
- package/src/runtime/shared/tool-card-model/agent-surface.mjs +1 -3
- package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
- package/src/runtime/shared/tool-result-summary.mjs +2 -15
- package/src/runtime/shared/tool-surface.mjs +3 -0
- package/src/runtime/shared/tool-work-units.mjs +2 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
- package/src/runtime/shared/worktrees/contract.mjs +4 -1
- package/src/runtime/shared/worktrees/git.mjs +15 -0
- package/src/runtime/shared/worktrees/manager.mjs +87 -38
- package/src/runtime/shared/worktrees/test-support.mjs +14 -13
- package/src/runtime/terminal-bridge/client.mjs +10 -1
- package/src/runtime/visualize-bridge/client.mjs +29 -8
- package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
- package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
- package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
- package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
- package/src/session-runtime/agent-home-delivery.mjs +489 -185
- package/src/session-runtime/agent-task-sessions.mjs +467 -229
- package/src/session-runtime/agent-tool-routing.mjs +8 -41
- package/src/session-runtime/boot/apis.mjs +9 -0
- package/src/session-runtime/boot/infrastructure.mjs +4 -0
- package/src/session-runtime/boot/providers.mjs +3 -0
- package/src/session-runtime/boot/tools.mjs +11 -2
- package/src/session-runtime/bot-status.mjs +12 -6
- package/src/session-runtime/bot-target.mjs +38 -0
- package/src/session-runtime/channel-config-api.mjs +6 -1
- package/src/session-runtime/config-lifecycle.mjs +6 -0
- package/src/session-runtime/connector-merge-migration.mjs +305 -0
- package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
- package/src/session-runtime/conversation-import/discovery.mjs +271 -25
- package/src/session-runtime/conversation-import/service.mjs +26 -5
- package/src/session-runtime/handoff-attachments.mjs +82 -31
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +144 -41
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +8 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
- package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
- package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
- package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
- package/src/session-runtime/lifecycle/teardown.mjs +23 -5
- package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
- package/src/session-runtime/mcp-oauth-login.mjs +5 -3
- package/src/session-runtime/mixy-heartbeat.mjs +153 -33
- package/src/session-runtime/model-route/set-route.mjs +11 -2
- package/src/session-runtime/notification-bus.mjs +31 -117
- package/src/session-runtime/notification-completion-queue.mjs +54 -0
- package/src/session-runtime/notification-listeners.mjs +76 -0
- package/src/session-runtime/owned-automation-run.mjs +2 -1
- package/src/session-runtime/prewarm/channel-start.mjs +3 -7
- package/src/session-runtime/provider-catalog-cache.mjs +82 -36
- package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
- package/src/session-runtime/provider-models.mjs +4 -2
- package/src/session-runtime/resource-mcp-api.mjs +143 -224
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
- package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
- package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
- package/src/session-runtime/resource-mcp-servers.mjs +78 -0
- package/src/session-runtime/resource-mcp-store.mjs +49 -0
- package/src/session-runtime/resource-recall-api.mjs +6 -1
- package/src/session-runtime/routine-owner.mjs +40 -9
- package/src/session-runtime/runtime-feature-gates.mjs +5 -1
- package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
- package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
- package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
- package/src/session-runtime/services/agent-tool/render.mjs +71 -17
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +13 -4
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
- package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
- package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
- package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
- package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
- package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
- package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
- package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
- package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
- package/src/session-runtime/services/channel-admin.mjs +7 -13
- package/src/session-runtime/services/channel-session-router.mjs +4 -2
- package/src/session-runtime/services/provider-admin.mjs +2 -1
- package/src/session-runtime/services/seeds.mjs +0 -28
- package/src/session-runtime/session-compaction-sync.mjs +27 -0
- package/src/session-runtime/session-create/session-options.mjs +1 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
- package/src/session-runtime/settings-compaction-api.mjs +2 -40
- package/src/session-runtime/settings-system-api.mjs +13 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
- package/src/session-runtime/setup-tool/executor.mjs +145 -22
- package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
- package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
- package/src/session-runtime/tool-policy/policy-stage.mjs +17 -2
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -4
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
- package/src/session-runtime/workspace/transitions.mjs +25 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +26 -9
- package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
- package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
- package/src/standalone/channel-transport/client-registry.mjs +24 -163
- package/src/standalone/channel-transport.mjs +1 -1
- package/src/standalone/daemon-channels-loader.mjs +10 -8
- package/src/standalone/daemon-session-control/list-page.mjs +72 -0
- package/src/standalone/daemon-session-control/request.mjs +51 -0
- package/src/standalone/daemon-session-control/room-host.mjs +57 -0
- package/src/standalone/daemon-session-control/route-control.mjs +48 -0
- package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
- package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
- package/src/standalone/daemon-session-control.mjs +142 -190
- package/src/standalone/daemon.mjs +26 -3
- package/src/standalone/session-client.mjs +7 -3
- package/src/standalone/session-protocol.mjs +5 -0
- package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
- package/src/standalone/session-service/quota-resume.mjs +3 -0
- package/src/standalone/session-service/retention/busy.mjs +65 -1
- package/src/standalone/session-service/session-calls/session-action.mjs +30 -2
- package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
- package/src/standalone/session-tool-output.mjs +15 -7
- package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
- package/src/tui/app/app-view/floating-panel.jsx +7 -4
- package/src/tui/app/model-options.mjs +3 -28
- package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
- package/src/tui/app/model-picker/route-selection.mjs +5 -6
- package/src/tui/app/provider-setup/oauth-actions.mjs +38 -20
- package/src/tui/app/provider-setup/provider-items.mjs +8 -2
- package/src/tui/app/provider-setup-picker.mjs +9 -5
- package/src/tui/components/QuestionPanel.jsx +13 -4
- package/src/tui/dist/index.mjs +133 -92
- package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
- package/src/tui/session/initial-state.mjs +3 -0
- package/src/tui/session/notice-surface.mjs +7 -1
- package/src/tui/session/queue-helpers.mjs +3 -42
- package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
- package/src/tui/session/session-api/routes-write.mjs +5 -1
- package/src/tui/session/session-api/routes.mjs +1 -0
- package/src/tui/session/session-api/settings.mjs +17 -1
- package/src/tui/session/session-flow/auto-clear.mjs +4 -33
- package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
- package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
- package/src/tui/session/session-flow/drain-retry.mjs +35 -0
- package/src/tui/session/session-flow/drain.mjs +118 -149
- package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +16 -2
- package/src/tui/session/tool-approval-delegation.mjs +64 -0
- package/src/tui/session/tool-approval-request.mjs +39 -0
- package/src/tui/session/tool-approval-settle.mjs +62 -0
- package/src/tui/session/tool-approval.mjs +69 -115
- package/src/tui/session/tui-steering-persist.mjs +8 -1
- package/src/tui/session/turn-stream.mjs +19 -2
- package/src/tui/session/turn.mjs +1 -0
- package/src/ui/statusline-agents.mjs +1 -3
- package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
- package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
- package/scripts/code-graph-description-contract.mjs +0 -188
- package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
package/src/rules/lead/LEAD.md
CHANGED
|
@@ -5,11 +5,13 @@
|
|
|
5
5
|
completion.
|
|
6
6
|
- The user sees your text, and tool calls only as activity cards, never your
|
|
7
7
|
thinking. Before your first tool call, briefly state what you are about to
|
|
8
|
-
do
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
do in one sentence; a quick lookup (a read, search or status check) needs
|
|
9
|
+
none, and one line covers a run of similar calls. While working, give a
|
|
10
|
+
sentence or two only at key moments: when you find something, change
|
|
11
|
+
direction, or make progress without an update for a while. Otherwise bring
|
|
12
|
+
the user only material findings, direction or scope changes, unapproved
|
|
13
|
+
destructive actions, blockers or meaningful delays — never a list of files
|
|
14
|
+
read, per-call narration or plan repeats.
|
|
13
15
|
- Mid-task: a replacement supersedes, an addition folds in, a status question
|
|
14
16
|
gets a brief answer while work continues.
|
|
15
17
|
- Context is managed automatically: never stop or propose stopping because of
|
|
@@ -17,19 +19,20 @@
|
|
|
17
19
|
- Be a grounded, candid, and attentive collaborator: natural and respectful,
|
|
18
20
|
without flattery, forced humor, mimicry, or stereotyping.
|
|
19
21
|
<!-- tools: agent -->
|
|
20
|
-
- Briefing an agent:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
- Briefing an agent: one self-contained English brief with the goal and the
|
|
23
|
+
context it needs, owned paths, non-goals, constraints the agent does not
|
|
24
|
+
already receive, and done-when; a running agent gets only changes.
|
|
25
|
+
Done-when is the end state of the product or answer, never a list of
|
|
26
|
+
checks: name no tools, steps, commands or suites; the agent's own rules
|
|
27
|
+
choose its checks. A Reviewer gets the diff scope, the acceptance criteria
|
|
28
|
+
and the author's Evidence verbatim, not the whole report, so passed checks
|
|
29
|
+
are not rerun; a re-review carries only the fixes. Reference evidence by
|
|
30
|
+
path instead of retelling it. Decide first; send scope changes as one
|
|
31
|
+
replacement brief; invent no other restrictions or copies.
|
|
28
32
|
<!-- tools: agent -->
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
work is not a completed request.
|
|
33
|
+
- Reports arrive as `<task-notification>`: never wait, poll or guess them;
|
|
34
|
+
do independent work and end the turn. On an agent report, each feature
|
|
35
|
+
beyond docs/copy/style or one-line changes gets one fresh Reviewer, any
|
|
36
|
+
author (Lead reviews when none is available); recheck only fixes. Before
|
|
37
|
+
commit/report, check cross-feature seams and run affected suites once.
|
|
38
|
+
Pending agent work is not a completed request.
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
# Tool Calls
|
|
2
2
|
|
|
3
|
-
-
|
|
4
|
-
|
|
5
|
-
-
|
|
6
|
-
one call
|
|
7
|
-
|
|
8
|
-
another's result.
|
|
3
|
+
- Group calls already known to be needed in one response. Sequence only when
|
|
4
|
+
an earlier operation or result is needed to choose or safely run a later call.
|
|
5
|
+
- For `read`, `grep`, `glob`, `git`, and `code_graph`, combine compatible targets
|
|
6
|
+
in one array call; split only for dependencies, differing options or scope,
|
|
7
|
+
or schema limits.
|
|
9
8
|
- Order on files: enumerate only when the scope is unknown → locate every
|
|
10
9
|
site (known locations skip straight to the read) → one read stage over every
|
|
11
10
|
located site → every edit in one response → one verification. A search after
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
patch from it with no surveys or history. Stop once every requested item
|
|
8
8
|
has its evidence; never widen past what was asked, and never ask
|
|
9
9
|
permission for work the request already covers.
|
|
10
|
+
- When blocked, first look for a workaround you can carry out yourself with
|
|
11
|
+
the available tools.
|
|
12
|
+
<!-- tools: lead -->
|
|
13
|
+
Ask the user only when none exists.
|
|
10
14
|
- Do not add work whose need depends on a pending result. Reuse content
|
|
11
15
|
already delivered; changed sources and omitted ranges are new evidence.
|
|
12
16
|
Trust documented guarantees; no availability checks or defensive branches —
|
|
@@ -7,8 +7,6 @@
|
|
|
7
7
|
files you did not create: it may hold other agents' or the user's
|
|
8
8
|
uncommitted work. Use a copy or managed snapshot for before/after
|
|
9
9
|
comparisons.
|
|
10
|
-
- Worktrees live only in the app-managed store; never create one through
|
|
11
|
-
shell or in a temp folder.
|
|
12
10
|
<!-- tools: git -->
|
|
13
11
|
- Separate-branch work goes into a managed worktree through `git`.
|
|
14
12
|
- Back up only when changes risk irreversible loss, not for routine code edits;
|
|
@@ -4,4 +4,6 @@
|
|
|
4
4
|
data transformation, generated output, unsupported-format decoding. An open
|
|
5
5
|
shell is never a routing reason.
|
|
6
6
|
- Structured service operations go through the service's MCP tool or CLI.
|
|
7
|
+
- Open no window, dialog or elevation prompt unless showing or operating
|
|
8
|
+
that UI is the task.
|
|
7
9
|
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
- Check required behavior, exact outputs and essential integrity, security,
|
|
4
4
|
compatibility and buildability. Expected values come from sources or
|
|
5
5
|
independent invariants, never from the output itself or from recall.
|
|
6
|
-
-
|
|
7
|
-
|
|
8
|
-
rerun failed or invalidated checks
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
- No builds/lint/tests/formatters mid-flight. Finish planned scope edits,
|
|
7
|
+
then run required checks once in parallel. On failure, read full logs,
|
|
8
|
+
finish fixes, rerun only failed or invalidated checks; reuse valid passes.
|
|
9
|
+
Never reread your writes.
|
|
10
|
+
- After two failed fixes, name the belief they share and test it before a third.
|
|
11
|
+
- Unexpected result: confirm the check sees the live artifact, not a cache or
|
|
12
|
+
stale copy, before blaming the system.
|
|
11
13
|
- Use supplied commands unchanged except inputs, else documented defaults
|
|
12
14
|
scoped to the change; no stricter flags or unrequested suites; gates belong
|
|
13
15
|
to release.
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Delivery
|
|
2
2
|
|
|
3
3
|
- Unless the user explicitly requests them, do not author separate record-keeping
|
|
4
|
-
artifacts (reports, progress logs, notes, or checklists).
|
|
5
|
-
|
|
4
|
+
artifacts (reports, progress logs, notes, or checklists).
|
|
5
|
+
<!-- tools: lead -->
|
|
6
|
+
Report progress and results in the conversation instead.
|
|
6
7
|
- Reference files and folders in inline code by a Project-root-relative or
|
|
7
8
|
absolute path, optionally `:line[:column]` (`deliverables/report.docx`,
|
|
8
9
|
`src/app.ts:42`); files outside the Project always by absolute path; never a
|
|
@@ -11,14 +12,11 @@
|
|
|
11
12
|
and give their path; never open them in the system browser or paste their
|
|
12
13
|
source unless the user asks.
|
|
13
14
|
<!-- tools: visualize -->
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
plans
|
|
17
|
-
|
|
15
|
+
- Show every finished visual artifact with `visualize open`, loading its schema
|
|
16
|
+
first if deferred: images, video, HTML, documents, decks, mockups, diagrams,
|
|
17
|
+
plans; comparisons or research tables go in a visualize page. Keep the chat
|
|
18
|
+
to a short summary.
|
|
18
19
|
|
|
19
20
|
<!-- tools: git -->
|
|
20
21
|
- A commit request includes selecting and staging its changes; a stage-only
|
|
21
22
|
request stops before commit. Do not stage changes without either request.
|
|
22
|
-
<!-- tools: git -->
|
|
23
|
-
- Stage selected diff changes with `git` using `action:"stage"`. Keep this
|
|
24
|
-
internal step within the requested commit workflow, not a separate approval.
|
|
@@ -243,11 +243,13 @@ export function resolveAgentWatchdogPolicy(agent, overrides = {}) {
|
|
|
243
243
|
// Role budget, floored so the provider recovery window always wins.
|
|
244
244
|
idleStaleMs = Math.max(abort * 1000, PROVIDER_RECOVERY_FLOOR_MS);
|
|
245
245
|
} else {
|
|
246
|
-
// Part B: the
|
|
247
|
-
//
|
|
248
|
-
//
|
|
249
|
-
//
|
|
250
|
-
//
|
|
246
|
+
// Part B: the provider-level idle abort is the first mid-stream catch, but
|
|
247
|
+
// it is transport-based for Anthropic (pings reset it; other providers
|
|
248
|
+
// judge semantic idle). This public-agent idle is a BACKSTOP only, so it
|
|
249
|
+
// must not exceed the stall abort (600s default) — the old 30-min value
|
|
250
|
+
// meant a ping-only wedge that slipped past the provider layer would still
|
|
251
|
+
// hang the owner for half an hour. Anthropic pings extend it only up to
|
|
252
|
+
// KEEPALIVE_MAX_IDLE_MULTIPLIER times (evaluateAgentWatchdogAbort). Cap it at
|
|
251
253
|
// the stall abort while keeping 30 min as an absolute ceiling. Long tool
|
|
252
254
|
// calls refresh progress through the activity heartbeat, so they never
|
|
253
255
|
// trip this backstop.
|
|
@@ -270,6 +272,23 @@ export function resolveAgentWatchdogPolicy(agent, overrides = {}) {
|
|
|
270
272
|
};
|
|
271
273
|
}
|
|
272
274
|
|
|
275
|
+
// How far keepalives may extend liveness past the last real progress, as a
|
|
276
|
+
// multiple of the idle budget. Anthropic pings across legitimate generation
|
|
277
|
+
// gaps (adaptive thinking, a buffered tool input), but a wedged stream that
|
|
278
|
+
// pings forever must still die.
|
|
279
|
+
export const KEEPALIVE_MAX_IDLE_MULTIPLIER = 3;
|
|
280
|
+
|
|
281
|
+
// A keepalive newer than the last real progress holds the idle abort while it
|
|
282
|
+
// is itself fresh and the silence is within the cap. The runtime records one
|
|
283
|
+
// only after the request's first semantic event, so a ping before it never
|
|
284
|
+
// reaches here (the first-output window owns that phase).
|
|
285
|
+
function keepaliveHoldsIdle(snapshot, last, now, idleStaleMs) {
|
|
286
|
+
const keepaliveAt = snapshot.lastKeepaliveAt || 0;
|
|
287
|
+
return (
|
|
288
|
+
keepaliveAt > last && now - keepaliveAt <= idleStaleMs && now - last <= idleStaleMs * KEEPALIVE_MAX_IDLE_MULTIPLIER
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
|
|
273
292
|
export function evaluateAgentWatchdogAbort(snapshot, now, policy) {
|
|
274
293
|
if (!snapshot || !policy) return null;
|
|
275
294
|
// A turn blocked on the user's tool approval (its own, or a sub-agent's that
|
|
@@ -285,7 +304,10 @@ export function evaluateAgentWatchdogAbort(snapshot, now, policy) {
|
|
|
285
304
|
const firstSemanticMs = policy.firstSemanticMs ?? policy.firstVisibleCeilingMs ?? 0;
|
|
286
305
|
// Independent fixed deadlines from request start. Transport can satisfy
|
|
287
306
|
// only the transport deadline; it never switches, extends, or resets the
|
|
288
|
-
// semantic-response deadline.
|
|
307
|
+
// semantic-response deadline. Both are judged per logical model request
|
|
308
|
+
// (runtime-liveness): the request that carries tool results gets the same
|
|
309
|
+
// first-output allowance as the turn's first request, while a retry of a
|
|
310
|
+
// request keeps that request's clock and marks.
|
|
289
311
|
if (snapshot.waitingForTransport && firstTransportMs > 0 && startedAt && now - startedAt > firstTransportMs) {
|
|
290
312
|
return new AgentStallAbortError(`agent first transport stale (${firstTransportMs}ms)`);
|
|
291
313
|
}
|
|
@@ -298,6 +320,7 @@ export function evaluateAgentWatchdogAbort(snapshot, now, policy) {
|
|
|
298
320
|
|
|
299
321
|
const last = snapshot.lastProgressAt || snapshot.firstActivityAt;
|
|
300
322
|
if (policy.idleStaleMs > 0 && last && now - last > policy.idleStaleMs) {
|
|
323
|
+
if (keepaliveHoldsIdle(snapshot, last, now, policy.idleStaleMs)) return null;
|
|
301
324
|
return new AgentStallAbortError(`agent task stale (${policy.idleStaleMs}ms without stream/tool progress)`);
|
|
302
325
|
}
|
|
303
326
|
|
|
@@ -195,9 +195,8 @@ export function resolveCacheStrategy(agent, { autoClear, session = null } = {})
|
|
|
195
195
|
// ttl "30m"; Lead-class sessions pin their stable prefix with one "12h"
|
|
196
196
|
// breakpoint (header: break-even). Earlier models' typical retention is
|
|
197
197
|
// ~30 min as well.
|
|
198
|
-
|
|
199
|
-
export const
|
|
200
|
-
const ANTHROPIC_TAIL_LIFETIME_MS = Object.freeze({ '5m': 5 * 60_000, '1h': 60 * 60_000 });
|
|
198
|
+
const OPENAI_LEAD_PREFIX_CACHE_TTL = '12h';
|
|
199
|
+
export const ANTHROPIC_TAIL_LIFETIME_MS = Object.freeze({ '5m': 5 * 60_000, '1h': 60 * 60_000 });
|
|
201
200
|
const OPENAI_TAIL_LIFETIME_MS = 30 * 60_000;
|
|
202
201
|
|
|
203
202
|
/** The OpenAI (API key) stable-prefix TTL for a session: '12h' for the Lead
|
|
@@ -14,7 +14,9 @@ function titleSystemPrompt(locale = '') {
|
|
|
14
14
|
: TITLE_SYSTEM_PROMPT;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
/** The title generator over injectable `deps` (tests); generateSessionTitle
|
|
18
|
+
* is it over the real config and provider registry. */
|
|
19
|
+
export function createTitleCompletion(deps = {}) {
|
|
18
20
|
const load = deps.loadConfig || loadConfig;
|
|
19
21
|
const resolveRoute = deps.resolveMaintenanceRoute || resolveMaintenanceRoute;
|
|
20
22
|
const initialize = deps.initProviders || initProviders;
|
|
@@ -137,7 +137,7 @@ const TOOL_ARG_KEYS = {
|
|
|
137
137
|
recall: ['query', 'limit', 'session_id', 'cwd'],
|
|
138
138
|
search: ['query', 'limit', 'cwd'],
|
|
139
139
|
code_graph: ['mode', 'file', 'files', 'symbol', 'symbols', 'body', 'language', 'limit', 'depth', 'page', 'cwd'],
|
|
140
|
-
shell: ['command', 'timeout_ms'],
|
|
140
|
+
shell: ['command', 'cwd', 'timeout_ms'],
|
|
141
141
|
task: ['action', 'task_id'],
|
|
142
142
|
edit: ['file_path', 'replace_all'],
|
|
143
143
|
edit_many: ['edits'],
|
|
@@ -631,6 +631,8 @@ function traceAgentTool({
|
|
|
631
631
|
...(toolBatchId ? { batch: { batch_id: toolBatchId, tool_call_id: toolCallId } } : {}),
|
|
632
632
|
...(Array.isArray(executionIntervals) ? { execution_intervals: executionIntervals } : {}),
|
|
633
633
|
...(resultTelemetry?.integrity ? { integrity: { ...resultTelemetry.integrity } } : {}),
|
|
634
|
+
// Shell-tool misuse the guards saw on this call (misuse-guard.mjs).
|
|
635
|
+
...(Array.isArray(resultTelemetry?.shellMisuse) ? { shell_misuse: resultTelemetry.shellMisuse } : {}),
|
|
634
636
|
},
|
|
635
637
|
cwd: cwd || null,
|
|
636
638
|
});
|
|
@@ -53,6 +53,7 @@ export function buildCacheBreakPayload(record = {}) {
|
|
|
53
53
|
input_prefix_mismatch_actual_hash: cleanHash(record.inputPrefixMismatchActualHash),
|
|
54
54
|
changed_blocks: cleanText(record.changedBlocks),
|
|
55
55
|
system_markers_changed: typeof record.markersChanged === 'boolean' ? record.markersChanged : null,
|
|
56
|
+
lost_message_breakpoints: cleanText(record.lostMessageBreakpoints),
|
|
56
57
|
};
|
|
57
58
|
return Object.fromEntries(Object.entries(payload).filter(([, value]) => value !== null));
|
|
58
59
|
}
|
|
@@ -81,6 +82,7 @@ function formatCacheBreakLine(record = {}) {
|
|
|
81
82
|
['noGuardBaseline', payload.missing_prefix_guard_baseline],
|
|
82
83
|
['changedBlocks', payload.changed_blocks],
|
|
83
84
|
['systemMarkersChanged', payload.system_markers_changed],
|
|
85
|
+
['lostMessageBreakpoints', payload.lost_message_breakpoints],
|
|
84
86
|
].filter(([, value]) => value !== null && value !== undefined);
|
|
85
87
|
return `[cache-break] ${fields.map(([key, value]) => (typeof value === 'string' ? `${key}=${JSON.stringify(value)}` : `${key}=${value}`)).join(' ')}`;
|
|
86
88
|
}
|
|
@@ -41,6 +41,10 @@ import {
|
|
|
41
41
|
removeRetiredAgentFields,
|
|
42
42
|
} from './config-storage.mjs';
|
|
43
43
|
import { oauthCredentialProbeState, isOAuthProviderAvailable } from './providers/oauth-credential-probes.mjs';
|
|
44
|
+
import {
|
|
45
|
+
DEFAULT_HEARTBEAT_INTERVAL_MINUTES,
|
|
46
|
+
normalizeHeartbeatIntervalMinutes,
|
|
47
|
+
} from '../../shared/heartbeat-interval.mjs';
|
|
44
48
|
import { normalizeDeveloperConfig } from '../../shared/developer-options.mjs';
|
|
45
49
|
import { normalizeWorktreeSettings } from '../../shared/worktrees/settings.mjs';
|
|
46
50
|
import { normalizePluginMcpIntents } from './runtime-core/plugin-mcp.mjs';
|
|
@@ -295,8 +299,13 @@ export function loadConfig(options = {}) {
|
|
|
295
299
|
recap: recapConfig,
|
|
296
300
|
// The model may title the session (session tool, action=rename); default on.
|
|
297
301
|
aiSessionTitles: raw.aiSessionTitles !== false,
|
|
298
|
-
// Mixy's
|
|
302
|
+
// Mixy's heartbeat check (session-runtime/mixy-heartbeat.mjs); default on.
|
|
299
303
|
heartbeat: raw.heartbeat !== false,
|
|
304
|
+
// Minutes between its checks, one of a fixed set (shared/heartbeat-interval.mjs);
|
|
305
|
+
// anything else reads as the default.
|
|
306
|
+
heartbeatIntervalMinutes: normalizeHeartbeatIntervalMinutes(raw.heartbeatIntervalMinutes),
|
|
307
|
+
// Prompt-cache warming (session/cache-warm.mjs); default on.
|
|
308
|
+
promptCacheWarming: raw?.promptCacheWarming !== false,
|
|
300
309
|
// Bots may leave an emoji reaction on the user's message (react tool); default on.
|
|
301
310
|
reactions: raw.reactions !== false,
|
|
302
311
|
// Bots page layout (order, hidden groups, pins, retention) and the shared
|
|
@@ -351,6 +360,7 @@ export function loadConfig(options = {}) {
|
|
|
351
360
|
shell: {},
|
|
352
361
|
update: {},
|
|
353
362
|
recap: { enabled: true },
|
|
363
|
+
promptCacheWarming: true,
|
|
354
364
|
worktree: normalizeWorktreeSettings(null),
|
|
355
365
|
developer: {},
|
|
356
366
|
modules: {},
|
|
@@ -482,8 +492,14 @@ function buildAgentSaveBuilder(config) {
|
|
|
482
492
|
else delete next.aiSessionTitles;
|
|
483
493
|
if (config.heartbeat === false) next.heartbeat = false;
|
|
484
494
|
else delete next.heartbeat;
|
|
495
|
+
// Only a non-default choice is stored.
|
|
496
|
+
const heartbeatMinutes = normalizeHeartbeatIntervalMinutes(config.heartbeatIntervalMinutes);
|
|
497
|
+
if (heartbeatMinutes !== DEFAULT_HEARTBEAT_INTERVAL_MINUTES) next.heartbeatIntervalMinutes = heartbeatMinutes;
|
|
498
|
+
else delete next.heartbeatIntervalMinutes;
|
|
485
499
|
if (config.reactions === false) next.reactions = false;
|
|
486
500
|
else delete next.reactions;
|
|
501
|
+
if (config.promptCacheWarming === false) next.promptCacheWarming = false;
|
|
502
|
+
else delete next.promptCacheWarming;
|
|
487
503
|
if (Array.isArray(config.botOrder) && config.botOrder.length) next.botOrder = [...config.botOrder];
|
|
488
504
|
else delete next.botOrder;
|
|
489
505
|
if (config.leadAvatar && typeof config.leadAvatar === 'object') next.leadAvatar = { ...config.leadAvatar };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export {
|
|
2
2
|
applyInitialDeferredToolManifestToBp2,
|
|
3
3
|
buildDeferredToolManifest,
|
|
4
|
+
resetBp2StableContext,
|
|
4
5
|
stripDeferredToolManifestBlock,
|
|
5
6
|
} from './deferred-tools.mjs';
|
|
6
7
|
export {
|
|
@@ -11,11 +12,13 @@ export {
|
|
|
11
12
|
collectPromptSkillsCached,
|
|
12
13
|
collectSkills,
|
|
13
14
|
collectSkillsCached,
|
|
15
|
+
currentSkillDelivery,
|
|
14
16
|
filterSkillsExcludingDisabled,
|
|
15
17
|
invalidateSkillsCache,
|
|
16
18
|
isSkillDisabled,
|
|
17
19
|
loadSkillResource,
|
|
18
20
|
skillBodyPresentInSession,
|
|
21
|
+
skillLoadRefusal,
|
|
19
22
|
skillMissingFeature,
|
|
20
23
|
skillOutsideScope,
|
|
21
24
|
skillEnabledFlags,
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
// Deferred-pool
|
|
2
|
-
|
|
1
|
+
// Deferred-pool manifest injected into BP2. MCP server instruction bodies are
|
|
2
|
+
// not injected: a server's one-line entry is its when-to-use trigger (accounts
|
|
3
|
+
// one line per server), and its instructions arrive with its tools
|
|
4
|
+
// on load_tool. The <mcp-instructions> block is still recognized so older
|
|
5
|
+
// prompts can shed it.
|
|
3
6
|
import { connectorTrigger } from '../../../shared/connector-triggers.mjs';
|
|
4
7
|
import { parseMcpToolName, titleCaseMcpServer } from '../../../shared/tool-primitives.mjs';
|
|
8
|
+
import { SKILL_TRIGGER_LISTING_MAX } from '../../../shared/skill-document.mjs';
|
|
5
9
|
import { isToolBridgeEnabled, TOOL_BRIDGE_GUIDANCE } from '../runtime-core/tool-exposure.mjs';
|
|
6
10
|
|
|
7
11
|
export function compactPromptManifestText(value, max = 250) {
|
|
@@ -24,13 +28,24 @@ const MCP_INSTRUCTIONS_BLOCK_RE = /(\n\n---\n*)?<mcp-instructions>[\s\S]*?<\/mcp
|
|
|
24
28
|
// Tool and MCP server names enter the manifests only as plain identifiers
|
|
25
29
|
// (no markup can be smuggled into the prompt through a name).
|
|
26
30
|
const MANIFEST_NAME_SAFE_RE = /^[A-Za-z0-9_.:-]+$/;
|
|
27
|
-
const MCP_INSTRUCTION_MAX_CHARS = 600;
|
|
28
31
|
|
|
29
32
|
function sanitizeManifestName(name) {
|
|
30
33
|
const text = String(name || '').trim();
|
|
31
34
|
return MANIFEST_NAME_SAFE_RE.test(text) ? text : '';
|
|
32
35
|
}
|
|
33
36
|
|
|
37
|
+
const MCP_INSTRUCTION_MAX_CHARS = 600;
|
|
38
|
+
|
|
39
|
+
/** A server's instruction text without markup, capped at MCP_INSTRUCTION_MAX_CHARS. */
|
|
40
|
+
export function sanitizeMcpInstructionText(text, max = MCP_INSTRUCTION_MAX_CHARS) {
|
|
41
|
+
const stripped = String(text || '')
|
|
42
|
+
.replace(/[<>]/g, '')
|
|
43
|
+
.trim();
|
|
44
|
+
if (!stripped) return '';
|
|
45
|
+
const cap = Math.max(1, Number(max) || MCP_INSTRUCTION_MAX_CHARS);
|
|
46
|
+
return stripped.length > cap ? `${stripped.slice(0, Math.max(1, cap - 3))}...` : stripped;
|
|
47
|
+
}
|
|
48
|
+
|
|
34
49
|
function skillRoutedToolNames(messages) {
|
|
35
50
|
const names = new Set();
|
|
36
51
|
for (const message of Array.isArray(messages) ? messages : []) {
|
|
@@ -63,7 +78,8 @@ function hasDeferredToolManifestBlock(text) {
|
|
|
63
78
|
* wire tools). Each entry is either a bare name string or `{ name, description }`;
|
|
64
79
|
* output lines are `- name: description` (description omitted when absent),
|
|
65
80
|
* mirroring the available-skills manifest so the model calls deferred tools
|
|
66
|
-
* directly. Descriptions are compacted
|
|
81
|
+
* directly. Descriptions are compacted to the skill listing's trigger cap
|
|
82
|
+
* (skill-document.mjs SKILL_TRIGGER_LISTING_MAX) and stripped of `<`/`>`.
|
|
67
83
|
* Empty pool → '' (caller omits the block).
|
|
68
84
|
*/
|
|
69
85
|
export function buildDeferredToolManifest(entries) {
|
|
@@ -77,62 +93,19 @@ export function buildDeferredToolManifest(entries) {
|
|
|
77
93
|
const description =
|
|
78
94
|
typeof entry === 'string'
|
|
79
95
|
? ''
|
|
80
|
-
: compactPromptManifestText(String(entry?.description || '').replace(/[<>]/g, ''),
|
|
96
|
+
: compactPromptManifestText(String(entry?.description || '').replace(/[<>]/g, ''), SKILL_TRIGGER_LISTING_MAX);
|
|
81
97
|
list.push({ name, description });
|
|
82
98
|
}
|
|
83
99
|
if (!list.length) return '';
|
|
84
100
|
list.sort((a, b) => a.name.localeCompare(b.name));
|
|
85
101
|
return [
|
|
86
102
|
'<available-deferred-tools>',
|
|
87
|
-
'Deferred
|
|
103
|
+
'Deferred tools; load_tool loads their schemas.',
|
|
88
104
|
...list.map((entry) => (entry.description ? `- ${entry.name}: ${entry.description}` : `- ${entry.name}`)),
|
|
89
105
|
'</available-deferred-tools>',
|
|
90
106
|
].join('\n');
|
|
91
107
|
}
|
|
92
108
|
|
|
93
|
-
function sanitizeMcpInstructionText(text, max = MCP_INSTRUCTION_MAX_CHARS) {
|
|
94
|
-
const stripped = String(text || '')
|
|
95
|
-
.replace(/[<>]/g, '')
|
|
96
|
-
.trim();
|
|
97
|
-
if (!stripped) return '';
|
|
98
|
-
const cap = Math.max(1, Number(max) || MCP_INSTRUCTION_MAX_CHARS);
|
|
99
|
-
return stripped.length > cap ? `${stripped.slice(0, Math.max(1, cap - 3))}...` : stripped;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Per-server MCP initialize instructions for deferred-pool tools only.
|
|
104
|
-
* Empty when no instructions or no matching deferred MCP tools → omit block.
|
|
105
|
-
* Emits ONLY the server heading + instruction body: tool names are never
|
|
106
|
-
* listed — <available-deferred-tools> names each server once (mcp__<server>).
|
|
107
|
-
*/
|
|
108
|
-
function buildMcpInstructionsManifest(mcpServerInstructions, poolNames, catalog = []) {
|
|
109
|
-
const map = mcpServerInstructions && typeof mcpServerInstructions === 'object' ? mcpServerInstructions : {};
|
|
110
|
-
const pool = [
|
|
111
|
-
...new Set((Array.isArray(poolNames) ? poolNames : []).map((name) => sanitizeManifestName(name)).filter(Boolean)),
|
|
112
|
-
];
|
|
113
|
-
// Tool definitions carry their server (shortened names cannot be parsed).
|
|
114
|
-
const byName = new Map();
|
|
115
|
-
for (const tool of Array.isArray(catalog) ? catalog : []) {
|
|
116
|
-
const name = String(tool?.name || '').trim();
|
|
117
|
-
if (name && !byName.has(name)) byName.set(name, tool);
|
|
118
|
-
}
|
|
119
|
-
const deferredServers = new Set();
|
|
120
|
-
for (const name of pool) {
|
|
121
|
-
const server = parseMcpToolName(byName.get(name) || name)?.server;
|
|
122
|
-
if (server) deferredServers.add(server);
|
|
123
|
-
}
|
|
124
|
-
const servers = [...deferredServers]
|
|
125
|
-
.filter((server) => sanitizeManifestName(server) && sanitizeMcpInstructionText(map[server]))
|
|
126
|
-
.sort((a, b) => a.localeCompare(b));
|
|
127
|
-
if (!servers.length) return '';
|
|
128
|
-
const lines = ['<mcp-instructions>'];
|
|
129
|
-
for (const server of servers) {
|
|
130
|
-
lines.push(`## ${sanitizeManifestName(server)}`, sanitizeMcpInstructionText(map[server]));
|
|
131
|
-
}
|
|
132
|
-
lines.push('</mcp-instructions>');
|
|
133
|
-
return lines.join('\n');
|
|
134
|
-
}
|
|
135
|
-
|
|
136
109
|
export function stripDeferredToolManifestBlock(text) {
|
|
137
110
|
return String(text || '')
|
|
138
111
|
.replace(DEFERRED_TOOLS_BLOCK_RE, '')
|
|
@@ -144,9 +117,8 @@ export function stripDeferredToolManifestBlock(text) {
|
|
|
144
117
|
// Rebuild path: replace the FIRST previously-injected <available-deferred-tools>
|
|
145
118
|
// block (with its leading `---` separator) with the fresh manifest IN PLACE, so
|
|
146
119
|
// the block keeps its original position and no sibling BP2 block (skills
|
|
147
|
-
// manifest, agent rules, …) is reordered or dropped.
|
|
148
|
-
//
|
|
149
|
-
// removed first to avoid duplication.
|
|
120
|
+
// manifest, agent rules, …) is reordered or dropped. A legacy <mcp-instructions>
|
|
121
|
+
// block left by older sessions is removed first.
|
|
150
122
|
function rebuildDeferredToolManifestBlock(text, manifest) {
|
|
151
123
|
let out = String(text || '').replace(MCP_INSTRUCTIONS_BLOCK_RE, '');
|
|
152
124
|
let replaced = false;
|
|
@@ -183,24 +155,50 @@ const firstSentence = (text) => {
|
|
|
183
155
|
return (flat.split(/(?<=[.!?])\s/, 1)[0] || flat).replace(/[.!?]+$/, '');
|
|
184
156
|
};
|
|
185
157
|
|
|
186
|
-
// A catalog connector's curated trigger; else the
|
|
187
|
-
// else its tools' leading descriptions (name
|
|
188
|
-
//
|
|
158
|
+
// A catalog connector's curated when-to-use trigger; else the first sentence
|
|
159
|
+
// of the server's MCP instructions; else its tools' leading descriptions (name
|
|
160
|
+
// order); else its name. Never the account: that is part of the instruction
|
|
161
|
+
// text delivered when the server's tools are loaded. Derived lines are
|
|
162
|
+
// compacted to at most 98 characters, ellipsis included.
|
|
189
163
|
function mcpServerTrigger(server, tools, instructions) {
|
|
190
|
-
// A multi-account connector's server names its account (connector-accounts.mjs).
|
|
191
|
-
const account = accountOfInstructions(instructions?.[server]);
|
|
192
164
|
const curated = connectorTrigger(server);
|
|
193
|
-
if (curated) return
|
|
194
|
-
|
|
165
|
+
if (curated) return curated;
|
|
166
|
+
// The account sentence ("Account: <address>. …", connector-accounts.mjs) is
|
|
167
|
+
// not a use line; it reaches the model with the loaded server's instructions.
|
|
168
|
+
const instruction = String(instructions?.[server] || '')
|
|
169
|
+
.replace(/[<>]/g, '')
|
|
170
|
+
.replace(/^\s*Account: \S+?\.\s+/, '');
|
|
195
171
|
const described = [...tools]
|
|
196
172
|
.sort((a, b) => String(a?.name || '').localeCompare(String(b?.name || '')))
|
|
197
173
|
.map((tool) => firstSentence(String(tool?.description || '').replace(/[<>]/g, '')))
|
|
198
174
|
.filter(Boolean)
|
|
199
175
|
.join('; ');
|
|
200
|
-
const derived = instruction
|
|
176
|
+
const derived = firstSentence(instruction) || described;
|
|
201
177
|
return derived ? compactPromptManifestText(derived, 98) : `${titleCaseMcpServer(server)} MCP server tools.`;
|
|
202
178
|
}
|
|
203
179
|
|
|
180
|
+
// `mcp__<server>` as the manifest names it, or '' for an unsafe server name.
|
|
181
|
+
export const mcpServerManifestLabel = (server) => sanitizeManifestName(mcpServerLineName(server));
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* One `{ label: 'mcp__<server>', trigger }` line per server of `servers` (Map
|
|
185
|
+
* server → its tools). The BP2 manifest and the deferred-tool delta both
|
|
186
|
+
* render these; a server with an unsafe name gets none.
|
|
187
|
+
*/
|
|
188
|
+
export function mcpServerLines(servers, instructions) {
|
|
189
|
+
const lines = [];
|
|
190
|
+
for (const [server, tools] of servers) {
|
|
191
|
+
const label = mcpServerManifestLabel(server);
|
|
192
|
+
if (!label) continue;
|
|
193
|
+
const trigger = compactPromptManifestText(
|
|
194
|
+
String(mcpServerTrigger(server, tools, instructions)).replace(/[<>]/g, ''),
|
|
195
|
+
SKILL_TRIGGER_LISTING_MAX
|
|
196
|
+
);
|
|
197
|
+
lines.push({ label, trigger });
|
|
198
|
+
}
|
|
199
|
+
return lines;
|
|
200
|
+
}
|
|
201
|
+
|
|
204
202
|
function deferredManifestEntries(session, pool) {
|
|
205
203
|
const byName = catalogByName(session);
|
|
206
204
|
const skillRoutedNames = skillRoutedToolNames(session.messages);
|
|
@@ -221,11 +219,8 @@ function deferredManifestEntries(session, pool) {
|
|
|
221
219
|
description: skillRoutedNames.has(key) ? '' : String(tool?.trigger || tool?.description || ''),
|
|
222
220
|
});
|
|
223
221
|
}
|
|
224
|
-
for (const
|
|
225
|
-
entries.push({
|
|
226
|
-
name: mcpServerLineName(server),
|
|
227
|
-
description: mcpServerTrigger(server, tools, session.mcpServerInstructions),
|
|
228
|
-
});
|
|
222
|
+
for (const line of mcpServerLines(servers, session.mcpServerInstructions)) {
|
|
223
|
+
entries.push({ name: line.label, description: line.trigger });
|
|
229
224
|
}
|
|
230
225
|
return entries;
|
|
231
226
|
}
|
|
@@ -241,7 +236,7 @@ export function listedDeferredToolNames(session, poolNames, rendered) {
|
|
|
241
236
|
}
|
|
242
237
|
|
|
243
238
|
function composeDeferredBp2Manifest(session, pool) {
|
|
244
|
-
// Bridge exposure gets the native roster
|
|
239
|
+
// Bridge exposure gets the native roster (the pool is
|
|
245
240
|
// already limited to what the session's policy lets it run), followed by
|
|
246
241
|
// the static bridge guidance. A tool-free bridge session gets nothing.
|
|
247
242
|
const bridge = isToolBridgeEnabled(session);
|
|
@@ -249,8 +244,6 @@ function composeDeferredBp2Manifest(session, pool) {
|
|
|
249
244
|
const parts = [];
|
|
250
245
|
const deferredManifest = buildDeferredToolManifest(deferredManifestEntries(session, pool));
|
|
251
246
|
if (deferredManifest) parts.push(deferredManifest);
|
|
252
|
-
const mcpManifest = buildMcpInstructionsManifest(session.mcpServerInstructions, pool, session.deferredToolCatalog);
|
|
253
|
-
if (mcpManifest) parts.push(mcpManifest);
|
|
254
247
|
if (bridge) parts.push(TOOL_BRIDGE_GUIDANCE);
|
|
255
248
|
return parts.join('\n\n');
|
|
256
249
|
}
|
|
@@ -292,6 +285,18 @@ function resolveDeferredBp2Index(session) {
|
|
|
292
285
|
return idx;
|
|
293
286
|
}
|
|
294
287
|
|
|
288
|
+
/**
|
|
289
|
+
* Give BP2 `stableContext` (profile meta + skill manifest) and no deferred
|
|
290
|
+
* manifest. The caller re-applies that manifest
|
|
291
|
+
* (applyInitialDeferredToolManifestToBp2 with `rebuild`), which appends it
|
|
292
|
+
* after the stable part exactly as session creation laid it out.
|
|
293
|
+
*/
|
|
294
|
+
export function resetBp2StableContext(session, stableContext) {
|
|
295
|
+
if (!Array.isArray(session?.messages)) return;
|
|
296
|
+
const idx = resolveDeferredBp2Index(session);
|
|
297
|
+
if (idx >= 0) setSystemContent(session, idx, String(stableContext || ''));
|
|
298
|
+
}
|
|
299
|
+
|
|
295
300
|
function writeDeferredManifestAt(session, idx, manifest, rebuild) {
|
|
296
301
|
for (let i = 0; i < session.messages.length; i++) {
|
|
297
302
|
if (i === idx || session.messages[i]?.role !== 'system' || typeof session.messages[i].content !== 'string')
|