mixdog 0.9.62 → 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
|
@@ -3,9 +3,9 @@ import { getHiddenAgent } from './internal-agents.mjs';
|
|
|
3
3
|
const SECOND_MS = 1000;
|
|
4
4
|
const MIN_PROVIDER_TIMEOUT_MS = 30_000;
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const STALL_TICK_MS = 15_000;
|
|
7
|
+
const DEFAULT_STALL_WARN_S = 300;
|
|
8
|
+
const DEFAULT_STALL_ABORT_S = 600;
|
|
9
9
|
// First-byte (no-stream-delta) abort for the agent stall watchdog. A wedged
|
|
10
10
|
// socket can sit at stage=requesting with zero server events. The 30s deadline
|
|
11
11
|
// trialed here false-aborted slow high-reasoning first bytes (e.g. gpt-5.5
|
|
@@ -13,14 +13,14 @@ export const DEFAULT_STALL_ABORT_S = 600;
|
|
|
13
13
|
// with dispatch auto-retry, produced premature aborts + duplicate re-dispatches.
|
|
14
14
|
// Auto-retry is now removed, so a single
|
|
15
15
|
// attempt must get a generous first-byte window: 300s (5 min). Env-overridable.
|
|
16
|
-
|
|
16
|
+
const DEFAULT_STALL_FIRST_BYTE_ABORT_S = (() => {
|
|
17
17
|
const raw = process.env.MIXDOG_STALL_FIRST_BYTE_ABORT_S;
|
|
18
18
|
const n = Number.parseInt(raw, 10);
|
|
19
19
|
if (Number.isFinite(n) && n > 0) return Math.min(Math.max(n, 5), 600);
|
|
20
20
|
return 300;
|
|
21
21
|
})();
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
function envThresholdSeconds(env = process.env) {
|
|
24
24
|
const raw = env.STALL_TIMEOUT_S;
|
|
25
25
|
if (!raw) return null;
|
|
26
26
|
const n = Number.parseInt(raw, 10);
|
|
@@ -28,17 +28,17 @@ export function envThresholdSeconds(env = process.env) {
|
|
|
28
28
|
return n;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
function resolveBaseStallThresholds(env = process.env) {
|
|
32
32
|
const abort = envThresholdSeconds(env) ?? DEFAULT_STALL_ABORT_S;
|
|
33
33
|
const warn = abort > DEFAULT_STALL_WARN_S ? DEFAULT_STALL_WARN_S : Math.floor(abort / 2);
|
|
34
34
|
return { warn, abort };
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
const _baseThresholds = resolveBaseStallThresholds();
|
|
38
|
-
|
|
38
|
+
const STALL_WARN_S = _baseThresholds.warn;
|
|
39
39
|
export const STALL_ABORT_S = _baseThresholds.abort;
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
const STALL_WARN_MS = STALL_WARN_S * SECOND_MS;
|
|
41
|
+
const STALL_ABORT_MS = STALL_ABORT_S * SECOND_MS;
|
|
42
42
|
|
|
43
43
|
export const PROVIDER_MAX_BEFORE_WARN_MS = Math.max(
|
|
44
44
|
SECOND_MS,
|
|
@@ -78,7 +78,7 @@ export const PROVIDER_GENERATE_TOTAL_TIMEOUT_MS = resolveTimeoutMs(
|
|
|
78
78
|
{ minMs: PROVIDER_FIRST_BYTE_TIMEOUT_MS, maxMs: PROVIDER_MAX_BEFORE_WARN_MS },
|
|
79
79
|
);
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
const PROVIDER_NONSTREAM_TOTAL_TIMEOUT_MS = resolveTimeoutMs(
|
|
82
82
|
['MIXDOG_NONSTREAM_TOTAL_TIMEOUT_MS', 'MIXDOG_COMPAT_NONSTREAM_TOTAL_TIMEOUT_MS'],
|
|
83
83
|
480_000,
|
|
84
84
|
{ minMs: PROVIDER_GENERATE_TOTAL_TIMEOUT_MS, maxMs: STALL_ABORT_MS },
|
|
@@ -187,7 +187,7 @@ export const PROVIDER_WS_ACQUIRE_TIMEOUT_MS = resolveTimeoutMs(
|
|
|
187
187
|
// silently blackholes response.create frames until a downstream timeout. An
|
|
188
188
|
// idle pooled socket is pinged on this cadence; a reused socket that has been
|
|
189
189
|
// quiet longer than the stale window is ping-probed before hand-out.
|
|
190
|
-
// Gated OFF by default for
|
|
190
|
+
// Gated OFF by default for reference-CLI parity — they do not ping model
|
|
191
191
|
// sockets. Enable with MIXDOG_PROVIDER_WS_PING_ENABLED=1. When disabled, no
|
|
192
192
|
// liveness interval is armed and the acquire-reuse ping probe is skipped (the
|
|
193
193
|
// non-OPEN eviction scan still runs); lastAliveAt stamping is harmless.
|
|
@@ -29,7 +29,7 @@ function _extractSubstitutionBodies(s) {
|
|
|
29
29
|
return out;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
function injectionBlockTargets(cmd) {
|
|
33
33
|
const targets = [];
|
|
34
34
|
const decoded = _decodeAnsiCQuotes(cmd);
|
|
35
35
|
if (decoded && decoded !== cmd) targets.push(decoded);
|
|
@@ -52,7 +52,7 @@ import { resourceAdmission } from '../../../shared/resource-admission.mjs';
|
|
|
52
52
|
|
|
53
53
|
globalThis.__mixdogBashSessionRuntimeLoaded = true;
|
|
54
54
|
|
|
55
|
-
//
|
|
55
|
+
// Official-client parity: default 120 s
|
|
56
56
|
// (2 min), max 600 s (10 min), BASH_DEFAULT_TIMEOUT_MS / BASH_MAX_TIMEOUT_MS
|
|
57
57
|
// env overrides (max floored at default). Matches the one-shot bash tool
|
|
58
58
|
// (builtin/bash-tool.mjs): an omitted `timeout` uses the 120 s default bounded
|
|
@@ -804,7 +804,7 @@ export async function shutdownBashSessions(reason = 'runtime-close') {
|
|
|
804
804
|
|
|
805
805
|
// Best-effort cleanup on process exit so orphan bash children don't linger
|
|
806
806
|
// when the plugin host shuts down. Self-registered exit drain; bare 'exit' hook stays as idempotent backup.
|
|
807
|
-
|
|
807
|
+
function drainBashSessions(reason = 'process-exit') {
|
|
808
808
|
let closed = 0;
|
|
809
809
|
for (const id of [..._sessions.keys()]) {
|
|
810
810
|
if (_killSessionNow(id, reason)) closed += 1;
|
|
@@ -79,7 +79,7 @@ function tryCreateLock(lockFile, token) {
|
|
|
79
79
|
return true;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
async function acquireAdvisoryLock(targetPath, { timeoutMs = 5000, pollMs = 25 } = {}) {
|
|
83
83
|
const lockFile = lockFileFor(targetPath);
|
|
84
84
|
// Ensure parent directory exists before openSync('wx'); the lockfile lives
|
|
85
85
|
// next to the target, so writes to new files in missing parent dirs would
|
|
@@ -23,12 +23,12 @@ export const GREP_CONTEXT_MAX = 200;
|
|
|
23
23
|
// explicit requests are honored up to the generic GREP_CONTEXT_MAX; total
|
|
24
24
|
// output stays bounded by the block clamp, the stream line cap, and the
|
|
25
25
|
// tool-output byte cap.
|
|
26
|
-
|
|
26
|
+
const GREP_CTX_HEAD_LIMIT_MAX = 40;
|
|
27
27
|
|
|
28
28
|
// Unbounded (no offset/limit) plain full reads default to this window instead of
|
|
29
29
|
// pulling the whole file; the read tool's ranged-read footer then hands the
|
|
30
30
|
// caller the next offset to page with.
|
|
31
|
-
|
|
31
|
+
const READ_GUARD_DEFAULT_LIMIT = 800;
|
|
32
32
|
|
|
33
33
|
// Best-effort clamp notice channel: stash a one-line note on the args so a
|
|
34
34
|
// surfacing consumer can echo it. Underscore-prefixed; ignored by executors.
|
|
@@ -57,7 +57,7 @@ function ioTraceDone(event, started, fields = {}) {
|
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
function atomicWriteShouldFsync(value) {
|
|
61
61
|
if (value === true || value === false) return value;
|
|
62
62
|
return /^(1|true|yes|on|sync)$/i.test(String(process.env.MIXDOG_ATOMIC_FSYNC || ''));
|
|
63
63
|
}
|
|
@@ -328,7 +328,7 @@ export async function executeBashTool(args, workDir, options = {}) {
|
|
|
328
328
|
}
|
|
329
329
|
// Keep foreground commands on a long tool-owned timeout. The MCP dispatch
|
|
330
330
|
// layer must not add a shorter fallback ceiling when timeout is omitted.
|
|
331
|
-
// Reference-CLI parity
|
|
331
|
+
// Reference-CLI parity: sync-first, no hard
|
|
332
332
|
// upper ceiling on a caller-provided total timeout. Default 120 s (2 min)
|
|
333
333
|
// when omitted; BASH_DEFAULT_TIMEOUT_MS / BASH_MAX_TIMEOUT_MS env overrides
|
|
334
334
|
// bound the blocking window when timeout promotion is available.
|
|
@@ -683,156 +683,4 @@ export async function executeBashTool(args, workDir, options = {}) {
|
|
|
683
683
|
}
|
|
684
684
|
}
|
|
685
685
|
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
function sleep(ms) {
|
|
689
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
function shellJobToTaskStatus(status) {
|
|
693
|
-
if (status === 'completed') return 'completed';
|
|
694
|
-
if (status === 'cancelled') return 'cancelled';
|
|
695
|
-
if (status === 'running') return 'running';
|
|
696
|
-
return 'failed';
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
function refreshShellTask(taskId, { includeRunning = false } = {}) {
|
|
700
|
-
const job = peekShellJob(taskId);
|
|
701
|
-
if (!job) return null;
|
|
702
|
-
const publicResult = shellJobPublicTaskResult(job);
|
|
703
|
-
if (job.status !== 'running') {
|
|
704
|
-
completeBackgroundTask(taskId, {
|
|
705
|
-
status: shellJobToTaskStatus(job.status),
|
|
706
|
-
result: publicResult,
|
|
707
|
-
resultText: JSON.stringify(publicResult, null, 2),
|
|
708
|
-
notify: false,
|
|
709
|
-
});
|
|
710
|
-
} else if (includeRunning) {
|
|
711
|
-
const task = getBackgroundTask(taskId);
|
|
712
|
-
if (task) {
|
|
713
|
-
task.result = publicResult;
|
|
714
|
-
task.resultText = JSON.stringify(publicResult, null, 2);
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
return job;
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
async function waitForGenericTask(taskId, { timeoutMs = 30_000, pollMs = 250, context = {} } = {}) {
|
|
721
|
-
const started = Date.now();
|
|
722
|
-
const deadline = started + Math.max(0, Number(timeoutMs) || 0);
|
|
723
|
-
let task = getBackgroundTask(taskId, { context });
|
|
724
|
-
if (!task) return null;
|
|
725
|
-
while (task && task.status === 'running' && Date.now() < deadline) {
|
|
726
|
-
await sleep(Math.max(25, Number(pollMs) || 250));
|
|
727
|
-
task = getBackgroundTask(taskId, { context });
|
|
728
|
-
}
|
|
729
|
-
return {
|
|
730
|
-
task,
|
|
731
|
-
waitedMs: Date.now() - started,
|
|
732
|
-
waitTimedOut: Boolean(task && task.status === 'running'),
|
|
733
|
-
};
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
function renderTaskCancelSuccess(taskId, task) {
|
|
737
|
-
const surface = task?.surface || 'task';
|
|
738
|
-
const operation = task?.operation || 'run';
|
|
739
|
-
return [
|
|
740
|
-
'status: completed',
|
|
741
|
-
`task_id: ${taskId}`,
|
|
742
|
-
`cancelled: ${surface}/${operation}`,
|
|
743
|
-
].join('\n');
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
export async function executeTaskTool(args, options = {}) {
|
|
747
|
-
const action = typeof args.action === 'string' ? args.action.toLowerCase() : (args.task_id ? 'wait' : 'list');
|
|
748
|
-
if (action === 'list') return renderBackgroundTaskList({ context: options });
|
|
749
|
-
|
|
750
|
-
const taskId = typeof args.task_id === 'string' ? args.task_id.trim() : '';
|
|
751
|
-
if (!taskId) return 'Error: task_id is required';
|
|
752
|
-
// sess_* values are agent/orchestrator session ids, not background shell
|
|
753
|
-
// tasks. task only resolves `shell mode=async` tasks, so surface a
|
|
754
|
-
// self-correcting hint instead of the bare "task not found" that otherwise
|
|
755
|
-
// invites a wrong-tool retry loop.
|
|
756
|
-
if (/^sess_/.test(taskId)) {
|
|
757
|
-
return `Error: "${taskId}" is an agent/session id, not a background task_id. Agent tasks deliver completion notifications; use agent list/read only for manual recovery.`;
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
const task = getBackgroundTask(taskId, { context: options });
|
|
761
|
-
if (!task) return `Error: task not found: ${taskId}`;
|
|
762
|
-
const isShellTask = task.surface === 'shell';
|
|
763
|
-
|
|
764
|
-
if (action === 'status' || action === 'read') {
|
|
765
|
-
if (isShellTask) refreshShellTask(taskId, { includeRunning: action === 'read' });
|
|
766
|
-
const latest = getBackgroundTask(taskId, { context: options }) || task;
|
|
767
|
-
return renderBackgroundTask(latest, { includeResult: action === 'read' });
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
if (action === 'cancel') {
|
|
771
|
-
if (isShellTask) {
|
|
772
|
-
const job = killShellJob(taskId);
|
|
773
|
-
cancelBackgroundShellJobWatch(taskId);
|
|
774
|
-
clearShellJobNotifyCtx(taskId);
|
|
775
|
-
cancelBackgroundTask(taskId, 'cancelled by task control');
|
|
776
|
-
return job ? renderTaskCancelSuccess(taskId, getBackgroundTask(taskId, { context: options }) || task) : buildJobNotFoundMessage(taskId);
|
|
777
|
-
}
|
|
778
|
-
cancelBackgroundTask(taskId, 'cancelled by task control');
|
|
779
|
-
return renderTaskCancelSuccess(taskId, getBackgroundTask(taskId, { context: options }) || task);
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
if (action !== 'wait') {
|
|
783
|
-
return `Error: task action must be one of list|status|read|wait|cancel (got ${JSON.stringify(args.action)})`;
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
if (!isShellTask) {
|
|
787
|
-
const waited = await waitForGenericTask(taskId, {
|
|
788
|
-
timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : 30_000,
|
|
789
|
-
pollMs: typeof args.poll_ms === 'number' ? args.poll_ms : 250,
|
|
790
|
-
context: options,
|
|
791
|
-
});
|
|
792
|
-
if (!waited?.task) return `Error: task not found: ${taskId}`;
|
|
793
|
-
const rendered = renderBackgroundTask(waited.task, { includeResult: TERMINAL_TASK_STATUSES.has(waited.task.status) });
|
|
794
|
-
return waited.waitTimedOut ? `${rendered}\nwait_timed_out: true\nwaited_ms: ${waited.waitedMs}` : rendered;
|
|
795
|
-
}
|
|
796
|
-
// Register as a synchronous waiter and cancel the armed watcher BEFORE
|
|
797
|
-
// awaiting: the caller consumes the outcome via task wait, so no async
|
|
798
|
-
// push is wanted, and cancelling up front closes the race where the armed
|
|
799
|
-
// watcher (watch callback or 2s poll) fires during the await window. The
|
|
800
|
-
// persistent notify ctx survives the cancel for a possible re-arm.
|
|
801
|
-
beginShellJobWait(taskId);
|
|
802
|
-
cancelBackgroundShellJobWatch(taskId);
|
|
803
|
-
try {
|
|
804
|
-
const job = await waitForShellJob(taskId, {
|
|
805
|
-
timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : 30_000,
|
|
806
|
-
pollMs: typeof args.poll_ms === 'number' ? args.poll_ms : 250,
|
|
807
|
-
});
|
|
808
|
-
if (!job) return buildJobNotFoundMessage(taskId);
|
|
809
|
-
if (job.status !== 'running') {
|
|
810
|
-
const publicResult = shellJobPublicTaskResult(job);
|
|
811
|
-
completeBackgroundTask(taskId, {
|
|
812
|
-
status: shellJobToTaskStatus(job.status),
|
|
813
|
-
result: publicResult,
|
|
814
|
-
resultText: JSON.stringify(publicResult, null, 2),
|
|
815
|
-
notify: false,
|
|
816
|
-
});
|
|
817
|
-
}
|
|
818
|
-
const latest = getBackgroundTask(taskId, { context: options }) || task;
|
|
819
|
-
const rendered = renderBackgroundTask(latest, { includeResult: job.status !== 'running' });
|
|
820
|
-
return job.status === 'running' ? `${rendered}\nwait_timed_out: true\nwaited_ms: ${job.waitedMs}` : rendered;
|
|
821
|
-
} finally {
|
|
822
|
-
// Only the LAST concurrent waiter (post-decrement count 0) may re-arm,
|
|
823
|
-
// and only for a still-running job (timed-out wait). Re-arm with no ctx
|
|
824
|
-
// arg — watchBackgroundShellJob falls back to the persistent ctx. This
|
|
825
|
-
// prevents the concurrent-waiter double-deliver: while any other waiter
|
|
826
|
-
// is still synchronously consuming the outcome, the watcher stays off.
|
|
827
|
-
const remaining = endShellJobWait(taskId);
|
|
828
|
-
if (remaining === 0) {
|
|
829
|
-
const latest = peekShellJob(taskId);
|
|
830
|
-
if (latest && latest.status === 'running') watchBackgroundShellJob(taskId);
|
|
831
|
-
// LAST waiter out and the job already finished — the outcome was
|
|
832
|
-
// consumed synchronously, so no re-arm. Drop the persisted ctx here
|
|
833
|
-
// or it leaks (cleanup only runs on a real watcher settle, which
|
|
834
|
-
// never happens for a never-re-armed entry).
|
|
835
|
-
else clearShellJobNotifyCtx(taskId);
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
}
|
|
686
|
+
export { executeTaskTool } from './task-tool.mjs';
|
|
@@ -79,7 +79,7 @@ function bumpPathMutationGeneration(path) {
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
function getPathMutationGeneration(path) {
|
|
83
83
|
const key = canonicalCachePath(path);
|
|
84
84
|
let generation = PATH_MUTATION_GLOBAL_GENERATION;
|
|
85
85
|
for (const [changedPath, value] of PATH_MUTATION_GENERATIONS) {
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
resolveAgainstCwd,
|
|
7
7
|
} from './path-utils.mjs';
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
function literalPathHint(rawPath) {
|
|
10
10
|
const s = String(rawPath || '');
|
|
11
11
|
if (/\$env:[A-Za-z_][A-Za-z0-9_]*|\$[A-Za-z_][A-Za-z0-9_]*|%[^%]+%/.test(s)) {
|
|
12
12
|
return ' Path fields do not expand shell environment variables; pass the resolved absolute path.';
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// logic is unchanged; we only refuse to enter it when the path is unreachable.
|
|
13
13
|
import { stat } from 'node:fs/promises';
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
const FS_REACHABILITY_DEADLINE_MS = 5000;
|
|
16
16
|
|
|
17
17
|
// Resolve true when the path is reachable (exists OR cleanly absent — ENOENT,
|
|
18
18
|
// EACCES, etc. are "the FS answered", let the real sync logic produce its own
|
|
@@ -85,7 +85,7 @@ function prepareFuzzyScore(query) {
|
|
|
85
85
|
* @param {string} str candidate path (relative)
|
|
86
86
|
* @returns {number|null} score, or null if `query` is not a subsequence
|
|
87
87
|
*/
|
|
88
|
-
|
|
88
|
+
function fuzzyScore(query, str) {
|
|
89
89
|
const scorer = prepareFuzzyScore(query);
|
|
90
90
|
return typeof scorer === 'function' ? scorer(str) : scorer;
|
|
91
91
|
}
|
|
@@ -124,7 +124,7 @@ export const NOISE_DIR_NAMES = new Set([
|
|
|
124
124
|
'.gradle',
|
|
125
125
|
]);
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
const MAX_WALK_ENTRIES = 200_000;
|
|
128
128
|
|
|
129
129
|
// Unified directory walk used by list / tree / find_files. The visitor
|
|
130
130
|
// callback owns the "should I record this entry?" decision; returning
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// chain so that overlapping calls for the same file are serialised in-process.
|
|
3
3
|
const editLocks = new Map();
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
function pathLockKey(absPath) {
|
|
6
6
|
const text = String(absPath || '');
|
|
7
7
|
return process.platform === 'win32' ? text.toLowerCase() : text;
|
|
8
8
|
}
|
|
@@ -35,7 +35,7 @@ export function posixPathToWindowsPath(posixPath) {
|
|
|
35
35
|
// a literal under WSL — the drive surfaces at `/mnt/<letter>/...`. Map
|
|
36
36
|
// `<drive>:` → `/mnt/<lowercase-drive>` and flip backslashes to slashes. Only
|
|
37
37
|
// drive-letter paths are touched; anything else is returned unchanged.
|
|
38
|
-
|
|
38
|
+
function windowsPathToPosixPath(winPath) {
|
|
39
39
|
if (typeof winPath !== 'string') return winPath;
|
|
40
40
|
const m = winPath.match(/^([a-zA-Z]):[\\/](.*)$/);
|
|
41
41
|
if (m) return `/mnt/${m[1].toLowerCase()}/${m[2].replace(/\\/g, '/')}`;
|
|
@@ -6,7 +6,7 @@ export function parseReadLineNumberArg(value) {
|
|
|
6
6
|
return Number.isFinite(n) && n > 0 ? Math.trunc(n) : null;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
function parseReadPathLineSpec(rawPath) {
|
|
10
10
|
if (typeof rawPath !== 'string' || rawPath.length === 0) return null;
|
|
11
11
|
const text = rawPath.trim();
|
|
12
12
|
let m = /^(.+?)#L(\d+)(?:-L?(\d+))?(?:\b.*)?$/i.exec(text);
|
|
@@ -23,7 +23,7 @@ export function parseReadPathLineSpec(rawPath) {
|
|
|
23
23
|
return { path: m[1], lineNo, endLine, inverted, invertedEnd: inverted ? endLineRaw : null };
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
function resolveExistingPathLineCoordinate(rawPath, workDir) {
|
|
27
27
|
const spec = parseReadPathLineSpec(rawPath);
|
|
28
28
|
if (!spec) return null;
|
|
29
29
|
const normalizedRawPath = normalizeInputPath(rawPath);
|
|
@@ -18,8 +18,7 @@ export const SMART_READ_TAIL_LINES = _readEnvInt('MIXDOG_READ_TAIL_LINES', 400);
|
|
|
18
18
|
// floor mostly fired on full:true mid-size reads where the advisory was pure
|
|
19
19
|
// tail bloat. Raised to 40 KB to keep the guidance only where re-reading a big
|
|
20
20
|
// file actually hurts.
|
|
21
|
-
|
|
22
|
-
export const READ_MAX_RENDERED_LINE_CHARS = 2_000;
|
|
21
|
+
const READ_MAX_RENDERED_LINE_CHARS = 2_000;
|
|
23
22
|
// The read line-prefix separator is `→` (the `→`
|
|
24
23
|
// arrow), matching default cat -n format `<n>→<content>`. It
|
|
25
24
|
// MUST be a NON-WHITESPACE glyph: a tab/space separator collides with the
|
|
@@ -84,7 +83,7 @@ export function appendReadContextAdvisory(out, { filePath: _filePath, lineCount:
|
|
|
84
83
|
return out;
|
|
85
84
|
}
|
|
86
85
|
|
|
87
|
-
|
|
86
|
+
function formatPaginationHint(remaining, nextOffset) {
|
|
88
87
|
const n = Number(remaining);
|
|
89
88
|
const label = Number.isFinite(n) && n > 0 ? `${n} more entries` : 'more entries';
|
|
90
89
|
return `... [${label}; next offset: ${nextOffset}]`;
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
// that stays under that cap after the 4/3 base64 inflation.
|
|
14
14
|
export const API_IMAGE_MAX_BASE64_SIZE = 5 * 1024 * 1024; // 5 MB
|
|
15
15
|
export const IMAGE_TARGET_RAW_SIZE = (API_IMAGE_MAX_BASE64_SIZE * 3) / 4; // 3.75 MB
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const IMAGE_MAX_WIDTH = 2000;
|
|
17
|
+
const IMAGE_MAX_HEIGHT = 2000;
|
|
18
18
|
// Token budget for a single image. est tokens = base64.length * 0.125 (CC's
|
|
19
19
|
// per-image heuristic). Default aligns to the 5MB base64 API ceiling so the
|
|
20
20
|
// dimension/raw-size resize governs the common case and the token gate only
|
|
21
21
|
// fires on pathologically dense images.
|
|
22
|
-
|
|
22
|
+
const DEFAULT_IMAGE_MAX_TOKENS = Math.ceil(API_IMAGE_MAX_BASE64_SIZE * 0.125);
|
|
23
23
|
|
|
24
24
|
// Cached dynamic import. Resolves to the sharp factory or null (absent /
|
|
25
25
|
// failed). Cached so repeated reads don't re-attempt a failing import.
|
|
@@ -39,7 +39,7 @@ async function loadSharp() {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
// True when sharp resolved; used for the per-file change summary / fallback note.
|
|
42
|
-
|
|
42
|
+
async function sharpAvailable() {
|
|
43
43
|
return (await loadSharp()) !== null;
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -106,7 +106,7 @@ export function readPathStringGuardError(filePath, workDir) {
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
/** Post-stat / symlink guards. Returns error message or null. */
|
|
109
|
-
|
|
109
|
+
function readPathStatGuardError(userPath, fullPath, st) {
|
|
110
110
|
if (isSpecialFileStat(st)) {
|
|
111
111
|
return `cannot read special file (FIFO / character / block device / socket): ${normalizeOutputPath(userPath)}`;
|
|
112
112
|
}
|
|
@@ -225,7 +225,7 @@ export async function streamReadRange(fullPath, offset, limit, stHint = null, ho
|
|
|
225
225
|
return { text: out, firstEmitted, lastEmitted, prefixHash };
|
|
226
226
|
}
|
|
227
227
|
|
|
228
|
-
|
|
228
|
+
function tryWindowedSmartReadSummary(fullPath, st, source = 'read_smart_stream', hooks = {}) {
|
|
229
229
|
const { ioTraceStart, ioTraceDone } = streamingHooks(hooks);
|
|
230
230
|
const displayPath = hooks.displayPath || fullPath;
|
|
231
231
|
const traceStart = ioTraceStart();
|
|
@@ -81,7 +81,7 @@ function _walkRgArgs(argsList, visit) {
|
|
|
81
81
|
// is the NEXT arg, short-attached (`-j8`), and long-attached (`--threads=8`).
|
|
82
82
|
// Used by both the _withRgThreads injection guard and the EAGAIN retry guard
|
|
83
83
|
// so the two never disagree.
|
|
84
|
-
|
|
84
|
+
function _hasRgThreadArg(argsList) {
|
|
85
85
|
let found = false;
|
|
86
86
|
_walkRgArgs(argsList, (a, _index, _valueIndex, options) => {
|
|
87
87
|
if (!options || typeof a !== 'string') return;
|
|
@@ -121,7 +121,7 @@ export function _rgEagainRetryArgs(argsList) {
|
|
|
121
121
|
// retry would change nothing. Matches the separated `-j 1` / `--threads 1` form
|
|
122
122
|
// and the attached `-j1` / `--threads=1` form. Any other thread pin (e.g. -j8)
|
|
123
123
|
// is NOT "single-thread pinned": the retry should still run and downshift it.
|
|
124
|
-
|
|
124
|
+
function _isRgSingleThreadPinned(argsList) {
|
|
125
125
|
let found = false;
|
|
126
126
|
_walkRgArgs(argsList, (a, _index, valueIndex, options) => {
|
|
127
127
|
if (!options || typeof a !== 'string') return;
|
|
@@ -65,7 +65,7 @@ export function stripEmbeddedPathQuotes(p) {
|
|
|
65
65
|
// must not trigger same-basename guidance or the BFS scan.
|
|
66
66
|
const NOT_FOUND_CODES = new Set(['ENOENT', 'ENOTDIR']);
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
const ENOENT_FIND_NUDGE = 'Locate with find on the basename before retrying.';
|
|
69
69
|
|
|
70
70
|
// Per-invocation memo for the ENOENT recovery fs scans. A single grep/glob
|
|
71
71
|
// ENOENT surfaces the SAME missing path through tryReadFamilyEnoentRedirect
|
|
@@ -109,7 +109,7 @@ function nearestExistingParentRel(workDir, missingPath) {
|
|
|
109
109
|
return null;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
function spaceJoinedPathHint(requestedPath) {
|
|
113
113
|
if (typeof requestedPath !== 'string') return '';
|
|
114
114
|
const trimmed = requestedPath.trim();
|
|
115
115
|
if (!/\s/.test(trimmed)) return '';
|
|
@@ -118,7 +118,7 @@ export function spaceJoinedPathHint(requestedPath) {
|
|
|
118
118
|
return ' Pass multiple scopes as path[] array (not a space-joined string).';
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
function appendEnoentFindNudge(text = '') {
|
|
122
122
|
const base = String(text || '');
|
|
123
123
|
if (base.includes(ENOENT_FIND_NUDGE)) return base;
|
|
124
124
|
const sep = base.length && !/\s$/.test(base) ? ' ' : '';
|
|
@@ -130,7 +130,7 @@ export function finalizeReadFamilyEnoentTail(hint, requestedPath, errCode = 'ENO
|
|
|
130
130
|
return appendEnoentFindNudge(String(hint || '') + spaceJoinedPathHint(requestedPath));
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
function resolveUniqueEnoentRedirect(workDir, missingPath, errCode = 'ENOENT', cache = null) {
|
|
134
134
|
if (!NOT_FOUND_CODES.has(String(errCode || 'ENOENT'))) return null;
|
|
135
135
|
const suffixHit = cachedSuffixStrip(workDir, missingPath, cache);
|
|
136
136
|
if (suffixHit) return suffixHit;
|
|
@@ -143,7 +143,7 @@ export function resolveUniqueEnoentRedirect(workDir, missingPath, errCode = 'ENO
|
|
|
143
143
|
return null;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
function redirectedFromPrefix(requestedPath) {
|
|
147
147
|
return `[redirected from ${normalizeOutputPath(requestedPath)}]\n`;
|
|
148
148
|
}
|
|
149
149
|
|
|
@@ -761,7 +761,7 @@ export async function analyzeShellCommandEffects(command, cwd) {
|
|
|
761
761
|
// its deadline. Only the first top-level segment is considered — sleeps inside
|
|
762
762
|
// pipelines/subshells/scripts are legitimate pacing and pass through. Float
|
|
763
763
|
// durations (sleep 0.5) are allowed, mirroring the reference CLI.
|
|
764
|
-
|
|
764
|
+
function detectBlockedSleepPattern(command) {
|
|
765
765
|
const cmd = String(command || '').trim();
|
|
766
766
|
if (!cmd) return null;
|
|
767
767
|
const sep = cmd.match(/&&|\|\||;|\|/);
|
|
@@ -13,7 +13,7 @@ const SHELL_JOB_SPILL_KEEP_BYTES = 4 * 1024 * 1024;
|
|
|
13
13
|
// Tail-trim a single spill log in place: if it exceeds maxBytes, rewrite it
|
|
14
14
|
// keeping only the last keepBytes. Sync, best-effort, no-op on a missing file.
|
|
15
15
|
// Mirrors rotateBoundedLog in src/lib/mixdog-debug.cjs. Returns true if trimmed.
|
|
16
|
-
|
|
16
|
+
function trimShellJobSpillFile(filePath, maxBytes = SHELL_JOB_SPILL_MAX_BYTES, keepBytes = SHELL_JOB_SPILL_KEEP_BYTES) {
|
|
17
17
|
try {
|
|
18
18
|
const st = statSync(filePath);
|
|
19
19
|
if (st.size <= maxBytes) return false;
|
|
@@ -214,7 +214,7 @@ export function shellJobEnforcedPath(jobId) { return join(getShellJobsDir(), `${
|
|
|
214
214
|
// precede its per-tick scan cap — otherwise other sessions' newer jobs evict
|
|
215
215
|
// this session's live jobs before filtering. Swept alongside the other
|
|
216
216
|
// artefacts.
|
|
217
|
-
|
|
217
|
+
function shellJobOwnerPath(jobId, pid) { return join(getShellJobsDir(), `${jobId}.owner-${pid}`); }
|
|
218
218
|
|
|
219
219
|
// Resolve the CLI host pid that owns a freshly-spawned job. Standalone CLI
|
|
220
220
|
// execution is process-owned: background tasks are scoped to this CLI lifetime,
|
|
@@ -20,7 +20,7 @@ export function isPidAlive(pid) {
|
|
|
20
20
|
// detached group. Windows has no process-group probe in Node; the root PID is
|
|
21
21
|
// the strongest non-invasive lifecycle signal available here (tree-kill still
|
|
22
22
|
// uses taskkill /T).
|
|
23
|
-
|
|
23
|
+
function isProcessTreeAlive(pid) {
|
|
24
24
|
if (!Number.isFinite(pid) || pid <= 0) return false;
|
|
25
25
|
if (process.platform === 'win32') return isPidAlive(pid);
|
|
26
26
|
try {
|
|
@@ -301,7 +301,7 @@ export function _killLiveJobPid(pid, { sync = false } = {}) {
|
|
|
301
301
|
return false;
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
|
-
|
|
304
|
+
function _sweepLiveJobsSync() {
|
|
305
305
|
for (const pid of _liveJobPids) {
|
|
306
306
|
_killLiveJobPid(pid, { sync: true });
|
|
307
307
|
}
|