mixdog 1.2.2 → 1.2.3
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 +18 -0
- package/package.json +2 -1
- package/scripts/provider-pingpong-live.mjs +509 -0
- package/src/agents/advisor/AGENT.md +1 -1
- package/src/agents/advisor/agent.json +1 -1
- package/src/defaults/shipped-history.json +5 -0
- package/src/defaults/skills/setup/SKILL.md +6 -1
- package/src/defaults/skills/setup/references/actions.md +44 -22
- package/src/defaults/skills/setup/references/surfaces.md +10 -8
- package/src/headless-exec.mjs +15 -8
- package/src/lib/keychain-cjs.cjs +7 -4
- package/src/output-styles/common.md +11 -10
- package/src/rules/agent/AGENT.md +5 -5
- package/src/rules/lead/LEAD.md +5 -5
- package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
- package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
- package/src/runtime/agent/orchestrator/config.mjs +5 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +7 -6
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +29 -10
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +6 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +58 -7
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +16 -3
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +10 -61
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +12 -6
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +114 -72
- package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +37 -5
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +43 -2
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +64 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +70 -6
- package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
- package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
- package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +25 -8
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +87 -5
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +13 -13
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +355 -37
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +93 -47
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +55 -10
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +26 -8
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +246 -42
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
- package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +388 -0
- package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
- package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
- package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +48 -22
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +119 -18
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +33 -1
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +121 -61
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +37 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +47 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
- package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +151 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +42 -24
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +172 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +53 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +25 -4
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +71 -24
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +44 -16
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -16
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -35
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +11 -3
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +170 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +75 -70
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +75 -0
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +147 -8
- package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
- package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +157 -0
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +512 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +183 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +100 -0
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +21 -0
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
- package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
- package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +14 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +176 -71
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +62 -10
- package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +14 -93
- package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +120 -0
- package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
- package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +91 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
- package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +21 -10
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +132 -0
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +30 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +63 -20
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +150 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +208 -14
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +15 -3
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +25 -3
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +19 -2
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/side-question.mjs +192 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +17 -3
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +58 -2
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +41 -28
- package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/store.mjs +19 -3
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +77 -0
- package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +14 -10
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +49 -34
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
- package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
- package/src/runtime/computer-bridge/action-schema.mjs +44 -21
- package/src/runtime/github/tool.mjs +92 -2
- package/src/runtime/memory/index.mjs +1 -0
- package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
- package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
- package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
- package/src/runtime/memory/lib/pg/process.mjs +31 -26
- package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +108 -3
- package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
- package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
- package/src/runtime/office/README.md +1 -1
- package/src/runtime/office/authoring/html-document-author.mjs +2 -0
- package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-measure.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +2 -0
- package/src/runtime/office/core/office-actions-read.mjs +3 -0
- package/src/runtime/office/core/office-render-preview.mjs +2 -0
- package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
- package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
- package/src/runtime/office/core/office-sessions.mjs +5 -0
- package/src/runtime/office/core/office-transactions.mjs +3 -0
- package/src/runtime/office/core/office-write-ledger.mjs +98 -0
- package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
- package/src/runtime/office/index.mjs +30 -0
- package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
- package/src/runtime/office/pdf/pdf-render.mjs +23 -7
- package/src/runtime/office/pdf/pdf-security.mjs +2 -0
- package/src/runtime/office/portable/portable-opc.mjs +4 -1
- package/src/runtime/office/quality/visual-diff.mjs +2 -0
- package/src/runtime/shared/bounded-file-read.mjs +13 -0
- package/src/runtime/shared/bounded-line-diff.mjs +182 -0
- package/src/runtime/shared/buffered-appender.mjs +18 -0
- package/src/runtime/shared/config.mjs +78 -18
- package/src/runtime/shared/err-text.mjs +6 -0
- package/src/runtime/shared/file-permissions.d.mts +6 -1
- package/src/runtime/shared/file-permissions.mjs +54 -6
- package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
- package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
- package/src/runtime/shared/loopback-listener.mjs +9 -0
- package/src/runtime/shared/provider-api-key.mjs +2 -0
- package/src/runtime/shared/review-diff.mjs +52 -0
- package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
- package/src/runtime/shared/session-sidebar-host.mjs +38 -0
- package/src/runtime/shared/slow-span.mjs +114 -0
- package/src/runtime/shared/statusline/statusline-segments.mjs +28 -4
- package/src/runtime/shared/tool-card-model/card-header.mjs +6 -1
- package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
- package/src/runtime/shared/tool-card-model.mjs +5 -2
- package/src/runtime/shared/tool-output-limit.mjs +4 -0
- package/src/runtime/shared/tool-primitives.mjs +13 -0
- package/src/runtime/shared/tool-result-summary.mjs +8 -1
- package/src/runtime/shared/tool-surface.mjs +18 -3
- package/src/runtime/shared/tool-work-units.mjs +40 -4
- package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
- package/src/runtime/shared/transcript-writer.mjs +10 -2
- package/src/runtime/shared/turn-changes.mjs +268 -100
- package/src/runtime/shared/turn-review-reply.mjs +8 -39
- package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
- package/src/runtime/shared/turn-snapshot.mjs +857 -683
- package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
- package/src/runtime/shared/user-data-guard.mjs +262 -49
- package/src/runtime/shared/worktrees/carry.mjs +531 -0
- package/src/runtime/shared/worktrees/contract.mjs +34 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +68 -0
- package/src/runtime/shared/worktrees/git-head.mjs +205 -0
- package/src/runtime/shared/worktrees/git.mjs +8 -3
- package/src/runtime/shared/worktrees/maintenance.mjs +1 -1
- package/src/runtime/shared/worktrees/manager.mjs +156 -8
- package/src/runtime/shared/worktrees/merge.mjs +31 -21
- package/src/runtime/shared/worktrees/paths.d.mts +6 -0
- package/src/runtime/terminal-bridge/client.mjs +44 -11
- package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
- package/src/runtime/tidy/apply.mjs +47 -2
- package/src/runtime/tidy/run-engines.mjs +11 -5
- package/src/session-runtime/agent-tool-routing.mjs +19 -13
- package/src/session-runtime/boot/apis.mjs +13 -5
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/infrastructure.mjs +6 -1
- package/src/session-runtime/boot/session.mjs +0 -1
- package/src/session-runtime/boot/tools.mjs +4 -1
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +65 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +11 -4
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +115 -18
- package/src/session-runtime/internal-tool-executor.mjs +6 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +188 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
- package/src/session-runtime/lifecycle/session-catalog.mjs +12 -3
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +29 -6
- package/src/session-runtime/lifecycle/teardown.mjs +72 -7
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/connect.mjs +17 -5
- package/src/session-runtime/model-route/set-route.mjs +2 -2
- package/src/session-runtime/native-web-search-usage.mjs +51 -0
- package/src/session-runtime/native-web-search.mjs +10 -1
- package/src/session-runtime/new-session-config.mjs +4 -2
- package/src/session-runtime/provider-auth/login.mjs +4 -0
- package/src/session-runtime/resource-scope-decorate.mjs +10 -3
- package/src/session-runtime/runtime-review-api.mjs +8 -2
- package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
- package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
- package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
- package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +73 -7
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +15 -1
- package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
- package/src/session-runtime/services/agent-tool/worker-index.mjs +46 -7
- package/src/session-runtime/services/agent-tool.mjs +3 -0
- package/src/session-runtime/services/channel-admin.mjs +19 -3
- package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
- package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
- package/src/session-runtime/services/provider-admin.mjs +81 -15
- package/src/session-runtime/session-transcript-purge.mjs +32 -0
- package/src/session-runtime/session-turn-api.mjs +14 -5
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -0
- package/src/session-runtime/setup-tool/executor.mjs +36 -6
- package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +13 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +13 -4
- package/src/session-runtime/skills-api.mjs +3 -5
- package/src/session-runtime/tool-surface.mjs +5 -1
- package/src/session-runtime/turn/compaction-gate.mjs +25 -0
- package/src/session-runtime/turn/session-ops.mjs +7 -5
- package/src/session-runtime/turn/side-question-ops.mjs +22 -0
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +5 -1
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +8 -3
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +10 -0
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +25 -9
- package/src/session-runtime/usage-stats-api.mjs +43 -11
- package/src/session-runtime/workspace/project-branches.mjs +7 -5
- package/src/session-runtime/workspace/transition-steps.mjs +129 -31
- package/src/session-runtime/workspace/transitions.mjs +190 -15
- package/src/standalone/daemon-agent-control.mjs +9 -1
- package/src/standalone/daemon-local-session-bridge.mjs +14 -1
- package/src/standalone/daemon-owner.mjs +17 -4
- package/src/standalone/daemon-pg-stop.mjs +51 -0
- package/src/standalone/daemon-stop-budget.d.mts +2 -0
- package/src/standalone/daemon-stop-budget.mjs +18 -0
- package/src/standalone/daemon-stored-session-views.mjs +2 -0
- package/src/standalone/daemon-telemetry.mjs +19 -0
- package/src/standalone/daemon.mjs +61 -1
- package/src/standalone/desktop-service-registry.mjs +5 -0
- package/src/standalone/local-session-runtime.mjs +70 -19
- package/src/standalone/session-client.mjs +42 -0
- package/src/standalone/session-protocol.mjs +7 -0
- package/src/standalone/session-proxy/projection.mjs +41 -4
- package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
- package/src/standalone/session-runtime-inline-host.mjs +1 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
- package/src/standalone/session-service-api.mjs +6 -1
- package/src/standalone/session-state-patch.d.mts +2 -1
- package/src/standalone/session-state-patch.mjs +41 -1
- package/src/tui/App.jsx +25 -0
- package/src/tui/app/app-view/floating-panel.jsx +26 -1
- package/src/tui/app/btw-controller.mjs +118 -0
- package/src/tui/app/create-app-pickers.mjs +2 -0
- package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
- package/src/tui/app/shell-layout/surfaces.mjs +3 -1
- package/src/tui/app/slash-commands.mjs +13 -3
- package/src/tui/app/slash-dispatch/session-commands.mjs +19 -6
- package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
- package/src/tui/app/use-global-key-input.mjs +5 -12
- package/src/tui/app/use-prompt-handlers.mjs +11 -0
- package/src/tui/components/BtwPanel.jsx +53 -0
- package/src/tui/components/QuestionPanel.jsx +275 -0
- package/src/tui/components/question-panel-model.mjs +156 -0
- package/src/tui/dist/index.mjs +2413 -1465
- package/src/tui/session/context-state.mjs +4 -2
- package/src/tui/session/session-api/commands.mjs +10 -0
- package/src/tui/session/session-api/controls.mjs +2 -2
- package/src/tui/session/session-api/integrations.mjs +9 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle.mjs +2 -1
- package/src/tui/session/session-api/settings.mjs +6 -0
- package/src/tui/session/session-api.mjs +1 -0
- package/src/tui/session/tool-approval.mjs +10 -7
- package/src/tui/session/transcript-spill.mjs +14 -7
- package/src/tui/session/turn-stream.mjs +174 -31
- package/src/tui/session/turn.mjs +12 -5
- package/src/workflows/default/WORKFLOW.md +3 -1
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
// application/selection logic. Pure module (session objects passed in).
|
|
4
4
|
import { clean } from './session-text.mjs';
|
|
5
5
|
import { mergePendingDeferredToolDelta } from './deferred-tool-delta.mjs';
|
|
6
|
-
import { applyInitialDeferredToolManifestToBp2
|
|
6
|
+
import { applyInitialDeferredToolManifestToBp2 } from '../context/collect.mjs';
|
|
7
7
|
import { getMcpServerInstructionsMap, getMcpTools, getMcpToolGeneration } from '../mcp/client.mjs';
|
|
8
8
|
import { filterMcpToolsForSession } from './extension-scopes.mjs';
|
|
9
|
-
import { isDeferredToolAvailable } from './deferred-tool-availability.mjs';
|
|
9
|
+
import { isDeferredToolAvailable, isToolPermittedBySessionPolicy } from './deferred-tool-availability.mjs';
|
|
10
|
+
import { routeToolExclusionReason } from '../session/loop/provider-tool-exclusions.mjs';
|
|
10
11
|
import { isResponsesFreeformTool, toResponsesCustomTool } from '../providers/custom-tool-wire.mjs';
|
|
11
12
|
import {
|
|
12
13
|
DEFERRED_DEFAULT_FULL_TOOLS,
|
|
@@ -28,6 +29,17 @@ import {
|
|
|
28
29
|
nativeProviderFamily,
|
|
29
30
|
} from './tool-catalog-schema.mjs';
|
|
30
31
|
import { filterModelEditTools } from '../../../shared/edit-tool-dialect.mjs';
|
|
32
|
+
import { describeBridgeTools, formatBridgeResult, isBridgeReadonlySession } from './tool-bridge.mjs';
|
|
33
|
+
import {
|
|
34
|
+
bridgeSurfaceOutdated,
|
|
35
|
+
isBridgeToolDefinition,
|
|
36
|
+
isToolBridgeEnabled,
|
|
37
|
+
sessionToolExposure,
|
|
38
|
+
TOOL_EXPOSURE_BRIDGE,
|
|
39
|
+
TOOL_EXPOSURE_NATIVE,
|
|
40
|
+
toolExposureModeForProvider,
|
|
41
|
+
} from './tool-exposure.mjs';
|
|
42
|
+
import { TOOL_BRIDGE_TOOLS } from './tool-defs.mjs';
|
|
31
43
|
export {
|
|
32
44
|
toolKind,
|
|
33
45
|
toolSchemaBucket,
|
|
@@ -44,9 +56,30 @@ export {
|
|
|
44
56
|
MEASURED_TOOL_USAGE,
|
|
45
57
|
} from './tool-catalog-data.mjs';
|
|
46
58
|
|
|
47
|
-
// Provider modes
|
|
59
|
+
// Provider modes without native tool search. Their bridge-v1 sessions
|
|
60
|
+
// (tool-exposure.mjs) get the native roster and late delta notices; only a
|
|
61
|
+
// surface not yet migrated to the bridge keeps the fixed full array, with no
|
|
62
|
+
// deferred-pool manifest and no late announcements.
|
|
48
63
|
const FIXED_SURFACE_MODES = new Set(['full', 'manifest', 'canonical']);
|
|
49
64
|
|
|
65
|
+
function fixedSurfaceSession(session) {
|
|
66
|
+
return FIXED_SURFACE_MODES.has(session?.deferredProviderMode) && !isToolBridgeEnabled(session);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Whether a bridge session's roster and delta notices may name `tool`: only
|
|
70
|
+
// what its own policy (allowlist, denied tools, read-only mode) lets it run.
|
|
71
|
+
// Native rosters are unchanged.
|
|
72
|
+
function rosterPermits(session, tool) {
|
|
73
|
+
if (!isToolBridgeEnabled(session)) return true;
|
|
74
|
+
if (!isToolPermittedBySessionPolicy(session, clean(tool?.name))) return false;
|
|
75
|
+
return !(isBridgeReadonlySession(session) && !isReadonlySelectable(tool));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// The bridge definitions every bridge session serializes: one frozen copy, so
|
|
79
|
+
// their bytes never vary across search, describe, call, skill loading or MCP
|
|
80
|
+
// connect/reconnect.
|
|
81
|
+
const BRIDGE_SURFACE_TOOLS = TOOL_BRIDGE_TOOLS.map((tool) => immutableToolForSurface(tool));
|
|
82
|
+
|
|
50
83
|
function isMcpToolName(name) {
|
|
51
84
|
return typeof name === 'string' && name.startsWith('mcp__');
|
|
52
85
|
}
|
|
@@ -73,6 +106,30 @@ export function filterDisallowedTools(tools, disallowed = []) {
|
|
|
73
106
|
return (tools || []).filter((tool) => !deny.has(clean(tool?.name)));
|
|
74
107
|
}
|
|
75
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Discovery's view of `tools` for one session: what its own policy (schema
|
|
111
|
+
* allowlist + denied tools) lets it execute. Nothing outside it is selected,
|
|
112
|
+
* registered as discovered, described or named in a result.
|
|
113
|
+
*/
|
|
114
|
+
export function filterSessionToolPolicy(tools, session) {
|
|
115
|
+
return filterDisallowedTools(tools, session?.disallowedTools).filter((tool) =>
|
|
116
|
+
isToolPermittedBySessionPolicy(session, clean(tool?.name))
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Predicate over tool names: false for a tool the session's route leaves out
|
|
121
|
+
// of every request (see routeToolExclusionReason).
|
|
122
|
+
function sentOnRoute(session, catalog) {
|
|
123
|
+
const byName = new Map();
|
|
124
|
+
for (const tool of [...(catalog || []), ...(Array.isArray(session?.tools) ? session.tools : [])]) {
|
|
125
|
+
byName.set(clean(tool?.name), tool);
|
|
126
|
+
}
|
|
127
|
+
return (name) => !routeToolExclusionReason(session, byName.get(name));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const permittedNames = (session, names) =>
|
|
131
|
+
(names || []).filter((name) => isToolPermittedBySessionPolicy(session, name));
|
|
132
|
+
|
|
76
133
|
export function sortedNamesByMeasuredUsage(names) {
|
|
77
134
|
// Canonical route order first; measured usage orders the unrouted tail.
|
|
78
135
|
return [...(names || [])].sort((a, b) => {
|
|
@@ -236,7 +293,7 @@ function setDeferredToolState(session, names) {
|
|
|
236
293
|
}
|
|
237
294
|
|
|
238
295
|
function deferredPoolToolNames(session) {
|
|
239
|
-
if (!session ||
|
|
296
|
+
if (!session || fixedSurfaceSession(session)) return [];
|
|
240
297
|
const catalog = Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : [];
|
|
241
298
|
const active = new Set([
|
|
242
299
|
...(session.tools || []).map((tool) => clean(tool?.name)).filter(Boolean),
|
|
@@ -245,7 +302,7 @@ function deferredPoolToolNames(session) {
|
|
|
245
302
|
const out = [];
|
|
246
303
|
for (const tool of catalog) {
|
|
247
304
|
const name = clean(tool?.name);
|
|
248
|
-
if (name && !active.has(name)) out.push(name);
|
|
305
|
+
if (name && !active.has(name) && rosterPermits(session, tool)) out.push(name);
|
|
249
306
|
}
|
|
250
307
|
return sortedNamesByMeasuredUsage(out);
|
|
251
308
|
}
|
|
@@ -288,13 +345,37 @@ export function isReadonlySelectable(tool) {
|
|
|
288
345
|
|
|
289
346
|
export function applyDeferredToolSurface(session, mode, extraTools = [], options = {}) {
|
|
290
347
|
if (!session || !Array.isArray(session.tools)) return session;
|
|
291
|
-
const
|
|
348
|
+
const provider = options.provider || session.provider;
|
|
349
|
+
// The pinned wire route decides a gateway's mode (it names its own
|
|
350
|
+
// provider, so a surface built for another provider ignores it).
|
|
351
|
+
const providerMode = deferredProviderMode(provider, session.wireRoute);
|
|
352
|
+
const exposure = toolExposureModeForProvider(provider, session.wireRoute);
|
|
353
|
+
const bridge = exposure === TOOL_EXPOSURE_BRIDGE;
|
|
354
|
+
// An existing surface built for another exposure is migrated, not merely
|
|
355
|
+
// re-selected: its fixed prompt guidance changes with it.
|
|
356
|
+
const previousExposure = sessionToolExposure(session);
|
|
357
|
+
// A surface an earlier bridge revision built (guidance-only prompt,
|
|
358
|
+
// search_tools) is rebuilt once, the same rewrite an exposure change makes.
|
|
359
|
+
const exposureChanged =
|
|
360
|
+
previousExposure !== null && (previousExposure !== exposure || (bridge && bridgeSurfaceOutdated(session)));
|
|
361
|
+
// The one native ↔ bridge transition, whoever triggers it (provider switch,
|
|
362
|
+
// resume, request boundary): leaving native keeps its discoveries aside,
|
|
363
|
+
// and the way back to native restores them below.
|
|
364
|
+
if (previousExposure === TOOL_EXPOSURE_NATIVE && bridge) {
|
|
365
|
+
session.nativeDeferredDiscovery = canonicalDeferredToolNames(
|
|
366
|
+
deferredCatalogUnion(session),
|
|
367
|
+
session.deferredDiscoveredTools || []
|
|
368
|
+
);
|
|
369
|
+
}
|
|
292
370
|
const byName = new Map();
|
|
293
371
|
// Rebuild from the full catalog, not just its eager projection. Current
|
|
294
|
-
// definitions still take precedence over retained definitions.
|
|
372
|
+
// definitions still take precedence over retained definitions. Bridge
|
|
373
|
+
// definitions belong to the exposure, never to the catalog.
|
|
295
374
|
const candidates = filterDisallowedTools(
|
|
296
375
|
filterModelEditTools(
|
|
297
|
-
[...session.tools, ...(extraTools || []), ...deferredCatalogUnion(session)]
|
|
376
|
+
[...session.tools, ...(extraTools || []), ...deferredCatalogUnion(session)].filter(
|
|
377
|
+
(tool) => !isBridgeToolDefinition(tool)
|
|
378
|
+
),
|
|
298
379
|
options.model || session.model
|
|
299
380
|
),
|
|
300
381
|
[...(session.disallowedTools || []), ...(options.disallowed || [])]
|
|
@@ -308,15 +389,12 @@ export function applyDeferredToolSurface(session, mode, extraTools = [], options
|
|
|
308
389
|
const defaultNames = defaultDeferredToolNames(catalog, mode);
|
|
309
390
|
// Solo keeps `agent` in the deferred pool: loadable on request, never eager.
|
|
310
391
|
if (session.orchestrationMode === 'none') defaultNames.delete('agent');
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
if (
|
|
317
|
-
selectedNames = storedNames.length ? canonicalDeferredToolNames(catalog, storedNames) : [];
|
|
318
|
-
if (!selectedNames.length || providerMode === 'native') selectedNames = sortedNamesByMeasuredUsage(defaultNames);
|
|
319
|
-
}
|
|
392
|
+
// Bridge sessions expose the mode's core only: a stored (legacy all-selected)
|
|
393
|
+
// selection never widens the wire surface, and load_tool is the bridge's own.
|
|
394
|
+
const storedNames = providerMode === 'native' || bridge ? [] : storedDeferredToolNames(session);
|
|
395
|
+
let selectedNames = storedNames.length ? canonicalDeferredToolNames(catalog, storedNames) : [];
|
|
396
|
+
if (!selectedNames.length || providerMode === 'native') selectedNames = sortedNamesByMeasuredUsage(defaultNames);
|
|
397
|
+
if (bridge) selectedNames = selectedNames.filter((name) => name !== 'load_tool');
|
|
320
398
|
const selected = new Set(selectedNames);
|
|
321
399
|
session.deferredToolCatalog = catalog;
|
|
322
400
|
session.deferredToolUsage = MEASURED_TOOL_USAGE;
|
|
@@ -332,14 +410,29 @@ export function applyDeferredToolSurface(session, mode, extraTools = [], options
|
|
|
332
410
|
session.tools.push(tool);
|
|
333
411
|
active.push(clean(tool?.name));
|
|
334
412
|
}
|
|
413
|
+
// Every other definition stays in the scoped catalog, reached through the
|
|
414
|
+
// bridge. A tool-free session (empty catalog) stays tool-free.
|
|
415
|
+
if (bridge && catalog.length) session.tools.push(...BRIDGE_SURFACE_TOOLS);
|
|
416
|
+
if (bridge) session.toolExposureMode = TOOL_EXPOSURE_BRIDGE;
|
|
417
|
+
else delete session.toolExposureMode;
|
|
335
418
|
session.deferredCallableTools = sortedNamesByMeasuredUsage(active);
|
|
336
419
|
if (providerMode === 'native') {
|
|
337
|
-
const
|
|
420
|
+
const restored = previousExposure === TOOL_EXPOSURE_BRIDGE ? session.nativeDeferredDiscovery || [] : [];
|
|
421
|
+
delete session.nativeDeferredDiscovery;
|
|
422
|
+
const discovered = canonicalDeferredToolNames(catalog, [...(session.deferredDiscoveredTools || []), ...restored]);
|
|
338
423
|
session.deferredSelectedTools = active;
|
|
339
424
|
session.deferredDiscoveredTools = discovered.filter((name) => !selected.has(name));
|
|
340
425
|
} else {
|
|
341
426
|
setDeferredToolState(session, active);
|
|
342
427
|
}
|
|
428
|
+
if (exposureChanged && session.messages?.some((m) => m?.role === 'system')) {
|
|
429
|
+
// Replace the previous exposure's fixed block once: the native deferred
|
|
430
|
+
// manifest, or the bridge roster + guidance. History stays as is.
|
|
431
|
+
session.mcpServerInstructions = getMcpServerInstructionsMap(session.mcpScopeId);
|
|
432
|
+
applyInitialDeferredToolManifestToBp2(session, deferredPoolToolNames(session), { rebuild: true });
|
|
433
|
+
const rendered = renderedDeferredManifest(session);
|
|
434
|
+
session.deferredAnnouncedTools = deferredPoolToolNames(session).filter((name) => rendered.includes(name));
|
|
435
|
+
}
|
|
343
436
|
if (!session.deferredToolBp2Applied && session.messages?.some((m) => m?.role === 'system')) {
|
|
344
437
|
if (!session.mcpServerInstructions || typeof session.mcpServerInstructions !== 'object') {
|
|
345
438
|
session.mcpServerInstructions = getMcpServerInstructionsMap(session.mcpScopeId);
|
|
@@ -358,41 +451,33 @@ export function applyDeferredToolSurface(session, mode, extraTools = [], options
|
|
|
358
451
|
|
|
359
452
|
export function rebuildDeferredToolSurfaceForProvider(session, provider) {
|
|
360
453
|
if (!session || !Array.isArray(session.tools)) return session;
|
|
361
|
-
const
|
|
362
|
-
const
|
|
363
|
-
const nextFamily = nativeProviderFamily(provider);
|
|
454
|
+
const previousFamily = nativeProviderFamily(session.provider, session.wireRoute);
|
|
455
|
+
const nextFamily = nativeProviderFamily(provider, session.wireRoute);
|
|
364
456
|
const preserveNativeState = previousFamily && previousFamily === nextFamily;
|
|
365
457
|
const discovered = preserveNativeState
|
|
366
458
|
? canonicalDeferredToolNames(deferredCatalogUnion(session), session.deferredDiscoveredTools || [])
|
|
367
459
|
: [];
|
|
368
460
|
const catalog = deferredCatalogUnion(session).slice();
|
|
369
|
-
|
|
461
|
+
const fromBridge = isToolBridgeEnabled(session);
|
|
462
|
+
// Another native family starts without this family's discoveries. Leaving
|
|
463
|
+
// native for the bridge keeps them: applyDeferredToolSurface sets them aside.
|
|
464
|
+
if (nextFamily) session.deferredDiscoveredTools = discovered;
|
|
465
|
+
// applyDeferredToolSurface replaces the fixed guidance when the exposure
|
|
466
|
+
// (native ↔ bridge) changes.
|
|
370
467
|
applyDeferredToolSurface(session, session.deferredSurfaceMode || 'lead', catalog, { provider });
|
|
371
|
-
|
|
372
|
-
|
|
468
|
+
// Back from the bridge: the discoveries applyDeferredToolSurface restored
|
|
469
|
+
// become callable again. Otherwise exactly the native family's own.
|
|
470
|
+
const eager = new Set(session.tools.map((tool) => clean(tool?.name)));
|
|
471
|
+
const kept = fromBridge
|
|
472
|
+
? sortedNamesByMeasuredUsage((session.deferredDiscoveredTools || []).filter((name) => !eager.has(name)))
|
|
473
|
+
: discovered;
|
|
474
|
+
if (session.deferredProviderMode === 'native' && kept.length) {
|
|
475
|
+
session.deferredDiscoveredTools = kept;
|
|
373
476
|
session.deferredCallableTools = sortedNamesByMeasuredUsage(
|
|
374
|
-
new Set([...(session.deferredCallableTools || []), ...
|
|
477
|
+
new Set([...(session.deferredCallableTools || []), ...kept])
|
|
375
478
|
);
|
|
376
479
|
session.deferredSelectedTools = session.deferredCallableTools.slice();
|
|
377
480
|
}
|
|
378
|
-
if (previousMode && previousMode !== session.deferredProviderMode) {
|
|
379
|
-
if (session.deferredProviderMode === 'native') {
|
|
380
|
-
session.mcpServerInstructions = getMcpServerInstructionsMap(session.mcpScopeId);
|
|
381
|
-
applyInitialDeferredToolManifestToBp2(session, deferredPoolToolNames(session), { rebuild: true });
|
|
382
|
-
const rendered = renderedDeferredManifest(session);
|
|
383
|
-
session.deferredAnnouncedTools = deferredPoolToolNames(session).filter((name) => rendered.includes(name));
|
|
384
|
-
} else if (previousMode === 'native') {
|
|
385
|
-
for (const system of session.messages?.filter((message) => message?.role === 'system') || []) {
|
|
386
|
-
if (typeof system.content === 'string') system.content = stripDeferredToolManifestBlock(system.content);
|
|
387
|
-
}
|
|
388
|
-
session.messages = session.messages.filter(
|
|
389
|
-
(message) => message?.role !== 'system' || String(message.content || '').trim()
|
|
390
|
-
);
|
|
391
|
-
session.deferredAnnouncedTools = [];
|
|
392
|
-
session.deferredToolBp2Applied = true;
|
|
393
|
-
delete session.deferredToolBp1Applied;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
481
|
return session;
|
|
397
482
|
}
|
|
398
483
|
|
|
@@ -400,9 +485,9 @@ export function rebuildDeferredToolSurfaceForProvider(session, provider) {
|
|
|
400
485
|
// An MCP server may finish its handshake BETWEEN session-create and the first
|
|
401
486
|
// user send. Fold those LIVE MCP tools into the boot deferred catalog + the
|
|
402
487
|
// provider-visible first-turn surface. Native providers rebuild the initial BP2
|
|
403
|
-
// <available-deferred-tools> manifest IN PLACE and pre-mark names announced
|
|
404
|
-
//
|
|
405
|
-
//
|
|
488
|
+
// <available-deferred-tools> manifest IN PLACE and pre-mark names announced;
|
|
489
|
+
// bridge-v1 sessions do the same (roster + bridge guidance). Only a fixed
|
|
490
|
+
// surface not yet on the bridge updates its scoped catalog alone. Fully sync
|
|
406
491
|
// and idempotent: no genuinely-new MCP name => no-op / no mutation.
|
|
407
492
|
export function refreshInitialDeferredMcpSurface(session, liveMcpTools) {
|
|
408
493
|
if (!session || !Array.isArray(session.messages)) return false;
|
|
@@ -422,15 +507,7 @@ export function refreshInitialDeferredMcpSurface(session, liveMcpTools) {
|
|
|
422
507
|
}
|
|
423
508
|
if (!added) return false;
|
|
424
509
|
session.deferredToolCatalog = sortedCatalogByMeasuredUsage([...byName.values()]);
|
|
425
|
-
if (session
|
|
426
|
-
const next = session.deferredToolCatalog.filter(
|
|
427
|
-
(tool) => session.deferredSurfaceMode !== 'readonly' || isReadonlySelectable(tool)
|
|
428
|
-
);
|
|
429
|
-
session.tools.splice(0, session.tools.length, ...next);
|
|
430
|
-
session.deferredCallableTools = next.map((tool) => clean(tool?.name)).filter(Boolean);
|
|
431
|
-
if (session.deferredProviderMode === 'canonical') {
|
|
432
|
-
setDeferredToolState(session, session.deferredCallableTools);
|
|
433
|
-
}
|
|
510
|
+
if (fixedSurfaceSession(session)) {
|
|
434
511
|
session.updatedAt = Date.now();
|
|
435
512
|
return true;
|
|
436
513
|
}
|
|
@@ -497,6 +574,7 @@ function reconcileStateOf(session, liveMcpTools) {
|
|
|
497
574
|
cwd: clean(session.cwd),
|
|
498
575
|
mode: clean(session.deferredSurfaceMode),
|
|
499
576
|
providerMode: clean(session.deferredProviderMode),
|
|
577
|
+
exposure: clean(session.toolExposureMode),
|
|
500
578
|
provider: clean(session.provider),
|
|
501
579
|
model: clean(session.model),
|
|
502
580
|
disallowed: JSON.stringify(session.disallowedTools || []),
|
|
@@ -525,7 +603,7 @@ function reconcileDeferredMcpToolCatalogUncached(session, liveMcpTools) {
|
|
|
525
603
|
.filter(isMcpToolName)
|
|
526
604
|
);
|
|
527
605
|
session.deferredMcpToolNames = [...new Set(live.map((tool) => clean(tool?.name)).filter(isMcpToolName))];
|
|
528
|
-
if (
|
|
606
|
+
if (fixedSurfaceSession(session)) {
|
|
529
607
|
const byName = new Map();
|
|
530
608
|
for (const tool of Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : []) {
|
|
531
609
|
const name = clean(tool?.name);
|
|
@@ -535,17 +613,23 @@ function reconcileDeferredMcpToolCatalogUncached(session, liveMcpTools) {
|
|
|
535
613
|
const name = clean(tool?.name);
|
|
536
614
|
if (name && isMcpToolName(name)) byName.set(name, liveToolClone(tool));
|
|
537
615
|
}
|
|
616
|
+
// A fixed surface not yet on the bridge: connect, reconnect and removal
|
|
617
|
+
// update the scoped catalog only (availability follows
|
|
618
|
+
// deferredMcpToolNames); nothing is announced.
|
|
538
619
|
const catalog = sortedCatalogByMeasuredUsage([...byName.values()]);
|
|
539
|
-
const
|
|
540
|
-
const before = JSON.stringify((session.tools || []).map((tool) => activeToolForSurface(tool)));
|
|
541
|
-
const after = JSON.stringify(next);
|
|
620
|
+
const previous = Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : [];
|
|
542
621
|
session.deferredToolCatalog = catalog;
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
return
|
|
622
|
+
if (previous.length !== catalog.length || previous.some((tool, index) => tool !== catalog[index])) {
|
|
623
|
+
session.updatedAt = Date.now();
|
|
624
|
+
}
|
|
625
|
+
return null;
|
|
547
626
|
}
|
|
548
627
|
const lateCatalog = Array.isArray(session.deferredLateToolCatalog) ? session.deferredLateToolCatalog : [];
|
|
628
|
+
// A bridge session judges a removal by the definition it had before this
|
|
629
|
+
// reconciliation (a disconnected late tool leaves the late pool below).
|
|
630
|
+
const knownBefore = isToolBridgeEnabled(session)
|
|
631
|
+
? new Map(deferredCatalogUnion(session).map((tool) => [clean(tool?.name), tool]))
|
|
632
|
+
: null;
|
|
549
633
|
const active = new Set([
|
|
550
634
|
...(session.tools || []).map((tool) => clean(tool?.name)).filter(Boolean),
|
|
551
635
|
...parseToolSelection(session.deferredCallableTools),
|
|
@@ -594,11 +678,13 @@ function reconcileDeferredMcpToolCatalogUncached(session, liveMcpTools) {
|
|
|
594
678
|
const name = clean(tool?.name);
|
|
595
679
|
if (!name || !isMcpToolName(name)) continue;
|
|
596
680
|
if (previousNames.has(name) || (!hadSnapshot && (active.has(name) || startupNames.has(name)))) continue;
|
|
681
|
+
if (!rosterPermits(session, tool)) continue;
|
|
597
682
|
added.push({ name, description: lateAnnouncementDescription(tool?.description) });
|
|
598
683
|
}
|
|
599
684
|
const removed = [];
|
|
600
685
|
for (const name of previousNames) {
|
|
601
686
|
if (nextNames.has(name)) continue;
|
|
687
|
+
if (knownBefore && !rosterPermits(session, knownBefore.get(name) || { name })) continue;
|
|
602
688
|
removed.push(name);
|
|
603
689
|
}
|
|
604
690
|
if (!added.length && !removed.length) return null;
|
|
@@ -625,6 +711,9 @@ export function selectDeferredTools(session, names, mode, { exact = false } = {}
|
|
|
625
711
|
const active = new Set([...surfaceActive, ...parseToolSelection(session?.deferredCallableTools)]);
|
|
626
712
|
const native = session?.deferredProviderMode === 'native' || session?.deferredNativeTools === true;
|
|
627
713
|
const discovered = new Set(Array.isArray(session?.deferredDiscoveredTools) ? session.deferredDiscoveredTools : []);
|
|
714
|
+
// Bridge sessions keep a fixed surface: deferred tools are described and
|
|
715
|
+
// run through the bridge, never appended to session.tools.
|
|
716
|
+
const bridge = isToolBridgeEnabled(session);
|
|
628
717
|
const activateOnSurface = !native;
|
|
629
718
|
const byName = new Map();
|
|
630
719
|
for (const tool of catalog) {
|
|
@@ -645,11 +734,18 @@ export function selectDeferredTools(session, names, mode, { exact = false } = {}
|
|
|
645
734
|
missing.push(requestedName);
|
|
646
735
|
continue;
|
|
647
736
|
}
|
|
737
|
+
// A tool this route never sends (schema rejected) is not loaded and not
|
|
738
|
+
// listed as active; the reason says why.
|
|
739
|
+
const routeExclusion = bridge ? null : routeToolExclusionReason(session, tool);
|
|
740
|
+
if (routeExclusion) {
|
|
741
|
+
blocked.push({ name, reason: routeExclusion });
|
|
742
|
+
continue;
|
|
743
|
+
}
|
|
648
744
|
if (mode === 'readonly' && !isReadonlySelectable(tool)) {
|
|
649
745
|
blocked.push({ name, reason: 'readonly mode' });
|
|
650
746
|
continue;
|
|
651
747
|
}
|
|
652
|
-
if (active.has(name) || (!activateOnSurface && discovered.has(name))) {
|
|
748
|
+
if (bridge || active.has(name) || (!activateOnSurface && discovered.has(name))) {
|
|
653
749
|
already.push(name);
|
|
654
750
|
continue;
|
|
655
751
|
}
|
|
@@ -663,6 +759,7 @@ export function selectDeferredTools(session, names, mode, { exact = false } = {}
|
|
|
663
759
|
}
|
|
664
760
|
added.push(name);
|
|
665
761
|
}
|
|
762
|
+
if (bridge) return { added, already, blocked, missing, native };
|
|
666
763
|
if (native) {
|
|
667
764
|
session.deferredCallableTools = sortedNamesByMeasuredUsage(active);
|
|
668
765
|
session.deferredDiscoveredTools = sortedNamesByMeasuredUsage([...discovered]);
|
|
@@ -697,11 +794,13 @@ function pendingAndFailedMcpServers(mcpStatus) {
|
|
|
697
794
|
return { pending: [...new Set(pending)].sort(), failed: [...new Set(failed)].sort() };
|
|
698
795
|
}
|
|
699
796
|
|
|
700
|
-
/**
|
|
797
|
+
/**
|
|
798
|
+
* The deferred catalog union, or the session's own tools when nothing is
|
|
799
|
+
* deferred — either way only what the session's policy lets it execute.
|
|
800
|
+
*/
|
|
701
801
|
function resolvableCatalog(session) {
|
|
702
802
|
const union = deferredCatalogUnion(session);
|
|
703
|
-
|
|
704
|
-
return filterDisallowedTools(Array.isArray(session?.tools) ? session.tools : [], session?.disallowedTools);
|
|
803
|
+
return filterSessionToolPolicy(union.length ? union : Array.isArray(session?.tools) ? session.tools : [], session);
|
|
705
804
|
}
|
|
706
805
|
|
|
707
806
|
// Pure loader. Input is exact deferred-tool names/aliases; output reports
|
|
@@ -709,6 +808,8 @@ function resolvableCatalog(session) {
|
|
|
709
808
|
// servers. No listing, no ranking, no substring filter. `options.mcpStatus` is
|
|
710
809
|
// the runtime getter for per-server status.
|
|
711
810
|
export function renderToolSearch(args = {}, session, mode = 'full', options = {}) {
|
|
811
|
+
// Bridge mode: load_tool describes (bounded, paged) and never loads.
|
|
812
|
+
if (isToolBridgeEnabled(session)) return formatBridgeResult(describeBridgeTools(session, args, { mode }));
|
|
712
813
|
const catalog = resolvableCatalog(session);
|
|
713
814
|
const requestedNames = parseToolSelection(args.names);
|
|
714
815
|
const { pending: pendingMcpServers, failed: failedMcpServers } = pendingAndFailedMcpServers(options?.mcpStatus);
|
|
@@ -729,9 +830,11 @@ export function renderToolSearch(args = {}, session, mode = 'full', options = {}
|
|
|
729
830
|
missing: [],
|
|
730
831
|
...mcpFields,
|
|
731
832
|
activeTools: sortedNamesByMeasuredUsage(
|
|
732
|
-
(session?.tools || []).map((tool) => clean(tool?.name)).filter(Boolean)
|
|
833
|
+
permittedNames(session, (session?.tools || []).map((tool) => clean(tool?.name)).filter(Boolean)).filter(
|
|
834
|
+
sentOnRoute(session, catalog)
|
|
835
|
+
)
|
|
733
836
|
),
|
|
734
|
-
discoveredTools: sortedNamesByMeasuredUsage(session?.deferredDiscoveredTools
|
|
837
|
+
discoveredTools: sortedNamesByMeasuredUsage(permittedNames(session, session?.deferredDiscoveredTools)),
|
|
735
838
|
},
|
|
736
839
|
null,
|
|
737
840
|
2
|
|
@@ -789,9 +892,11 @@ export function renderToolSearch(args = {}, session, mode = 'full', options = {}
|
|
|
789
892
|
...(blocked.length ? { blocked } : {}),
|
|
790
893
|
...mcpFields,
|
|
791
894
|
activeTools: sortedNamesByMeasuredUsage(
|
|
792
|
-
[...nextActiveNames]
|
|
895
|
+
permittedNames(session, [...nextActiveNames])
|
|
896
|
+
.filter((name) => isDeferredToolAvailable(session, name))
|
|
897
|
+
.filter(sentOnRoute(session, catalog))
|
|
793
898
|
),
|
|
794
|
-
discoveredTools: sortedNamesByMeasuredUsage(session?.deferredDiscoveredTools
|
|
899
|
+
discoveredTools: sortedNamesByMeasuredUsage(permittedNames(session, session?.deferredDiscoveredTools)),
|
|
795
900
|
...(notes.length ? { note: notes.join(' ') } : {}),
|
|
796
901
|
},
|
|
797
902
|
null,
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
// Pure, self-contained schemas + the agent-hidden default helper; no runtime
|
|
3
3
|
// closure dependencies.
|
|
4
4
|
|
|
5
|
+
// One load_tool for every session, native and bridge, byte for byte: native
|
|
6
|
+
// sessions register the named tools; bridge sessions (see tool-bridge.mjs)
|
|
7
|
+
// get their definitions back and run them through call_tool. Native request
|
|
8
|
+
// bytes must never change, so the bridge adds nothing to this definition.
|
|
5
9
|
export const TOOL_SEARCH_TOOL = {
|
|
6
10
|
name: 'load_tool',
|
|
7
11
|
title: 'load_tool',
|
|
@@ -27,34 +31,80 @@ export const TOOL_SEARCH_TOOL = {
|
|
|
27
31
|
},
|
|
28
32
|
};
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
// Fixed tool bridge for non-native providers (see tool-bridge.mjs). The
|
|
35
|
+
// description is static so the definition stays byte-stable: it never carries
|
|
36
|
+
// catalog names, counts or listings.
|
|
37
|
+
export const CALL_TOOL_TOOL = {
|
|
38
|
+
name: 'call_tool',
|
|
39
|
+
title: 'call_tool',
|
|
33
40
|
annotations: {
|
|
34
|
-
title: '
|
|
41
|
+
title: 'call_tool',
|
|
42
|
+
readOnlyHint: false,
|
|
43
|
+
destructiveHint: true,
|
|
44
|
+
idempotentHint: false,
|
|
45
|
+
openWorldHint: true,
|
|
46
|
+
agentHidden: true,
|
|
47
|
+
},
|
|
48
|
+
description:
|
|
49
|
+
'Run one tool that is available in this session but not directly exposed, with the arguments its schema requires. The call has the same permissions, approvals and result as calling that tool directly.',
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: 'object',
|
|
52
|
+
properties: {
|
|
53
|
+
name: { type: 'string', minLength: 1, maxLength: 256, description: 'Exact tool name.' },
|
|
54
|
+
arguments: { type: 'object', description: 'Arguments for that tool.' },
|
|
55
|
+
},
|
|
56
|
+
required: ['name', 'arguments'],
|
|
57
|
+
additionalProperties: false,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// The fixed bridge for non-native providers: the shared load_tool plus call_tool.
|
|
62
|
+
export const TOOL_BRIDGE_TOOLS = Object.freeze([TOOL_SEARCH_TOOL, CALL_TOOL_TOOL]);
|
|
63
|
+
|
|
64
|
+
export const SESSION_TOOL = {
|
|
65
|
+
name: 'session',
|
|
66
|
+
title: 'Session',
|
|
67
|
+
annotations: {
|
|
68
|
+
title: 'Session',
|
|
35
69
|
readOnlyHint: false,
|
|
36
70
|
destructiveHint: false,
|
|
37
71
|
idempotentHint: false,
|
|
38
72
|
openWorldHint: false,
|
|
39
73
|
agentHidden: true,
|
|
40
74
|
},
|
|
41
|
-
trigger: '
|
|
75
|
+
trigger: 'Session status, rename the title, compact, fork into a new session, switch Project, worktrees.',
|
|
42
76
|
description:
|
|
43
|
-
'
|
|
77
|
+
'Manage the current session. status shows session id, title, Project and model; rename sets the session title; compact runs after this turn ends; fork copies this conversation into a new session. set-project switches the active Project; list-projects returns the registered projects (name, path); a project name instead of a path → list-projects first, then set-project with the matching path, ask only if several match. path must be an existing directory. A shell-local cd does not change the Project. Worktree actions act on this session’s git worktree only when the user explicitly asks.',
|
|
44
78
|
inputSchema: {
|
|
45
79
|
type: 'object',
|
|
46
80
|
properties: {
|
|
47
81
|
action: {
|
|
48
82
|
type: 'string',
|
|
49
|
-
enum: [
|
|
83
|
+
enum: [
|
|
84
|
+
'status',
|
|
85
|
+
'rename',
|
|
86
|
+
'compact',
|
|
87
|
+
'fork',
|
|
88
|
+
'set-project',
|
|
89
|
+
'list-projects',
|
|
90
|
+
'favorite',
|
|
91
|
+
'archive',
|
|
92
|
+
'merge-worktree',
|
|
93
|
+
'remove-worktree',
|
|
94
|
+
'list-worktrees',
|
|
95
|
+
'prune-worktrees',
|
|
96
|
+
],
|
|
50
97
|
description:
|
|
51
|
-
'
|
|
98
|
+
'status (default without path) shows the session; rename sets title; compact schedules a compaction right after this turn; fork creates a new session copying this conversation (returns its sessionId; this session stays current); set-project switches to path; list-projects returns registered projects; favorite/archive set this session’s sidebar flag to value; merge-worktree merges this session’s worktree into the project folder’s checked-out branch, remove-worktree deletes it (returning to the project folder; call again if it reports WORKTREE_REMOVAL_INCOMPLETE); list-worktrees lists every managed worktree and who retains it; prune-worktrees removes clean, merged ones no session retains.',
|
|
52
99
|
},
|
|
53
|
-
|
|
100
|
+
title: { type: 'string', description: 'rename: the new session title.' },
|
|
101
|
+
path: { type: 'string', description: 'Existing directory to switch to (implies action=set-project).' },
|
|
102
|
+
compact: { type: 'boolean', description: 'fork: compact the copied conversation.' },
|
|
54
103
|
force: {
|
|
55
104
|
type: 'boolean',
|
|
56
105
|
description: 'remove-worktree: delete even with uncommitted or unmerged work (only when the user says so).',
|
|
57
106
|
},
|
|
107
|
+
value: { type: 'boolean', description: 'favorite/archive: on or off.' },
|
|
58
108
|
},
|
|
59
109
|
additionalProperties: false,
|
|
60
110
|
},
|
|
@@ -121,6 +171,7 @@ export function collectStandaloneToolDefs({
|
|
|
121
171
|
tidyToolDefs = [],
|
|
122
172
|
visualizeToolDefs = [],
|
|
123
173
|
setupToolDefs = [],
|
|
174
|
+
askUserToolDefs = [],
|
|
124
175
|
goalTools = [],
|
|
125
176
|
agentTools = [],
|
|
126
177
|
skillToolEnabled = true,
|
|
@@ -129,7 +180,7 @@ export function collectStandaloneToolDefs({
|
|
|
129
180
|
const standaloneTools = [
|
|
130
181
|
TOOL_SEARCH_TOOL,
|
|
131
182
|
...(skillToolEnabled ? [SKILL_TOOL] : []),
|
|
132
|
-
|
|
183
|
+
SESSION_TOOL,
|
|
133
184
|
...webSearchRuntimeTools.filter((tool) => tool?.public !== false),
|
|
134
185
|
...admitted(memoryToolDefs?.TOOL_DEFS, MEMORY_RUNTIME_TOOLS),
|
|
135
186
|
...admitted(codeGraphToolDefs?.CODE_GRAPH_TOOL_DEFS, CODE_GRAPH_RUNTIME_TOOLS),
|
|
@@ -141,6 +192,7 @@ export function collectStandaloneToolDefs({
|
|
|
141
192
|
...admitted(tidyToolDefs, TIDY_RUNTIME_TOOLS),
|
|
142
193
|
...admitted(visualizeToolDefs, VISUALIZE_RUNTIME_TOOLS),
|
|
143
194
|
...setupToolDefs,
|
|
195
|
+
...askUserToolDefs,
|
|
144
196
|
...goalTools,
|
|
145
197
|
...agentTools,
|
|
146
198
|
];
|