@pugi/cli 0.1.0-beta.98 → 1.0.0-alpha.1
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/LICENSE +1 -1
- package/README.md +11 -191
- package/bin/pugi +8 -0
- package/package.json +15 -71
- package/postinstall.mjs +31 -0
- package/CHANGELOG.md +0 -132
- package/THIRD_PARTY_NOTICES.md +0 -40
- package/assets/pugi-mascot.ansi +0 -16
- package/assets/pugi-prozr2-mascot.ansi +0 -9
- package/bin/run.js +0 -34
- package/dist/commands/deploy.js +0 -439
- package/dist/commands/flatten.js +0 -191
- package/dist/commands/jobs-watch.js +0 -201
- package/dist/commands/jobs.js +0 -260
- package/dist/commands/retro.js +0 -210
- package/dist/commands/smoke.js +0 -133
- package/dist/core/agent-progress/cleanup.js +0 -134
- package/dist/core/agent-progress/schema.js +0 -144
- package/dist/core/agent-progress/writer.js +0 -101
- package/dist/core/agents/adaptive-router.js +0 -330
- package/dist/core/agents/loader.js +0 -104
- package/dist/core/agents/query-decomposer.js +0 -297
- package/dist/core/agents/registry.js +0 -69
- package/dist/core/approvals/shortcut-resolver.js +0 -98
- package/dist/core/artifact-chain/dispatcher.js +0 -148
- package/dist/core/artifact-chain/exporter.js +0 -164
- package/dist/core/artifact-chain/state.js +0 -243
- package/dist/core/artifact-chain/steps.js +0 -169
- package/dist/core/ask-user/question.js +0 -92
- package/dist/core/audit/audit-trail.js +0 -275
- package/dist/core/auth/ensure-authenticated.js +0 -129
- package/dist/core/auth/env-provider.js +0 -238
- package/dist/core/auto-open-browser.js +0 -128
- package/dist/core/auto-update/channels.js +0 -122
- package/dist/core/auto-update/checker.js +0 -241
- package/dist/core/auto-update/state.js +0 -235
- package/dist/core/bare-mode/index.js +0 -107
- package/dist/core/bash/redirect.js +0 -281
- package/dist/core/bash-classifier.js +0 -1397
- package/dist/core/checkpoint/resumer.js +0 -149
- package/dist/core/checkpoint/rewinder.js +0 -291
- package/dist/core/checkpoints/shadow-git.js +0 -670
- package/dist/core/citations/parser.js +0 -109
- package/dist/core/classifier/yolo-classifier.js +0 -88
- package/dist/core/clipboard.js +0 -70
- package/dist/core/codegraph/decision-store.js +0 -248
- package/dist/core/codegraph/detect-repo.js +0 -459
- package/dist/core/codegraph/install.js +0 -134
- package/dist/core/codegraph/offer-hook.js +0 -220
- package/dist/core/compact/auto-trigger.js +0 -96
- package/dist/core/compact/buffer-rewriter.js +0 -115
- package/dist/core/compact/summarizer.js +0 -208
- package/dist/core/compact/token-counter.js +0 -108
- package/dist/core/consensus/anvil-fanout.js +0 -276
- package/dist/core/consensus/diff-capture.js +0 -491
- package/dist/core/consensus/rubric.js +0 -233
- package/dist/core/context/builder.js +0 -114
- package/dist/core/context/compaction-events.js +0 -99
- package/dist/core/context/compaction.js +0 -602
- package/dist/core/context/index.js +0 -28
- package/dist/core/context/invariants.js +0 -250
- package/dist/core/context/markdown-loader.js +0 -288
- package/dist/core/context/markdown-traverse.js +0 -255
- package/dist/core/context/pugiignore.js +0 -316
- package/dist/core/context/repo-skeleton.js +0 -533
- package/dist/core/context/tool-eviction.js +0 -55
- package/dist/core/context/watcher.js +0 -342
- package/dist/core/context/working-set.js +0 -165
- package/dist/core/coordinator/agent-tools.js +0 -77
- package/dist/core/coordinator/agent-toolset.js +0 -65
- package/dist/core/coordinator/fsm.js +0 -73
- package/dist/core/coordinator/mode-fsm.js +0 -70
- package/dist/core/cost/rate-card.js +0 -129
- package/dist/core/cost/tracker.js +0 -221
- package/dist/core/credentials.js +0 -355
- package/dist/core/cron/scheduler.js +0 -138
- package/dist/core/denial-tracking/index.js +0 -8
- package/dist/core/denial-tracking/state.js +0 -264
- package/dist/core/diagnostics/probe-runner.js +0 -93
- package/dist/core/diagnostics/probes/api.js +0 -46
- package/dist/core/diagnostics/probes/auth.js +0 -93
- package/dist/core/diagnostics/probes/bare-mode.js +0 -42
- package/dist/core/diagnostics/probes/cli-version.js +0 -127
- package/dist/core/diagnostics/probes/config.js +0 -72
- package/dist/core/diagnostics/probes/denial-tracking.js +0 -57
- package/dist/core/diagnostics/probes/disk.js +0 -81
- package/dist/core/diagnostics/probes/engine-live.js +0 -46
- package/dist/core/diagnostics/probes/git.js +0 -65
- package/dist/core/diagnostics/probes/hooks.js +0 -118
- package/dist/core/diagnostics/probes/mcp.js +0 -75
- package/dist/core/diagnostics/probes/node.js +0 -59
- package/dist/core/diagnostics/probes/pnpm.js +0 -36
- package/dist/core/diagnostics/probes/pugi-md.js +0 -89
- package/dist/core/diagnostics/probes/sandbox.js +0 -72
- package/dist/core/diagnostics/probes/session.js +0 -74
- package/dist/core/diagnostics/probes/status-snapshot.js +0 -488
- package/dist/core/diagnostics/probes/workspace.js +0 -63
- package/dist/core/diagnostics/types.js +0 -70
- package/dist/core/dispatch/cache-cleanup.js +0 -197
- package/dist/core/dispatch/cache-handoff.js +0 -295
- package/dist/core/edits/apply-patch-layer-e.js +0 -189
- package/dist/core/edits/dispatch.js +0 -511
- package/dist/core/edits/format-detector.js +0 -260
- package/dist/core/edits/format-matrix.js +0 -26
- package/dist/core/edits/fuzzy-ladder.js +0 -650
- package/dist/core/edits/index.js +0 -19
- package/dist/core/edits/journal.js +0 -199
- package/dist/core/edits/layer-a-apply.js +0 -217
- package/dist/core/edits/layer-a-fuzzy-apply.js +0 -198
- package/dist/core/edits/layer-b-apply.js +0 -211
- package/dist/core/edits/layer-c-apply.js +0 -160
- package/dist/core/edits/layer-d-ast.js +0 -572
- package/dist/core/edits/marker-parser.js +0 -401
- package/dist/core/edits/security-gate.js +0 -223
- package/dist/core/edits/verify-hook.js +0 -273
- package/dist/core/edits/worktree.js +0 -322
- package/dist/core/engine/adapter-runner.js +0 -8
- package/dist/core/engine/anvil-client.js +0 -344
- package/dist/core/engine/auto-compact.js +0 -179
- package/dist/core/engine/budgets.js +0 -192
- package/dist/core/engine/context-prefix.js +0 -155
- package/dist/core/engine/index.js +0 -12
- package/dist/core/engine/intensity.js +0 -163
- package/dist/core/engine/intent.js +0 -260
- package/dist/core/engine/native-pugi.js +0 -1616
- package/dist/core/engine/noop.js +0 -27
- package/dist/core/engine/prompts.js +0 -236
- package/dist/core/engine/strip-internal-fields.js +0 -124
- package/dist/core/engine/tool-bridge.js +0 -2173
- package/dist/core/engine/verification-patterns.js +0 -195
- package/dist/core/evaluation/golden-dataset.js +0 -293
- package/dist/core/feedback/queue.js +0 -177
- package/dist/core/feedback/submitter.js +0 -145
- package/dist/core/file-cache.js +0 -141
- package/dist/core/flatten/flatten-repo.js +0 -439
- package/dist/core/format/osc8-link.js +0 -28
- package/dist/core/hook-chains.js +0 -392
- package/dist/core/hooks/citation-verify-hook.js +0 -138
- package/dist/core/hooks/citation-verify.js +0 -112
- package/dist/core/hooks/events.js +0 -46
- package/dist/core/hooks/index.js +0 -15
- package/dist/core/hooks/registry.js +0 -216
- package/dist/core/hooks/runner.js +0 -236
- package/dist/core/hooks/v2/event-emitter.js +0 -115
- package/dist/core/hooks/v2/executor.js +0 -282
- package/dist/core/hooks/v2/index.js +0 -25
- package/dist/core/hooks/v2/lifecycle.js +0 -104
- package/dist/core/hooks/v2/loader.js +0 -216
- package/dist/core/hooks/v2/matcher.js +0 -125
- package/dist/core/hooks/v2/trust.js +0 -143
- package/dist/core/hooks/v2/types.js +0 -86
- package/dist/core/hooks/worktree-events.js +0 -158
- package/dist/core/hooks.js +0 -415
- package/dist/core/image/renderer.js +0 -71
- package/dist/core/index-store.js +0 -260
- package/dist/core/init/detector.js +0 -582
- package/dist/core/init/template-renderer.js +0 -242
- package/dist/core/jobs/registry.js +0 -462
- package/dist/core/ledger/results-tsv.js +0 -142
- package/dist/core/log-discipline/stdout-redirect.js +0 -51
- package/dist/core/lsp/cache.js +0 -105
- package/dist/core/lsp/client.js +0 -1229
- package/dist/core/lsp/language-detect.js +0 -66
- package/dist/core/lsp/post-edit-diagnostics.js +0 -171
- package/dist/core/lsp/server-detect.js +0 -173
- package/dist/core/lsp/symbol-cache.js +0 -162
- package/dist/core/lsp/symbol-tools.js +0 -664
- package/dist/core/mcp/client.js +0 -385
- package/dist/core/mcp/http-server.js +0 -553
- package/dist/core/mcp/orchestrator-config.js +0 -192
- package/dist/core/mcp/orchestrator-tools.js +0 -806
- package/dist/core/mcp/permission.js +0 -190
- package/dist/core/mcp/registry.js +0 -193
- package/dist/core/mcp/server-tools.js +0 -219
- package/dist/core/mcp/server.js +0 -397
- package/dist/core/mcp/trust.js +0 -91
- package/dist/core/memory/dual-write.js +0 -416
- package/dist/core/memory/passive-extract.js +0 -130
- package/dist/core/memory/phase1-kinds.js +0 -20
- package/dist/core/memory/secret-scanner.js +0 -304
- package/dist/core/memory-sync/queue.js +0 -170
- package/dist/core/metrics/extract.js +0 -113
- package/dist/core/modes/roo-modes.js +0 -68
- package/dist/core/onboarding/ensure-initialized.js +0 -133
- package/dist/core/onboarding/marker.js +0 -111
- package/dist/core/onboarding/telemetry-state.js +0 -108
- package/dist/core/output-style/presets.js +0 -176
- package/dist/core/output-style/state.js +0 -185
- package/dist/core/path-security.js +0 -345
- package/dist/core/permission.js +0 -369
- package/dist/core/permissions/auto-classifier.js +0 -124
- package/dist/core/permissions/bash-parser.js +0 -371
- package/dist/core/permissions/circuit-breaker.js +0 -83
- package/dist/core/permissions/constrained-edit.js +0 -91
- package/dist/core/permissions/gate.js +0 -278
- package/dist/core/permissions/index.js +0 -20
- package/dist/core/permissions/mode.js +0 -174
- package/dist/core/permissions/network-egress.js +0 -137
- package/dist/core/permissions/state.js +0 -241
- package/dist/core/permissions/tool-class.js +0 -107
- package/dist/core/plan-mode/ui-state.js +0 -51
- package/dist/core/plans/plan-artifact.js +0 -721
- package/dist/core/policy-limits/etag-store.js +0 -122
- package/dist/core/prd-check/parser.js +0 -215
- package/dist/core/prd-check/reporter.js +0 -127
- package/dist/core/prd-check/session-review.js +0 -557
- package/dist/core/prd-check/verifiers.js +0 -223
- package/dist/core/prompt-cache/client-cache.js +0 -99
- package/dist/core/prompts/assembly.js +0 -29
- package/dist/core/prompts/registry.js +0 -364
- package/dist/core/pugi-gitignore.js +0 -52
- package/dist/core/pugi-md/cc-compat-rules.js +0 -735
- package/dist/core/pugi-md/context-injector.js +0 -76
- package/dist/core/pugi-md/walk-up.js +0 -207
- package/dist/core/python/uv-installer.js +0 -270
- package/dist/core/python/uv-resolver.js +0 -83
- package/dist/core/rate-limit/narrator.js +0 -146
- package/dist/core/recipes/cli-types.js +0 -20
- package/dist/core/recipes/loader.js +0 -103
- package/dist/core/recipes/runner.js +0 -345
- package/dist/core/recipes/schema.js +0 -587
- package/dist/core/release-notes/parser.js +0 -241
- package/dist/core/release-notes/state.js +0 -116
- package/dist/core/repl/ask.js +0 -512
- package/dist/core/repl/cancellation.js +0 -98
- package/dist/core/repl/cap-warning.js +0 -91
- package/dist/core/repl/clipboard-read.js +0 -174
- package/dist/core/repl/dispatch-fsm.js +0 -220
- package/dist/core/repl/engine-bridge.js +0 -303
- package/dist/core/repl/history-search.js +0 -175
- package/dist/core/repl/history.js +0 -182
- package/dist/core/repl/kill-ring.js +0 -138
- package/dist/core/repl/model-pricing.js +0 -135
- package/dist/core/repl/privacy-banner.js +0 -71
- package/dist/core/repl/session.js +0 -4962
- package/dist/core/repl/slash-commands.js +0 -747
- package/dist/core/repl/store/index.js +0 -12
- package/dist/core/repl/store/jsonl-log.js +0 -321
- package/dist/core/repl/store/lockfile.js +0 -155
- package/dist/core/repl/store/session-store.js +0 -821
- package/dist/core/repl/store/types.js +0 -44
- package/dist/core/repl/store/uuid-v7.js +0 -68
- package/dist/core/repl/tool-route.js +0 -382
- package/dist/core/repl/workspace-context.js +0 -206
- package/dist/core/repo-map/build.js +0 -125
- package/dist/core/repo-map/cache.js +0 -185
- package/dist/core/repo-map/extractor.js +0 -254
- package/dist/core/repo-map/formatter.js +0 -145
- package/dist/core/repo-map/page-rank.js +0 -105
- package/dist/core/repo-map/scanner.js +0 -211
- package/dist/core/retro/git-collector.js +0 -251
- package/dist/core/retro/health-card.js +0 -25
- package/dist/core/retro/metrics.js +0 -342
- package/dist/core/retro/narrative.js +0 -249
- package/dist/core/retro/plane-collector.js +0 -274
- package/dist/core/retro/pr-issue-link.js +0 -65
- package/dist/core/retro/types.js +0 -16
- package/dist/core/retry-budget/budget.js +0 -284
- package/dist/core/retry-budget/index.js +0 -5
- package/dist/core/retry-budget/retry-cap.js +0 -74
- package/dist/core/routing/lead-worker.js +0 -43
- package/dist/core/routing/pre-flight-estimator.js +0 -108
- package/dist/core/runs/run-tree.js +0 -103
- package/dist/core/sandboxing/adapter.js +0 -29
- package/dist/core/sandboxing/index.js +0 -49
- package/dist/core/sandboxing/none.js +0 -19
- package/dist/core/sandboxing/seatbelt.js +0 -183
- package/dist/core/security/injection-scanner.js +0 -367
- package/dist/core/security/output-filter.js +0 -418
- package/dist/core/session/env-file.js +0 -105
- package/dist/core/session/section-budgets.js +0 -140
- package/dist/core/session.js +0 -377
- package/dist/core/settings.js +0 -400
- package/dist/core/share/formatter.js +0 -271
- package/dist/core/share/redactor.js +0 -221
- package/dist/core/share/uploader.js +0 -267
- package/dist/core/skills/defaults.js +0 -457
- package/dist/core/skills/loader.js +0 -454
- package/dist/core/skills/sources.js +0 -480
- package/dist/core/skills/trust.js +0 -172
- package/dist/core/smoke/headless-driver.js +0 -174
- package/dist/core/smoke/orchestrator.js +0 -194
- package/dist/core/smoke/runner.js +0 -238
- package/dist/core/smoke/scenario-parser.js +0 -316
- package/dist/core/statusline.js +0 -99
- package/dist/core/subagents/dispatcher-real.js +0 -600
- package/dist/core/subagents/dispatcher.js +0 -352
- package/dist/core/subagents/index.js +0 -39
- package/dist/core/subagents/isolation-matrix.js +0 -213
- package/dist/core/subagents/spawn.js +0 -101
- package/dist/core/telemetry/emitter.js +0 -229
- package/dist/core/telemetry/queue.js +0 -251
- package/dist/core/theme/context.js +0 -91
- package/dist/core/theme/presets.js +0 -228
- package/dist/core/theme/state.js +0 -181
- package/dist/core/todos/invariant.js +0 -10
- package/dist/core/todos/state.js +0 -177
- package/dist/core/tool-schema/compressor.js +0 -89
- package/dist/core/transport/version-interceptor.js +0 -166
- package/dist/core/trust.js +0 -109
- package/dist/core/tui/thinking-block.js +0 -64
- package/dist/core/vim/keymap.js +0 -288
- package/dist/core/vim/state.js +0 -92
- package/dist/core/watch-markers/marker-watcher.js +0 -133
- package/dist/core/worktree/include-parser.js +0 -249
- package/dist/core/worktree-manager/cleanup.js +0 -123
- package/dist/core/worktree-manager/manager.js +0 -303
- package/dist/index.js +0 -44
- package/dist/runtime/bootstrap.js +0 -190
- package/dist/runtime/cli.js +0 -8121
- package/dist/runtime/commands/agents.js +0 -385
- package/dist/runtime/commands/budget.js +0 -192
- package/dist/runtime/commands/cancel.js +0 -231
- package/dist/runtime/commands/chain.js +0 -489
- package/dist/runtime/commands/codegraph-status.js +0 -227
- package/dist/runtime/commands/compact.js +0 -297
- package/dist/runtime/commands/config.js +0 -595
- package/dist/runtime/commands/cost.js +0 -199
- package/dist/runtime/commands/delegate.js +0 -312
- package/dist/runtime/commands/dispatch.js +0 -126
- package/dist/runtime/commands/doctor.js +0 -579
- package/dist/runtime/commands/feedback.js +0 -184
- package/dist/runtime/commands/hooks.js +0 -187
- package/dist/runtime/commands/init.js +0 -254
- package/dist/runtime/commands/lsp.js +0 -368
- package/dist/runtime/commands/mcp.js +0 -935
- package/dist/runtime/commands/memory.js +0 -582
- package/dist/runtime/commands/model.js +0 -237
- package/dist/runtime/commands/onboarding.js +0 -275
- package/dist/runtime/commands/patch.js +0 -128
- package/dist/runtime/commands/permissions.js +0 -112
- package/dist/runtime/commands/plan.js +0 -143
- package/dist/runtime/commands/prd-check.js +0 -285
- package/dist/runtime/commands/privacy.js +0 -107
- package/dist/runtime/commands/recipe.js +0 -325
- package/dist/runtime/commands/redo-blob-store.js +0 -92
- package/dist/runtime/commands/redo.js +0 -361
- package/dist/runtime/commands/release-notes.js +0 -229
- package/dist/runtime/commands/repo-map.js +0 -95
- package/dist/runtime/commands/report.js +0 -299
- package/dist/runtime/commands/resume.js +0 -118
- package/dist/runtime/commands/review-consensus.js +0 -414
- package/dist/runtime/commands/rewind.js +0 -333
- package/dist/runtime/commands/roster.js +0 -117
- package/dist/runtime/commands/sessions.js +0 -163
- package/dist/runtime/commands/share.js +0 -316
- package/dist/runtime/commands/skills.js +0 -401
- package/dist/runtime/commands/status.js +0 -186
- package/dist/runtime/commands/stickers.js +0 -82
- package/dist/runtime/commands/style.js +0 -194
- package/dist/runtime/commands/theme.js +0 -196
- package/dist/runtime/commands/undo.js +0 -361
- package/dist/runtime/commands/update.js +0 -289
- package/dist/runtime/commands/vim.js +0 -140
- package/dist/runtime/commands/worktree.js +0 -177
- package/dist/runtime/commands/worktrees.js +0 -155
- package/dist/runtime/deprecation-warning.js +0 -69
- package/dist/runtime/engine-exit-code.js +0 -50
- package/dist/runtime/headless-repl.js +0 -195
- package/dist/runtime/headless.js +0 -548
- package/dist/runtime/load-hooks-or-exit.js +0 -71
- package/dist/runtime/plan-decompose.js +0 -531
- package/dist/runtime/sigint-guard.js +0 -272
- package/dist/runtime/stream-renderer.js +0 -195
- package/dist/runtime/update-check.js +0 -294
- package/dist/runtime/version.js +0 -65
- package/dist/runtime/worktree-bootstrap.js +0 -579
- package/dist/skills/bundled/batch.js +0 -617
- package/dist/skills/bundled/index.js +0 -45
- package/dist/skills/bundled/loop.js +0 -358
- package/dist/skills/bundled/remember.js +0 -383
- package/dist/skills/bundled/simplify.js +0 -289
- package/dist/skills/bundled/skillify.js +0 -373
- package/dist/skills/bundled/stuck.js +0 -558
- package/dist/skills/bundled/verify.js +0 -439
- package/dist/testing/vcr.js +0 -486
- package/dist/tools/agent-tool.js +0 -229
- package/dist/tools/apply-patch.js +0 -556
- package/dist/tools/ask-user-question.js +0 -337
- package/dist/tools/ask-user.js +0 -115
- package/dist/tools/bash.js +0 -1238
- package/dist/tools/brief.js +0 -224
- package/dist/tools/cron.js +0 -433
- package/dist/tools/enter-worktree.js +0 -250
- package/dist/tools/exit-worktree.js +0 -147
- package/dist/tools/file-tools.js +0 -553
- package/dist/tools/http-request.js +0 -336
- package/dist/tools/lsp-tools.js +0 -565
- package/dist/tools/mcp-tool.js +0 -260
- package/dist/tools/multi-edit.js +0 -361
- package/dist/tools/powershell.js +0 -268
- package/dist/tools/registry.js +0 -166
- package/dist/tools/server-tools.js +0 -892
- package/dist/tools/skill-tool.js +0 -96
- package/dist/tools/sleep.js +0 -99
- package/dist/tools/synthetic-output.js +0 -133
- package/dist/tools/tasks.js +0 -208
- package/dist/tools/todo-write.js +0 -184
- package/dist/tools/verify-plan-execution.js +0 -295
- package/dist/tools/web-fetch-injection-scanner.js +0 -207
- package/dist/tools/web-fetch.js +0 -720
- package/dist/tools/web-search.js +0 -458
- package/dist/tui/agent-progress-card.js +0 -111
- package/dist/tui/agent-tree-pane.js +0 -9
- package/dist/tui/agent-tree.js +0 -87
- package/dist/tui/ask-cli.js +0 -52
- package/dist/tui/ask-modal.js +0 -211
- package/dist/tui/ask-user-question-chips.js +0 -315
- package/dist/tui/ask-user-question-prompt.js +0 -203
- package/dist/tui/compact-banner.js +0 -81
- package/dist/tui/conversation-pane.js +0 -164
- package/dist/tui/cost-table.js +0 -111
- package/dist/tui/device-flow.js +0 -142
- package/dist/tui/doctor-table.js +0 -46
- package/dist/tui/feedback-prompt.js +0 -156
- package/dist/tui/input-box.js +0 -732
- package/dist/tui/login-picker.js +0 -69
- package/dist/tui/markdown-render.js +0 -266
- package/dist/tui/multi-file-diff-approval.js +0 -375
- package/dist/tui/onboarding-wizard.js +0 -240
- package/dist/tui/permissions-picker.js +0 -86
- package/dist/tui/render.js +0 -160
- package/dist/tui/repl-render.js +0 -770
- package/dist/tui/repl-splash-art.js +0 -64
- package/dist/tui/repl-splash-mascot.js +0 -154
- package/dist/tui/repl-splash.js +0 -117
- package/dist/tui/repl.js +0 -378
- package/dist/tui/slash-palette.js +0 -106
- package/dist/tui/splash-data.js +0 -61
- package/dist/tui/splash.js +0 -31
- package/dist/tui/status-bar.js +0 -209
- package/dist/tui/status-table.js +0 -7
- package/dist/tui/stickers-art.js +0 -136
- package/dist/tui/style-table.js +0 -28
- package/dist/tui/theme-table.js +0 -29
- package/dist/tui/thinking-spinner.js +0 -123
- package/dist/tui/tool-stream-pane.js +0 -140
- package/dist/tui/update-banner.js +0 -33
- package/dist/tui/vim-input.js +0 -267
- package/dist/tui/welcome-banner.js +0 -107
- package/dist/tui/welcome-data.js +0 -293
- package/dist/tui/workspace-context.js +0 -105
- package/docs/examples/codegraph.mcp.json +0 -10
- package/test/scenarios/codegen-create-file.scenario.txt +0 -13
- package/test/scenarios/compact-force.scenario.txt +0 -12
- package/test/scenarios/identity.scenario.txt +0 -11
- package/test/scenarios/persona-handoff.scenario.txt +0 -12
- package/test/scenarios/walkback.scenario.txt +0 -12
|
@@ -1,511 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Diff dispatch — escalation Phase 1, β1b Pl8 transactional layer
|
|
3
|
-
* .
|
|
4
|
-
*
|
|
5
|
-
* Reads a raw model response containing one or more SEARCH/REPLACE
|
|
6
|
-
* envelopes, normalises them through `marker-parser`, and routes each
|
|
7
|
-
* parsed edit to the correct applicator:
|
|
8
|
-
*
|
|
9
|
-
* - `layer-a` → applyLayerA
|
|
10
|
-
* - `layer-b` → applyLayerB
|
|
11
|
-
* - `layer-c` → applyLayerC
|
|
12
|
-
* - `layer-d` → throws LayerDDeferredError, surfaced as a clean
|
|
13
|
-
* dispatch failure (Layer D ships in )
|
|
14
|
-
*
|
|
15
|
-
* Per-edit results are aggregated into `DispatchResult[]` so callers
|
|
16
|
-
* can render the full apply transcript even when some edits failed.
|
|
17
|
-
* Order is preserved across the response.
|
|
18
|
-
*
|
|
19
|
-
* Crash recovery hook: when a SessionStore-style appendEvent callback
|
|
20
|
-
* is supplied, the dispatcher records the INTENT (parsed edit) BEFORE
|
|
21
|
-
* calling the applicator. The matching `applied` event lands AFTER
|
|
22
|
-
* the writeFile. A crash between the two leaves a recoverable trail —
|
|
23
|
-
* the operator (or `pugi resume`) sees the intent and can re-attempt.
|
|
24
|
-
*
|
|
25
|
-
* β1b Pl8 — transactional rollback: when the caller supplies
|
|
26
|
-
* `transactional: { sessionId, taskId, workspaceRoot }`, the dispatcher
|
|
27
|
-
* wraps the multi-file edits in a session journal (see
|
|
28
|
-
* `core/edits/journal.ts`). On non-zero exit / budget kill / partial
|
|
29
|
-
* fail it runs `rollbackDispatch()`:
|
|
30
|
-
*
|
|
31
|
-
* - tracked files that EXISTED before → `git restore -- <file>`
|
|
32
|
-
* - newly created files (existed=false) → `fs.unlink`
|
|
33
|
-
* - untracked files that EXISTED before → restore from in-memory
|
|
34
|
-
* pre-content snapshot (sha256_before validated)
|
|
35
|
-
*
|
|
36
|
-
* Pattern mirrors `tools/apply-patch.ts::rollbackFiles` (PR). The
|
|
37
|
-
* journal is the durability layer that lets a process crash recover
|
|
38
|
-
* across PIDs; the in-memory snapshot covers the single-process case
|
|
39
|
-
* where the journal write itself failed.
|
|
40
|
-
*
|
|
41
|
-
* The dispatcher is intentionally side-effect-light: no logging, no
|
|
42
|
-
* stdout writes, no exit-code mutation. The CLI integration layer in
|
|
43
|
-
* `cli.ts` owns operator-facing rendering; the dispatcher returns
|
|
44
|
-
* structured data and lets the caller decide UX.
|
|
45
|
-
*/
|
|
46
|
-
import { spawnSync } from 'node:child_process';
|
|
47
|
-
import { readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
48
|
-
import { resolve, sep } from 'node:path';
|
|
49
|
-
import { commitCheckpoint, formatCheckpointMessage, initShadowRepo, ShadowGitUnavailableError, } from '../checkpoints/shadow-git.js';
|
|
50
|
-
import { detectEditFormat } from './format-detector.js';
|
|
51
|
-
import { LayerDDeferredError, applyLayerD } from './layer-d-ast.js';
|
|
52
|
-
import { applyLayerA } from './layer-a-apply.js';
|
|
53
|
-
import { applyLayerAFuzzy } from './layer-a-fuzzy-apply.js';
|
|
54
|
-
import { applyLayerB } from './layer-b-apply.js';
|
|
55
|
-
import { applyLayerC } from './layer-c-apply.js';
|
|
56
|
-
import { MarkerParseError, parseMarkers, } from './marker-parser.js';
|
|
57
|
-
import { appendEntry, snapshotForDispatch, } from './journal.js';
|
|
58
|
-
/**
|
|
59
|
-
* Parse `raw` into edits and apply each in order. Aggregate results,
|
|
60
|
-
* preserving order. Never throws — parse failures surface as a single
|
|
61
|
-
* synthetic DispatchResult with `ok: false, layer: 'layer-a', reason:
|
|
62
|
-
* 'marker_parse_error'`. Applicator failures are recorded per-edit.
|
|
63
|
-
*/
|
|
64
|
-
export async function dispatchEdit(raw, opts) {
|
|
65
|
-
const family = resolveFamily(opts.modelTag);
|
|
66
|
-
// PUGI-79 — resolve the preferred-layer chain ONCE per dispatch.
|
|
67
|
-
// Caller supplied wins; otherwise the detector derives from modelTag.
|
|
68
|
-
// The chain is informational here (the parser still routes per
|
|
69
|
-
// envelope); a future fuzzy-ladder change can read it to influence
|
|
70
|
-
// retry ordering without revisiting the dispatcher's escalation
|
|
71
|
-
// contract.
|
|
72
|
-
const preferredChain = resolvePreferredChain(opts);
|
|
73
|
-
if (preferredChain)
|
|
74
|
-
opts.onPreferredLayer?.(preferredChain);
|
|
75
|
-
let parsed;
|
|
76
|
-
try {
|
|
77
|
-
parsed = parseMarkers(raw, family);
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
if (error instanceof MarkerParseError) {
|
|
81
|
-
const result = {
|
|
82
|
-
layer: 'layer-a',
|
|
83
|
-
file: '',
|
|
84
|
-
ok: false,
|
|
85
|
-
bytesWritten: 0,
|
|
86
|
-
reason: 'marker_parse_error',
|
|
87
|
-
detail: `${error.message}${error.atLine ? ` (line ${error.atLine})` : ''} — modelHint=${error.modelHint}`,
|
|
88
|
-
...(preferredChain ? { expectedLayer: preferredChain.primary } : {}),
|
|
89
|
-
};
|
|
90
|
-
opts.onResult?.(result);
|
|
91
|
-
return [result];
|
|
92
|
-
}
|
|
93
|
-
throw error;
|
|
94
|
-
}
|
|
95
|
-
if (parsed.length === 0) {
|
|
96
|
-
// Empty parse but no error == no markers in the payload. This is
|
|
97
|
-
// not necessarily a failure (the model may have answered with
|
|
98
|
-
// prose only); surface a single neutral result so the caller can
|
|
99
|
-
// render "no edits proposed".
|
|
100
|
-
return [];
|
|
101
|
-
}
|
|
102
|
-
// β1b Pl8 — transactional path. When enabled, snapshot every target
|
|
103
|
-
// file BEFORE the first applicator runs so we can roll back if a
|
|
104
|
-
// later edit fails. Snapshot also drives the journal entry so a
|
|
105
|
-
// post-crash recovery can replay rollback in a fresh process.
|
|
106
|
-
//
|
|
107
|
-
// The journal write itself is best-effort: a disk-full / EACCES
|
|
108
|
-
// failure must NOT block the dispatch. The in-memory snapshot
|
|
109
|
-
// still carries every pre-existing file's content, so single-
|
|
110
|
-
// process rollback degrades cleanly. The operator sees the
|
|
111
|
-
// journal-failed warning via the session events mirror (caller's
|
|
112
|
-
// responsibility to emit).
|
|
113
|
-
let snapshot = null;
|
|
114
|
-
let preContent = null;
|
|
115
|
-
if (opts.transactional && !opts.dryRun) {
|
|
116
|
-
const targets = Array.from(new Set(parsed.map((e) => editFile(e))));
|
|
117
|
-
snapshot = snapshotForDispatch(opts.transactional.workspaceRoot, targets);
|
|
118
|
-
preContent = new Map();
|
|
119
|
-
for (const e of snapshot) {
|
|
120
|
-
if (!e.existed)
|
|
121
|
-
continue;
|
|
122
|
-
const abs = resolve(opts.transactional.workspaceRoot, e.path);
|
|
123
|
-
try {
|
|
124
|
-
preContent.set(e.path, readFileSync(abs));
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
/* file vanished between snapshot + read — treat as not-snapshotted */
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
appendEntry(opts.transactional.workspaceRoot, opts.transactional.sessionId, {
|
|
131
|
-
ts: Date.now(),
|
|
132
|
-
taskId: opts.transactional.taskId,
|
|
133
|
-
files: snapshot,
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
// Per-task shadow git checkpoint hook (backlog). Init the
|
|
137
|
-
// shadow once per dispatch, then commit after every successful
|
|
138
|
-
// edit. The init is best-effort — a missing `git` binary or a
|
|
139
|
-
// chmod failure surfaces through `onCheckpointError` but does not
|
|
140
|
-
// disable the dispatch.
|
|
141
|
-
let checkpointStep = opts.checkpoint?.stepStart && Number.isFinite(opts.checkpoint.stepStart)
|
|
142
|
-
? Math.max(1, Math.floor(opts.checkpoint.stepStart))
|
|
143
|
-
: 1;
|
|
144
|
-
let checkpointEnabled = false;
|
|
145
|
-
if (opts.checkpoint && !opts.dryRun) {
|
|
146
|
-
try {
|
|
147
|
-
initShadowRepo(opts.cwd, opts.checkpoint.taskId);
|
|
148
|
-
checkpointEnabled = true;
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
const err = error instanceof Error ? error : new Error(String(error));
|
|
152
|
-
opts.checkpoint.onCheckpointError?.(err, '');
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
const expectedLayer = preferredChain?.primary;
|
|
156
|
-
const out = [];
|
|
157
|
-
let crashError = null;
|
|
158
|
-
for (const edit of parsed) {
|
|
159
|
-
const intent = makeIntent(edit);
|
|
160
|
-
opts.onIntent?.(intent);
|
|
161
|
-
let result;
|
|
162
|
-
try {
|
|
163
|
-
result = await applyOne(edit, opts);
|
|
164
|
-
}
|
|
165
|
-
catch (error) {
|
|
166
|
-
// applyOne does not throw today (errors are returned as
|
|
167
|
-
// `ok: false`), but a future applicator that does throw —
|
|
168
|
-
// or a budget-kill that arrives mid-write — needs deterministic
|
|
169
|
-
// rollback. Catch + record + break so the rollback below runs.
|
|
170
|
-
crashError = error;
|
|
171
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
172
|
-
result = {
|
|
173
|
-
layer: 'layer-a',
|
|
174
|
-
file: editFile(edit),
|
|
175
|
-
ok: false,
|
|
176
|
-
bytesWritten: 0,
|
|
177
|
-
reason: 'apply_error',
|
|
178
|
-
detail: `dispatch threw: ${msg}`,
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
if (expectedLayer !== undefined) {
|
|
182
|
-
// PUGI-79: stamp the expected layer on every result so
|
|
183
|
-
// observability surfaces can compute drift (expected vs actual)
|
|
184
|
-
// per family. The actual `layer` field is unchanged — the
|
|
185
|
-
// hint is informational, not a routing override.
|
|
186
|
-
result = { ...result, expectedLayer };
|
|
187
|
-
}
|
|
188
|
-
out.push(result);
|
|
189
|
-
opts.onResult?.(result);
|
|
190
|
-
if (result.ok && checkpointEnabled && opts.checkpoint && !opts.dryRun) {
|
|
191
|
-
// Best-effort shadow commit. Failures here MUST NOT block the
|
|
192
|
-
// dispatch — the operator already has the edit applied; the
|
|
193
|
-
// checkpoint is a customer-trust safety net, not a hard gate.
|
|
194
|
-
try {
|
|
195
|
-
const absPath = result.absPath ?? resolve(opts.cwd, result.file);
|
|
196
|
-
const message = formatCheckpointMessage({
|
|
197
|
-
taskId: opts.checkpoint.taskId,
|
|
198
|
-
step: checkpointStep,
|
|
199
|
-
toolName: result.layer,
|
|
200
|
-
cwd: opts.cwd,
|
|
201
|
-
absPath,
|
|
202
|
-
});
|
|
203
|
-
commitCheckpoint(opts.cwd, opts.checkpoint.taskId, message);
|
|
204
|
-
}
|
|
205
|
-
catch (error) {
|
|
206
|
-
const err = error instanceof Error ? error : new Error(String(error));
|
|
207
|
-
// Disable the shadow hook for the rest of this dispatch if
|
|
208
|
-
// the git binary is unavailable — repeated probes burn CPU
|
|
209
|
-
// and add no signal beyond the first failure.
|
|
210
|
-
if (err instanceof ShadowGitUnavailableError) {
|
|
211
|
-
checkpointEnabled = false;
|
|
212
|
-
}
|
|
213
|
-
opts.checkpoint.onCheckpointError?.(err, result.file);
|
|
214
|
-
}
|
|
215
|
-
checkpointStep += 1;
|
|
216
|
-
}
|
|
217
|
-
if (!result.ok && opts.transactional && snapshot && preContent) {
|
|
218
|
-
// Rollback every snapshotted file then break out — partial
|
|
219
|
-
// success is unacceptable in transactional mode.
|
|
220
|
-
const rollback = rollbackDispatch(opts.transactional.workspaceRoot, snapshot, preContent);
|
|
221
|
-
if (!rollback.ok) {
|
|
222
|
-
// Surface the rollback failure as an additional synthetic
|
|
223
|
-
// result so the caller can render the operator-facing
|
|
224
|
-
// message without losing the original failure context.
|
|
225
|
-
const failure = {
|
|
226
|
-
layer: 'layer-a',
|
|
227
|
-
file: '',
|
|
228
|
-
ok: false,
|
|
229
|
-
bytesWritten: 0,
|
|
230
|
-
reason: 'rollback_failed',
|
|
231
|
-
detail: rollback.detail,
|
|
232
|
-
};
|
|
233
|
-
out.push(failure);
|
|
234
|
-
opts.onResult?.(failure);
|
|
235
|
-
}
|
|
236
|
-
if (crashError) {
|
|
237
|
-
// Re-throw post-rollback so the caller learns the dispatch
|
|
238
|
-
// crashed (vs returned ok: false). Rollback already completed
|
|
239
|
-
// so the workspace is consistent.
|
|
240
|
-
throw crashError;
|
|
241
|
-
}
|
|
242
|
-
break;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
return out;
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Workspace-relative path for a parsed edit, regardless of layer.
|
|
249
|
-
* Hoisted because the snapshot + intent both need the same answer.
|
|
250
|
-
*/
|
|
251
|
-
function editFile(edit) {
|
|
252
|
-
switch (edit.kind) {
|
|
253
|
-
case 'layer-a':
|
|
254
|
-
case 'layer-b':
|
|
255
|
-
case 'layer-c':
|
|
256
|
-
case 'layer-d':
|
|
257
|
-
return edit.edit.file;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Roll the workspace back to the pre-dispatch state captured in
|
|
262
|
-
* `snapshot`. Mirrors `tools/apply-patch.ts::rollbackFiles`:
|
|
263
|
-
*
|
|
264
|
-
* - existed-before + git-tracked → `git restore -- <file>` (cheap
|
|
265
|
-
* + atomic against the index).
|
|
266
|
-
* - existed-before + untracked → restore from the in-memory
|
|
267
|
-
* preContent buffer (sha256_before validates the snapshot still
|
|
268
|
-
* matches what we hold; if not we punt with `partial_rollback`).
|
|
269
|
-
* - newly created → fs.unlink (force).
|
|
270
|
-
*
|
|
271
|
-
* Best-effort: every per-file failure is collected into the detail
|
|
272
|
-
* string so the operator can manually fix the residual state. The
|
|
273
|
-
* dispatcher does not abort on the first error so an unrelated
|
|
274
|
-
* permission glitch on one file doesn't strand the others.
|
|
275
|
-
*
|
|
276
|
-
* Exported for the spec suite + a future operator command
|
|
277
|
-
* (`pugi resume --rollback <taskId>` ships in β2).
|
|
278
|
-
*/
|
|
279
|
-
export function rollbackDispatch(workspaceRoot, snapshot, preContent) {
|
|
280
|
-
if (snapshot.length === 0)
|
|
281
|
-
return { ok: true };
|
|
282
|
-
// Filter to workspace-internal paths only. A snapshot entry that
|
|
283
|
-
// escaped the workspace would already have aborted upstream; the
|
|
284
|
-
// filter is belt + braces against a future bug.
|
|
285
|
-
const safe = snapshot.filter((e) => {
|
|
286
|
-
const abs = resolve(workspaceRoot, e.path);
|
|
287
|
-
return abs === workspaceRoot || abs.startsWith(workspaceRoot + sep);
|
|
288
|
-
});
|
|
289
|
-
const failures = [];
|
|
290
|
-
const tracked = listTrackedFiles(workspaceRoot, safe.map((e) => e.path));
|
|
291
|
-
for (const entry of safe) {
|
|
292
|
-
const abs = resolve(workspaceRoot, entry.path);
|
|
293
|
-
if (!entry.existed) {
|
|
294
|
-
try {
|
|
295
|
-
// β1b r1: `recursive: true` so rollback handles the case where
|
|
296
|
-
// the dispatcher created an intermediate directory (e.g. a new
|
|
297
|
-
// `src/feature/` tree). Without it the unlink fails on a dir
|
|
298
|
-
// and the journal-replay leaves an orphan workspace path.
|
|
299
|
-
rmSync(abs, { force: true, recursive: true });
|
|
300
|
-
}
|
|
301
|
-
catch (error) {
|
|
302
|
-
failures.push(`${entry.path}: unlink failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
303
|
-
}
|
|
304
|
-
continue;
|
|
305
|
-
}
|
|
306
|
-
if (tracked.has(entry.path)) {
|
|
307
|
-
const result = spawnSync('git', ['restore', '--', entry.path], {
|
|
308
|
-
cwd: workspaceRoot,
|
|
309
|
-
encoding: 'utf8',
|
|
310
|
-
});
|
|
311
|
-
if (result.status !== 0) {
|
|
312
|
-
failures.push(`${entry.path}: git restore failed: ${(result.stderr ?? '').trim() || 'non-zero exit'}`);
|
|
313
|
-
}
|
|
314
|
-
continue;
|
|
315
|
-
}
|
|
316
|
-
// Untracked-but-existed: write back from memory.
|
|
317
|
-
const buf = preContent.get(entry.path);
|
|
318
|
-
if (!buf) {
|
|
319
|
-
failures.push(`${entry.path}: pre-content snapshot missing (partial rollback)`);
|
|
320
|
-
continue;
|
|
321
|
-
}
|
|
322
|
-
try {
|
|
323
|
-
writeFileSync(abs, buf);
|
|
324
|
-
}
|
|
325
|
-
catch (error) {
|
|
326
|
-
failures.push(`${entry.path}: rewrite failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
if (failures.length === 0)
|
|
330
|
-
return { ok: true };
|
|
331
|
-
return { ok: false, detail: failures.join('; ') };
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Ask git which of `paths` are tracked. A single `git ls-files
|
|
335
|
-
* --error-unmatch` call would fail-fast on the first untracked path,
|
|
336
|
-
* so we use `git ls-files -- <paths...>` which lists only tracked
|
|
337
|
-
* matches. Returns a Set of workspace-relative paths.
|
|
338
|
-
*
|
|
339
|
-
* Pure-stdlib fallback when git is unavailable: returns an empty
|
|
340
|
-
* Set — every "existed" entry then routes to the untracked-restore
|
|
341
|
-
* path via the in-memory preContent map. Slower per file but still
|
|
342
|
-
* correct.
|
|
343
|
-
*/
|
|
344
|
-
function listTrackedFiles(cwd, paths) {
|
|
345
|
-
if (paths.length === 0)
|
|
346
|
-
return new Set();
|
|
347
|
-
const result = spawnSync('git', ['ls-files', '--', ...paths], {
|
|
348
|
-
cwd,
|
|
349
|
-
encoding: 'utf8',
|
|
350
|
-
});
|
|
351
|
-
if (result.status !== 0)
|
|
352
|
-
return new Set();
|
|
353
|
-
const out = new Set();
|
|
354
|
-
for (const line of (result.stdout ?? '').split('\n')) {
|
|
355
|
-
const trimmed = line.trim();
|
|
356
|
-
if (trimmed.length > 0)
|
|
357
|
-
out.add(trimmed);
|
|
358
|
-
}
|
|
359
|
-
return out;
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* PUGI-79 helper — resolve the preferred-layer chain for this
|
|
363
|
-
* dispatch. Caller-supplied `preferredLayer` wins; otherwise the
|
|
364
|
-
* detector derives from `modelTag`. Returns null when neither path
|
|
365
|
-
* yields a chain (no caller hint AND no model tag) — the dispatcher
|
|
366
|
-
* skips the observability hook in that case so we do not emit a
|
|
367
|
-
* misleading wildcard reading.
|
|
368
|
-
*/
|
|
369
|
-
function resolvePreferredChain(opts) {
|
|
370
|
-
if (opts.preferredLayer) {
|
|
371
|
-
// Defensive clone so caller mutations after dispatchEdit returns
|
|
372
|
-
// cannot poison subsequent calls that share the chain reference.
|
|
373
|
-
return {
|
|
374
|
-
primary: opts.preferredLayer.primary,
|
|
375
|
-
fallback: [...opts.preferredLayer.fallback],
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
|
-
if (opts.modelTag)
|
|
379
|
-
return detectEditFormat(opts.modelTag);
|
|
380
|
-
return null;
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* Public helper exposed for the marker parser tests + CLI surface that
|
|
384
|
-
* may want to know the resolved family without re-running the auto
|
|
385
|
-
* detector.
|
|
386
|
-
*/
|
|
387
|
-
export function resolveFamily(modelTag) {
|
|
388
|
-
if (!modelTag)
|
|
389
|
-
return 'auto';
|
|
390
|
-
const tag = modelTag.toLowerCase();
|
|
391
|
-
if (tag.startsWith('claude') || tag.startsWith('anthropic/'))
|
|
392
|
-
return 'anthropic';
|
|
393
|
-
if (tag.startsWith('gemini') || tag.startsWith('xai/') || tag.startsWith('grok'))
|
|
394
|
-
return 'gemini';
|
|
395
|
-
if (tag.startsWith('gpt') || tag.startsWith('o1') || tag.startsWith('openai/'))
|
|
396
|
-
return 'openai';
|
|
397
|
-
return 'auto';
|
|
398
|
-
}
|
|
399
|
-
function makeIntent(edit) {
|
|
400
|
-
switch (edit.kind) {
|
|
401
|
-
case 'layer-a':
|
|
402
|
-
return {
|
|
403
|
-
layer: 'layer-a',
|
|
404
|
-
file: edit.edit.file,
|
|
405
|
-
intentSummary: `Layer A: ${edit.edit.file} (oldString ${edit.edit.oldString.length} bytes)`,
|
|
406
|
-
};
|
|
407
|
-
case 'layer-b':
|
|
408
|
-
return {
|
|
409
|
-
layer: 'layer-b',
|
|
410
|
-
file: edit.edit.file,
|
|
411
|
-
intentSummary: `Layer B: ${edit.edit.file} (${edit.edit.edits.length} sub-edits)`,
|
|
412
|
-
};
|
|
413
|
-
case 'layer-c':
|
|
414
|
-
return {
|
|
415
|
-
layer: 'layer-c',
|
|
416
|
-
file: edit.edit.file,
|
|
417
|
-
intentSummary: `Layer C: ${edit.edit.file} (rewrite, ${edit.edit.newContents.length} bytes, baseSha ${edit.edit.baseSha256.slice(0, 12)})`,
|
|
418
|
-
};
|
|
419
|
-
case 'layer-d':
|
|
420
|
-
return {
|
|
421
|
-
layer: 'layer-d',
|
|
422
|
-
file: edit.edit.file,
|
|
423
|
-
intentSummary: `Layer D: ${edit.edit.file} op=${edit.edit.operation}`,
|
|
424
|
-
};
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
async function applyOne(edit, opts) {
|
|
428
|
-
const applyOpts = { cwd: opts.cwd, dryRun: opts.dryRun };
|
|
429
|
-
switch (edit.kind) {
|
|
430
|
-
case 'layer-a': {
|
|
431
|
-
const r = await applyLayerA(edit.edit, applyOpts);
|
|
432
|
-
// Backlog — Layer A.5 escalation. The fuzzy ladder is the
|
|
433
|
-
// ONLY retry path: every other Layer A failure mode (ambiguous,
|
|
434
|
-
// file_missing, identical_replacement, security gate denial)
|
|
435
|
-
// bubbles up untouched because the ladder can't fix them.
|
|
436
|
-
// ambiguous in particular MUST stay loud — a fuzzy retry on top
|
|
437
|
-
// of an ambiguous strict match would just pick one of the
|
|
438
|
-
// strict candidates silently, defeating the disambiguation
|
|
439
|
-
// contract.
|
|
440
|
-
if (!r.ok && r.reason === 'no_match' && opts.fuzzy === true) {
|
|
441
|
-
const fuzzy = await applyLayerAFuzzy(edit.edit, {
|
|
442
|
-
cwd: opts.cwd,
|
|
443
|
-
dryRun: opts.dryRun,
|
|
444
|
-
minRatio: opts.fuzzyMinRatio,
|
|
445
|
-
lengthFlex: opts.fuzzyLengthFlex,
|
|
446
|
-
});
|
|
447
|
-
const base = toResult('layer-a-fuzzy', edit.edit.file, fuzzy);
|
|
448
|
-
return {
|
|
449
|
-
...base,
|
|
450
|
-
...(fuzzy.fuzzyTier ? { fuzzyTier: fuzzy.fuzzyTier } : {}),
|
|
451
|
-
...(fuzzy.fuzzyScore !== undefined ? { fuzzyScore: fuzzy.fuzzyScore } : {}),
|
|
452
|
-
};
|
|
453
|
-
}
|
|
454
|
-
return toResult('layer-a', edit.edit.file, r);
|
|
455
|
-
}
|
|
456
|
-
case 'layer-b': {
|
|
457
|
-
const r = await applyLayerB(edit.edit, applyOpts);
|
|
458
|
-
return {
|
|
459
|
-
...toResult('layer-b', edit.edit.file, r),
|
|
460
|
-
appliedCount: r.appliedCount,
|
|
461
|
-
};
|
|
462
|
-
}
|
|
463
|
-
case 'layer-c': {
|
|
464
|
-
const r = await applyLayerC(edit.edit, applyOpts);
|
|
465
|
-
return {
|
|
466
|
-
...toResult('layer-c', edit.edit.file, r),
|
|
467
|
-
expectedSha256: r.expectedSha256,
|
|
468
|
-
actualSha256: r.actualSha256,
|
|
469
|
-
};
|
|
470
|
-
}
|
|
471
|
-
case 'layer-d': {
|
|
472
|
-
try {
|
|
473
|
-
const r = await applyLayerD(edit.edit, applyOpts);
|
|
474
|
-
return toResult('layer-d', edit.edit.file, r);
|
|
475
|
-
}
|
|
476
|
-
catch (error) {
|
|
477
|
-
if (error instanceof LayerDDeferredError) {
|
|
478
|
-
return {
|
|
479
|
-
layer: 'layer-d',
|
|
480
|
-
file: edit.edit.file,
|
|
481
|
-
ok: false,
|
|
482
|
-
bytesWritten: 0,
|
|
483
|
-
reason: 'layer_d_deferred',
|
|
484
|
-
detail: error.message,
|
|
485
|
-
};
|
|
486
|
-
}
|
|
487
|
-
return {
|
|
488
|
-
layer: 'layer-d',
|
|
489
|
-
file: edit.edit.file,
|
|
490
|
-
ok: false,
|
|
491
|
-
bytesWritten: 0,
|
|
492
|
-
reason: 'apply_error',
|
|
493
|
-
detail: error instanceof Error ? error.message : String(error),
|
|
494
|
-
};
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
function toResult(layer, file, r) {
|
|
500
|
-
return {
|
|
501
|
-
layer,
|
|
502
|
-
file,
|
|
503
|
-
ok: r.ok,
|
|
504
|
-
bytesWritten: r.bytesWritten,
|
|
505
|
-
reason: r.reason,
|
|
506
|
-
detail: r.detail,
|
|
507
|
-
matchCount: r.matchCount,
|
|
508
|
-
absPath: r.absPath,
|
|
509
|
-
};
|
|
510
|
-
}
|
|
511
|
-
//# sourceMappingURL=dispatch.js.map
|