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,359 @@
|
|
|
1
|
+
// V4A + unified-as-V4A patch parsers and format-detection helpers. Moved
|
|
2
|
+
// verbatim from patch.mjs; parsing behavior (V4A/unified) is unchanged.
|
|
3
|
+
|
|
4
|
+
import { stripDiffPrefix } from './paths.mjs';
|
|
5
|
+
import {
|
|
6
|
+
DEV_NULL,
|
|
7
|
+
V4A_EOF_MARKER,
|
|
8
|
+
V4A_MOVE_TO_PREFIX,
|
|
9
|
+
UNIFIED_HUNK_HEADER_RE,
|
|
10
|
+
UNIFIED_HUNK_HEADER_CAPTURE_RE,
|
|
11
|
+
} from './constants.mjs';
|
|
12
|
+
|
|
13
|
+
// Strip BOM + normalize CRLF→LF only. Idempotent and structural — no
|
|
14
|
+
// hunk metadata is rewritten.
|
|
15
|
+
export function prepareInput(patchStr) {
|
|
16
|
+
return String(patchStr).replace(/^\uFEFF/, '').replace(/\r\n/g, '\n');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function isApplyPatchEnvelope(patchStr) {
|
|
20
|
+
const text = prepareInput(patchStr).trimStart();
|
|
21
|
+
return text.startsWith('*** Begin Patch')
|
|
22
|
+
|| text.startsWith('*** Add File:')
|
|
23
|
+
|| text.startsWith('*** Update File:')
|
|
24
|
+
|| text.startsWith('*** Delete File:');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function isV4APatchInput(patchStr, format) {
|
|
28
|
+
return String(format || '').toLowerCase() === 'v4a'
|
|
29
|
+
|| isApplyPatchEnvelope(patchStr);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function hasUnifiedBareV4AHunk(patchStr) {
|
|
33
|
+
const text = prepareInput(patchStr);
|
|
34
|
+
if (!/^--- /m.test(text) || !/^\+\+\+ /m.test(text)) return false;
|
|
35
|
+
return text.split('\n').some((line) => line.startsWith('@@') && !UNIFIED_HUNK_HEADER_RE.test(line));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function isUnifiedHunkCountError(err) {
|
|
39
|
+
const message = String(err?.message || err || '');
|
|
40
|
+
return /Hunk at line .*more lines than expected|Hunk at line .*less lines than expected|expected \d+ old lines|line count did not match/i.test(message);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function canFallbackCountedUnified(patchStr, requestedFormat, err) {
|
|
44
|
+
if (requestedFormat === 'unified') return false;
|
|
45
|
+
if (isV4APatchInput(patchStr, requestedFormat)) return false;
|
|
46
|
+
const text = prepareInput(patchStr);
|
|
47
|
+
return /^--- /m.test(text)
|
|
48
|
+
&& /^\+\+\+ /m.test(text)
|
|
49
|
+
&& UNIFIED_HUNK_HEADER_RE.test(text.split('\n').find((line) => line.startsWith('@@')) || '')
|
|
50
|
+
&& isUnifiedHunkCountError(err);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function stripPatchPathMetadata(rawPath) {
|
|
54
|
+
let text = String(rawPath || '').trim();
|
|
55
|
+
if (!text) return '';
|
|
56
|
+
const tabIdx = text.indexOf('\t');
|
|
57
|
+
if (tabIdx !== -1) text = text.slice(0, tabIdx).trimEnd();
|
|
58
|
+
const quote = text[0];
|
|
59
|
+
if ((quote === '"' || quote === "'") && text.length > 1) {
|
|
60
|
+
const end = text.indexOf(quote, 1);
|
|
61
|
+
if (end > 0) text = text.slice(1, end);
|
|
62
|
+
}
|
|
63
|
+
return text;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function stripV4APathHeader(line, prefix) {
|
|
67
|
+
return stripPatchPathMetadata(String(line || '').slice(prefix.length));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function normaliseV4APath(rawPath) {
|
|
71
|
+
const p = stripPatchPathMetadata(rawPath);
|
|
72
|
+
if (!p) return '';
|
|
73
|
+
return p.replace(/^["']|["']$/g, '').replace(/\\/g, '/');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function normaliseV4AAnchor(rawAnchor) {
|
|
77
|
+
return String(rawAnchor || '').replace(/\s*@@\s*$/, '').trim();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function stripV4AMovePathHeader(line) {
|
|
81
|
+
return normaliseV4APath(String(line || '').slice(V4A_MOVE_TO_PREFIX.length));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function isV4AEndOfFileMarker(rawLine) {
|
|
85
|
+
return String(rawLine || '').trim() === V4A_EOF_MARKER;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function v4aEnsureUpdateHunk(current, pendingAnchors) {
|
|
89
|
+
return { anchors: pendingAnchors.slice(), lines: [] };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function v4aPushBlankContextLine(currentHunk, pendingAnchors) {
|
|
93
|
+
if (!currentHunk) currentHunk = v4aEnsureUpdateHunk(null, pendingAnchors);
|
|
94
|
+
currentHunk.lines.push(' ');
|
|
95
|
+
return currentHunk;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function v4aMarkHunkEndOfFile(currentHunk, finishHunk) {
|
|
99
|
+
if (!currentHunk || currentHunk.lines.length === 0) {
|
|
100
|
+
throw new Error('V4A update hunk does not contain any lines before *** End of File');
|
|
101
|
+
}
|
|
102
|
+
currentHunk.isEndOfFile = true;
|
|
103
|
+
finishHunk();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Split a patch string into lines, dropping the single trailing empty element
|
|
107
|
+
// produced by the patch's terminal newline. Invariant: a well-formed patch
|
|
108
|
+
// ends with "\n", so `"...\n".split("\n")` always yields a spurious final ""
|
|
109
|
+
// that is a line *terminator*, not a content line. Absorbing it as a blank
|
|
110
|
+
// context line corrupts the last hunk (phantom trailing "" in oldLines) and
|
|
111
|
+
// breaks anchoring whenever the matched source region is not followed by a
|
|
112
|
+
// blank line. A genuine trailing blank context line survives as the
|
|
113
|
+
// second-to-last element, so only the terminator artifact is removed.
|
|
114
|
+
function splitPatchLines(patchStr) {
|
|
115
|
+
const lines = prepareInput(patchStr).split('\n');
|
|
116
|
+
if (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();
|
|
117
|
+
return lines;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Guard against the compacted-history placeholder text leaking back in as
|
|
121
|
+
// literal patch input (models sometimes paste tool-output summaries back as
|
|
122
|
+
// new tool args). Exported so callers (e.g. apply_patch entry) can check
|
|
123
|
+
// this before any format detection / V4A-vs-unified dispatch, so ANY
|
|
124
|
+
// compacted body gets the corrective message regardless of format.
|
|
125
|
+
export const COMPACTED_PLACEHOLDER_RE = /^\s*\[mixdog compacted \w+:/;
|
|
126
|
+
|
|
127
|
+
// Mid-body scan uses the FULL placeholder shape ("<N> chars, sha…") rather
|
|
128
|
+
// than the loose prefix above: V4A tolerates unprefixed context lines, so a
|
|
129
|
+
// loose prefix match on any non-diff line could false-positive a legit edit
|
|
130
|
+
// whose content mentions the placeholder text. The full shape only occurs in
|
|
131
|
+
// actual compacted output leaked back as patch input.
|
|
132
|
+
const COMPACTED_PLACEHOLDER_LINE_RE = /^\s*\[mixdog compacted \w+: \d+ chars, sha\d*:/;
|
|
133
|
+
|
|
134
|
+
export function isCompactedPlaceholderPatch(patchStr) {
|
|
135
|
+
const str = String(patchStr ?? '');
|
|
136
|
+
if (COMPACTED_PLACEHOLDER_RE.test(str)) return true;
|
|
137
|
+
// Whole-patch prefix check above only catches the placeholder as the very
|
|
138
|
+
// first line. Models sometimes paste the placeholder mid-body (e.g. after
|
|
139
|
+
// a "*** Begin Patch" header or between hunks) as a standalone raw line.
|
|
140
|
+
// Scan for that shape too, but only on lines that are NOT diff content
|
|
141
|
+
// (unified +/-/space-prefixed lines), so a legit edit to a file whose
|
|
142
|
+
// real content happens to contain this literal text still parses normally.
|
|
143
|
+
for (const line of str.split('\n')) {
|
|
144
|
+
if (line.startsWith('+') || line.startsWith('-') || line.startsWith(' ')) continue;
|
|
145
|
+
if (COMPACTED_PLACEHOLDER_LINE_RE.test(line)) return true;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function parseV4APatch(patchStr) {
|
|
151
|
+
const lines = splitPatchLines(patchStr);
|
|
152
|
+
const files = [];
|
|
153
|
+
let current = null;
|
|
154
|
+
let pendingAnchors = [];
|
|
155
|
+
let currentHunk = null;
|
|
156
|
+
|
|
157
|
+
const finishHunk = () => {
|
|
158
|
+
if (!current || !currentHunk) return;
|
|
159
|
+
if (currentHunk.lines.length > 0) current.hunks.push(currentHunk);
|
|
160
|
+
currentHunk = null;
|
|
161
|
+
};
|
|
162
|
+
const finishFile = () => {
|
|
163
|
+
finishHunk();
|
|
164
|
+
current = null;
|
|
165
|
+
pendingAnchors = [];
|
|
166
|
+
};
|
|
167
|
+
const startFile = (kind, path) => {
|
|
168
|
+
finishFile();
|
|
169
|
+
current = { kind, path: normaliseV4APath(path), hunks: [], lines: [], movePath: null };
|
|
170
|
+
files.push(current);
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
for (const rawLine of lines) {
|
|
174
|
+
if (rawLine === '*** Begin Patch' || rawLine === '*** End Patch') continue;
|
|
175
|
+
if (rawLine.startsWith('*** Update File:')) {
|
|
176
|
+
startFile('update', stripV4APathHeader(rawLine, '*** Update File:'));
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if (rawLine.startsWith('*** Add File:')) {
|
|
180
|
+
startFile('add', stripV4APathHeader(rawLine, '*** Add File:'));
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
if (rawLine.startsWith('*** Delete File:')) {
|
|
184
|
+
startFile('delete', stripV4APathHeader(rawLine, '*** Delete File:'));
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (!current) {
|
|
188
|
+
throw new Error(`V4A patch line appears before a file header: ${rawLine}`);
|
|
189
|
+
}
|
|
190
|
+
if (current.kind === 'update' && rawLine.startsWith(V4A_MOVE_TO_PREFIX)) {
|
|
191
|
+
if (current.movePath) {
|
|
192
|
+
throw new Error(`V4A patch lists multiple ${V4A_MOVE_TO_PREFIX} directives for ${current.path}`);
|
|
193
|
+
}
|
|
194
|
+
const dest = stripV4AMovePathHeader(rawLine);
|
|
195
|
+
if (!dest) throw new Error('V4A patch contains an empty move destination path');
|
|
196
|
+
current.movePath = dest;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (current.kind === 'add') {
|
|
200
|
+
current.lines.push(rawLine.startsWith('+') ? rawLine.slice(1) : rawLine);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (current.kind === 'delete') {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (rawLine === '') {
|
|
207
|
+
if (currentHunk) currentHunk = v4aPushBlankContextLine(currentHunk, pendingAnchors);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (isV4AEndOfFileMarker(rawLine)) {
|
|
211
|
+
v4aMarkHunkEndOfFile(currentHunk, finishHunk);
|
|
212
|
+
currentHunk = null;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (rawLine.startsWith('@@')) {
|
|
216
|
+
const anchor = normaliseV4AAnchor(rawLine.slice(2));
|
|
217
|
+
if (currentHunk && currentHunk.lines.length > 0) finishHunk();
|
|
218
|
+
pendingAnchors.push(anchor);
|
|
219
|
+
currentHunk = { anchors: pendingAnchors.slice(), lines: [] };
|
|
220
|
+
pendingAnchors = [];
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
const tag = rawLine[0];
|
|
224
|
+
if (tag !== ' ' && tag !== '-' && tag !== '+') {
|
|
225
|
+
if (!currentHunk) currentHunk = v4aEnsureUpdateHunk(current, pendingAnchors);
|
|
226
|
+
pendingAnchors = [];
|
|
227
|
+
currentHunk.lines.push(` ${rawLine}`);
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (!currentHunk) currentHunk = v4aEnsureUpdateHunk(current, pendingAnchors);
|
|
231
|
+
currentHunk.lines.push(rawLine);
|
|
232
|
+
}
|
|
233
|
+
finishFile();
|
|
234
|
+
const bad = files.find((file) => !file.path);
|
|
235
|
+
if (bad) throw new Error('V4A patch contains an empty file path');
|
|
236
|
+
if (files.length === 0) throw new Error('V4A patch contained no file sections');
|
|
237
|
+
return files;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function stripUnifiedV4APathHeader(line, prefix) {
|
|
241
|
+
return stripDiffPrefix(normaliseV4APath(String(line || '').slice(prefix.length)));
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Shared parser for unified-input -> V4A sections. The bare and counted
|
|
245
|
+
// fallbacks are byte-identical except for (a) the error label and (b) how an
|
|
246
|
+
// `@@` line yields its anchor: bare rejects counted headers and takes the raw
|
|
247
|
+
// tail; counted requires a counted header and takes its capture group. The
|
|
248
|
+
// difference is injected as `resolveAnchor`; everything else is shared.
|
|
249
|
+
function parseUnifiedAsV4APatch(patchStr, { label, resolveAnchor }) {
|
|
250
|
+
const lines = splitPatchLines(patchStr);
|
|
251
|
+
const files = [];
|
|
252
|
+
let current = null;
|
|
253
|
+
let pendingAnchors = [];
|
|
254
|
+
let currentHunk = null;
|
|
255
|
+
|
|
256
|
+
const finishHunk = () => {
|
|
257
|
+
if (!current || !currentHunk) return;
|
|
258
|
+
if (current.kind === 'update' && currentHunk.lines.length > 0) current.hunks.push(currentHunk);
|
|
259
|
+
currentHunk = null;
|
|
260
|
+
};
|
|
261
|
+
const finishFile = () => {
|
|
262
|
+
finishHunk();
|
|
263
|
+
current = null;
|
|
264
|
+
pendingAnchors = [];
|
|
265
|
+
};
|
|
266
|
+
const startFile = (oldPath, newPath) => {
|
|
267
|
+
finishFile();
|
|
268
|
+
const oldIsNull = DEV_NULL.test(oldPath || '');
|
|
269
|
+
const newIsNull = DEV_NULL.test(newPath || '');
|
|
270
|
+
const kind = oldIsNull ? 'add' : (newIsNull ? 'delete' : 'update');
|
|
271
|
+
const path = kind === 'add' ? newPath : oldPath;
|
|
272
|
+
current = { kind, path: normaliseV4APath(path), hunks: [], lines: [] };
|
|
273
|
+
files.push(current);
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
for (let i = 0; i < lines.length; i++) {
|
|
277
|
+
const rawLine = lines[i];
|
|
278
|
+
if (rawLine.startsWith('diff --git ') || rawLine.startsWith('index ') || rawLine.startsWith('new file mode ') || rawLine.startsWith('deleted file mode ')) {
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (rawLine.startsWith('--- ')) {
|
|
282
|
+
const next = lines[i + 1] || '';
|
|
283
|
+
if (next.startsWith('+++ ')) {
|
|
284
|
+
startFile(stripUnifiedV4APathHeader(rawLine, '--- '), stripUnifiedV4APathHeader(next, '+++ '));
|
|
285
|
+
i++;
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
// A real unified file header `--- X` is ALWAYS immediately followed by a
|
|
289
|
+
// `+++ Y` line. Without the pair, outside a file this is a malformed
|
|
290
|
+
// patch (keep the diagnostic); INSIDE a file it is a hunk-body deletion
|
|
291
|
+
// line whose content starts with `-- ` (rawLine `--- foo`) — fall through
|
|
292
|
+
// to body handling instead of misreading it as a file header.
|
|
293
|
+
if (!current) throw new Error(`${label} missing +++ header after: ${rawLine}`);
|
|
294
|
+
}
|
|
295
|
+
if (!current) continue;
|
|
296
|
+
if (rawLine === '') {
|
|
297
|
+
if (current.kind !== 'update') continue;
|
|
298
|
+
if (currentHunk) currentHunk = v4aPushBlankContextLine(currentHunk, pendingAnchors);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (current.kind === 'update' && isV4AEndOfFileMarker(rawLine)) {
|
|
302
|
+
v4aMarkHunkEndOfFile(currentHunk, finishHunk);
|
|
303
|
+
currentHunk = null;
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
if (rawLine.startsWith('@@')) {
|
|
307
|
+
const anchor = resolveAnchor(rawLine);
|
|
308
|
+
if (currentHunk && currentHunk.lines.length > 0) finishHunk();
|
|
309
|
+
pendingAnchors.push(anchor);
|
|
310
|
+
currentHunk = { anchors: pendingAnchors.slice(), lines: [] };
|
|
311
|
+
pendingAnchors = [];
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
if (current.kind === 'add') {
|
|
315
|
+
if (rawLine[0] === '+') current.lines.push(rawLine.slice(1));
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
if (current.kind === 'delete') {
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
const tag = rawLine[0];
|
|
322
|
+
if (tag !== ' ' && tag !== '-' && tag !== '+') {
|
|
323
|
+
if (!currentHunk) currentHunk = v4aEnsureUpdateHunk(current, pendingAnchors);
|
|
324
|
+
pendingAnchors = [];
|
|
325
|
+
currentHunk.lines.push(` ${rawLine}`);
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
if (!currentHunk) currentHunk = v4aEnsureUpdateHunk(current, pendingAnchors);
|
|
329
|
+
currentHunk.lines.push(rawLine);
|
|
330
|
+
}
|
|
331
|
+
finishFile();
|
|
332
|
+
const bad = files.find((file) => !file.path);
|
|
333
|
+
if (bad) throw new Error(`${label} contains an empty file path`);
|
|
334
|
+
if (files.length === 0) throw new Error(`${label} contained no file sections`);
|
|
335
|
+
return files;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
export function parseUnifiedBareV4APatch(patchStr) {
|
|
339
|
+
return parseUnifiedAsV4APatch(patchStr, {
|
|
340
|
+
label: 'unified bare patch',
|
|
341
|
+
resolveAnchor: (rawLine) => {
|
|
342
|
+
if (UNIFIED_HUNK_HEADER_RE.test(rawLine)) {
|
|
343
|
+
throw new Error('unified bare patch cannot mix counted unified hunks with bare @@ anchors');
|
|
344
|
+
}
|
|
345
|
+
return normaliseV4AAnchor(rawLine.slice(2));
|
|
346
|
+
},
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export function parseUnifiedCountedAsV4APatch(patchStr) {
|
|
351
|
+
return parseUnifiedAsV4APatch(patchStr, {
|
|
352
|
+
label: 'unified fallback',
|
|
353
|
+
resolveAnchor: (rawLine) => {
|
|
354
|
+
const match = UNIFIED_HUNK_HEADER_CAPTURE_RE.exec(rawLine);
|
|
355
|
+
if (!match) throw new Error(`unified fallback requires counted hunk header: ${rawLine}`);
|
|
356
|
+
return normaliseV4AAnchor(match[1] || '');
|
|
357
|
+
},
|
|
358
|
+
});
|
|
359
|
+
}
|