mixdog 0.9.63 → 0.9.64
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 +3 -0
- package/package.json +9 -2
- package/scripts/code-graph-description-contract.mjs +3 -3
- package/scripts/verify-release-assets.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +11 -14
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -6
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
- package/src/runtime/agent/orchestrator/config.mjs +19 -124
- package/src/runtime/agent/orchestrator/context/collect.mjs +6 -6
- package/src/runtime/agent/orchestrator/dispatch-persist.mjs +2 -2
- package/src/runtime/agent/orchestrator/internal-agents.mjs +2 -2
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/client.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +333 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +3 -277
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +6 -6
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +196 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +460 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +14 -593
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +5 -280
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +357 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-headers.mjs +216 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +2 -188
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/compact/budget.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/compact/file-reattach.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +17 -0
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +18 -26
- package/src/runtime/agent/orchestrator/session/loop/termination.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/delivered-completions.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +49 -0
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +49 -0
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +260 -0
- package/src/runtime/agent/orchestrator/session/store/serialize.mjs +72 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +163 -0
- package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/store.mjs +9 -561
- package/src/runtime/agent/orchestrator/session/tool-envelope.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +2 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +11 -11
- package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/bash-session.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +2 -154
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/cwd-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/fs-reachability.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/path-locks.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-args.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +2 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +5 -5
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-spawn.mjs +519 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +5 -449
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +212 -0
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +1 -7
- package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +9 -36
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +15 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +429 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +2 -395
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-state.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/mutation-planner.mjs +5 -5
- package/src/runtime/agent/orchestrator/tools/next-call-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +7 -7
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +72 -9
- package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/patch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/result-compression.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +2 -444
- package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +505 -0
- package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +1 -1
- package/src/runtime/channels/lib/backend-dispatch.mjs +20 -5
- package/src/runtime/channels/lib/scheduler.mjs +1 -1
- package/src/runtime/channels/lib/telegram-format.mjs +1 -1
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +4 -4
- package/src/runtime/channels/tool-defs.mjs +2 -3
- package/src/runtime/memory/index.mjs +1 -5
- package/src/runtime/memory/lib/core-memory-candidates.mjs +357 -0
- package/src/runtime/memory/lib/core-memory-store.mjs +7 -357
- package/src/runtime/memory/lib/cycle-signatures.mjs +1 -1
- package/src/runtime/memory/lib/embedding-model-config.mjs +1 -1
- package/src/runtime/memory/lib/embedding-provider.mjs +1 -5
- package/src/runtime/memory/lib/embedding-worker.mjs +1 -5
- package/src/runtime/memory/lib/ko-morph.mjs +2 -2
- package/src/runtime/memory/lib/memory-config-flags.mjs +2 -5
- package/src/runtime/memory/lib/memory-cycle-requests.mjs +3 -7
- package/src/runtime/memory/lib/memory-cycle1.mjs +4 -8
- package/src/runtime/memory/lib/memory-cycle2-gate.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle2-shared.mjs +2 -5
- package/src/runtime/memory/lib/memory-cycle3.mjs +1 -5
- package/src/runtime/memory/lib/memory-embed.mjs +2 -6
- package/src/runtime/memory/lib/memory-log.mjs +8 -0
- package/src/runtime/memory/lib/memory-ops-policy.mjs +4 -8
- package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +1 -1
- package/src/runtime/memory/lib/memory-recall-store.mjs +2 -193
- package/src/runtime/memory/lib/memory-score.mjs +1 -1
- package/src/runtime/memory/lib/memory-text-utils.mjs +2 -2
- package/src/runtime/memory/lib/memory.mjs +2 -6
- package/src/runtime/memory/lib/pg/adapter.mjs +2 -6
- package/src/runtime/memory/lib/pg/process.mjs +1 -5
- package/src/runtime/memory/lib/pg/supervisor.mjs +1 -5
- package/src/runtime/memory/lib/recall-format.mjs +2 -2
- package/src/runtime/memory/lib/recall-scoring.mjs +195 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -5
- package/src/runtime/memory/lib/trace-store.mjs +2 -6
- package/src/runtime/search/lib/http-fetch.mjs +6 -6
- package/src/runtime/search/lib/web-tools.mjs +2 -2
- package/src/runtime/shared/buffered-appender.mjs +1 -1
- package/src/runtime/shared/child-guardian.mjs +1 -1
- package/src/runtime/shared/child-spawn-gate.mjs +1 -1
- package/src/runtime/shared/config.mjs +4 -4
- package/src/runtime/shared/launcher-control.mjs +9 -10
- package/src/runtime/shared/llm/index.mjs +5 -20
- package/src/runtime/shared/markdown-frontmatter.mjs +1 -1
- package/src/runtime/shared/memory-snapshot.mjs +4 -4
- package/src/runtime/shared/pristine-execution.mjs +1 -1
- package/src/runtime/shared/process-lifecycle.mjs +0 -1
- package/src/runtime/shared/process-shutdown.mjs +1 -1
- package/src/runtime/shared/resource-admission.mjs +2 -2
- package/src/runtime/shared/schedule-session-run.mjs +1 -1
- package/src/runtime/shared/schedules-db.mjs +1 -1
- package/src/runtime/shared/service-discovery.mjs +2 -2
- package/src/runtime/shared/staged-update.mjs +6 -6
- package/src/runtime/shared/tool-execution-contract.mjs +1 -1
- package/src/runtime/shared/tool-primitives.mjs +1 -1
- package/src/runtime/shared/tool-surface.mjs +2 -2
- package/src/runtime/shared/update-checker.mjs +1 -1
- package/src/runtime/shared/user-cwd.mjs +3 -3
- package/src/runtime/shared/user-data-guard.mjs +4 -4
- package/src/runtime/shared/workspace-router.mjs +5 -5
- package/src/session-runtime/config-helpers.mjs +2 -3
- package/src/session-runtime/config-lifecycle.mjs +1 -1
- package/src/session-runtime/hitch-profile.mjs +1 -1
- package/src/session-runtime/lifecycle-api.mjs +6 -4
- package/src/session-runtime/model-recency.mjs +5 -5
- package/src/session-runtime/plugin-mcp.mjs +1 -1
- package/src/session-runtime/provider-request-snapshot.mjs +338 -0
- package/src/session-runtime/session-text.mjs +4 -4
- package/src/session-runtime/tool-catalog-schema.mjs +197 -0
- package/src/session-runtime/tool-catalog.mjs +6 -483
- package/src/session-runtime/tool-defs.mjs +1 -1
- package/src/standalone/agent-task-status.mjs +1 -1
- package/src/standalone/agent-tool/helpers.mjs +2 -2
- package/src/standalone/channel-admin.mjs +4 -4
- package/src/standalone/explore-tool.mjs +3 -3
- package/src/standalone/hook-bus/config.mjs +1 -1
- package/src/standalone/hook-bus/constants.mjs +1 -1
- package/src/standalone/hook-bus/rules.mjs +1 -1
- package/src/standalone/projects.mjs +1 -1
- package/src/standalone/provider-admin.mjs +2 -2
- package/src/tui/app/app-format.mjs +2 -2
- package/src/tui/app/clipboard.mjs +3 -3
- package/src/tui/app/input-parsers.mjs +1 -1
- package/src/tui/app/text-layout.mjs +1 -1
- package/src/tui/app/transcript-row-estimate.mjs +360 -0
- package/src/tui/app/transcript-window.mjs +5 -347
- package/src/tui/app/use-mouse-input.mjs +1 -1
- package/src/tui/app/use-prompt-handlers.mjs +1 -1
- package/src/tui/components/tool-execution/surface-detail.mjs +9 -9
- package/src/tui/components/tool-execution/text-format.mjs +2 -2
- package/src/tui/components/tool-output-format.mjs +7 -7
- package/src/tui/display-width.mjs +4 -4
- package/src/tui/dist/index.mjs +63 -97
- package/src/tui/engine/agent-envelope.mjs +5 -5
- package/src/tui/engine/notification-plan.mjs +1 -1
- package/src/tui/engine/queue-helpers.mjs +3 -3
- package/src/tui/engine/render-timing.mjs +4 -5
- package/src/tui/engine/session-api-ext.mjs +3 -3
- package/src/tui/engine/tool-result-status.mjs +5 -5
- package/src/tui/engine/tool-result-text.mjs +1 -1
- package/src/tui/engine/transcript-spill.mjs +585 -0
- package/src/tui/engine/tui-steering-persist.mjs +1 -1
- package/src/tui/engine.mjs +2 -474
- package/src/tui/lib/voice-setup.mjs +1 -1
- package/src/tui/markdown/format-token.mjs +1 -1
- package/src/tui/markdown/render-ansi.mjs +1 -1
- package/src/tui/markdown/table-layout.mjs +4 -4
- package/src/tui/paste-attachments.mjs +1 -1
- package/src/tui/prompt-history-store.mjs +3 -3
- package/src/tui/statusline-ansi-bridge.mjs +2 -2
- package/src/tui/theme.mjs +1 -1
- package/src/tui/transcript-tool-failures.mjs +2 -2
- package/src/ui/ansi.mjs +0 -9
- package/src/ui/statusline-format.mjs +2 -4
- package/scripts/_bench-cwc.json +0 -20
- package/scripts/_jitter-fuzz.jsx +0 -42
- package/scripts/_jitter-fuzz2.jsx +0 -30
- package/scripts/_jitter-probe.jsx +0 -35
- package/scripts/_jp2.jsx +0 -16
- package/scripts/_smoke_wd.mjs +0 -7
- package/scripts/abort-recovery-test.mjs +0 -175
- package/scripts/agent-dispatch-abort-compose-test.mjs +0 -31
- package/scripts/agent-live-arg-guard-smoke.mjs +0 -20
- package/scripts/agent-live-path-suffix-smoke.mjs +0 -34
- package/scripts/agent-live-toolcall-args-smoke.mjs +0 -45
- package/scripts/agent-loop-policy-test.mjs +0 -37
- package/scripts/agent-model-liveness-test.mjs +0 -763
- package/scripts/agent-parallel-smoke.mjs +0 -435
- package/scripts/agent-route-batch-test.mjs +0 -40
- package/scripts/agent-tag-reuse-smoke.mjs +0 -441
- package/scripts/agent-terminal-reap-test.mjs +0 -252
- package/scripts/agent-trace-io-test.mjs +0 -133
- package/scripts/ansi-color-capability-test.mjs +0 -90
- package/scripts/anthropic-admission-retry-integration-test.mjs +0 -119
- package/scripts/anthropic-maxtokens-test.mjs +0 -119
- package/scripts/anthropic-oauth-refresh-race-test.mjs +0 -397
- package/scripts/anthropic-transport-policy-test.mjs +0 -726
- package/scripts/apply-patch-edit-smoke.mjs +0 -71
- package/scripts/arg-guard-test.mjs +0 -93
- package/scripts/async-notify-settlement-test.mjs +0 -99
- package/scripts/atomic-lock-tryonce-test.mjs +0 -125
- package/scripts/background-task-meta-smoke.mjs +0 -38
- package/scripts/bench-run.mjs +0 -508
- package/scripts/boot-smoke.mjs +0 -137
- package/scripts/build-runtime-windows.ps1 +0 -242
- package/scripts/channel-daemon-smoke.mjs +0 -1103
- package/scripts/code-graph-aggregate-cwd-test.mjs +0 -158
- package/scripts/code-graph-disk-hit-test.mjs +0 -290
- package/scripts/code-graph-dispatch-test.mjs +0 -96
- package/scripts/code-graph-root-federation-test.mjs +0 -273
- package/scripts/compact-active-turn-test.mjs +0 -68
- package/scripts/compact-file-reattach-test.mjs +0 -88
- package/scripts/compact-pressure-test.mjs +0 -788
- package/scripts/compact-prior-context-flatten-test.mjs +0 -252
- package/scripts/compact-recall-digest-test.mjs +0 -57
- package/scripts/compact-smoke.mjs +0 -1017
- package/scripts/compact-trigger-migration-smoke.mjs +0 -261
- package/scripts/compacted-placeholder-scrub-test.mjs +0 -63
- package/scripts/context-mcp-metering-test.mjs +0 -1406
- package/scripts/debounced-skills-async-save-test.mjs +0 -57
- package/scripts/deferred-tool-loading-test.mjs +0 -250
- package/scripts/desktop-session-bridge-test.mjs +0 -1013
- package/scripts/dispatch-persist-recovery-test.mjs +0 -141
- package/scripts/embedding-worker-exit-test.mjs +0 -76
- package/scripts/execution-completion-dedup-test.mjs +0 -205
- package/scripts/execution-pending-resume-kick-test.mjs +0 -151
- package/scripts/execution-resume-esc-integration-test.mjs +0 -176
- package/scripts/explore-bench-tmp.mjs +0 -36
- package/scripts/explore-bench.mjs +0 -248
- package/scripts/explore-prompt-policy-test.mjs +0 -256
- package/scripts/explore-timeout-cancel-test.mjs +0 -345
- package/scripts/find-fuzzy-hidden-test.mjs +0 -267
- package/scripts/forwarder-rebind-tail-test.mjs +0 -67
- package/scripts/freevar-smoke.mjs +0 -98
- package/scripts/gemini-provider-test.mjs +0 -1448
- package/scripts/generate-oc-icons.mjs +0 -11
- package/scripts/grok-oauth-refresh-race-test.mjs +0 -273
- package/scripts/headless-pristine-execution-test.mjs +0 -614
- package/scripts/hook-bus-test.mjs +0 -552
- package/scripts/ingest-pure-conversation-smoke.mjs +0 -175
- package/scripts/internal-comms-bench-test.mjs +0 -226
- package/scripts/internal-comms-bench.mjs +0 -853
- package/scripts/internal-comms-smoke.mjs +0 -277
- package/scripts/internal-tools-normalization-test.mjs +0 -62
- package/scripts/interrupted-turn-history-test.mjs +0 -399
- package/scripts/lead-workflow-smoke.mjs +0 -592
- package/scripts/lifecycle-api-test.mjs +0 -137
- package/scripts/live-share-test.mjs +0 -148
- package/scripts/live-worker-smoke.mjs +0 -333
- package/scripts/log-writer-guard-smoke.mjs +0 -131
- package/scripts/maintenance-default-routes-test.mjs +0 -164
- package/scripts/max-output-recovery-persist-test.mjs +0 -81
- package/scripts/max-output-recovery-test.mjs +0 -368
- package/scripts/mcp-client-normalization-test.mjs +0 -45
- package/scripts/mcp-grace-deferred-test.mjs +0 -225
- package/scripts/memory-core-input-test.mjs +0 -167
- package/scripts/memory-cycle-routing-test.mjs +0 -111
- package/scripts/memory-meta-concurrency-test.mjs +0 -20
- package/scripts/memory-pg-recovery-test.mjs +0 -59
- package/scripts/memory-rule-contract-test.mjs +0 -93
- package/scripts/model-list-sanitize-test.mjs +0 -37
- package/scripts/mouse-tracking-restore-smoke.mjs +0 -107
- package/scripts/native-edit-wire-test.mjs +0 -152
- package/scripts/notify-completion-mirror-test.mjs +0 -73
- package/scripts/openai-oauth-refresh-race-test.mjs +0 -120
- package/scripts/openai-oauth-ws-1006-retry-test.mjs +0 -954
- package/scripts/openai-ws-early-settle-test.mjs +0 -216
- package/scripts/output-style-bench.mjs +0 -292
- package/scripts/output-style-smoke.mjs +0 -145
- package/scripts/parent-abort-link-test.mjs +0 -90
- package/scripts/patch-binary-cache-test.mjs +0 -181
- package/scripts/path-suffix-test.mjs +0 -57
- package/scripts/pending-completion-drop-test.mjs +0 -239
- package/scripts/pending-messages-lock-nonblocking-test.mjs +0 -62
- package/scripts/pretool-ask-runtime-test.mjs +0 -54
- package/scripts/process-lifecycle-test.mjs +0 -461
- package/scripts/prompt-immediate-render-test.mjs +0 -89
- package/scripts/prompt-input-parity-test.mjs +0 -145
- package/scripts/provider-admission-scheduler-test.mjs +0 -681
- package/scripts/provider-contract-test.mjs +0 -632
- package/scripts/provider-stream-stall-test.mjs +0 -276
- package/scripts/provider-toolcall-test.mjs +0 -3063
- package/scripts/reactive-compact-persist-smoke.mjs +0 -203
- package/scripts/recall-bench.mjs +0 -359
- package/scripts/resource-admission-test.mjs +0 -792
- package/scripts/result-classification-test.mjs +0 -75
- package/scripts/rg-runner-test.mjs +0 -240
- package/scripts/routing-corpus-test.mjs +0 -349
- package/scripts/sanitize-tool-pairs-test.mjs +0 -260
- package/scripts/session-bench-cache-break-test.mjs +0 -102
- package/scripts/session-bench.mjs +0 -1708
- package/scripts/session-context-bench.mjs +0 -344
- package/scripts/session-heartbeat-lifecycle-test.mjs +0 -68
- package/scripts/session-ingest-compaction-smoke.mjs +0 -279
- package/scripts/session-ingest-smoke.mjs +0 -177
- package/scripts/session-orphan-sweep-test.mjs +0 -109
- package/scripts/set-effort-config-test.mjs +0 -41
- package/scripts/shell-failure-diagnostics-test.mjs +0 -280
- package/scripts/shell-hardening-test.mjs +0 -209
- package/scripts/shell-jobs-windows-hide-test.mjs +0 -164
- package/scripts/ship-mode-test.mjs +0 -98
- package/scripts/smoke-loop-failure-summary-test.mjs +0 -38
- package/scripts/smoke-loop-failure-summary.mjs +0 -16
- package/scripts/smoke-loop-report.mjs +0 -221
- package/scripts/smoke-loop.mjs +0 -202
- package/scripts/smoke-runtime-negative.ps1 +0 -106
- package/scripts/statusline-quota-hysteresis-test.mjs +0 -62
- package/scripts/steering-drain-buckets-test.mjs +0 -467
- package/scripts/steering-fold-provenance-test.mjs +0 -71
- package/scripts/streaming-tail-window-test.mjs +0 -175
- package/scripts/submit-commandbusy-race-test.mjs +0 -257
- package/scripts/task-bench.mjs +0 -205
- package/scripts/terminal-bench-isolation-guards-test.mjs +0 -102
- package/scripts/termio-input-smoke.mjs +0 -199
- package/scripts/tool-result-hook-test.mjs +0 -48
- package/scripts/tool-smoke.mjs +0 -2453
- package/scripts/tool-tui-presentation-test.mjs +0 -286
- package/scripts/toolcall-args-test.mjs +0 -239
- package/scripts/tui-ambiguous-width-test.mjs +0 -113
- package/scripts/tui-background-failure-smoke.mjs +0 -73
- package/scripts/tui-perf-run.ps1 +0 -26
- package/scripts/tui-render-smoke.mjs +0 -90
- package/scripts/tui-runtime-load-bench-entry.jsx +0 -608
- package/scripts/tui-runtime-load-bench.mjs +0 -50
- package/scripts/tui-store-frame-batch-test.mjs +0 -99
- package/scripts/tui-transcript-jitter-harness-entry.jsx +0 -383
- package/scripts/tui-transcript-perf-test.mjs +0 -934
- package/scripts/usage-metrics-epoch-smoke.mjs +0 -114
- package/scripts/verify-release-assets-test.mjs +0 -281
- package/scripts/web-fetch-routing-test.mjs +0 -158
- package/scripts/webhook-smoke.mjs +0 -201
- package/scripts/windows-hide-spawn-options-test.mjs +0 -19
- package/scripts/worker-notify-rejection-test.mjs +0 -51
- package/scripts/write-backpressure-test.mjs +0 -147
|
@@ -26,6 +26,9 @@ import {
|
|
|
26
26
|
MEASURED_TOOL_USAGE,
|
|
27
27
|
READONLY_TOOL_NAMES,
|
|
28
28
|
} from './tool-catalog-data.mjs';
|
|
29
|
+
import { toolKind, measuredToolUsage, parseToolSelection, parseToolSearchQuerySelection, measuredToolRank, sortedCatalogByMeasuredUsage, activeToolForSurface, deferredProviderMode, nativeProviderFamily } from './tool-catalog-schema.mjs';
|
|
30
|
+
export { toolKind, toolSchemaBucket, estimateToolSchemaBreakdown, measuredToolUsage, parseToolSelection, parseToolSearchQuerySelection, sortedCatalogByMeasuredUsage } from './tool-catalog-schema.mjs';
|
|
31
|
+
export { resolveProviderRequestTools, snapshotProviderRequestTools } from './provider-request-snapshot.mjs';
|
|
29
32
|
export {
|
|
30
33
|
DEFERRED_DEFAULT_FULL_TOOLS,
|
|
31
34
|
DEFERRED_DEFAULT_LEAD_TOOLS,
|
|
@@ -33,486 +36,6 @@ export {
|
|
|
33
36
|
MEASURED_TOOL_USAGE,
|
|
34
37
|
} from './tool-catalog-data.mjs';
|
|
35
38
|
|
|
36
|
-
const toolSchemaBreakdownMemo = new WeakMap();
|
|
37
|
-
|
|
38
|
-
function sameToolSchemaEntries(cached, tools) {
|
|
39
|
-
if (!cached || cached.entries.length !== tools.length) return false;
|
|
40
|
-
const nativePrefixCount = providerNativeToolPrefixCount(tools);
|
|
41
|
-
for (let index = 0; index < tools.length; index += 1) {
|
|
42
|
-
const entry = cached.entries[index];
|
|
43
|
-
const tool = tools[index];
|
|
44
|
-
if (entry.tool !== tool
|
|
45
|
-
|| entry.name !== tool?.name
|
|
46
|
-
|| entry.description !== tool?.description
|
|
47
|
-
|| entry.inputSchema !== tool?.inputSchema
|
|
48
|
-
|| entry.input_schema !== tool?.input_schema
|
|
49
|
-
|| entry.parameters !== tool?.parameters
|
|
50
|
-
|| entry.schema !== tool?.schema
|
|
51
|
-
|| entry.deferLoading !== tool?.deferLoading
|
|
52
|
-
|| entry.defer_loading !== tool?.defer_loading
|
|
53
|
-
|| entry.annotationsMixdogKind !== tool?.annotations?.mixdogKind
|
|
54
|
-
|| entry.annotationsAgentHidden !== tool?.annotations?.agentHidden
|
|
55
|
-
|| entry.native !== (index < nativePrefixCount)
|
|
56
|
-
|| entry.wireSignature !== toolSchemaSignature(toolMeteringList(tool, index < nativePrefixCount))) return false;
|
|
57
|
-
}
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function toolMeteringList(tool, native) {
|
|
62
|
-
return native ? finalizeProviderRequestTools([tool], 1) : [tool];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function toolSchemaEntry(tool, native = false) {
|
|
66
|
-
return {
|
|
67
|
-
tool,
|
|
68
|
-
name: tool?.name,
|
|
69
|
-
description: tool?.description,
|
|
70
|
-
inputSchema: tool?.inputSchema,
|
|
71
|
-
input_schema: tool?.input_schema,
|
|
72
|
-
parameters: tool?.parameters,
|
|
73
|
-
schema: tool?.schema,
|
|
74
|
-
deferLoading: tool?.deferLoading,
|
|
75
|
-
defer_loading: tool?.defer_loading,
|
|
76
|
-
annotationsMixdogKind: tool?.annotations?.mixdogKind,
|
|
77
|
-
annotationsAgentHidden: tool?.annotations?.agentHidden,
|
|
78
|
-
native,
|
|
79
|
-
wireSignature: toolSchemaSignature(toolMeteringList(tool, native)),
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
export function toolKind(tool) {
|
|
83
|
-
const name = clean(tool?.name);
|
|
84
|
-
if (name.startsWith('mcp__')) return 'mcp';
|
|
85
|
-
if (name.startsWith('skill:') || tool?.annotations?.mixdogKind === 'skill') return 'skill';
|
|
86
|
-
if (name === 'Skill' || name.startsWith('skill_') || name === 'skills_list' || name === 'skill_view') return 'skill';
|
|
87
|
-
if (tool?.annotations?.agentHidden) return 'control';
|
|
88
|
-
if (['apply_patch', 'shell'].includes(name)) return 'mutation';
|
|
89
|
-
return 'tool';
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export function toolSchemaBucket(tool) {
|
|
93
|
-
const name = clean(tool?.name);
|
|
94
|
-
const kind = toolKind(tool);
|
|
95
|
-
if (kind === 'mcp') return 'mcp';
|
|
96
|
-
if (kind === 'skill') return 'skills';
|
|
97
|
-
if (name === 'memory' || name === 'recall' || name.includes('memory')) return 'memory';
|
|
98
|
-
if (name === 'search' || name === 'web_fetch') return 'web';
|
|
99
|
-
if (['read', 'grep', 'find', 'glob', 'list', 'code_graph', 'explore'].includes(name)) return 'code';
|
|
100
|
-
if (['shell', 'apply_patch'].includes(name)) return 'mutation';
|
|
101
|
-
if (name === 'agent' || name === 'delegate') return 'agents';
|
|
102
|
-
if (name === 'session_manage') return 'session';
|
|
103
|
-
if (name.includes('channel') || name.includes('discord') || name.includes('webhook')) return 'channels';
|
|
104
|
-
if (name.includes('provider') || name === 'load_tool' || name === 'tool_search' || name === 'cwd') return 'setup';
|
|
105
|
-
if (kind === 'control') return 'control';
|
|
106
|
-
return 'other';
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export function estimateToolSchemaBreakdown(tools) {
|
|
110
|
-
if (Array.isArray(tools)) {
|
|
111
|
-
const cached = toolSchemaBreakdownMemo.get(tools);
|
|
112
|
-
if (sameToolSchemaEntries(cached, tools)) return cached.value;
|
|
113
|
-
}
|
|
114
|
-
const out = {};
|
|
115
|
-
const list = Array.isArray(tools) ? tools : [];
|
|
116
|
-
const nativePrefixCount = providerNativeToolPrefixCount(list);
|
|
117
|
-
for (let index = 0; index < list.length; index += 1) {
|
|
118
|
-
const tool = list[index];
|
|
119
|
-
const bucket = toolSchemaBucket(tool);
|
|
120
|
-
const row = out[bucket] || { count: 0, tokens: 0 };
|
|
121
|
-
row.count += 1;
|
|
122
|
-
row.tokens += estimateToolSchemaTokens(toolMeteringList(tool, index < nativePrefixCount));
|
|
123
|
-
out[bucket] = row;
|
|
124
|
-
}
|
|
125
|
-
if (Array.isArray(tools)) {
|
|
126
|
-
toolSchemaBreakdownMemo.set(tools, {
|
|
127
|
-
entries: tools.map((tool, index) => toolSchemaEntry(tool, index < nativePrefixCount)),
|
|
128
|
-
value: out,
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
return out;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export function measuredToolUsage(name) {
|
|
135
|
-
return MEASURED_TOOL_USAGE[clean(name)] || 0;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export function parseToolSelection(value) {
|
|
139
|
-
if (Array.isArray(value)) return value.map(clean).filter(Boolean);
|
|
140
|
-
if (value && typeof value !== 'string' && typeof value[Symbol.iterator] === 'function') {
|
|
141
|
-
return [...value].map(clean).filter(Boolean);
|
|
142
|
-
}
|
|
143
|
-
return String(value || '').replace(/^select\s*:/i, '')
|
|
144
|
-
.split(/[,\s]+/)
|
|
145
|
-
.map(clean)
|
|
146
|
-
.filter(Boolean);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export function parseToolSearchQuerySelection(query) {
|
|
150
|
-
const match = clean(query).match(/^select\s*:\s*(.+)$/i);
|
|
151
|
-
return match ? parseToolSelection(match[1]) : [];
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function measuredToolRank(name) {
|
|
155
|
-
const index = MEASURED_TOOL_ORDER.indexOf(clean(name));
|
|
156
|
-
return index === -1 ? Number.MAX_SAFE_INTEGER : index;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
export function sortedCatalogByMeasuredUsage(catalog) {
|
|
160
|
-
return (catalog || [])
|
|
161
|
-
.map((tool, index) => ({ tool, index }))
|
|
162
|
-
.sort((a, b) => {
|
|
163
|
-
const au = measuredToolUsage(a.tool?.name);
|
|
164
|
-
const bu = measuredToolUsage(b.tool?.name);
|
|
165
|
-
if (bu !== au) return bu - au;
|
|
166
|
-
const ar = measuredToolRank(a.tool?.name);
|
|
167
|
-
const br = measuredToolRank(b.tool?.name);
|
|
168
|
-
if (ar !== br) return ar - br;
|
|
169
|
-
return a.index - b.index;
|
|
170
|
-
})
|
|
171
|
-
.map((entry) => entry.tool);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
function activeToolForSurface(tool) {
|
|
175
|
-
if (!tool || typeof tool !== 'object') return tool;
|
|
176
|
-
return JSON.parse(JSON.stringify(tool));
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
function deferredProviderMode(provider) {
|
|
180
|
-
const p = clean(provider).toLowerCase();
|
|
181
|
-
if (p === 'gemini') return 'manifest';
|
|
182
|
-
if (p === 'anthropic' || p === 'anthropic-oauth'
|
|
183
|
-
|| p === 'openai' || p === 'openai-oauth') {
|
|
184
|
-
return 'native';
|
|
185
|
-
}
|
|
186
|
-
// xAI/Grok and every other OpenAI-compatible backend have no native
|
|
187
|
-
// tool_search/tool_search_output contract. Give them one complete canonical
|
|
188
|
-
// function array instead of a load-driven array whose bytes churn.
|
|
189
|
-
return 'canonical';
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
function nativeProviderFamily(provider) {
|
|
193
|
-
const p = clean(provider).toLowerCase();
|
|
194
|
-
if (p === 'openai' || p === 'openai-oauth') return 'openai';
|
|
195
|
-
if (p === 'anthropic' || p === 'anthropic-oauth') return 'anthropic';
|
|
196
|
-
return '';
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
const ANTHROPIC_NATIVE_PROVIDERS = new Set(['anthropic', 'anthropic-oauth']);
|
|
200
|
-
|
|
201
|
-
// Pure projection of the tool definitions that the next provider request will
|
|
202
|
-
// serialize. Anthropic's native deferred surface sends the base active tools
|
|
203
|
-
// plus only definitions that have actually been discovered through the
|
|
204
|
-
// session/native tool-search history. Every other provider already receives
|
|
205
|
-
// its canonical/native surface in `tools`, so preserve that array verbatim.
|
|
206
|
-
export function resolveProviderRequestTools({
|
|
207
|
-
provider,
|
|
208
|
-
tools,
|
|
209
|
-
messages,
|
|
210
|
-
session,
|
|
211
|
-
} = {}) {
|
|
212
|
-
const activeTools = Array.isArray(tools) ? tools : [];
|
|
213
|
-
const normalizedProvider = clean(provider || session?.provider).toLowerCase();
|
|
214
|
-
if (!ANTHROPIC_NATIVE_PROVIDERS.has(normalizedProvider)
|
|
215
|
-
|| session?.deferredNativeTools !== true
|
|
216
|
-
|| activeTools.length === 0) {
|
|
217
|
-
return activeTools;
|
|
218
|
-
}
|
|
219
|
-
const discovered = new Set(
|
|
220
|
-
parseToolSelection(session?.deferredDiscoveredTools),
|
|
221
|
-
);
|
|
222
|
-
for (const message of Array.isArray(messages) ? messages : []) {
|
|
223
|
-
const native = message?.nativeToolSearch;
|
|
224
|
-
const source = clean(native?.provider).toLowerCase();
|
|
225
|
-
if (source && source !== normalizedProvider
|
|
226
|
-
&& !(ANTHROPIC_NATIVE_PROVIDERS.has(source)
|
|
227
|
-
&& ANTHROPIC_NATIVE_PROVIDERS.has(normalizedProvider))) continue;
|
|
228
|
-
for (const name of parseToolSelection(native?.toolReferences)) discovered.add(name);
|
|
229
|
-
}
|
|
230
|
-
if (discovered.size === 0) return activeTools;
|
|
231
|
-
const activeNames = new Set(activeTools.map((tool) => clean(tool?.name)).filter(Boolean));
|
|
232
|
-
const catalog = Array.isArray(session?.deferredToolCatalog) ? session.deferredToolCatalog : [];
|
|
233
|
-
const deferredTools = catalog
|
|
234
|
-
.filter((tool) => {
|
|
235
|
-
const name = clean(tool?.name);
|
|
236
|
-
return name && discovered.has(name) && !activeNames.has(name);
|
|
237
|
-
})
|
|
238
|
-
.map((tool) => ({ ...tool, deferLoading: true }));
|
|
239
|
-
return deferredTools.length ? [...activeTools, ...deferredTools] : activeTools;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
const OMIT_REQUEST_TOOL_VALUE = Symbol('omit-request-tool-value');
|
|
243
|
-
const MAX_PROVIDER_SNAPSHOT_ARRAY_LENGTH = 1_000_000;
|
|
244
|
-
|
|
245
|
-
function defineEnumerableDataProperty(target, key, value) {
|
|
246
|
-
Object.defineProperty(target, key, {
|
|
247
|
-
value,
|
|
248
|
-
enumerable: true,
|
|
249
|
-
configurable: false,
|
|
250
|
-
writable: false,
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function boxedJsonPrimitive(value) {
|
|
255
|
-
try { return { matched: true, value: Number.prototype.valueOf.call(value) }; } catch {}
|
|
256
|
-
try { return { matched: true, value: String.prototype.valueOf.call(value) }; } catch {}
|
|
257
|
-
try { return { matched: true, value: Boolean.prototype.valueOf.call(value) }; } catch {}
|
|
258
|
-
try { return { matched: true, value: BigInt.prototype.valueOf.call(value) }; } catch {}
|
|
259
|
-
return { matched: false, value: null };
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
function providerSnapshotLengthPrimitive(value) {
|
|
263
|
-
if ((typeof value !== 'object' || value === null) && typeof value !== 'function') return value;
|
|
264
|
-
const exotic = value[Symbol.toPrimitive];
|
|
265
|
-
if (exotic !== undefined && exotic !== null) {
|
|
266
|
-
if (typeof exotic !== 'function') throw new TypeError('invalid length primitive');
|
|
267
|
-
const primitive = exotic.call(value, 'number');
|
|
268
|
-
if ((typeof primitive === 'object' && primitive !== null) || typeof primitive === 'function') {
|
|
269
|
-
throw new TypeError('invalid length primitive');
|
|
270
|
-
}
|
|
271
|
-
return primitive;
|
|
272
|
-
}
|
|
273
|
-
for (const methodName of ['valueOf', 'toString']) {
|
|
274
|
-
const method = value[methodName];
|
|
275
|
-
if (typeof method !== 'function') continue;
|
|
276
|
-
const primitive = method.call(value);
|
|
277
|
-
if ((typeof primitive !== 'object' || primitive === null) && typeof primitive !== 'function') {
|
|
278
|
-
return primitive;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
throw new TypeError('invalid length primitive');
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
function providerSnapshotArrayLength(rawLength) {
|
|
285
|
-
let primitive;
|
|
286
|
-
let numeric;
|
|
287
|
-
try {
|
|
288
|
-
primitive = providerSnapshotLengthPrimitive(rawLength);
|
|
289
|
-
if (typeof primitive === 'bigint' || typeof primitive === 'symbol') {
|
|
290
|
-
throw new TypeError('invalid length primitive');
|
|
291
|
-
}
|
|
292
|
-
numeric = Number(primitive);
|
|
293
|
-
} catch {
|
|
294
|
-
throw new TypeError('provider tool snapshot: invalid array length');
|
|
295
|
-
}
|
|
296
|
-
if (Number.isNaN(numeric) || numeric <= 0) return 0;
|
|
297
|
-
if (!Number.isFinite(numeric)) {
|
|
298
|
-
throw new RangeError(
|
|
299
|
-
`provider tool snapshot: array length exceeds safe limit ${MAX_PROVIDER_SNAPSHOT_ARRAY_LENGTH}`,
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
const effectiveLength = Math.floor(numeric);
|
|
303
|
-
if (effectiveLength > MAX_PROVIDER_SNAPSHOT_ARRAY_LENGTH) {
|
|
304
|
-
throw new RangeError(
|
|
305
|
-
`provider tool snapshot: array length exceeds safe limit ${MAX_PROVIDER_SNAPSHOT_ARRAY_LENGTH}`,
|
|
306
|
-
);
|
|
307
|
-
}
|
|
308
|
-
return effectiveLength;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
function normalizeRequestToolJson(value, state, {
|
|
312
|
-
arrayEntry = false,
|
|
313
|
-
key = '',
|
|
314
|
-
applyToJSON = true,
|
|
315
|
-
seededProperties = null,
|
|
316
|
-
} = {}) {
|
|
317
|
-
if (value === null || typeof value === 'string' || typeof value === 'boolean') return value;
|
|
318
|
-
if (typeof value === 'number') return Number.isFinite(value) ? value : null;
|
|
319
|
-
if (typeof value === 'bigint') {
|
|
320
|
-
throw new TypeError('provider tool snapshot: BigInt is not JSON-serializable');
|
|
321
|
-
}
|
|
322
|
-
if (value === undefined || typeof value === 'function' || typeof value === 'symbol') {
|
|
323
|
-
return arrayEntry ? null : OMIT_REQUEST_TOOL_VALUE;
|
|
324
|
-
}
|
|
325
|
-
if (typeof value !== 'object') {
|
|
326
|
-
throw new TypeError(`provider tool snapshot: unsupported JSON value type ${typeof value}`);
|
|
327
|
-
}
|
|
328
|
-
if (state.active.has(value)) {
|
|
329
|
-
throw new TypeError('provider tool snapshot: cyclic value is not JSON-serializable');
|
|
330
|
-
}
|
|
331
|
-
if (state.memo.has(value)) return state.memo.get(value);
|
|
332
|
-
|
|
333
|
-
let capturedProperties = seededProperties;
|
|
334
|
-
if (applyToJSON) {
|
|
335
|
-
// JSON reads `toJSON` once before serializing an object. Preserve that
|
|
336
|
-
// single observation for an own-enumerable non-function (and for a
|
|
337
|
-
// callable that returns `this`) so property traversal cannot invoke a
|
|
338
|
-
// stateful accessor a second time.
|
|
339
|
-
const toJSONDescriptor = Object.getOwnPropertyDescriptor(value, 'toJSON');
|
|
340
|
-
const toJSON = value.toJSON;
|
|
341
|
-
if (typeof toJSON === 'function') {
|
|
342
|
-
// Keep the source guarded through both hook execution and replacement
|
|
343
|
-
// normalization. A hook returning itself, or any replacement graph that
|
|
344
|
-
// points back to its source, is a JSON cycle rather than another hook
|
|
345
|
-
// invocation.
|
|
346
|
-
state.active.add(value);
|
|
347
|
-
try {
|
|
348
|
-
const replacement = toJSON.call(value, key);
|
|
349
|
-
const normalized = normalizeRequestToolJson(replacement, state, {
|
|
350
|
-
arrayEntry,
|
|
351
|
-
key,
|
|
352
|
-
applyToJSON: false,
|
|
353
|
-
seededProperties: null,
|
|
354
|
-
});
|
|
355
|
-
state.memo.set(value, normalized);
|
|
356
|
-
return normalized;
|
|
357
|
-
} finally {
|
|
358
|
-
state.active.delete(value);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
if (toJSONDescriptor?.enumerable) {
|
|
362
|
-
capturedProperties = { ...(seededProperties || {}), toJSON };
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
const boxed = boxedJsonPrimitive(value);
|
|
366
|
-
if (boxed.matched) {
|
|
367
|
-
return normalizeRequestToolJson(boxed.value, state, { arrayEntry, key });
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
const isArray = Array.isArray(value);
|
|
371
|
-
const normalized = isArray ? [] : {};
|
|
372
|
-
state.active.add(value);
|
|
373
|
-
try {
|
|
374
|
-
if (isArray) {
|
|
375
|
-
// JSON.stringify captures array length once. Accessors may mutate the
|
|
376
|
-
// source array, but they cannot extend or shorten this iteration bound.
|
|
377
|
-
const rawLength = value.length;
|
|
378
|
-
const length = providerSnapshotArrayLength(rawLength);
|
|
379
|
-
for (let index = 0; index < length; index += 1) {
|
|
380
|
-
const entry = value[index];
|
|
381
|
-
normalized.push(normalizeRequestToolJson(entry, state, {
|
|
382
|
-
arrayEntry: true,
|
|
383
|
-
key: String(index),
|
|
384
|
-
}));
|
|
385
|
-
}
|
|
386
|
-
} else {
|
|
387
|
-
// JSON-compatible request schemas are own-enumerable data. Normalize class
|
|
388
|
-
// instances/accessors to a plain record, ignore inherited mutable fields,
|
|
389
|
-
// and define keys explicitly so an own "__proto__" remains ordinary data.
|
|
390
|
-
for (const key of Reflect.ownKeys(value)) {
|
|
391
|
-
if (typeof key !== 'string') continue;
|
|
392
|
-
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
393
|
-
if (!descriptor?.enumerable) continue;
|
|
394
|
-
// Deferred catalog selection captures `name` once before touching the
|
|
395
|
-
// candidate schema. Seed that captured value here so a stateful/throwing
|
|
396
|
-
// getter is never observed a second time during JSON normalization.
|
|
397
|
-
const entry = capturedProperties && Object.hasOwn(capturedProperties, key)
|
|
398
|
-
? capturedProperties[key]
|
|
399
|
-
: value[key];
|
|
400
|
-
const child = normalizeRequestToolJson(entry, state, { key });
|
|
401
|
-
if (child !== OMIT_REQUEST_TOOL_VALUE) defineEnumerableDataProperty(normalized, key, child);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
} finally {
|
|
405
|
-
state.active.delete(value);
|
|
406
|
-
}
|
|
407
|
-
Object.freeze(normalized);
|
|
408
|
-
state.memo.set(value, normalized);
|
|
409
|
-
return normalized;
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// Establish one immutable request-attempt snapshot. Nested schema records are
|
|
413
|
-
// cloned before freezing, so a catalog refresh or in-place schema mutation
|
|
414
|
-
// after this boundary cannot change either provider bytes or their signature.
|
|
415
|
-
export function snapshotProviderRequestTools(options = {}) {
|
|
416
|
-
const {
|
|
417
|
-
provider,
|
|
418
|
-
tools,
|
|
419
|
-
nativeTools,
|
|
420
|
-
messages,
|
|
421
|
-
session,
|
|
422
|
-
} = options;
|
|
423
|
-
const activeTools = Array.isArray(tools) ? tools : [];
|
|
424
|
-
const state = { active: new WeakSet(), memo: new WeakMap() };
|
|
425
|
-
const snapshots = [];
|
|
426
|
-
const names = new Set();
|
|
427
|
-
const activeCandidateRefs = new WeakSet();
|
|
428
|
-
// Anthropic native definitions are already provider-wire objects. Preserve
|
|
429
|
-
// their prior prepend order and duplicate behavior, but freeze the exact
|
|
430
|
-
// bytes into the same request snapshot used for accounting and retries.
|
|
431
|
-
if (ANTHROPIC_NATIVE_PROVIDERS.has(clean(provider || session?.provider).toLowerCase())) {
|
|
432
|
-
for (const nativeTool of Array.isArray(nativeTools) ? nativeTools : []) {
|
|
433
|
-
if (!nativeTool || typeof nativeTool !== 'object') continue;
|
|
434
|
-
const normalized = normalizeRequestToolJson(nativeTool, state);
|
|
435
|
-
if (normalized && typeof normalized === 'object' && !Array.isArray(normalized)) {
|
|
436
|
-
snapshots.push(normalized);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
const nativePrefixCount = snapshots.length;
|
|
441
|
-
const finish = () => finalizeProviderRequestTools(snapshots, nativePrefixCount);
|
|
442
|
-
const appendSnapshot = (candidate, selectedName = null, deferred = false) => {
|
|
443
|
-
const normalized = normalizeRequestToolJson(candidate, state, {
|
|
444
|
-
seededProperties: selectedName === null ? null : { name: selectedName },
|
|
445
|
-
});
|
|
446
|
-
if (deferred && (
|
|
447
|
-
!normalized
|
|
448
|
-
|| typeof normalized !== 'object'
|
|
449
|
-
|| Array.isArray(normalized)
|
|
450
|
-
|| typeof normalized.name !== 'string'
|
|
451
|
-
|| !clean(normalized.name)
|
|
452
|
-
|| normalized.name !== selectedName
|
|
453
|
-
)) {
|
|
454
|
-
throw new TypeError(`provider tool snapshot: selected tool identity mismatch for ${JSON.stringify(selectedName)}`);
|
|
455
|
-
}
|
|
456
|
-
if (!normalized || typeof normalized !== 'object' || Array.isArray(normalized)) return;
|
|
457
|
-
const name = clean(normalized.name);
|
|
458
|
-
if (!name || names.has(name)) return;
|
|
459
|
-
names.add(name);
|
|
460
|
-
if (!deferred) {
|
|
461
|
-
snapshots.push(normalized);
|
|
462
|
-
return;
|
|
463
|
-
}
|
|
464
|
-
const deferredSnapshot = {};
|
|
465
|
-
for (const key of Object.keys(normalized)) {
|
|
466
|
-
if (key === 'deferLoading' || key === 'defer_loading') continue;
|
|
467
|
-
defineEnumerableDataProperty(deferredSnapshot, key, normalized[key]);
|
|
468
|
-
}
|
|
469
|
-
defineEnumerableDataProperty(deferredSnapshot, 'deferLoading', true);
|
|
470
|
-
snapshots.push(Object.freeze(deferredSnapshot));
|
|
471
|
-
};
|
|
472
|
-
|
|
473
|
-
// Active candidates are provider-visible by definition: normalize each once,
|
|
474
|
-
// then perform all validation/dedupe from the plain snapshot only.
|
|
475
|
-
for (const tool of activeTools) {
|
|
476
|
-
if (tool && typeof tool === 'object') activeCandidateRefs.add(tool);
|
|
477
|
-
appendSnapshot(tool);
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
const normalizedProvider = clean(provider || session?.provider).toLowerCase();
|
|
481
|
-
if (!ANTHROPIC_NATIVE_PROVIDERS.has(normalizedProvider)
|
|
482
|
-
|| session?.deferredNativeTools !== true
|
|
483
|
-
// Native definitions preserve their historical prepend behavior, but they
|
|
484
|
-
// do not make an otherwise all-deferred catalog eligible for expansion.
|
|
485
|
-
|| names.size === 0) {
|
|
486
|
-
return finish();
|
|
487
|
-
}
|
|
488
|
-
const discovered = new Set(parseToolSelection(session?.deferredDiscoveredTools));
|
|
489
|
-
for (const message of Array.isArray(messages) ? messages : []) {
|
|
490
|
-
const native = message?.nativeToolSearch;
|
|
491
|
-
const source = clean(native?.provider).toLowerCase();
|
|
492
|
-
if (source && source !== normalizedProvider
|
|
493
|
-
&& !(ANTHROPIC_NATIVE_PROVIDERS.has(source)
|
|
494
|
-
&& ANTHROPIC_NATIVE_PROVIDERS.has(normalizedProvider))) continue;
|
|
495
|
-
for (const name of parseToolSelection(native?.toolReferences)) discovered.add(name);
|
|
496
|
-
}
|
|
497
|
-
if (discovered.size === 0) return finish();
|
|
498
|
-
|
|
499
|
-
// Catalog arrays have no separate key map, so `name` is their explicit
|
|
500
|
-
// selection key contract: capture it once, skip undiscovered/duplicate
|
|
501
|
-
// entries without touching schemas, and seed selected normalization with the
|
|
502
|
-
// captured value to avoid a second getter evaluation.
|
|
503
|
-
const seenCatalogRefs = new WeakSet();
|
|
504
|
-
for (const tool of Array.isArray(session?.deferredToolCatalog) ? session.deferredToolCatalog : []) {
|
|
505
|
-
if (tool && typeof tool === 'object') {
|
|
506
|
-
if (activeCandidateRefs.has(tool) || seenCatalogRefs.has(tool)) continue;
|
|
507
|
-
seenCatalogRefs.add(tool);
|
|
508
|
-
}
|
|
509
|
-
const capturedName = tool?.name;
|
|
510
|
-
const selectionName = typeof capturedName === 'string' ? clean(capturedName) : '';
|
|
511
|
-
if (!selectionName || !discovered.has(selectionName) || names.has(selectionName)) continue;
|
|
512
|
-
appendSnapshot(tool, capturedName, true);
|
|
513
|
-
}
|
|
514
|
-
return finish();
|
|
515
|
-
}
|
|
516
39
|
|
|
517
40
|
export function filterDisallowedTools(tools, disallowed = []) {
|
|
518
41
|
if (!Array.isArray(disallowed) || disallowed.length === 0) return tools;
|
|
@@ -663,7 +186,7 @@ function setDeferredToolState(session, names) {
|
|
|
663
186
|
return selected;
|
|
664
187
|
}
|
|
665
188
|
|
|
666
|
-
|
|
189
|
+
function deferredPoolToolNames(session) {
|
|
667
190
|
if (!session || session.deferredProviderMode === 'full'
|
|
668
191
|
|| session.deferredProviderMode === 'manifest'
|
|
669
192
|
|| session.deferredProviderMode === 'canonical') return [];
|
|
@@ -876,7 +399,7 @@ export function refreshInitialDeferredMcpSurface(session, liveMcpTools) {
|
|
|
876
399
|
}
|
|
877
400
|
|
|
878
401
|
/**
|
|
879
|
-
* Turn-boundary reconciliation (
|
|
402
|
+
* Turn-boundary reconciliation (full snapshot + delta).
|
|
880
403
|
* Merge currently-connected MCP tools into session.deferredLateToolCatalog (a
|
|
881
404
|
* SEPARATE pool from the boot-frozen session.deferredToolCatalog) so tools from
|
|
882
405
|
* servers that finished their handshake AFTER this session was created become
|
|
@@ -1129,7 +652,7 @@ export function selectDeferredTools(session, names, mode, options = {}) {
|
|
|
1129
652
|
// query "select:a,b" → legacy query-side loader
|
|
1130
653
|
// A free-text `query` is NOT a search anymore: it yields no names, and the
|
|
1131
654
|
// caller is steered back to names[].
|
|
1132
|
-
|
|
655
|
+
function parseLoadToolNames(args = {}) {
|
|
1133
656
|
const fromNames = parseToolSelection(args.names);
|
|
1134
657
|
if (fromNames.length) return fromNames;
|
|
1135
658
|
const fromSelect = parseToolSelection(args.select);
|
|
@@ -97,7 +97,7 @@ export const SESSION_MANAGE_TOOL = {
|
|
|
97
97
|
};
|
|
98
98
|
|
|
99
99
|
export const LEAD_DISALLOWED_TOOLS = Object.freeze([]);
|
|
100
|
-
|
|
100
|
+
const AGENT_HIDDEN_WRAPPER_TOOLS = new Set([]);
|
|
101
101
|
|
|
102
102
|
export function applyStandaloneToolDefaults(tool) {
|
|
103
103
|
if (!tool || !AGENT_HIDDEN_WRAPPER_TOOLS.has(tool.name)) return tool;
|
|
@@ -44,7 +44,7 @@ export function formatAgentWatchdogSummary(policy, snapshot = null) {
|
|
|
44
44
|
return parts.length ? `armed ${parts.join(' ')}` : null;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
function resolveSilentForSeconds(now, snapshot, runtime) {
|
|
48
48
|
const last = Math.max(
|
|
49
49
|
snapshot?.lastProgressAt || 0,
|
|
50
50
|
runtime?.lastProgressAt || 0,
|
|
@@ -75,7 +75,7 @@ export function presetKey(preset) {
|
|
|
75
75
|
return clean(preset?.id || preset?.name);
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
function bridgeRouteForStatusline(preset = {}) {
|
|
79
79
|
const provider = clean(preset.provider);
|
|
80
80
|
const model = clean(preset.model);
|
|
81
81
|
if (!provider || !model) return null;
|
|
@@ -191,7 +191,7 @@ export function compactIso(value) {
|
|
|
191
191
|
return text.replace('T', ' ').replace(/\.\d+Z$/, 'Z');
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
|
|
194
|
+
function formatElapsedMs(ms) {
|
|
195
195
|
const n = Number(ms);
|
|
196
196
|
if (!Number.isFinite(n) || n < 0) return '';
|
|
197
197
|
const totalSec = Math.floor(n / 1000);
|
|
@@ -162,7 +162,7 @@ function listEntryDirs(dir) {
|
|
|
162
162
|
|
|
163
163
|
// Single-channel read: resolves `cfg.channel` into the flat shape the
|
|
164
164
|
// settings/TUI layer consumes.
|
|
165
|
-
|
|
165
|
+
function getChannel(config = {}) {
|
|
166
166
|
const cfg = normalizeChannelsConfig(config);
|
|
167
167
|
const backend = cfg.backend === 'telegram' ? 'telegram' : 'discord';
|
|
168
168
|
const entry = resolveChannelEntry(cfg);
|
|
@@ -325,7 +325,7 @@ const DAY_TOKEN_TO_DOW = {
|
|
|
325
325
|
// expression: daily -> '*', weekday -> '1-5', weekend -> '0,6', explicit day
|
|
326
326
|
// lists ("mon,wed,fri" | "1,3,5") -> comma-joined numbers. Throws on an
|
|
327
327
|
// unmappable token so bad combos surface instead of silently mis-scheduling.
|
|
328
|
-
|
|
328
|
+
function foldDaysIntoCron(cron, days) {
|
|
329
329
|
const parts = String(cron).trim().split(/\s+/);
|
|
330
330
|
const dowIndex = parts.length - 1;
|
|
331
331
|
const raw = String(days || '').trim().toLowerCase();
|
|
@@ -446,7 +446,7 @@ export async function setScheduleEnabled(name, enabled) {
|
|
|
446
446
|
// (webhooks-db.mjs) — the single source of truth. Legacy per-endpoint
|
|
447
447
|
// WEBHOOK.md + secret folders are imported once at boot and deleted by the
|
|
448
448
|
// store's migration hook.
|
|
449
|
-
|
|
449
|
+
async function listWebhooks() {
|
|
450
450
|
const endpoints = await dbListEndpoints();
|
|
451
451
|
return endpoints.map((ep) => ({
|
|
452
452
|
name: ep.name,
|
|
@@ -556,7 +556,7 @@ export async function channelSetup(config = null) {
|
|
|
556
556
|
};
|
|
557
557
|
}
|
|
558
558
|
|
|
559
|
-
|
|
559
|
+
async function renderChannelStatus(config = null) {
|
|
560
560
|
const setup = await channelSetup(config);
|
|
561
561
|
const lines = [];
|
|
562
562
|
lines.push(`discord ${setup.discord.status}${setup.discord.problem ? ` (${setup.discord.problem})` : ''}`);
|
|
@@ -33,14 +33,14 @@ export const EXPLORE_TOOL = {
|
|
|
33
33
|
// Total merged-output character cap. The original source uses a very large cap
|
|
34
34
|
// (50MB) plus a smart-read summariser downstream; the standalone path returns
|
|
35
35
|
// the merged text in-turn, so we keep a sane bound to protect the Lead context.
|
|
36
|
-
|
|
36
|
+
const EXPLORE_OUTPUT_CHAR_CAP = 24_000;
|
|
37
37
|
const EXPLORE_TRUNCATION_MARKER = '\n\n[explore: output truncated; narrow cwd or split queries to see more]';
|
|
38
38
|
// Bound fan-out so a hostile/poisoned query array cannot spawn unbounded subs.
|
|
39
39
|
export const MAX_FANOUT_QUERIES = 8;
|
|
40
40
|
// Mechanical turn cap per explorer sub-session: 3 free turns (contract: tool
|
|
41
41
|
// turn 1 = whole batched search, turns 2-3 = miss recovery), then the agent
|
|
42
42
|
// loop forces one tool-less final-answer turn. Overridable for tuning.
|
|
43
|
-
|
|
43
|
+
const EXPLORE_MAX_LOOP_ITERATIONS = (() => {
|
|
44
44
|
const raw = Number(process.env.MIXDOG_EXPLORE_MAX_LOOP);
|
|
45
45
|
return Number.isFinite(raw) && raw > 0 ? Math.floor(raw) : 3;
|
|
46
46
|
})();
|
|
@@ -528,7 +528,7 @@ function anchorLineExists(line, cwd, captureRe = ANCHOR_PATH_CAPTURE_RE) {
|
|
|
528
528
|
try { return existsSync(isAbsolute(p) ? p : resolve(cwd, p)); } catch { return true; }
|
|
529
529
|
}
|
|
530
530
|
|
|
531
|
-
|
|
531
|
+
function cleanExplorerText(text, cwd = null) {
|
|
532
532
|
const raw = String(text || '').trim();
|
|
533
533
|
if (!raw) return '';
|
|
534
534
|
const anchors = [];
|
|
@@ -35,7 +35,7 @@ function readTrustedProjects(dataDir) {
|
|
|
35
35
|
return out;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
function isProjectTrusted(dataDir, projectDir) {
|
|
39
39
|
if (!projectDir) return false;
|
|
40
40
|
const abs = resolve(projectDir);
|
|
41
41
|
const key = process.platform === 'win32' ? abs.toLowerCase() : abs;
|
|
@@ -22,7 +22,7 @@ export const USER_PROMPT_TIMEOUT_S = 30;
|
|
|
22
22
|
export const MESSAGE_DISPLAY_TIMEOUT_S = 10;
|
|
23
23
|
export const DEFAULT_PROMPT_TIMEOUT_S = 30;
|
|
24
24
|
export const DEFAULT_AGENT_TIMEOUT_S = 60;
|
|
25
|
-
|
|
25
|
+
const MAX_OUTPUT_CHARS = 10_000;
|
|
26
26
|
export const MAX_BUFFER_BYTES = 10 * 1024 * 1024;
|
|
27
27
|
|
|
28
28
|
export const TOOL_IF_EVENTS = new Set([
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { compactValue } from './payload.mjs';
|
|
2
2
|
import { defaultShellKind } from './handlers.mjs';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
function matchesList(pattern, value) {
|
|
5
5
|
if (pattern == null || pattern === '*' || pattern === 'all') return true;
|
|
6
6
|
const items = Array.isArray(pattern) ? pattern : [pattern];
|
|
7
7
|
return items.some((item) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* standalone/projects.mjs — user-registered project (cwd) store.
|
|
3
3
|
*
|
|
4
|
-
* Projects are working directories the user explicitly registers
|
|
4
|
+
* Projects are working directories the user explicitly registers.
|
|
5
5
|
* There is NO git scanning and NO recent-history auto-import; only entries the
|
|
6
6
|
* user creates appear here. Persisted as JSON at <MIXDOG_HOME>/projects.json.
|
|
7
7
|
*
|