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
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
// Production-path regression: runtime completion notification -> feed enqueue
|
|
2
|
-
// -> session drain -> real runTurn -> Esc. This deliberately uses the real
|
|
3
|
-
// feed, queue, API, and turn implementations rather than fabricating restore
|
|
4
|
-
// state, so ownership survives the same path used by the TUI.
|
|
5
|
-
import test from 'node:test';
|
|
6
|
-
import assert from 'node:assert/strict';
|
|
7
|
-
|
|
8
|
-
import { createAgentJobFeed } from '../src/tui/engine/agent-job-feed.mjs';
|
|
9
|
-
import { createSessionFlow } from '../src/tui/engine/session-flow.mjs';
|
|
10
|
-
import { createRunTurn } from '../src/tui/engine/turn.mjs';
|
|
11
|
-
import { createEngineApiA } from '../src/tui/engine/session-api.mjs';
|
|
12
|
-
import { _clearDeliveredCompletions } from '../src/runtime/agent/orchestrator/session/manager/delivered-completions.mjs';
|
|
13
|
-
|
|
14
|
-
const tick = () => new Promise((resolve) => setImmediate(resolve));
|
|
15
|
-
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
16
|
-
|
|
17
|
-
function completion(executionId, body) {
|
|
18
|
-
return {
|
|
19
|
-
content: `Async agent task ${executionId} completed finished.\n\nResult:\n> ${body}`,
|
|
20
|
-
meta: { type: 'agent_task_result', execution_id: executionId, status: 'completed' },
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function makeHarness() {
|
|
25
|
-
let seq = 0;
|
|
26
|
-
let notify = null;
|
|
27
|
-
let activeAsk = null;
|
|
28
|
-
let feed = null;
|
|
29
|
-
const asks = [];
|
|
30
|
-
const pending = [];
|
|
31
|
-
const itemIndexById = new Map();
|
|
32
|
-
const state = {
|
|
33
|
-
items: [],
|
|
34
|
-
queued: [],
|
|
35
|
-
busy: false,
|
|
36
|
-
commandBusy: false,
|
|
37
|
-
spinner: null,
|
|
38
|
-
thinking: null,
|
|
39
|
-
lastTurn: null,
|
|
40
|
-
stats: { turns: 0, inputTokens: 0, outputTokens: 0 },
|
|
41
|
-
};
|
|
42
|
-
const runtime = {
|
|
43
|
-
id: null,
|
|
44
|
-
toolMode: 'auto',
|
|
45
|
-
onNotification: (fn) => { notify = fn; return () => {}; },
|
|
46
|
-
consumePendingSessionReset: () => null,
|
|
47
|
-
ask: async (text, options) => new Promise((resolve, reject) => {
|
|
48
|
-
activeAsk = { text, options, reject };
|
|
49
|
-
asks.push(activeAsk);
|
|
50
|
-
}),
|
|
51
|
-
abort: () => {
|
|
52
|
-
const error = new Error('interrupted');
|
|
53
|
-
error.name = 'SessionClosedError';
|
|
54
|
-
activeAsk?.reject(error);
|
|
55
|
-
return true;
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
const bag = {
|
|
59
|
-
runtime,
|
|
60
|
-
nextId: () => `id_${++seq}`,
|
|
61
|
-
tuiDebug: () => {},
|
|
62
|
-
LEAD_TURN_TIMEOUT_MS: 300_000,
|
|
63
|
-
flags: { leadTurnEpoch: 0, drainEpoch: 0, disposed: false, draining: false, activePromptRestore: null },
|
|
64
|
-
pending,
|
|
65
|
-
pendingNotificationKeys: new Set(),
|
|
66
|
-
displayedExecutionNotificationKeys: new Set(),
|
|
67
|
-
listeners: new Set(),
|
|
68
|
-
itemIndexById,
|
|
69
|
-
getState: () => state,
|
|
70
|
-
set: (patch) => Object.assign(state, patch),
|
|
71
|
-
pushItem: (item) => {
|
|
72
|
-
state.items = [...state.items, item];
|
|
73
|
-
if (item?.id != null) itemIndexById.set(item.id, state.items.length - 1);
|
|
74
|
-
},
|
|
75
|
-
patchItem: (id, patch) => {
|
|
76
|
-
const index = state.items.findIndex((item) => item.id === id);
|
|
77
|
-
if (index < 0) return false;
|
|
78
|
-
state.items = state.items.map((item, i) => i === index ? { ...item, ...patch } : item);
|
|
79
|
-
return true;
|
|
80
|
-
},
|
|
81
|
-
replaceItems: (items) => items,
|
|
82
|
-
pushNotice: () => {},
|
|
83
|
-
pushUserOrSyntheticItem: (text, id) => {
|
|
84
|
-
state.items = [...state.items, { kind: 'injected', id, text }];
|
|
85
|
-
},
|
|
86
|
-
autoClearState: () => ({ enabled: false }),
|
|
87
|
-
agentStatusState: () => ({}),
|
|
88
|
-
routeState: () => ({}),
|
|
89
|
-
syncContextStats: () => {},
|
|
90
|
-
denyAllToolApprovals: () => {},
|
|
91
|
-
requestToolApproval: async () => ({ approved: false }),
|
|
92
|
-
markToolCallActive: () => {},
|
|
93
|
-
markToolCallDone: () => {},
|
|
94
|
-
clearActiveToolSummary: () => {},
|
|
95
|
-
patchToolCardResult: () => {},
|
|
96
|
-
flushToolResults: () => {},
|
|
97
|
-
// session-flow captures this dependency before the feed is constructed;
|
|
98
|
-
// keep that production ordering while forwarding to the live feed.
|
|
99
|
-
flushDeferredExecutionPendingResumeKick: () => feed?.flushDeferredExecutionPendingResumeKick(),
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
Object.assign(bag, createSessionFlow(bag));
|
|
103
|
-
feed = createAgentJobFeed({
|
|
104
|
-
runtime,
|
|
105
|
-
getState: bag.getState,
|
|
106
|
-
set: bag.set,
|
|
107
|
-
nextId: bag.nextId,
|
|
108
|
-
getDisposed: () => bag.flags.disposed,
|
|
109
|
-
patchItem: bag.patchItem,
|
|
110
|
-
enqueue: (...args) => bag.enqueue(...args),
|
|
111
|
-
drain: (...args) => bag.drain(...args),
|
|
112
|
-
pushUserOrSyntheticItem: bag.pushUserOrSyntheticItem,
|
|
113
|
-
makeQueueEntry: (...args) => bag.makeQueueEntry(...args),
|
|
114
|
-
getPending: () => pending,
|
|
115
|
-
agentStatusState: bag.agentStatusState,
|
|
116
|
-
displayedExecutionNotificationKeys: bag.displayedExecutionNotificationKeys,
|
|
117
|
-
pushNotice: bag.pushNotice,
|
|
118
|
-
});
|
|
119
|
-
Object.assign(bag, feed);
|
|
120
|
-
bag.runTurn = createRunTurn(bag);
|
|
121
|
-
const api = createEngineApiA(bag);
|
|
122
|
-
feed.subscribeRuntimeNotifications();
|
|
123
|
-
|
|
124
|
-
return {
|
|
125
|
-
api,
|
|
126
|
-
state,
|
|
127
|
-
asks,
|
|
128
|
-
deliver: (event) => notify(event),
|
|
129
|
-
activeAsk: () => activeAsk,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
for (const phase of ['before first delta', 'after response progress']) {
|
|
134
|
-
test(`runtime completion Esc ${phase} does not restart it, while a new completion wakes`, async () => {
|
|
135
|
-
_clearDeliveredCompletions();
|
|
136
|
-
const harness = makeHarness();
|
|
137
|
-
|
|
138
|
-
const first = completion('execution_A', 'first result');
|
|
139
|
-
harness.deliver(first);
|
|
140
|
-
await tick();
|
|
141
|
-
assert.equal(harness.asks.length, 1, 'runtime notification drained into a real turn');
|
|
142
|
-
assert.match(harness.activeAsk().text, /first result/, 'completion body reached runtime.ask');
|
|
143
|
-
assert.equal(first.modelVisibleDelivered, true, 'notification was acknowledged on the TUI path');
|
|
144
|
-
|
|
145
|
-
if (phase === 'after response progress') {
|
|
146
|
-
harness.activeAsk().options.onTextDelta('partial response\n');
|
|
147
|
-
await wait(40);
|
|
148
|
-
assert.equal(
|
|
149
|
-
harness.state.streamingTail?.kind === 'assistant'
|
|
150
|
-
&& /partial response/.test(harness.state.streamingTail.text),
|
|
151
|
-
true,
|
|
152
|
-
'response progress reached the dedicated live tail',
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
assert.equal(harness.api.abort().aborted, true, 'Esc aborts the active runTurn');
|
|
157
|
-
await tick();
|
|
158
|
-
assert.equal(harness.state.busy, false, 'busy clears after the real abort unwind');
|
|
159
|
-
assert.equal(harness.state.spinner, null, 'spinner clears after Esc');
|
|
160
|
-
assert.equal(harness.state.thinking, null, 'thinking clears after Esc');
|
|
161
|
-
assert.equal(harness.state.streamingTail == null, true, 'Esc leaves no orphaned streaming tail');
|
|
162
|
-
|
|
163
|
-
harness.deliver(completion('execution_A', 'duplicate retry'));
|
|
164
|
-
await tick();
|
|
165
|
-
assert.equal(harness.asks.length, 1, 'duplicate execution delivery cannot restart the aborted completion');
|
|
166
|
-
|
|
167
|
-
harness.deliver(completion('execution_B', 'later result'));
|
|
168
|
-
await tick();
|
|
169
|
-
assert.equal(harness.asks.length, 2, 'a genuinely new execution still wakes a turn');
|
|
170
|
-
assert.match(harness.activeAsk().text, /later result/);
|
|
171
|
-
|
|
172
|
-
// Finish the second intentionally-open mocked provider request.
|
|
173
|
-
harness.api.abort();
|
|
174
|
-
await tick();
|
|
175
|
-
});
|
|
176
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
|
-
import { runExplore } from '../src/standalone/explore-tool.mjs';
|
|
5
|
-
// Attribute LLM send time (not just wall) for this high-fanout batch.
|
|
6
|
-
process.env.MIXDOG_AGENT_TRACE_TIMING = '1';
|
|
7
|
-
const queries = [
|
|
8
|
-
'standalone explore tool implementation entry point',
|
|
9
|
-
'V4A patch format parsing/conversion implementation',
|
|
10
|
-
'recall memory entries persistent store (sqlite) read/query implementation',
|
|
11
|
-
'output styles: how style definitions are loaded and applied at session runtime',
|
|
12
|
-
'Discord backend outbound message send implementation',
|
|
13
|
-
'shell command destructive/danger policy scan before execution',
|
|
14
|
-
'where does mixdog store per-user data and sessions on this machine (out of repo)',
|
|
15
|
-
'channel runtime crash logging write path',
|
|
16
|
-
];
|
|
17
|
-
const t0 = Date.now();
|
|
18
|
-
const res = await runExplore({ query: queries, cwd: 'C:/Project/mixdog' }, { callerCwd: 'C:/Project/mixdog' });
|
|
19
|
-
console.log('BATCH_ELAPSED_MS', Date.now() - t0);
|
|
20
|
-
const txt = res.content?.[0]?.text || '';
|
|
21
|
-
console.log('FAILED_COUNT', (txt.match(/EXPLORATION_FAILED/g) || []).length);
|
|
22
|
-
// Sum send_ms from loop rows emitted since t0 → LLM time vs the wall above.
|
|
23
|
-
const tracePath = process.env.MIXDOG_AGENT_TRACE_PATH
|
|
24
|
-
|| join(process.env.MIXDOG_DATA_DIR || join(process.env.MIXDOG_HOME || join(homedir(), '.mixdog'), 'data'), 'history', 'agent-trace.jsonl');
|
|
25
|
-
let sendMs = 0, sends = 0; const sessions = new Set();
|
|
26
|
-
if (existsSync(tracePath)) {
|
|
27
|
-
for (const line of readFileSync(tracePath, 'utf8').split('\n')) {
|
|
28
|
-
if (!line) continue;
|
|
29
|
-
try {
|
|
30
|
-
const r = JSON.parse(line);
|
|
31
|
-
if (r.ts >= t0 && r.kind === 'loop' && r.agent === 'explorer') { sendMs += Number(r.send_ms) || 0; sends++; sessions.add(r.session_id); }
|
|
32
|
-
} catch { /* skip */ }
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
console.log('LLM_SEND_MS_TOTAL', sendMs, 'sends', sends, 'sessions', sessions.size);
|
|
36
|
-
process.exit(0);
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
// Explore quality bench — round-based tuning harness.
|
|
2
|
-
//
|
|
3
|
-
// Runs a fixed query set through runExplore against this repo, then reads
|
|
4
|
-
// agent-trace.jsonl to report per-session tool-call counts, wall time, and
|
|
5
|
-
// anchor quality. Usage:
|
|
6
|
-
// node scripts/explore-bench.mjs [roundLabel]
|
|
7
|
-
// Fresh process per run = no in-memory result cache carryover.
|
|
8
|
-
import { readFileSync, existsSync } from 'node:fs';
|
|
9
|
-
import { join, isAbsolute } from 'node:path';
|
|
10
|
-
import { homedir } from 'node:os';
|
|
11
|
-
import { runExplore } from '../src/standalone/explore-tool.mjs';
|
|
12
|
-
|
|
13
|
-
const ROUND = process.argv[2] || 'r0';
|
|
14
|
-
const CWD = 'C:/Project/mixdog';
|
|
15
|
-
|
|
16
|
-
// Anchor helpers: an anchor line carries a `path:line`. Strict quality =
|
|
17
|
-
// expected token must land ON such a line (not merely somewhere in the text),
|
|
18
|
-
// and anchors===0 is always a miss (except expectFail). Spot-accuracy verifies
|
|
19
|
-
// the referenced file exists and the line number is within the file length.
|
|
20
|
-
function anchorLinesOf(text) {
|
|
21
|
-
return text.split('\n').filter((l) => /:\d+/.test(l));
|
|
22
|
-
}
|
|
23
|
-
// Variant-aware token matching for the fabricated-line guard. Split
|
|
24
|
-
// camelCase and snake_case/kebab joins into atomic sub-tokens, then compare
|
|
25
|
-
// on a light stem so plural/verb forms unify (importance/importanceScore/
|
|
26
|
-
// chunk_importance -> {importance,score,chunk}; scoring~score, memories~memory).
|
|
27
|
-
// Matching is exact stem-equality of sub-tokens (never substring), so it does
|
|
28
|
-
// not loosen into generic-word overlap.
|
|
29
|
-
function splitSubtokens(s) {
|
|
30
|
-
return String(s)
|
|
31
|
-
.replace(/([a-z0-9])([A-Z])/g, '$1 $2') // camelCase boundary
|
|
32
|
-
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2') // ACRONYMWord boundary
|
|
33
|
-
.split(/[^A-Za-z0-9]+/) // snake_case / kebab / punctuation
|
|
34
|
-
.map((t) => t.toLowerCase())
|
|
35
|
-
.filter(Boolean);
|
|
36
|
-
}
|
|
37
|
-
function stemToken(t) {
|
|
38
|
-
if (t.length <= 4) return t;
|
|
39
|
-
return t
|
|
40
|
-
.replace(/ies$/, 'y')
|
|
41
|
-
.replace(/(ings|ing|edly|ed|es|ly|s)$/, '')
|
|
42
|
-
.replace(/e$/, '');
|
|
43
|
-
}
|
|
44
|
-
function checkAnchorLine(line, ctxTokens = []) {
|
|
45
|
-
const m = line.match(/([A-Za-z0-9_.\/\\-]+):(\d+)/);
|
|
46
|
-
if (!m) return null; // no parseable path:line
|
|
47
|
-
const p = m[1];
|
|
48
|
-
const ln = Number(m[2]);
|
|
49
|
-
const full = isAbsolute(p) ? p : join(CWD, p);
|
|
50
|
-
if (!existsSync(full)) return false;
|
|
51
|
-
try {
|
|
52
|
-
const fileLines = readFileSync(full, 'utf8').split('\n');
|
|
53
|
-
if (!(ln >= 1 && ln <= fileLines.length)) return false;
|
|
54
|
-
// Fabricated-line guard: the cited line's ±2 window must contain a
|
|
55
|
-
// query/expected token, so a plausible-but-wrong line number fails.
|
|
56
|
-
if (ctxTokens.length) {
|
|
57
|
-
// ±2 lines around the 1-based cited line (indices ln-3 .. ln+1 inclusive).
|
|
58
|
-
const win = fileLines.slice(Math.max(0, ln - 3), ln + 2).join('\n');
|
|
59
|
-
const winStems = [...new Set(splitSubtokens(win).map(stemToken))];
|
|
60
|
-
const wantStems = ctxTokens.map((t) => stemToken(t.toLowerCase()));
|
|
61
|
-
// Exact stem-equality unifies plural/verb variants; a prefix relation
|
|
62
|
-
// additionally bridges derivational forms (compact/compaction) without
|
|
63
|
-
// matching generic filler. Guard the bridge so a short generic line
|
|
64
|
-
// token can't satisfy a longer wanted token (impl~implementation,
|
|
65
|
-
// clas~classifier): require the shorter stem >=5 chars AND a
|
|
66
|
-
// shorter/longer length ratio >=0.6.
|
|
67
|
-
const prefixBridge = (s, w) => {
|
|
68
|
-
if (!(s.startsWith(w) || w.startsWith(s))) return false;
|
|
69
|
-
const short = Math.min(s.length, w.length);
|
|
70
|
-
const long = Math.max(s.length, w.length);
|
|
71
|
-
return short >= 5 && short / long >= 0.6;
|
|
72
|
-
};
|
|
73
|
-
const hitStem = (w) => winStems.some((s) => s === w || prefixBridge(s, w));
|
|
74
|
-
if (!wantStems.some(hitStem)) return false;
|
|
75
|
-
}
|
|
76
|
-
return true;
|
|
77
|
-
} catch { return false; }
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// High-fanout timing attribution: emit lightweight per-iteration send_ms
|
|
81
|
-
// loop rows (no verbose payload estimate) so we can split LLM send time
|
|
82
|
-
// from tool time under the parallel round below. Trace-only; no behavior
|
|
83
|
-
// or provider change.
|
|
84
|
-
if (!process.env.MIXDOG_AGENT_TRACE_TIMING) process.env.MIXDOG_AGENT_TRACE_TIMING = '1';
|
|
85
|
-
|
|
86
|
-
// Representative locator queries with ground truth: expect = substrings, at
|
|
87
|
-
// least one must appear in the anchor output (quality hit). expectFail = the
|
|
88
|
-
// correct answer is EXPLORATION_FAILED (miss discipline).
|
|
89
|
-
const QUERIES = [
|
|
90
|
-
{
|
|
91
|
-
q: 'where is the tool-call stall watchdog policy resolved and what defaults does it use',
|
|
92
|
-
expect: ['agent-progress-watchdog', 'stall-policy'],
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
q: 'session compact / smart compact trigger threshold logic',
|
|
96
|
-
expect: ['compact'],
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
q: 'where are hidden agent tool schema profiles defined (read / read-write-search)',
|
|
100
|
-
expect: ['agent-dispatch', 'agents.json', 'internal-agents'],
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
q: 'recall memory chunk importance scoring implementation',
|
|
104
|
-
expect: ['importance', 'memory'],
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
q: 'websocket reconnect backoff handling',
|
|
108
|
-
expect: ['openai-oauth-ws', 'retry-classifier'],
|
|
109
|
-
},
|
|
110
|
-
// ── extended set: symbol-exact, filename, error-string, korean, flow, config ──
|
|
111
|
-
{
|
|
112
|
-
q: 'buildExplorerPrompt definition', // exact known symbol
|
|
113
|
-
expect: ['explore-tool'],
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
q: 'where does the explore tool cache results and what is the TTL',
|
|
117
|
-
expect: ['explore-tool'],
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
q: 'error text "maintenance route unresolved for agent" — where is it thrown',
|
|
121
|
-
expect: ['agent-dispatch'],
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
q: '\uC5D0\uC774\uC804\uD2B8 \uC138\uC158\uC758 \uCD5C\uB300 \uB8E8\uD504 \uBC18\uBCF5 \uD69F\uC218\uB294 \uC5B4\uB514\uC11C \uC815\uD574\uC838?', // korean concept query
|
|
125
|
-
expect: ['agent-loop-policy'],
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
q: 'how does a fixed agent slot map to a workflow slot (explore/explorer)',
|
|
129
|
-
expect: ['session-runtime/workflow', 'FIXED_AGENT_SLOTS'],
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
q: 'where is the mixdog config json file path resolved (data dir)',
|
|
133
|
-
expect: ['config', 'plugin-paths'],
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
// path-only class: the correct answer is a verified file/dir location on
|
|
137
|
-
// disk; a bare path (no :line) is an allowed HIT for this query.
|
|
138
|
-
q: 'where does mixdog store background shell job stdout logs on disk',
|
|
139
|
-
expect: ['shell-jobs', 'shell-job-paths', 'getShellJobsDir', 'shellJobStdout'],
|
|
140
|
-
pathOnly: true,
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
q: 'GraphQL schema stitching resolver implementation', // not in this repo
|
|
144
|
-
expectFail: true,
|
|
145
|
-
},
|
|
146
|
-
];
|
|
147
|
-
|
|
148
|
-
function tracePath() {
|
|
149
|
-
return process.env.MIXDOG_AGENT_TRACE_PATH
|
|
150
|
-
|| join(process.env.MIXDOG_DATA_DIR || join(process.env.MIXDOG_HOME || join(homedir(), '.mixdog'), 'data'), 'history', 'agent-trace.jsonl');
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function readTraceSince(ts) {
|
|
154
|
-
const p = tracePath();
|
|
155
|
-
if (!existsSync(p)) return [];
|
|
156
|
-
const rows = [];
|
|
157
|
-
for (const line of readFileSync(p, 'utf8').split('\n')) {
|
|
158
|
-
if (!line) continue;
|
|
159
|
-
try {
|
|
160
|
-
const r = JSON.parse(line);
|
|
161
|
-
// Keep every row since ts; explorer-session attribution happens at
|
|
162
|
-
// aggregation time.
|
|
163
|
-
if (r.ts >= ts) rows.push(r);
|
|
164
|
-
} catch { /* skip */ }
|
|
165
|
-
}
|
|
166
|
-
return rows;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const t0 = Date.now();
|
|
170
|
-
// Parallel round: all queries fire at once. Per-session trace attribution is
|
|
171
|
-
// by session_id so counts stay correct; per-query ms includes queueing.
|
|
172
|
-
const results = await Promise.all(QUERIES.map(async ({ q, expect, expectFail, pathOnly }) => {
|
|
173
|
-
const qt0 = Date.now();
|
|
174
|
-
const res = await runExplore({ query: q, cwd: CWD }, { callerCwd: CWD });
|
|
175
|
-
const text = res?.content?.[0]?.text || '';
|
|
176
|
-
const aLines = anchorLinesOf(text);
|
|
177
|
-
const anchors = aLines.length;
|
|
178
|
-
const failed = /EXPLORATION_FAILED/.test(text);
|
|
179
|
-
// Context tokens for the fabricated-line guard: expanded expected + query
|
|
180
|
-
// words, length>=4 to drop filler.
|
|
181
|
-
const ctxTokens = [
|
|
182
|
-
...(expect || []).flatMap((e) => e.toLowerCase().split(/[^a-z0-9]+/)),
|
|
183
|
-
...q.toLowerCase().split(/[^a-z0-9]+/),
|
|
184
|
-
].filter((t) => t.length >= 4);
|
|
185
|
-
// Spot-check up to 2 anchors per query for file/line validity + line context.
|
|
186
|
-
let badAnchors = 0;
|
|
187
|
-
for (const l of aLines.slice(0, 2)) {
|
|
188
|
-
if (checkAnchorLine(l, ctxTokens) === false) badAnchors++;
|
|
189
|
-
}
|
|
190
|
-
const allLines = text.split('\n').filter((l) => l.trim());
|
|
191
|
-
// Strict hit: expected token must appear ON an anchor line (>=1 anchor). For
|
|
192
|
-
// the path-only class, an expected token on any verified path line HITs even
|
|
193
|
-
// without :line. expectFail wants EXPLORATION_FAILED with zero anchors.
|
|
194
|
-
const hit = expectFail
|
|
195
|
-
? (failed && anchors === 0)
|
|
196
|
-
: pathOnly
|
|
197
|
-
? (!failed && (expect || []).some(
|
|
198
|
-
(e) => allLines.some((l) => l.toLowerCase().includes(e.toLowerCase())),
|
|
199
|
-
))
|
|
200
|
-
: (!failed && anchors > 0 && (expect || []).some(
|
|
201
|
-
(e) => aLines.some((l) => l.toLowerCase().includes(e.toLowerCase())),
|
|
202
|
-
));
|
|
203
|
-
return { q: q.slice(0, 48), ms: Date.now() - qt0, anchors, failed, hit, badAnchors, bytes: text.length };
|
|
204
|
-
}));
|
|
205
|
-
|
|
206
|
-
// Identify explorer sessions from trace rows, then attribute both tool calls
|
|
207
|
-
// and LLM send time per session.
|
|
208
|
-
const rows = readTraceSince(t0);
|
|
209
|
-
const explorerSessions = new Set(
|
|
210
|
-
rows.filter((r) => r.agent === 'explorer').map((r) => r.session_id)
|
|
211
|
-
);
|
|
212
|
-
const bySession = new Map();
|
|
213
|
-
for (const r of rows) {
|
|
214
|
-
if (r.kind !== 'tool' || !explorerSessions.has(r.session_id)) continue;
|
|
215
|
-
const s = bySession.get(r.session_id) || { calls: 0, tools: [] };
|
|
216
|
-
s.calls++; s.tools.push(r.tool_name);
|
|
217
|
-
bySession.set(r.session_id, s);
|
|
218
|
-
}
|
|
219
|
-
const callCounts = [...bySession.values()].map((s) => s.calls).sort((a, b) => a - b);
|
|
220
|
-
const p50 = callCounts[Math.floor(callCounts.length / 2)] ?? 0;
|
|
221
|
-
|
|
222
|
-
// LLM send-time attribution from loop rows (kind='loop', send_ms), emitted
|
|
223
|
-
// under MIXDOG_AGENT_TRACE_TIMING. Under the parallel round, sends overlap
|
|
224
|
-
// wall time, so send/wall > 1 quantifies provider contention.
|
|
225
|
-
const sendBySession = new Map();
|
|
226
|
-
for (const r of rows) {
|
|
227
|
-
if (r.kind !== 'loop' || !explorerSessions.has(r.session_id)) continue;
|
|
228
|
-
const cur = sendBySession.get(r.session_id) || { sends: 0, ms: 0 };
|
|
229
|
-
cur.sends++; cur.ms += Number(r.send_ms) || 0;
|
|
230
|
-
sendBySession.set(r.session_id, cur);
|
|
231
|
-
}
|
|
232
|
-
const sendMsPer = [...sendBySession.values()].map((s) => s.ms).sort((a, b) => a - b);
|
|
233
|
-
const sendTotal = sendMsPer.reduce((a, b) => a + b, 0);
|
|
234
|
-
const sendP50 = sendMsPer[Math.floor(sendMsPer.length / 2)] ?? 0;
|
|
235
|
-
const sendMax = sendMsPer[sendMsPer.length - 1] ?? 0;
|
|
236
|
-
const sendCount = [...sendBySession.values()].reduce((a, s) => a + s.sends, 0);
|
|
237
|
-
|
|
238
|
-
console.log(`\n=== explore-bench round=${ROUND} ===`);
|
|
239
|
-
for (const r of results) {
|
|
240
|
-
console.log(` [${String(r.ms).padStart(6)}ms] ${r.hit ? 'HIT ' : 'MISS'} anchors=${r.anchors} bad=${r.badAnchors} failed=${r.failed} bytes=${r.bytes} ${r.q}`);
|
|
241
|
-
}
|
|
242
|
-
const badTotal = results.reduce((a, r) => a + r.badAnchors, 0);
|
|
243
|
-
console.log(` quality: ${results.filter((r) => r.hit).length}/${results.length} hits (strict) bad-anchors=${badTotal}`);
|
|
244
|
-
console.log(` sessions=${bySession.size} toolcalls p50=${p50} max=${callCounts[callCounts.length - 1] ?? 0} total=${callCounts.reduce((a, b) => a + b, 0)}`);
|
|
245
|
-
for (const [id, s] of bySession) console.log(` ${id.slice(-8)}: ${s.tools.join(',')}`);
|
|
246
|
-
const wallMs = Date.now() - t0;
|
|
247
|
-
console.log(` llm-send: sessions=${sendBySession.size} sends=${sendCount} ms/session p50=${sendP50} max=${sendMax} total=${sendTotal}`);
|
|
248
|
-
console.log(` wall total=${(wallMs / 1000).toFixed(1)}s send/wall=${wallMs > 0 ? (sendTotal / wallMs).toFixed(2) : '0.00'}x`);
|