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,210 @@
|
|
|
1
|
+
// Incremental + terminal usage-metrics accounting for sessions.
|
|
2
|
+
// Extracted verbatim from manager.mjs (behavior-preserving). Pure helpers plus
|
|
3
|
+
// per-session idempotency tracking for incremental usage persistence.
|
|
4
|
+
//
|
|
5
|
+
// Runtime coupling is injected: persistIterationMetrics needs the live
|
|
6
|
+
// _runtimeState map (owned by manager.mjs) to read the in-memory session and
|
|
7
|
+
// flag usageMetricsTurnIncremental. manager.mjs wires it via configureUsageMetricsRuntime().
|
|
8
|
+
import { providerInputExcludesCache } from '../../providers/registry.mjs';
|
|
9
|
+
import { loadSession, saveSessionAsync } from '../store.mjs';
|
|
10
|
+
|
|
11
|
+
// Per-session idempotency tracking: sessionId → Set of seen
|
|
12
|
+
// turn:epoch:iteration:source keys.
|
|
13
|
+
const _metricSeenIter = new Map();
|
|
14
|
+
|
|
15
|
+
// Injected accessor for manager's _runtimeState. Defaults to a no-op lookup so
|
|
16
|
+
// the pure helpers remain usable (and unit-testable) before wiring.
|
|
17
|
+
let _getRuntimeEntry = () => null;
|
|
18
|
+
|
|
19
|
+
/** Wire the live runtime-state accessor from manager.mjs. */
|
|
20
|
+
export function configureUsageMetricsRuntime({ getRuntimeEntry } = {}) {
|
|
21
|
+
if (typeof getRuntimeEntry === 'function') _getRuntimeEntry = getRuntimeEntry;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Drop the per-session metric-idempotency Set (called on session close). */
|
|
25
|
+
export function dropMetricSeenState(sessionId) {
|
|
26
|
+
if (sessionId) _metricSeenIter.delete(sessionId);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Monotonic per-session ask/turn id for incremental usage idempotency. */
|
|
30
|
+
export function bumpUsageMetricsTurnId(session) {
|
|
31
|
+
if (!session || typeof session !== 'object') return 0;
|
|
32
|
+
const next = (Number(session.usageMetricsTurnId) || 0) + 1;
|
|
33
|
+
session.usageMetricsTurnId = next;
|
|
34
|
+
return next;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function resolveUsageMetricsTurnId(session, delta = {}) {
|
|
38
|
+
if (delta.usageMetricsTurnId != null && Number.isFinite(Number(delta.usageMetricsTurnId))) {
|
|
39
|
+
return Number(delta.usageMetricsTurnId);
|
|
40
|
+
}
|
|
41
|
+
return Number(session?.usageMetricsTurnId) || 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Advance loop metrics epoch when agentLoop resets its iteration counter (post-compact). */
|
|
45
|
+
export function bumpUsageMetricsEpoch(session) {
|
|
46
|
+
if (!session || typeof session !== 'object') return 0;
|
|
47
|
+
const next = (Number(session.usageMetricsEpoch) || 0) + 1;
|
|
48
|
+
session.usageMetricsEpoch = next;
|
|
49
|
+
return next;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Resolve usage-metrics epoch for idempotency (exported for regression smoke).
|
|
54
|
+
* Prefers session.usageMetricsEpoch (bumped in loop on compact reset) and optional
|
|
55
|
+
* delta.usageMetricsEpoch; falls back to iteration regression when loop did not bump.
|
|
56
|
+
*/
|
|
57
|
+
export function resolveUsageMetricsEpoch(session, delta = {}) {
|
|
58
|
+
if (!session) return 0;
|
|
59
|
+
let epoch = Number(session.usageMetricsEpoch) || 0;
|
|
60
|
+
if (delta.usageMetricsEpoch != null && Number.isFinite(Number(delta.usageMetricsEpoch))) {
|
|
61
|
+
epoch = Math.max(epoch, Number(delta.usageMetricsEpoch));
|
|
62
|
+
}
|
|
63
|
+
const idx = Number(delta.iterationIndex);
|
|
64
|
+
const prevLastIdx = typeof session.lastIterationIndex === 'number'
|
|
65
|
+
? session.lastIterationIndex
|
|
66
|
+
: null;
|
|
67
|
+
if (
|
|
68
|
+
(delta.usageMetricsEpoch == null || !Number.isFinite(Number(delta.usageMetricsEpoch)))
|
|
69
|
+
&& prevLastIdx !== null
|
|
70
|
+
&& Number.isFinite(idx)
|
|
71
|
+
&& idx < prevLastIdx
|
|
72
|
+
) {
|
|
73
|
+
epoch += 1;
|
|
74
|
+
}
|
|
75
|
+
return epoch;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function usageMetricsSourceKey(delta = {}) {
|
|
79
|
+
const raw = delta.source ?? delta.usageSource;
|
|
80
|
+
if (raw == null || raw === '') return 'provider_send';
|
|
81
|
+
return String(raw);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Idempotency key for incremental usage persistence (exported for regression smoke). */
|
|
85
|
+
export function usageMetricsIdempotencyKey(sessionId, session, delta = {}) {
|
|
86
|
+
const turnId = resolveUsageMetricsTurnId(session, delta);
|
|
87
|
+
const epoch = resolveUsageMetricsEpoch(session, delta);
|
|
88
|
+
const source = usageMetricsSourceKey(delta);
|
|
89
|
+
return `${sessionId}:${turnId}:${epoch}:${delta.iterationIndex}:${source}`;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function uncachedInputTokensForProvider(provider, inputTokens, cachedReadTokens = 0, cacheWriteTokens = 0) {
|
|
93
|
+
const input = Number(inputTokens) || 0;
|
|
94
|
+
if (input <= 0) return 0;
|
|
95
|
+
// Anthropic-style providers report input_tokens excluding cache reads; OpenAI
|
|
96
|
+
// Responses/Gemini-style providers report input_tokens inclusive of cached
|
|
97
|
+
// prefix tokens. Keep both views so UI can show the real context footprint
|
|
98
|
+
// and the fresh/new token portion without mistaking cache hits for a cache
|
|
99
|
+
// break.
|
|
100
|
+
if (providerInputExcludesCache(provider)) return input + (Number(cacheWriteTokens) || 0);
|
|
101
|
+
return Math.max(input - (Number(cachedReadTokens) || 0) - (Number(cacheWriteTokens) || 0), 0);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Apply terminal ask usage to session totals. Skips lifetime totals when incremental
|
|
106
|
+
* per-iteration persistence already counted this turn (askSession path).
|
|
107
|
+
*/
|
|
108
|
+
export function applyAskTerminalUsageTotals(session, result, options = {}) {
|
|
109
|
+
if (!session || !result?.usage) return;
|
|
110
|
+
const skipTotals = options.skipTotalsIfIncremental === true;
|
|
111
|
+
if (!skipTotals) {
|
|
112
|
+
const inputTokens = result.usage.inputTokens || 0;
|
|
113
|
+
const outputTokens = result.usage.outputTokens || 0;
|
|
114
|
+
const cachedTokens = result.usage.cachedTokens || 0;
|
|
115
|
+
const cacheWriteTokens = result.usage.cacheWriteTokens || 0;
|
|
116
|
+
const uncachedInputTokens = uncachedInputTokensForProvider(session.provider, inputTokens, cachedTokens, cacheWriteTokens);
|
|
117
|
+
session.totalInputTokens = (session.totalInputTokens || 0) + inputTokens;
|
|
118
|
+
session.totalOutputTokens = (session.totalOutputTokens || 0) + outputTokens;
|
|
119
|
+
session.tokensCumulative = (session.tokensCumulative || 0)
|
|
120
|
+
+ inputTokens
|
|
121
|
+
+ outputTokens;
|
|
122
|
+
session.totalCachedReadTokens = (session.totalCachedReadTokens || 0) + cachedTokens;
|
|
123
|
+
session.totalCacheWriteTokens = (session.totalCacheWriteTokens || 0) + cacheWriteTokens;
|
|
124
|
+
session.totalUncachedInputTokens = (session.totalUncachedInputTokens || 0) + uncachedInputTokens;
|
|
125
|
+
}
|
|
126
|
+
const _lastTurn = result.lastTurnUsage || result.usage || {};
|
|
127
|
+
const _lastInputTokens = _lastTurn.inputTokens || 0;
|
|
128
|
+
const _lastCachedReadTokens = _lastTurn.cachedTokens || 0;
|
|
129
|
+
const _lastCacheWriteTokens = _lastTurn.cacheWriteTokens || 0;
|
|
130
|
+
session.lastInputTokens = _lastInputTokens;
|
|
131
|
+
session.lastOutputTokens = _lastTurn.outputTokens || 0;
|
|
132
|
+
session.lastCachedReadTokens = _lastCachedReadTokens;
|
|
133
|
+
session.lastCacheWriteTokens = _lastCacheWriteTokens;
|
|
134
|
+
session.lastUncachedInputTokens = uncachedInputTokensForProvider(
|
|
135
|
+
session.provider,
|
|
136
|
+
_lastInputTokens,
|
|
137
|
+
_lastCachedReadTokens,
|
|
138
|
+
_lastCacheWriteTokens,
|
|
139
|
+
);
|
|
140
|
+
const _inputExcludesCache = providerInputExcludesCache(session.provider);
|
|
141
|
+
session.lastContextTokens = _inputExcludesCache
|
|
142
|
+
? _lastInputTokens + _lastCachedReadTokens + _lastCacheWriteTokens
|
|
143
|
+
: _lastInputTokens;
|
|
144
|
+
session.lastContextTokensUpdatedAt = Date.now();
|
|
145
|
+
session.lastContextTokensStaleAfterCompact = false;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Persist incremental usage delta immediately after each provider.send iteration.
|
|
150
|
+
* Idempotency key `sessionId:turnId:epoch:iterationIndex:source` scopes retries
|
|
151
|
+
* per ask, compaction epoch, iteration, and usage source.
|
|
152
|
+
*/
|
|
153
|
+
export async function persistIterationMetrics(delta) {
|
|
154
|
+
if (!delta || !delta.sessionId) return;
|
|
155
|
+
const { sessionId, iterationIndex, deltaInput, deltaOutput, deltaCachedRead, deltaCacheWrite, ts } = delta;
|
|
156
|
+
const runtimeEntry = _getRuntimeEntry(sessionId);
|
|
157
|
+
const session = runtimeEntry?.session ?? loadSession(sessionId);
|
|
158
|
+
if (!session || session.closed) return;
|
|
159
|
+
const epoch = resolveUsageMetricsEpoch(session, delta);
|
|
160
|
+
if (epoch !== (Number(session.usageMetricsEpoch) || 0)) {
|
|
161
|
+
session.usageMetricsEpoch = epoch;
|
|
162
|
+
}
|
|
163
|
+
let seen = _metricSeenIter.get(sessionId);
|
|
164
|
+
if (!seen) {
|
|
165
|
+
seen = new Set();
|
|
166
|
+
_metricSeenIter.set(sessionId, seen);
|
|
167
|
+
}
|
|
168
|
+
const ikey = usageMetricsIdempotencyKey(sessionId, session, delta);
|
|
169
|
+
const isReplay = seen.has(ikey);
|
|
170
|
+
seen.add(ikey);
|
|
171
|
+
if (!isReplay) {
|
|
172
|
+
if (runtimeEntry) runtimeEntry.usageMetricsTurnIncremental = true;
|
|
173
|
+
const deltaUncachedInput = delta.deltaUncachedInput != null
|
|
174
|
+
? Number(delta.deltaUncachedInput) || 0
|
|
175
|
+
: uncachedInputTokensForProvider(session.provider, deltaInput, deltaCachedRead, deltaCacheWrite);
|
|
176
|
+
session.totalInputTokens = (session.totalInputTokens || 0) + (deltaInput || 0);
|
|
177
|
+
session.totalOutputTokens = (session.totalOutputTokens || 0) + (deltaOutput || 0);
|
|
178
|
+
session.tokensCumulative = (session.tokensCumulative || 0) + (deltaInput || 0) + (deltaOutput || 0);
|
|
179
|
+
// Cache totals — additive fields, default 0 on legacy sessions; both
|
|
180
|
+
// are undefined-safe so the schema migrates lazily as new iterations
|
|
181
|
+
// land. Keeps live + terminal aggregates in lock-step (loop.mjs already
|
|
182
|
+
// includes cached_read / cache_write in its terminal usage rollup).
|
|
183
|
+
session.totalCachedReadTokens = (session.totalCachedReadTokens || 0) + (deltaCachedRead || 0);
|
|
184
|
+
session.totalCacheWriteTokens = (session.totalCacheWriteTokens || 0) + (deltaCacheWrite || 0);
|
|
185
|
+
session.totalUncachedInputTokens = (session.totalUncachedInputTokens || 0) + deltaUncachedInput;
|
|
186
|
+
// Window snapshot updated per iteration so agent type=list reflects the
|
|
187
|
+
// most-recent provider-reported input size even for short dispatches
|
|
188
|
+
// that finish before askSession's terminal save lands.
|
|
189
|
+
session.lastInputTokens = deltaInput || 0;
|
|
190
|
+
session.lastOutputTokens = deltaOutput || 0;
|
|
191
|
+
session.lastCachedReadTokens = deltaCachedRead || 0;
|
|
192
|
+
session.lastCacheWriteTokens = deltaCacheWrite || 0;
|
|
193
|
+
session.lastUncachedInputTokens = deltaUncachedInput;
|
|
194
|
+
// Normalized last-call context footprint: how many prompt tokens the
|
|
195
|
+
// model actually saw on the most-recent send, comparable ACROSS
|
|
196
|
+
// providers. Anthropic reports input_tokens EXCLUDING cache (cache_read
|
|
197
|
+
// is a separate field), so the cached portion must be added back to
|
|
198
|
+
// reflect real context size; openai/grok/gemini already fold cached
|
|
199
|
+
// tokens INTO the input count, so input alone is the footprint.
|
|
200
|
+
const _inputExcludesCache = providerInputExcludesCache(session.provider);
|
|
201
|
+
session.lastContextTokens = _inputExcludesCache
|
|
202
|
+
? (deltaInput || 0) + (deltaCachedRead || 0) + (deltaCacheWrite || 0)
|
|
203
|
+
: (deltaInput || 0);
|
|
204
|
+
session.lastContextTokensUpdatedAt = ts || Date.now();
|
|
205
|
+
session.lastContextTokensStaleAfterCompact = false;
|
|
206
|
+
}
|
|
207
|
+
session.lastIterationIndex = iterationIndex;
|
|
208
|
+
session.updatedAt = ts || Date.now();
|
|
209
|
+
await saveSessionAsync(session, { expectedGeneration: session.generation });
|
|
210
|
+
}
|