mixdog 0.9.2 → 0.9.4
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/package.json +8 -3
- package/scripts/anthropic-maxtokens-test.mjs +119 -0
- package/scripts/bench/lead-review-tasks-r3.json +20 -0
- package/scripts/bench/lead-review-tasks.json +20 -0
- package/scripts/bench/r4-mixed-tasks.json +20 -0
- package/scripts/bench/review-tasks.json +20 -0
- package/scripts/bench/round-codex.json +114 -0
- package/scripts/bench/round-mixdog-lead-r3.json +269 -0
- package/scripts/bench/round-mixdog-lead.json +269 -0
- package/scripts/bench/round-mixdog.json +126 -0
- package/scripts/bench/round-r10-bigsample.json +679 -0
- package/scripts/bench/round-r11-codexalign.json +257 -0
- package/scripts/bench/round-r4-codex.json +114 -0
- package/scripts/bench/round-r4-mixed.json +225 -0
- package/scripts/bench/round-r5-gpt-lead.json +259 -0
- package/scripts/bench/round-r6-codex.json +114 -0
- package/scripts/bench/round-r6-solo.json +257 -0
- package/scripts/bench/round-r7-full.json +254 -0
- package/scripts/bench/round-r8-fulldefault.json +255 -0
- package/scripts/bench-run.mjs +215 -29
- package/scripts/build-tui.mjs +13 -1
- package/scripts/explore-bench.mjs +124 -0
- package/scripts/freevar-smoke.mjs +95 -0
- package/scripts/hook-bus-test.mjs +191 -0
- package/scripts/internal-comms-bench.mjs +1 -0
- package/scripts/internal-comms-smoke.mjs +10 -9
- package/scripts/mouse-probe.mjs +45 -0
- package/scripts/output-style-bench.mjs +13 -6
- package/scripts/output-style-smoke.mjs +4 -4
- package/scripts/path-suffix-test.mjs +57 -0
- package/scripts/provider-toolcall-test.mjs +7 -3
- package/scripts/recall-bench.mjs +207 -0
- package/scripts/recall-usecase-cases.json +18 -0
- package/scripts/recall-usecase-probe.json +6 -0
- package/scripts/session-bench.mjs +152 -6
- package/scripts/tool-smoke.mjs +30 -67
- package/scripts/tui-render-smoke.mjs +90 -0
- package/scripts/webhook-smoke.mjs +208 -0
- package/src/agents/debugger/AGENT.md +5 -2
- package/src/agents/heavy-worker/AGENT.md +21 -11
- package/src/agents/maintainer/AGENT.md +4 -0
- package/src/agents/reviewer/AGENT.md +3 -2
- package/src/agents/worker/AGENT.md +21 -11
- package/src/lib/rules-builder.cjs +4 -0
- package/src/mixdog-session-runtime.mjs +933 -3731
- package/src/output-styles/default.md +34 -9
- package/src/output-styles/{oneline.md → extreme-minimal.md} +5 -4
- package/src/output-styles/minimal.md +4 -1
- package/src/output-styles/simple.md +22 -7
- package/src/repl.mjs +5 -5
- package/src/rules/agent/00-common.md +2 -0
- package/src/rules/agent/30-explorer.md +8 -11
- package/src/rules/lead/lead-brief.md +12 -0
- package/src/rules/lead/lead-tool.md +2 -9
- package/src/rules/shared/01-tool.md +11 -5
- package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +25 -0
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +100 -23
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +6 -15
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +362 -0
- package/src/runtime/agent/orchestrator/agent-trace-io.mjs +410 -0
- package/src/runtime/agent/orchestrator/agent-trace.mjs +16 -735
- package/src/runtime/agent/orchestrator/config.mjs +69 -2
- package/src/runtime/agent/orchestrator/context/collect.mjs +51 -0
- package/src/runtime/agent/orchestrator/mcp/client.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +63 -21
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +93 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +209 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +489 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +97 -1343
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +607 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +78 -10
- package/src/runtime/agent/orchestrator/providers/api-usage.mjs +1 -13
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +81 -0
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +248 -0
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +303 -0
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +505 -0
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +44 -1014
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +18 -4
- package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +32 -0
- package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +86 -11
- package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +348 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +54 -20
- package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +108 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +19 -12
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +58 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +368 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +760 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +41 -1142
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +732 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +193 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +303 -2119
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +140 -995
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +227 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-events.mjs +67 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +436 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +1105 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +38 -12
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +7 -8
- package/src/runtime/agent/orchestrator/session/compact/budget.mjs +288 -0
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +85 -0
- package/src/runtime/agent/orchestrator/session/compact/engine.mjs +749 -0
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +82 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +315 -0
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +643 -0
- package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +326 -0
- package/src/runtime/agent/orchestrator/session/compact.mjs +40 -2282
- package/src/runtime/agent/orchestrator/session/loop/compact-debug.mjs +28 -0
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +274 -0
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +61 -0
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +38 -0
- package/src/runtime/agent/orchestrator/session/loop/env.mjs +14 -0
- package/src/runtime/agent/orchestrator/session/loop/hidden-agents.mjs +21 -0
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +47 -0
- package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +182 -0
- package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +173 -0
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +63 -0
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +100 -0
- package/src/runtime/agent/orchestrator/session/loop/termination.mjs +58 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +52 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +239 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +218 -0
- package/src/runtime/agent/orchestrator/session/loop/transcript-repair.mjs +101 -0
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +35 -0
- package/src/runtime/agent/orchestrator/session/loop.mjs +409 -1304
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +471 -0
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +230 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +235 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +149 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +155 -0
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +406 -0
- package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +80 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +303 -0
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +210 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +226 -2114
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +189 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +74 -179
- package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +70 -20
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +22 -2
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +33 -42
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +241 -0
- package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +40 -0
- package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +42 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +11 -4
- package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +29 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +8 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +126 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +81 -87
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +161 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +108 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +78 -304
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +11 -6
- package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +303 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +43 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +382 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +551 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +295 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-model.mjs +158 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/keyword-match.mjs +82 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/lang-predicates.mjs +128 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/memory-cache.mjs +66 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/project-root.mjs +44 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1080 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/source-access.mjs +81 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/span.mjs +19 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +280 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +45 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +347 -0
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +36 -4277
- package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/patch/constants.mjs +9 -0
- package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +171 -0
- package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +471 -0
- package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +436 -0
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +342 -0
- package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +359 -0
- package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +340 -0
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +643 -0
- package/src/runtime/agent/orchestrator/tools/patch.mjs +36 -2959
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +1 -23
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +10 -74
- package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +77 -0
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +2 -4
- package/src/runtime/agent/orchestrator/tools/shell-state.mjs +154 -0
- package/src/runtime/channels/backends/discord-access.mjs +32 -0
- package/src/runtime/channels/backends/discord-attachments.mjs +65 -0
- package/src/runtime/channels/backends/discord-gateway.mjs +233 -0
- package/src/runtime/channels/backends/discord.mjs +12 -292
- package/src/runtime/channels/index.mjs +241 -894
- package/src/runtime/channels/lib/backend-dispatch.mjs +44 -0
- package/src/runtime/channels/lib/boot-profile.mjs +23 -0
- package/src/runtime/channels/lib/crash-log.mjs +106 -0
- package/src/runtime/channels/lib/event-pipeline.mjs +18 -1
- package/src/runtime/channels/lib/event-queue.mjs +63 -4
- package/src/runtime/channels/lib/inbound-routing.mjs +111 -0
- package/src/runtime/channels/lib/index-drop-trace.mjs +72 -0
- package/src/runtime/channels/lib/output-forwarder.mjs +9 -1
- package/src/runtime/channels/lib/owner-heartbeat.mjs +75 -0
- package/src/runtime/channels/lib/parent-bridge.mjs +88 -0
- package/src/runtime/channels/lib/runtime-paths.mjs +14 -4
- package/src/runtime/channels/lib/session-discovery.mjs +56 -4
- package/src/runtime/channels/lib/telegram-format.mjs +19 -22
- package/src/runtime/channels/lib/tool-dispatch.mjs +158 -0
- package/src/runtime/channels/lib/tool-format.mjs +1 -1
- package/src/runtime/channels/lib/transcript-discovery.mjs +4 -4
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +6 -3
- package/src/runtime/channels/lib/voice-transcription.mjs +179 -0
- package/src/runtime/channels/lib/webhook/deliveries.mjs +312 -0
- package/src/runtime/channels/lib/webhook/log.mjs +42 -0
- package/src/runtime/channels/lib/webhook/ngrok.mjs +181 -0
- package/src/runtime/channels/lib/webhook/signature.mjs +60 -0
- package/src/runtime/channels/lib/webhook.mjs +36 -570
- package/src/runtime/channels/lib/whisper-language.mjs +42 -0
- package/src/runtime/channels/tool-defs.mjs +11 -130
- package/src/runtime/memory/index.mjs +258 -2050
- package/src/runtime/memory/lib/core-memory-store.mjs +351 -1
- package/src/runtime/memory/lib/cycle-llm-adapters.mjs +58 -0
- package/src/runtime/memory/lib/cycle-scheduler.mjs +497 -0
- package/src/runtime/memory/lib/cycle-signatures.mjs +34 -0
- package/src/runtime/memory/lib/embedding-warmup.mjs +58 -0
- package/src/runtime/memory/lib/http-wire.mjs +57 -0
- package/src/runtime/memory/lib/memory-config-flags.mjs +91 -0
- package/src/runtime/memory/lib/memory-cycle.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle2-gate.mjs +515 -0
- package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +324 -0
- package/src/runtime/memory/lib/memory-cycle2-shared.mjs +18 -0
- package/src/runtime/memory/lib/memory-cycle2.mjs +72 -837
- package/src/runtime/memory/lib/memory-embed.mjs +149 -0
- package/src/runtime/memory/lib/memory-process-lock.mjs +162 -0
- package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +24 -0
- package/src/runtime/memory/lib/memory-recall-store.mjs +22 -2
- package/src/runtime/memory/lib/memory-retrievers.mjs +8 -0
- package/src/runtime/memory/lib/memory.mjs +20 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +1 -1
- package/src/runtime/memory/lib/promotion-fingerprint.mjs +50 -0
- package/src/runtime/memory/lib/query-handlers.mjs +780 -0
- package/src/runtime/memory/lib/recall-format.mjs +238 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +8 -3
- package/src/runtime/memory/lib/transcript-ingest.mjs +425 -0
- package/src/runtime/memory/tool-defs.mjs +6 -14
- package/src/runtime/search/lib/http-fetch.mjs +274 -0
- package/src/runtime/search/lib/ssrf-guard.mjs +333 -0
- package/src/runtime/search/lib/web-tools.mjs +24 -602
- package/src/runtime/shared/abort-controller.mjs +1 -1
- package/src/runtime/shared/atomic-file.mjs +26 -1
- package/src/runtime/shared/background-tasks.mjs +2 -3
- package/src/runtime/shared/buffered-appender.mjs +149 -0
- package/src/runtime/shared/launcher-control.mjs +2 -2
- package/src/runtime/shared/task-notification-envelope.mjs +98 -0
- package/src/runtime/shared/tool-execution-contract.mjs +2 -2
- package/src/runtime/shared/tool-primitives.mjs +308 -0
- package/src/runtime/shared/tool-result-summary.mjs +515 -0
- package/src/runtime/shared/tool-surface.mjs +80 -898
- package/src/runtime/shared/transcript-writer.mjs +52 -2
- package/src/runtime/shared/update-checker.mjs +7 -4
- package/src/session-runtime/config-helpers.mjs +291 -0
- package/src/session-runtime/config-lifecycle.mjs +232 -0
- package/src/session-runtime/cwd-plugins.mjs +226 -0
- package/src/session-runtime/effort.mjs +128 -0
- package/src/session-runtime/fs-utils.mjs +10 -0
- package/src/session-runtime/mcp-glue.mjs +177 -0
- package/src/session-runtime/model-capabilities.mjs +130 -0
- package/src/session-runtime/model-recency.mjs +111 -0
- package/src/session-runtime/native-search.mjs +247 -0
- package/src/session-runtime/output-styles.mjs +126 -0
- package/src/session-runtime/plugin-mcp.mjs +114 -0
- package/src/session-runtime/prewarm.mjs +142 -0
- package/src/session-runtime/provider-models.mjs +278 -0
- package/src/session-runtime/provider-usage.mjs +120 -0
- package/src/session-runtime/quick-model-rows.mjs +170 -0
- package/src/session-runtime/quick-search-models.mjs +46 -0
- package/src/session-runtime/session-hooks.mjs +93 -0
- package/src/session-runtime/session-text.mjs +100 -0
- package/src/session-runtime/settings-api.mjs +319 -0
- package/src/session-runtime/statusline-route.mjs +35 -0
- package/src/session-runtime/tool-catalog.mjs +720 -0
- package/src/session-runtime/tool-defs.mjs +84 -0
- package/src/session-runtime/warmup-schedulers.mjs +201 -0
- package/src/session-runtime/workflow.mjs +358 -0
- package/src/standalone/agent-tool/helpers.mjs +237 -0
- package/src/standalone/agent-tool/notify.mjs +107 -0
- package/src/standalone/agent-tool/provider-init.mjs +143 -0
- package/src/standalone/agent-tool/render.mjs +152 -0
- package/src/standalone/agent-tool/tool-def.mjs +55 -0
- package/src/standalone/agent-tool.mjs +155 -677
- package/src/standalone/channel-worker.mjs +7 -9
- package/src/standalone/explore-tool.mjs +40 -12
- package/src/standalone/hook-bus/config.mjs +207 -0
- package/src/standalone/hook-bus/constants.mjs +90 -0
- package/src/standalone/hook-bus/handlers.mjs +481 -0
- package/src/standalone/hook-bus/payload.mjs +31 -0
- package/src/standalone/hook-bus/rules.mjs +77 -0
- package/src/standalone/hook-bus.mjs +110 -746
- package/src/standalone/memory-runtime-proxy.mjs +7 -0
- package/src/standalone/opencode-go-login.mjs +125 -0
- package/src/standalone/provider-admin.mjs +15 -19
- package/src/standalone/usage-dashboard.mjs +3 -1
- package/src/tui/App.jsx +1163 -7571
- package/src/tui/app/app-format.mjs +206 -0
- package/src/tui/app/channel-pickers.mjs +510 -0
- package/src/tui/app/clipboard.mjs +67 -0
- package/src/tui/app/core-memory-picker.mjs +210 -0
- package/src/tui/app/extension-pickers.mjs +506 -0
- package/src/tui/app/input-parsers.mjs +193 -0
- package/src/tui/app/maintenance-pickers.mjs +324 -0
- package/src/tui/app/model-options.mjs +330 -0
- package/src/tui/app/model-picker.mjs +365 -0
- package/src/tui/app/onboarding-steps.mjs +400 -0
- package/src/tui/app/project-picker.mjs +247 -0
- package/src/tui/app/provider-setup-picker.mjs +580 -0
- package/src/tui/app/resume-picker.mjs +55 -0
- package/src/tui/app/route-pickers.mjs +419 -0
- package/src/tui/app/settings-picker.mjs +490 -0
- package/src/tui/app/slash-commands.mjs +101 -0
- package/src/tui/app/slash-dispatch.mjs +427 -0
- package/src/tui/app/text-layout.mjs +46 -0
- package/src/tui/app/theme-effort-pickers.mjs +154 -0
- package/src/tui/app/transcript-window.mjs +671 -0
- package/src/tui/app/use-mouse-input.mjs +460 -0
- package/src/tui/app/use-prompt-handlers.mjs +310 -0
- package/src/tui/app/use-transcript-scroll.mjs +510 -0
- package/src/tui/app/use-transcript-window.mjs +589 -0
- package/src/tui/components/ConfirmBar.jsx +1 -1
- package/src/tui/components/Picker.jsx +32 -4
- package/src/tui/components/PromptInput.jsx +259 -80
- package/src/tui/components/SlashCommandPalette.jsx +8 -1
- package/src/tui/components/StatusLine.jsx +63 -12
- package/src/tui/components/TextEntryPanel.jsx +11 -0
- package/src/tui/components/ToolExecution.jsx +56 -588
- package/src/tui/components/TranscriptItem.jsx +105 -0
- package/src/tui/components/UsagePanel.jsx +18 -4
- package/src/tui/components/prompt-input/edit-helpers.mjs +72 -0
- package/src/tui/components/prompt-input/voice-indicator.mjs +39 -0
- package/src/tui/components/tool-execution/ResultBody.jsx +56 -0
- package/src/tui/components/tool-execution/surface-detail.mjs +405 -0
- package/src/tui/components/tool-execution/text-format.mjs +161 -0
- package/src/tui/components/tool-output-format.mjs +2 -2
- package/src/tui/display-width.mjs +20 -3
- package/src/tui/dist/index.mjs +18034 -17188
- package/src/tui/engine/agent-envelope.mjs +296 -0
- package/src/tui/engine/agent-job-feed.mjs +133 -0
- package/src/tui/engine/boot-profile.mjs +21 -0
- package/src/tui/engine/labels.mjs +67 -0
- package/src/tui/engine/notice-text.mjs +112 -0
- package/src/tui/engine/notification-plan.mjs +76 -0
- package/src/tui/engine/queue-helpers.mjs +161 -0
- package/src/tui/engine/render-timing.mjs +17 -0
- package/src/tui/engine/session-stats.mjs +46 -0
- package/src/tui/engine/tool-approval.mjs +94 -0
- package/src/tui/engine/tool-call-fields.mjs +23 -0
- package/src/tui/engine/tool-card-results.mjs +234 -0
- package/src/tui/engine/tool-result-status.mjs +135 -0
- package/src/tui/engine/tool-result-text.mjs +126 -0
- package/src/tui/engine.mjs +405 -1385
- package/src/tui/figures.mjs +5 -0
- package/src/tui/index.jsx +105 -0
- package/src/tui/input-editing.mjs +60 -10
- package/src/tui/keyboard-protocol.mjs +2 -2
- package/src/tui/lib/voice-recorder.mjs +35 -19
- package/src/tui/markdown/format-token.mjs +11 -9
- package/src/tui/paste-attachments.mjs +38 -0
- package/src/tui/statusline-ansi-bridge.mjs +11 -3
- package/src/tui/theme.mjs +6 -0
- package/src/tui/themes/base.mjs +2 -2
- package/src/tui/themes/kanagawa.mjs +4 -4
- package/src/tui/themes/teal.mjs +4 -5
- package/src/tui/themes/utils.mjs +1 -1
- package/src/ui/statusline-agents.mjs +213 -0
- package/src/ui/statusline-format.mjs +146 -0
- package/src/ui/statusline-segments.mjs +148 -0
- package/src/ui/statusline.mjs +77 -462
- package/src/ui/tool-card.mjs +0 -1
- package/src/vendor/statusline/bin/statusline-route.mjs +15 -2
- package/src/workflows/default/WORKFLOW.md +16 -9
- package/src/workflows/sequential/WORKFLOW.md +16 -11
- package/src/workflows/solo/WORKFLOW.md +5 -1
- package/vendor/ink/build/display-width.js +19 -3
- package/vendor/ink/build/ink.js +103 -6
- package/vendor/ink/build/log-update.js +17 -3
- package/vendor/ink/build/wrap-text.js +125 -0
- package/scripts/_test-folder-dialog.mjs +0 -30
- package/scripts/fix-brief-fn.mjs +0 -35
- package/scripts/fix-format-tool-surface.mjs +0 -24
- package/scripts/fix-tool-exec-visible.mjs +0 -42
- package/scripts/patch-agent-brief.mjs +0 -48
- package/scripts/patch-app.mjs +0 -21
- package/scripts/patch-app2.mjs +0 -18
- package/scripts/patch-dist-brief.mjs +0 -96
- package/scripts/patch-tool-exec.mjs +0 -70
- package/src/examples/schedules/SCHEDULE.example.md +0 -32
- package/src/examples/webhooks/WEBHOOK.example.md +0 -40
- package/src/runtime/agent/orchestrator/session/manager.reactive-persist.test.mjs +0 -107
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.test.mjs +0 -143
- package/src/runtime/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -285
- package/src/runtime/agent/orchestrator/tools/builtin/open-config-tool.mjs +0 -26
- package/src/runtime/shared/channel-notification-routing.test.mjs +0 -45
- package/src/runtime/shared/tool-execution-contract.test.mjs +0 -183
- package/src/standalone/agent-task-status.test.mjs +0 -76
- package/src/tui/components/tool-output-format.test.mjs +0 -399
- package/src/tui/display-width.test.mjs +0 -35
- package/src/tui/engine-runtime-notification.test.mjs +0 -115
- package/src/tui/engine-tool-result-text.test.mjs +0 -75
- package/src/tui/markdown/format-token.test.mjs +0 -354
- package/src/tui/markdown/render-ansi.test.mjs +0 -108
- package/src/tui/markdown/stream-fence.test.mjs +0 -26
- package/src/tui/markdown/streaming-markdown.test.mjs +0 -70
- package/src/tui/prompt-history-store.test.mjs +0 -52
- package/src/tui/statusline-ansi-bridge.test.mjs +0 -159
- package/src/tui/transcript-tool-failures.test.mjs +0 -111
- package/src/ui/markdown.test.mjs +0 -70
- package/src/ui/statusline-context-label.test.mjs +0 -15
- package/src/vendor/statusline/bin/statusline-lib.mjs +0 -186
- package/src/vendor/statusline/bin/statusline-route.test.mjs +0 -80
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
// Graph build orchestration: worker-thread async build (buildCodeGraphAsync),
|
|
2
|
+
// synchronous _buildCodeGraph (imported by the prewarm worker), and the
|
|
3
|
+
// prewarm entry points. Owns the in-flight single-flight map. Extracted
|
|
4
|
+
// verbatim from code-graph.mjs.
|
|
5
|
+
//
|
|
6
|
+
// SELF-REFERENTIAL DYNAMIC IMPORT: buildCodeGraphAsync spawns the prewarm
|
|
7
|
+
// worker via `new URL('../code-graph-prewarm-worker.mjs', import.meta.url)`.
|
|
8
|
+
// That worker in turn does `import { _buildCodeGraph } from '../code-graph.mjs'`
|
|
9
|
+
// (the facade), which re-exports _buildCodeGraph from THIS module. The worker
|
|
10
|
+
// path is unchanged relative to the facade, so it keeps importing the facade —
|
|
11
|
+
// no module imports its own path. The URL below is resolved against THIS
|
|
12
|
+
// module's dir (tools/code-graph/), so it walks one level up to reach the
|
|
13
|
+
// worker at tools/.
|
|
14
|
+
import { resolve as pathResolve } from 'node:path';
|
|
15
|
+
import { Worker } from 'node:worker_threads';
|
|
16
|
+
import { acquire as acquireChildSpawnSlot } from '../../../../shared/child-spawn-gate.mjs';
|
|
17
|
+
import {
|
|
18
|
+
canonicalGraphCwd as _canonicalGraphCwd,
|
|
19
|
+
codeGraphCache as _codeGraphCache,
|
|
20
|
+
consumeCodeGraphDirtyPaths as _consumeCodeGraphDirtyPaths,
|
|
21
|
+
getCodeGraphGen as _getCodeGraphGen,
|
|
22
|
+
} from '../code-graph-state.mjs';
|
|
23
|
+
import {
|
|
24
|
+
CODE_GRAPH_TTL_MS,
|
|
25
|
+
CODE_GRAPH_MAX_FILES,
|
|
26
|
+
CODE_GRAPH_WORKER_TIMEOUT_MS,
|
|
27
|
+
SYMBOL_SCHEMA_VERSION,
|
|
28
|
+
} from './constants.mjs';
|
|
29
|
+
import {
|
|
30
|
+
_computeGraphSignature,
|
|
31
|
+
_deserializeGraph,
|
|
32
|
+
_attachGraphRuntimeCaches,
|
|
33
|
+
} from './graph-model.mjs';
|
|
34
|
+
import { _touchCodeGraphCache, _setCodeGraphCache } from './memory-cache.mjs';
|
|
35
|
+
import {
|
|
36
|
+
ensureDiskCodeGraphLoaded,
|
|
37
|
+
getDiskCodeGraphEntry,
|
|
38
|
+
_setDiskCodeGraphEntry,
|
|
39
|
+
} from './disk-cache.mjs';
|
|
40
|
+
import {
|
|
41
|
+
_runGraphManifest,
|
|
42
|
+
_runGraphWalk,
|
|
43
|
+
_runGraphFiles,
|
|
44
|
+
_fileInfoFromRustRecord,
|
|
45
|
+
_reuseFileInfo,
|
|
46
|
+
} from './graph-binary.mjs';
|
|
47
|
+
import { _lookupCandidateNodes } from './symbol-index.mjs';
|
|
48
|
+
import { _findDirProjectRoot } from './project-root.mjs';
|
|
49
|
+
|
|
50
|
+
// In-flight async builds keyed by canonical graphCwd. Same-cwd parallel
|
|
51
|
+
// callers (prewarm + cache-miss + multiple find_symbol) share one Worker
|
|
52
|
+
// spawn instead of fanning out. Entry removed on settle so the next caller
|
|
53
|
+
// after a failure can retry.
|
|
54
|
+
const _inflightAsyncBuilds = new Map();
|
|
55
|
+
|
|
56
|
+
export function prewarmCodeGraph(cwd) {
|
|
57
|
+
if (!cwd) return;
|
|
58
|
+
// Reuse the buildCodeGraphAsync single-flight path. Fire-and-forget.
|
|
59
|
+
buildCodeGraphAsync(cwd).catch(() => { /* best-effort */ });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function prewarmCodeGraphSymbols(cwd, symbols, { language = null } = {}) {
|
|
63
|
+
if (!cwd) return;
|
|
64
|
+
const wanted = (Array.isArray(symbols) ? symbols : [symbols])
|
|
65
|
+
.map((s) => String(s || '').trim())
|
|
66
|
+
.filter(Boolean);
|
|
67
|
+
buildCodeGraphAsync(cwd).then((graph) => {
|
|
68
|
+
if (!graph) return;
|
|
69
|
+
for (const symbol of wanted) {
|
|
70
|
+
try { _lookupCandidateNodes(graph, symbol, language); } catch { /* best-effort */ }
|
|
71
|
+
}
|
|
72
|
+
}).catch(() => { /* best-effort */ });
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function prewarmCodeGraphIfProject(cwd) {
|
|
76
|
+
if (!cwd) return false;
|
|
77
|
+
const root = _findDirProjectRoot(cwd);
|
|
78
|
+
if (!root) return false;
|
|
79
|
+
prewarmCodeGraph(root);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function buildCodeGraphAsync(cwd, signal = null) {
|
|
84
|
+
if (signal?.aborted) throw new Error('aborted');
|
|
85
|
+
const graphCwd = _canonicalGraphCwd(cwd);
|
|
86
|
+
const cached = _codeGraphCache.get(graphCwd);
|
|
87
|
+
if (cached?.graph && Date.now() - cached.ts < CODE_GRAPH_TTL_MS) {
|
|
88
|
+
_touchCodeGraphCache(graphCwd);
|
|
89
|
+
return cached.graph;
|
|
90
|
+
}
|
|
91
|
+
const existing = _inflightAsyncBuilds.get(graphCwd);
|
|
92
|
+
if (existing) {
|
|
93
|
+
if (!signal) return existing;
|
|
94
|
+
let onAbort = null;
|
|
95
|
+
const abortP = new Promise((_, reject) => {
|
|
96
|
+
onAbort = () => reject(new Error('aborted'));
|
|
97
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
98
|
+
});
|
|
99
|
+
const cleanup = () => {
|
|
100
|
+
if (onAbort) {
|
|
101
|
+
try { signal.removeEventListener('abort', onAbort); } catch {}
|
|
102
|
+
onAbort = null;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
return Promise.race([existing, abortP]).then(
|
|
106
|
+
(v) => { cleanup(); return v; },
|
|
107
|
+
(e) => { cleanup(); throw e; },
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
const _genAtStart = _getCodeGraphGen(graphCwd);
|
|
111
|
+
let _worker = null;
|
|
112
|
+
const promise = new Promise((resolve, reject) => {
|
|
113
|
+
let settled = false;
|
|
114
|
+
let timeout = null;
|
|
115
|
+
let _onSignalAbort = null;
|
|
116
|
+
let _releaseSlot = null;
|
|
117
|
+
const settle = (val) => {
|
|
118
|
+
if (settled) return;
|
|
119
|
+
settled = true;
|
|
120
|
+
if (timeout) { clearTimeout(timeout); timeout = null; }
|
|
121
|
+
if (_onSignalAbort && signal) {
|
|
122
|
+
try { signal.removeEventListener('abort', _onSignalAbort); } catch {}
|
|
123
|
+
_onSignalAbort = null;
|
|
124
|
+
}
|
|
125
|
+
if (_releaseSlot) { try { _releaseSlot(); } catch {} _releaseSlot = null; }
|
|
126
|
+
_inflightAsyncBuilds.delete(graphCwd);
|
|
127
|
+
if (val instanceof Error) reject(val);
|
|
128
|
+
else resolve(val);
|
|
129
|
+
};
|
|
130
|
+
acquireChildSpawnSlot(signal || null).then((release) => {
|
|
131
|
+
_releaseSlot = release;
|
|
132
|
+
if (settled) { release(); _releaseSlot = null; return; }
|
|
133
|
+
const workerUrl = new URL('../code-graph-prewarm-worker.mjs', import.meta.url);
|
|
134
|
+
_worker = new Worker(workerUrl, {
|
|
135
|
+
workerData: { cwd },
|
|
136
|
+
execArgv: [],
|
|
137
|
+
});
|
|
138
|
+
const w = _worker;
|
|
139
|
+
timeout = setTimeout(() => {
|
|
140
|
+
try { _worker?.terminate(); } catch {}
|
|
141
|
+
settle(new Error(`code-graph worker timed out after ${CODE_GRAPH_WORKER_TIMEOUT_MS}ms for cwd=${graphCwd}`));
|
|
142
|
+
}, CODE_GRAPH_WORKER_TIMEOUT_MS);
|
|
143
|
+
timeout.unref?.();
|
|
144
|
+
if (signal) {
|
|
145
|
+
_onSignalAbort = () => {
|
|
146
|
+
try { _worker?.terminate(); } catch {}
|
|
147
|
+
settle(new Error('aborted'));
|
|
148
|
+
};
|
|
149
|
+
signal.addEventListener('abort', _onSignalAbort, { once: true });
|
|
150
|
+
}
|
|
151
|
+
w.once('message', (msg) => {
|
|
152
|
+
try {
|
|
153
|
+
if (msg && msg.ok && msg.graph && typeof msg.signature === 'string') {
|
|
154
|
+
if (_getCodeGraphGen(graphCwd) === _genAtStart) {
|
|
155
|
+
_setCodeGraphCache(graphCwd, { ts: Date.now(), signature: msg.signature, graph: msg.graph });
|
|
156
|
+
_setDiskCodeGraphEntry(graphCwd, msg.graph);
|
|
157
|
+
}
|
|
158
|
+
settle(msg.graph);
|
|
159
|
+
} else {
|
|
160
|
+
settle(new Error('code-graph prewarm worker failed'));
|
|
161
|
+
}
|
|
162
|
+
} catch (e) { settle(e instanceof Error ? e : new Error(String(e))); }
|
|
163
|
+
});
|
|
164
|
+
w.once('error', (e) => settle(e instanceof Error ? e : new Error(String(e))));
|
|
165
|
+
}, (e) => settle(e instanceof Error ? e : new Error(String(e))));
|
|
166
|
+
});
|
|
167
|
+
_inflightAsyncBuilds.set(graphCwd, promise);
|
|
168
|
+
return promise;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Internal — exported (via the facade) solely for code-graph-prewarm-worker.mjs
|
|
173
|
+
* to import. NOT part of the public API. External callers should use
|
|
174
|
+
* buildCodeGraphAsync (worker-thread isolated) or the code_graph / find_symbol
|
|
175
|
+
* tools, never this synchronous form on the main event loop.
|
|
176
|
+
*/
|
|
177
|
+
export async function _buildCodeGraph(cwd) {
|
|
178
|
+
const now = Date.now();
|
|
179
|
+
let _tp = performance.now();
|
|
180
|
+
const _trace = (label) => { if (process.env.MIXDOG_GRAPH_TRACE) { const n = performance.now(); process.stderr.write(`[cg-trace] ${label}=${(n - _tp).toFixed(0)}ms\n`); _tp = n; } };
|
|
181
|
+
const graphCwd = _canonicalGraphCwd(cwd);
|
|
182
|
+
const absRoot = graphCwd;
|
|
183
|
+
const _genAtStart = _getCodeGraphGen(graphCwd);
|
|
184
|
+
const cached = _codeGraphCache.get(graphCwd);
|
|
185
|
+
let previousGraph = cached?.graph || null;
|
|
186
|
+
_consumeCodeGraphDirtyPaths(graphCwd);
|
|
187
|
+
|
|
188
|
+
// 1. Change-detect via Rust --manifest (fp/rel/size only, no parse).
|
|
189
|
+
const manifest = await _runGraphManifest(absRoot);
|
|
190
|
+
const signature = _computeGraphSignature(manifest);
|
|
191
|
+
_trace('manifest+sig');
|
|
192
|
+
const truncated = manifest.length > CODE_GRAPH_MAX_FILES;
|
|
193
|
+
const indexed = truncated ? manifest.slice(0, CODE_GRAPH_MAX_FILES) : manifest;
|
|
194
|
+
|
|
195
|
+
// 2. Memory cache hit.
|
|
196
|
+
if (cached && cached.signature === signature && now - cached.ts < CODE_GRAPH_TTL_MS) {
|
|
197
|
+
_touchCodeGraphCache(graphCwd);
|
|
198
|
+
return cached.graph;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// 3. Disk cache hit.
|
|
202
|
+
ensureDiskCodeGraphLoaded(now);
|
|
203
|
+
const diskEntry = getDiskCodeGraphEntry(graphCwd);
|
|
204
|
+
if (diskEntry?.signature === signature) {
|
|
205
|
+
const graph = _deserializeGraph(graphCwd, diskEntry);
|
|
206
|
+
if (graph) {
|
|
207
|
+
if (_getCodeGraphGen(graphCwd) === _genAtStart) {
|
|
208
|
+
_setCodeGraphCache(graphCwd, { ts: now, signature, graph });
|
|
209
|
+
}
|
|
210
|
+
return graph;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (!previousGraph && diskEntry) previousGraph = _deserializeGraph(graphCwd, diskEntry);
|
|
214
|
+
if (previousGraph && previousGraph.schemaVersion !== SYMBOL_SCHEMA_VERSION) {
|
|
215
|
+
previousGraph = null;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// 4. Build fileInfos. Reuse unchanged nodes by fp; parse the rest in Rust.
|
|
219
|
+
const reusable = [];
|
|
220
|
+
const freshRels = [];
|
|
221
|
+
for (const meta of indexed) {
|
|
222
|
+
const previousNode = previousGraph?.nodes?.get(meta.rel) || null;
|
|
223
|
+
if (previousNode && previousNode.fingerprint === meta.fp) {
|
|
224
|
+
reusable.push(_reuseFileInfo(previousNode, previousGraph, absRoot));
|
|
225
|
+
} else {
|
|
226
|
+
freshRels.push(meta.rel);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
let fileInfos;
|
|
230
|
+
if (freshRels.length === 0) {
|
|
231
|
+
fileInfos = reusable;
|
|
232
|
+
} else if (reusable.length > 0 && freshRels.length <= 256) {
|
|
233
|
+
const recs = await _runGraphFiles(absRoot, freshRels, reusable);
|
|
234
|
+
const reusedByRel = new Map(reusable.map((info) => [info.rel, info]));
|
|
235
|
+
const freshSet = new Set(freshRels);
|
|
236
|
+
fileInfos = [...reusable];
|
|
237
|
+
for (const rec of recs) {
|
|
238
|
+
if (freshSet.has(rec.rel)) {
|
|
239
|
+
fileInfos.push(_fileInfoFromRustRecord(rec, absRoot));
|
|
240
|
+
} else {
|
|
241
|
+
const reusedInfo = reusedByRel.get(rec.rel);
|
|
242
|
+
if (!reusedInfo) continue;
|
|
243
|
+
const resolved = Array.isArray(rec.resolvedImports)
|
|
244
|
+
? rec.resolvedImports.filter((v) => typeof v === 'string')
|
|
245
|
+
: [];
|
|
246
|
+
reusedInfo.resolvedImports = resolved;
|
|
247
|
+
if (Array.isArray(rec.importedBy)) {
|
|
248
|
+
reusedInfo.importedBy = rec.importedBy.filter((v) => typeof v === 'string');
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
} else {
|
|
253
|
+
let recs = await _runGraphWalk(absRoot);
|
|
254
|
+
if (recs.length > CODE_GRAPH_MAX_FILES) recs = recs.slice(0, CODE_GRAPH_MAX_FILES);
|
|
255
|
+
fileInfos = recs.map((rec) => _fileInfoFromRustRecord(rec, absRoot));
|
|
256
|
+
}
|
|
257
|
+
_trace('walk+parse');
|
|
258
|
+
const nodes = new Map();
|
|
259
|
+
const reverse = new Map();
|
|
260
|
+
for (const info of fileInfos) {
|
|
261
|
+
const resolvedImportsRel = Array.isArray(info.resolvedImports) ? info.resolvedImports : [];
|
|
262
|
+
const importedBy = Array.isArray(info.importedBy) ? info.importedBy : [];
|
|
263
|
+
const node = {
|
|
264
|
+
abs: info.abs,
|
|
265
|
+
rel: info.rel,
|
|
266
|
+
lang: info.lang,
|
|
267
|
+
fingerprint: info.fingerprint,
|
|
268
|
+
rawImports: info.rawImports,
|
|
269
|
+
resolvedImportsRel,
|
|
270
|
+
resolvedImports: resolvedImportsRel.map((rel) => pathResolve(absRoot, rel)),
|
|
271
|
+
importedBy,
|
|
272
|
+
packageName: info.packageName,
|
|
273
|
+
namespaceName: info.namespaceName,
|
|
274
|
+
goPackageName: info.goPackageName,
|
|
275
|
+
topLevelTypes: info.topLevelTypes,
|
|
276
|
+
tokenSymbols: info.tokenSymbols,
|
|
277
|
+
symbols: Array.isArray(info.symbols) ? info.symbols : [],
|
|
278
|
+
};
|
|
279
|
+
nodes.set(info.rel, node);
|
|
280
|
+
for (const rel of resolvedImportsRel) {
|
|
281
|
+
if (!reverse.has(rel)) reverse.set(rel, new Set());
|
|
282
|
+
reverse.get(rel).add(node.rel);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
_trace('assemble');
|
|
286
|
+
const graph = _attachGraphRuntimeCaches({ cwd: graphCwd, nodes, reverse, schemaVersion: SYMBOL_SCHEMA_VERSION, builtAt: now, signature });
|
|
287
|
+
graph.truncated = Boolean(truncated);
|
|
288
|
+
for (const info of fileInfos) {
|
|
289
|
+
if (typeof info.sourceText === 'string') {
|
|
290
|
+
graph._sourceTextCache.set(info.rel, {
|
|
291
|
+
fingerprint: info.fingerprint || '',
|
|
292
|
+
text: info.sourceText,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
graph._symbolTokenIndexDirty = true;
|
|
297
|
+
if (_getCodeGraphGen(graphCwd) === _genAtStart) {
|
|
298
|
+
_setCodeGraphCache(graphCwd, { ts: now, signature, graph });
|
|
299
|
+
_setDiskCodeGraphEntry(graphCwd, graph);
|
|
300
|
+
_trace('cache+disk');
|
|
301
|
+
}
|
|
302
|
+
return graph;
|
|
303
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Code-graph tuning constants + cache-file name/regex patterns. Extracted
|
|
2
|
+
// verbatim from code-graph.mjs so the build/cache/search modules can share
|
|
3
|
+
// one source of truth. Behavior-identical: same env vars, same defaults.
|
|
4
|
+
|
|
5
|
+
export const CODE_GRAPH_TTL_MS = 30_000;
|
|
6
|
+
export const CODE_GRAPH_MAX_FILES = 10_000;
|
|
7
|
+
export const CODE_GRAPH_WORKER_TIMEOUT_MS = 120_000;
|
|
8
|
+
// Timeout for the native mixdog-graph binary child process (spawned per graph build).
|
|
9
|
+
export const CODE_GRAPH_BINARY_TIMEOUT_MS = Math.max(1000, Number(process.env.MIXDOG_CODE_GRAPH_BINARY_TIMEOUT_MS) || 20000);
|
|
10
|
+
// Legacy single-file cache. Kept as a constant for the one-shot migration
|
|
11
|
+
// path; new writes go into the per-cwd directory layout below.
|
|
12
|
+
export const CODE_GRAPH_DISK_FILE = 'code-graph-cache.json';
|
|
13
|
+
// Per-cwd cache: <data>/code-graph-cache/manifest.json + <hash>.json per
|
|
14
|
+
// indexed root. Avoids the unbounded single-file blob (observed >50 MB on
|
|
15
|
+
// long-running workspaces) that had to be JSON.parsed in full on every
|
|
16
|
+
// fresh process startup.
|
|
17
|
+
export const CODE_GRAPH_DISK_DIR = 'code-graph-cache';
|
|
18
|
+
export const CODE_GRAPH_DISK_MAX_ENTRIES = 24;
|
|
19
|
+
export const CODE_GRAPH_DISK_MAX_BYTES = Math.max(
|
|
20
|
+
1 * 1024 * 1024,
|
|
21
|
+
Math.floor((Number(process.env.MIXDOG_CODE_GRAPH_CACHE_MAX_MB) || 80) * 1024 * 1024),
|
|
22
|
+
);
|
|
23
|
+
// Reap writeFileAtomicSync debris only after this age (see _sweepCodeGraphCacheDir).
|
|
24
|
+
// Younger .tmp files may belong to an in-flight persist still holding the sibling .lock;
|
|
25
|
+
// DEFAULT_LOCK_TIMEOUT_MS is 8s — 120s is a safe margin for large graph JSON writes.
|
|
26
|
+
export const ORPHAN_TMP_MIN_AGE_MS = 120_000;
|
|
27
|
+
export const RE_CACHE_TMP = /^\.[0-9a-f]{16}\.json\.[0-9a-f]{24}\.tmp$/i;
|
|
28
|
+
export const RE_MANIFEST_TMP = /^\.manifest\.json\.[0-9a-f]{24}\.tmp$/i;
|
|
29
|
+
export const RE_CACHE_LOCK = /^[0-9a-f]{16}\.json\.lock$/i;
|
|
30
|
+
export const CODE_GRAPH_MEMORY_MAX_ENTRIES = Math.max(
|
|
31
|
+
1,
|
|
32
|
+
Math.floor(Number(process.env.MIXDOG_CODE_GRAPH_MEMORY_MAX_ENTRIES) || 6),
|
|
33
|
+
);
|
|
34
|
+
export const CODE_GRAPH_MEMORY_MAX_SOURCE_BYTES = Math.max(
|
|
35
|
+
1 * 1024 * 1024,
|
|
36
|
+
Math.floor((Number(process.env.MIXDOG_CODE_GRAPH_MEMORY_MAX_MB) || 48) * 1024 * 1024),
|
|
37
|
+
);
|
|
38
|
+
// Bump when the per-symbol record SHAPE changes (e.g. adding endLine). The
|
|
39
|
+
// version is folded into the cache signature so graphs built by an older
|
|
40
|
+
// binary/schema (symbols without a finite endLine) no longer match and are
|
|
41
|
+
// rebuilt instead of served — otherwise a stale cache would feed endLine-less
|
|
42
|
+
// symbols and silently defeat body-span containment in _nearestEnclosingSymbol.
|
|
43
|
+
export const SYMBOL_SCHEMA_VERSION = 'sym-range-v3-rustimports';
|