mixdog 0.9.3 → 0.9.5
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 +112 -38
- package/package.json +10 -3
- 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/r5-orchestrated-task.json +7 -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-r13-clientmeta.json +464 -0
- package/scripts/bench/round-r14-betafeatures.json +466 -0
- package/scripts/bench/round-r15-fulldefault.json +462 -0
- package/scripts/bench/round-r16-sessionid.json +466 -0
- package/scripts/bench/round-r17-wirebytes.json +456 -0
- package/scripts/bench/round-r18-prewarm.json +468 -0
- package/scripts/bench/round-r19-clean.json +472 -0
- package/scripts/bench/round-r20-prewarm-clean.json +475 -0
- package/scripts/bench/round-r21-delta-retry.json +473 -0
- package/scripts/bench/round-r22-full-probe.json +693 -0
- package/scripts/bench/round-r23-itemprobe.json +701 -0
- package/scripts/bench/round-r24-shapefix.json +677 -0
- package/scripts/bench/round-r25-serial.json +464 -0
- package/scripts/bench/round-r26-parallel3.json +671 -0
- package/scripts/bench/round-r27-parallel10.json +894 -0
- package/scripts/bench/round-r28-parallel10-stagger.json +882 -0
- package/scripts/bench/round-r29-parallel10-stagger166.json +886 -0
- package/scripts/bench/round-r30-instid.json +253 -0
- package/scripts/bench/round-r31-upgradeprobe.json +256 -0
- package/scripts/bench/round-r32-vs-codex-lead.json +254 -0
- package/scripts/bench/round-r33-vs-codex-codex.json +115 -0
- package/scripts/bench/round-r34-orchestrated.json +120 -0
- package/scripts/bench/round-r35-orchestrated-codex.json +61 -0
- package/scripts/bench/round-r36-orchestrated-capped.json +128 -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 +251 -32
- package/scripts/freevar-smoke.mjs +95 -0
- package/scripts/internal-comms-bench.mjs +3 -4
- package/scripts/internal-comms-smoke.mjs +10 -9
- package/scripts/model-catalog-audit.mjs +209 -0
- package/scripts/model-list-sanitize-test.mjs +37 -0
- 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/provider-toolcall-test.mjs +7 -3
- package/scripts/recall-bench.mjs +76 -13
- package/scripts/recall-quality-cases.json +12 -0
- package/scripts/recall-usecase-cases.json +18 -0
- package/scripts/session-bench.mjs +152 -6
- package/scripts/tool-smoke.mjs +25 -65
- package/scripts/tui-render-smoke.mjs +90 -0
- package/scripts/webhook-smoke.mjs +208 -0
- package/src/agents/debugger/AGENT.md +4 -1
- package/src/agents/heavy-worker/AGENT.md +9 -8
- package/src/agents/maintainer/AGENT.md +4 -0
- package/src/agents/reviewer/AGENT.md +2 -1
- package/src/agents/scheduler-task/AGENT.md +2 -3
- package/src/agents/webhook-handler/AGENT.md +2 -3
- package/src/agents/worker/AGENT.md +10 -7
- package/src/app.mjs +12 -1
- package/src/headless-role.mjs +7 -1
- package/src/lib/rules-builder.cjs +4 -0
- package/src/mixdog-session-runtime.mjs +647 -2056
- package/src/output-styles/default.md +30 -9
- package/src/output-styles/{oneline.md → extreme-minimal.md} +5 -4
- package/src/output-styles/minimal.md +8 -6
- package/src/output-styles/simple.md +21 -7
- package/src/rules/agent/00-common.md +6 -3
- package/src/rules/agent/30-explorer.md +16 -5
- package/src/rules/lead/01-general.md +5 -5
- package/src/rules/lead/lead-brief.md +15 -0
- package/src/rules/lead/lead-tool.md +6 -15
- package/src/rules/shared/01-tool.md +17 -21
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +8 -3
- 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/providers/anthropic-effort.mjs +62 -20
- 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 +81 -1281
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +607 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +32 -3
- 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 +43 -1013
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +17 -3
- package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +105 -11
- package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +356 -0
- package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +108 -0
- 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 +40 -1143
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +740 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +193 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +349 -2131
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +143 -1002
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +229 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-events.mjs +67 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +465 -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/provider-catalog-cache.mjs +80 -0
- 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-policy.mjs +14 -2
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +61 -0
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +275 -0
- package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +173 -0
- package/src/runtime/agent/orchestrator/session/loop/termination.mjs +58 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +239 -0
- package/src/runtime/agent/orchestrator/session/loop.mjs +278 -402
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +471 -0
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +7 -4
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +12 -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/usage-metrics.mjs +210 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +166 -1087
- 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 +20 -1
- 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 +35 -44
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +40 -0
- 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 -92
- 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 +28 -265
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +0 -6
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +57 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/keyword-match.mjs +82 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +10 -122
- package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +45 -0
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
- 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 +0 -21
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +9 -72
- package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +77 -0
- 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 +27 -318
- package/src/runtime/channels/backends/telegram.mjs +8 -12
- package/src/runtime/channels/index.mjs +247 -701
- package/src/runtime/channels/lib/backend-dispatch.mjs +46 -0
- package/src/runtime/channels/lib/config.mjs +37 -149
- package/src/runtime/channels/lib/event-pipeline.mjs +22 -5
- package/src/runtime/channels/lib/event-queue.mjs +78 -13
- package/src/runtime/channels/lib/inbound-routing.mjs +74 -0
- package/src/runtime/channels/lib/interaction-workflows.mjs +5 -113
- package/src/runtime/channels/lib/output-forwarder.mjs +1 -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/scheduler.mjs +27 -113
- package/src/runtime/channels/lib/session-discovery.mjs +56 -4
- 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 +313 -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 +43 -616
- package/src/runtime/channels/tool-defs.mjs +11 -130
- package/src/runtime/memory/index.mjs +210 -1948
- package/src/runtime/memory/lib/core-memory-store.mjs +5 -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/embedding-warmup.mjs +58 -0
- package/src/runtime/memory/lib/ko-morph.mjs +195 -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 +24 -842
- 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-store.mjs +69 -12
- package/src/runtime/memory/lib/memory-text-utils.mjs +46 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +1 -1
- package/src/runtime/memory/lib/query-handlers.mjs +802 -0
- package/src/runtime/memory/lib/recall-format.mjs +55 -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 +5 -13
- 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/atomic-file.mjs +26 -1
- package/src/runtime/shared/config.mjs +14 -4
- package/src/runtime/shared/launcher-control.mjs +2 -2
- package/src/runtime/shared/markdown-frontmatter.mjs +19 -0
- package/src/runtime/shared/schedules-store.mjs +13 -3
- 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 +23 -0
- package/src/runtime/shared/update-checker.mjs +7 -4
- package/src/session-runtime/config-helpers.mjs +119 -2
- package/src/session-runtime/config-lifecycle.mjs +232 -0
- package/src/session-runtime/cwd-plugins.mjs +226 -0
- package/src/session-runtime/mcp-glue.mjs +177 -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 +11 -9
- 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 +205 -0
- package/src/session-runtime/quick-search-models.mjs +47 -0
- package/src/session-runtime/session-hooks.mjs +93 -0
- package/src/session-runtime/settings-api.mjs +352 -0
- package/src/session-runtime/tool-catalog.mjs +29 -29
- package/src/session-runtime/tool-defs.mjs +84 -0
- package/src/session-runtime/warmup-schedulers.mjs +201 -0
- package/src/session-runtime/workflow.mjs +1 -1
- 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 +138 -669
- package/src/standalone/channel-admin.mjs +102 -90
- package/src/standalone/channel-worker.mjs +4 -7
- package/src/standalone/explore-tool.mjs +64 -14
- 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 +77 -870
- package/src/standalone/memory-runtime-proxy.mjs +7 -0
- package/src/standalone/opencode-go-login.mjs +5 -1
- package/src/standalone/provider-admin.mjs +1 -16
- package/src/standalone/usage-dashboard.mjs +3 -1
- package/src/tui/App.jsx +1059 -8110
- package/src/tui/app/app-format.mjs +213 -0
- package/src/tui/app/channel-pickers.mjs +508 -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 +356 -0
- package/src/tui/app/model-options.mjs +334 -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 +489 -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 +677 -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 +512 -0
- package/src/tui/app/use-transcript-window.mjs +607 -0
- package/src/tui/components/ConfirmBar.jsx +10 -7
- package/src/tui/components/Picker.jsx +64 -15
- package/src/tui/components/PromptInput.jsx +33 -102
- package/src/tui/components/SlashCommandPalette.jsx +8 -1
- package/src/tui/components/StatusLine.jsx +69 -15
- package/src/tui/components/TextEntryPanel.jsx +11 -0
- package/src/tui/components/ToolExecution.jsx +52 -594
- 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/display-width.mjs +20 -3
- package/src/tui/dist/index.mjs +13553 -12384
- package/src/tui/engine/agent-job-feed.mjs +133 -0
- package/src/tui/engine/notification-plan.mjs +76 -0
- package/src/tui/engine/render-timing.mjs +17 -0
- package/src/tui/engine/tool-approval.mjs +94 -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.mjs +170 -574
- package/src/tui/figures.mjs +5 -0
- package/src/tui/index.jsx +65 -1
- package/src/tui/input-editing.mjs +2 -2
- package/src/tui/markdown/format-token.mjs +4 -1
- package/src/tui/statusline-ansi-bridge.mjs +11 -3
- package/src/tui/theme.mjs +6 -0
- 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 -501
- 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 -18
- package/src/workflows/sequential/WORKFLOW.md +16 -18
- package/vendor/ink/build/display-width.js +19 -3
- package/vendor/ink/build/ink.js +112 -7
- 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/external-tool-adapters.test.mjs +0 -162
- package/src/runtime/agent/orchestrator/tools/builtin/open-config-tool.mjs +0 -26
- package/src/runtime/channels/lib/holidays.mjs +0 -138
- package/src/runtime/shared/channel-notification-routing.test.mjs +0 -45
- package/src/runtime/shared/task-notification-envelope.test.mjs +0 -107
- 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/input-editing.selection.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/paste-fix.test.mjs +0 -119
- 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,239 @@
|
|
|
1
|
+
// Tool dispatch/execution cluster, extracted from loop.mjs.
|
|
2
|
+
// executeTool routes a single tool call (Skill/skills/mcp/code_graph/internal/
|
|
3
|
+
// shell/apply_patch/builtin/external-adapter) through before/after hooks and the
|
|
4
|
+
// scoped-cache outcome bookkeeping. No behavior change: bodies are verbatim from
|
|
5
|
+
// loop.mjs, re-exported via the facade so existing importers keep working.
|
|
6
|
+
import { executeMcpTool, isMcpTool, mcpToolHasField } from '../../mcp/client.mjs';
|
|
7
|
+
import { executeBuiltinTool, formatUnknownBuiltinToolMessage, isBuiltinTool, isExternalAdapterTool } from '../../tools/builtin.mjs';
|
|
8
|
+
import { executeBashSessionTool } from '../../tools/bash-session.mjs';
|
|
9
|
+
import { executePatchTool } from '../../tools/patch.mjs';
|
|
10
|
+
import { executeInternalTool, isInternalTool } from '../../internal-tools.mjs';
|
|
11
|
+
import { normalizeToolEnvelope, makeToolEnvelope } from '../tool-envelope.mjs';
|
|
12
|
+
import { getSessionAbortSignal, enqueuePendingMessage } from '../manager.mjs';
|
|
13
|
+
import { createScopedCacheOutcome } from '../cache/scoped-cache-outcome.mjs';
|
|
14
|
+
import { modelVisibleToolCompletionMessage } from '../../../../shared/tool-execution-contract.mjs';
|
|
15
|
+
import { _isScopedCacheableTool } from './tool-classify.mjs';
|
|
16
|
+
import {
|
|
17
|
+
buildSkillsListResponse,
|
|
18
|
+
viewSkill,
|
|
19
|
+
resolveToolResultAfterHook,
|
|
20
|
+
extractBashSessionId,
|
|
21
|
+
buildAgentBashSessionArgs,
|
|
22
|
+
resolvePreToolAskApproval,
|
|
23
|
+
} from './tool-helpers.mjs';
|
|
24
|
+
|
|
25
|
+
let codeGraphRuntimePromise = null;
|
|
26
|
+
async function executeCodeGraphToolLazy(name, args, cwd, signal = null, options = {}) {
|
|
27
|
+
codeGraphRuntimePromise ??= import('../../tools/code-graph.mjs');
|
|
28
|
+
const mod = await codeGraphRuntimePromise;
|
|
29
|
+
if (typeof mod.executeCodeGraphTool !== 'function') throw new Error('code_graph runtime is not available');
|
|
30
|
+
return mod.executeCodeGraphTool(name, args, cwd, signal, options);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function _scopedCacheOutcomeForCall(sessionRef, toolCallId, toolName, callerSessionId, executeOpts = {}) {
|
|
34
|
+
if (executeOpts.scopedCacheOutcome) {
|
|
35
|
+
if (sessionRef && toolCallId) {
|
|
36
|
+
// instanceof guard: a session revived from disk (JSON round-trip) turns
|
|
37
|
+
// this Map into a plain object `{}` — truthy, but without Map methods.
|
|
38
|
+
if (!(sessionRef._scopedCacheOutcomeByCallId instanceof Map)) sessionRef._scopedCacheOutcomeByCallId = new Map();
|
|
39
|
+
sessionRef._scopedCacheOutcomeByCallId.set(toolCallId, executeOpts.scopedCacheOutcome);
|
|
40
|
+
}
|
|
41
|
+
return executeOpts.scopedCacheOutcome;
|
|
42
|
+
}
|
|
43
|
+
if (!callerSessionId || !toolCallId || !_isScopedCacheableTool(toolName)) return null;
|
|
44
|
+
const outcome = createScopedCacheOutcome();
|
|
45
|
+
if (sessionRef) {
|
|
46
|
+
if (!(sessionRef._scopedCacheOutcomeByCallId instanceof Map)) sessionRef._scopedCacheOutcomeByCallId = new Map();
|
|
47
|
+
sessionRef._scopedCacheOutcomeByCallId.set(toolCallId, outcome);
|
|
48
|
+
}
|
|
49
|
+
return outcome;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function executeTool(name, args, cwd, callerSessionId, sessionRef, executeOpts = {}) {
|
|
53
|
+
const scopedCacheOutcome = _scopedCacheOutcomeForCall(
|
|
54
|
+
sessionRef,
|
|
55
|
+
executeOpts.toolCallId,
|
|
56
|
+
name,
|
|
57
|
+
callerSessionId,
|
|
58
|
+
executeOpts,
|
|
59
|
+
);
|
|
60
|
+
const toolOpts = scopedCacheOutcome
|
|
61
|
+
? { ...executeOpts, scopedCacheOutcome }
|
|
62
|
+
: executeOpts;
|
|
63
|
+
const notificationSessionId = String(executeOpts.notifySessionId || sessionRef?.ownerSessionId || callerSessionId || '').trim();
|
|
64
|
+
const notifyFn = typeof executeOpts.notifyFn === 'function'
|
|
65
|
+
? executeOpts.notifyFn
|
|
66
|
+
: (text, meta = {}) => {
|
|
67
|
+
if (!notificationSessionId) return;
|
|
68
|
+
try {
|
|
69
|
+
const visible = modelVisibleToolCompletionMessage(text, meta);
|
|
70
|
+
if (visible) enqueuePendingMessage(notificationSessionId, visible);
|
|
71
|
+
} catch { /* best effort */ }
|
|
72
|
+
};
|
|
73
|
+
const completionToolOpts = {
|
|
74
|
+
...toolOpts,
|
|
75
|
+
sessionId: callerSessionId,
|
|
76
|
+
callerSessionId: notificationSessionId || callerSessionId,
|
|
77
|
+
routingSessionId: callerSessionId,
|
|
78
|
+
clientHostPid: sessionRef?.clientHostPid,
|
|
79
|
+
notifyFn,
|
|
80
|
+
};
|
|
81
|
+
const beforeToolHook = typeof executeOpts.beforeToolHook === 'function'
|
|
82
|
+
? executeOpts.beforeToolHook
|
|
83
|
+
: sessionRef?.beforeToolHook;
|
|
84
|
+
const toolApprovalHook = typeof executeOpts.toolApprovalHook === 'function'
|
|
85
|
+
? executeOpts.toolApprovalHook
|
|
86
|
+
: sessionRef?.toolApprovalHook;
|
|
87
|
+
if (beforeToolHook) {
|
|
88
|
+
try {
|
|
89
|
+
const decision = await beforeToolHook({
|
|
90
|
+
name,
|
|
91
|
+
args,
|
|
92
|
+
cwd,
|
|
93
|
+
sessionId: callerSessionId,
|
|
94
|
+
toolCallId: executeOpts.toolCallId || null,
|
|
95
|
+
});
|
|
96
|
+
const action = String(decision?.action || decision?.decision || '').toLowerCase();
|
|
97
|
+
if (action === 'deny' || action === 'block') {
|
|
98
|
+
const reason = decision?.reason ? `: ${decision.reason}` : '';
|
|
99
|
+
return `Error: tool "${name}" denied by hook${reason}`;
|
|
100
|
+
}
|
|
101
|
+
if (action === 'ask') {
|
|
102
|
+
const askReason = String(decision?.reason || 'approval requested by hook').trim();
|
|
103
|
+
const askOutcome = await resolvePreToolAskApproval({
|
|
104
|
+
toolName: name,
|
|
105
|
+
args,
|
|
106
|
+
cwd,
|
|
107
|
+
sessionId: callerSessionId,
|
|
108
|
+
toolCallId: executeOpts.toolCallId || null,
|
|
109
|
+
askReason,
|
|
110
|
+
toolApprovalHook,
|
|
111
|
+
});
|
|
112
|
+
if (askOutcome.denial) return askOutcome.denial;
|
|
113
|
+
const approval = askOutcome.approval;
|
|
114
|
+
if (approval && typeof approval === 'object' && approval.args && typeof approval.args === 'object' && !Array.isArray(approval.args)) {
|
|
115
|
+
args = approval.args;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if ((action === 'modify' || action === 'rewrite') && decision?.args && typeof decision.args === 'object' && !Array.isArray(decision.args)) {
|
|
119
|
+
args = decision.args;
|
|
120
|
+
}
|
|
121
|
+
} catch {
|
|
122
|
+
// Hooks are policy extensions. A broken hook must not wedge the agent loop.
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const afterToolHook = typeof executeOpts.afterToolHook === 'function'
|
|
126
|
+
? executeOpts.afterToolHook
|
|
127
|
+
: sessionRef?.afterToolHook;
|
|
128
|
+
const __result = await (async () => {
|
|
129
|
+
if (name === 'Skill') {
|
|
130
|
+
return viewSkill(cwd, args?.name);
|
|
131
|
+
}
|
|
132
|
+
if (name === 'skills_list') {
|
|
133
|
+
return buildSkillsListResponse(cwd);
|
|
134
|
+
}
|
|
135
|
+
if (name === 'skill_view') {
|
|
136
|
+
return viewSkill(cwd, args?.name);
|
|
137
|
+
}
|
|
138
|
+
if (isMcpTool(name)) {
|
|
139
|
+
// 24h trace data shows ~24% of external MCP calls are cwd-sensitive
|
|
140
|
+
// (bash / grep / read / list / glob etc.) but the worker session's
|
|
141
|
+
// cwd was previously dropped here. Inject cwd only when the tool's
|
|
142
|
+
// inputSchema declares the field — schemas without it would reject
|
|
143
|
+
// an unknown argument.
|
|
144
|
+
const needsCwdInjection = cwd
|
|
145
|
+
&& mcpToolHasField(name, 'cwd')
|
|
146
|
+
&& (args == null || args.cwd == null);
|
|
147
|
+
const finalArgs = needsCwdInjection ? { ...(args || {}), cwd } : args;
|
|
148
|
+
return executeMcpTool(name, finalArgs);
|
|
149
|
+
}
|
|
150
|
+
if (name === 'code_graph') {
|
|
151
|
+
// cwd chain: args.cwd (caller-explicit) → session cwd → undefined (handler throws)
|
|
152
|
+
const graphCwd = (typeof args?.cwd === 'string' && args.cwd.trim()) ? args.cwd.trim() : cwd;
|
|
153
|
+
return executeCodeGraphToolLazy(name, args, graphCwd, null, toolOpts);
|
|
154
|
+
}
|
|
155
|
+
if (isInternalTool(name)) {
|
|
156
|
+
// callerSessionId propagates into server.mjs dispatchTool so that
|
|
157
|
+
// dispatchAiWrapped can detect and reject recursive calls from a
|
|
158
|
+
// hidden-role session (recall/search/explore → self).
|
|
159
|
+
return executeInternalTool(name, args, {
|
|
160
|
+
callerSessionId,
|
|
161
|
+
callerCwd: cwd,
|
|
162
|
+
clientHostPid: sessionRef?.clientHostPid,
|
|
163
|
+
signal: executeOpts.signal,
|
|
164
|
+
routingSessionId: callerSessionId,
|
|
165
|
+
notifyFn,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
if (name === 'shell') {
|
|
169
|
+
const routedArgs = buildAgentBashSessionArgs(args, sessionRef);
|
|
170
|
+
if (!routedArgs) {
|
|
171
|
+
// clientHostPid scopes background shell-jobs to the dispatching
|
|
172
|
+
// terminal's claude.exe pid (agent sessions store it on sessionRef);
|
|
173
|
+
// without it resolveJobOwnerHostPid falls back to the daemon-global env.
|
|
174
|
+
return executeBuiltinTool(name, args, cwd, completionToolOpts);
|
|
175
|
+
}
|
|
176
|
+
// Thread the session's AbortSignal so agent type=close can interrupt the
|
|
177
|
+
// persistent child process. getSessionAbortSignal is imported from
|
|
178
|
+
// manager.mjs; callerSessionId identifies the controller.
|
|
179
|
+
let _bashAbortSignal = null;
|
|
180
|
+
try { _bashAbortSignal = getSessionAbortSignal(callerSessionId); } catch { /* ignore */ }
|
|
181
|
+
const result = await executeBashSessionTool('bash_session', routedArgs, cwd, {
|
|
182
|
+
sessionId: callerSessionId,
|
|
183
|
+
abortSignal: _bashAbortSignal,
|
|
184
|
+
});
|
|
185
|
+
const bashSid = extractBashSessionId(result);
|
|
186
|
+
if (bashSid) {
|
|
187
|
+
sessionRef.implicitBashSessionId = bashSid;
|
|
188
|
+
// Track all persistent bash sessions for bulk teardown on close.
|
|
189
|
+
if (sessionRef.allBashSessionIds) {
|
|
190
|
+
if (!sessionRef.allBashSessionIds.includes(bashSid)) {
|
|
191
|
+
sessionRef.allBashSessionIds.push(bashSid);
|
|
192
|
+
}
|
|
193
|
+
} else {
|
|
194
|
+
sessionRef.allBashSessionIds = [bashSid];
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
if (name === 'apply_patch') {
|
|
200
|
+
const patchArgs = typeof args === 'string' ? { patch: args } : args;
|
|
201
|
+
return executePatchTool(name, patchArgs, cwd, { sessionId: callerSessionId, toolCallId: executeOpts.toolCallId || null });
|
|
202
|
+
}
|
|
203
|
+
if (isBuiltinTool(name)) {
|
|
204
|
+
// clientHostPid threaded for the same per-terminal job-scope reason as
|
|
205
|
+
// the bash branch above (see resolveJobOwnerHostPid).
|
|
206
|
+
return executeBuiltinTool(name, args, cwd, completionToolOpts);
|
|
207
|
+
}
|
|
208
|
+
if (isExternalAdapterTool(name)) {
|
|
209
|
+
// Foreign-CLI tool names (StrReplace/Write/bash variants) adapt to a
|
|
210
|
+
// native execution inside executeBuiltinTool's default: case; on a
|
|
211
|
+
// shape mismatch it falls back to the redirect guidance message.
|
|
212
|
+
return executeBuiltinTool(name, args, cwd, completionToolOpts);
|
|
213
|
+
}
|
|
214
|
+
return formatUnknownBuiltinToolMessage(name, args, 'tool');
|
|
215
|
+
})();
|
|
216
|
+
if (typeof afterToolHook === 'function') {
|
|
217
|
+
try {
|
|
218
|
+
const hookResult = await afterToolHook({
|
|
219
|
+
name,
|
|
220
|
+
args,
|
|
221
|
+
cwd,
|
|
222
|
+
sessionId: callerSessionId,
|
|
223
|
+
toolCallId: executeOpts.toolCallId || null,
|
|
224
|
+
result: __result,
|
|
225
|
+
});
|
|
226
|
+
// Envelope-aware hook override: a PostToolUse hook may override the
|
|
227
|
+
// model-VISIBLE tool output (the envelope's `result` / stub), but it
|
|
228
|
+
// must NEVER drop the `newMessages` channel. Split first, apply the
|
|
229
|
+
// override to `result` only, then re-wrap so newMessages survive.
|
|
230
|
+
const { result: __res, newMessages: __nm } = normalizeToolEnvelope(__result);
|
|
231
|
+
const __overridden = resolveToolResultAfterHook(__res, hookResult);
|
|
232
|
+
if (__nm.length) return makeToolEnvelope(__overridden, __nm);
|
|
233
|
+
return __overridden;
|
|
234
|
+
} catch {
|
|
235
|
+
// PostToolUse hooks are best-effort; never let one break the tool result.
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return __result;
|
|
239
|
+
}
|