@pugi/cli 0.1.0-beta.99 → 1.0.0-alpha.10
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 -195
- 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,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Approximate token counter for the `/compact` auto-trigger gate.
|
|
3
|
-
*
|
|
4
|
-
* Pugi does not bundle tiktoken — adding a 3 MB native module for a
|
|
5
|
-
* single heuristic check after every turn is the wrong trade. We instead
|
|
6
|
-
* use the OpenAI rule-of-thumb that 1 token ≈ 4 characters of English
|
|
7
|
-
* (≈ ¾ of a word). For mixed-language conversations the approximation
|
|
8
|
-
* skews high by 10-20% which is the safe direction — the auto-compact
|
|
9
|
-
* threshold trips slightly EARLY, never LATE. A late trigger would
|
|
10
|
-
* exceed the model's actual context window and crash the next turn.
|
|
11
|
-
*
|
|
12
|
-
* Per-model context windows are exported from `MODEL_CONTEXT_WINDOW` so
|
|
13
|
-
* the caller can resolve the budget from the active model slug without
|
|
14
|
-
* round-tripping to the server. New models added in Anvil should grow
|
|
15
|
-
* this table in lockstep; the fall-back is the conservative 32k window.
|
|
16
|
-
*
|
|
17
|
-
* Override hook: when `PUGI_TOKEN_COUNTER_OVERRIDE` is set the function
|
|
18
|
-
* parses it as a JSON object `{"text": <n>}` (number of tokens to claim
|
|
19
|
-
* per char). Used only by the integration spec — never by production.
|
|
20
|
-
*/
|
|
21
|
-
/** Default chars-per-token ratio for the OpenAI rule-of-thumb. */
|
|
22
|
-
const DEFAULT_CHARS_PER_TOKEN = 4;
|
|
23
|
-
/**
|
|
24
|
-
* Conservative fallback window when the model slug is unknown. 32k is
|
|
25
|
-
* the smallest window any current Anvil-served model exposes; using it
|
|
26
|
-
* as a fall-back guarantees we never overestimate budget and skip a
|
|
27
|
-
* compaction that should have fired.
|
|
28
|
-
*/
|
|
29
|
-
const FALLBACK_WINDOW = 32_000;
|
|
30
|
-
/**
|
|
31
|
-
* Known context windows for models Anvil exposes today. Keep in sync
|
|
32
|
-
* with `apps/admin-api/src/pugi/model-registry.ts` — when a new model
|
|
33
|
-
* lands there, add it here. The table is intentionally narrow: only
|
|
34
|
-
* models we have actually validated.
|
|
35
|
-
*/
|
|
36
|
-
export const MODEL_CONTEXT_WINDOW = Object.freeze({
|
|
37
|
-
'sonnet-4.6': 200_000,
|
|
38
|
-
'sonnet-4.5': 200_000,
|
|
39
|
-
'opus-4.7': 1_000_000,
|
|
40
|
-
'opus-4.6': 200_000,
|
|
41
|
-
'haiku-4.5': 200_000,
|
|
42
|
-
'deepseek-chat-v3.1': 128_000,
|
|
43
|
-
'gpt-5': 200_000,
|
|
44
|
-
'gemini-2.5-pro': 1_000_000,
|
|
45
|
-
});
|
|
46
|
-
/**
|
|
47
|
-
* Estimate the token count of a single string. Returns a positive
|
|
48
|
-
* integer for non-empty input and zero for empty input. The function is
|
|
49
|
-
* pure — same input always yields the same output.
|
|
50
|
-
*
|
|
51
|
-
* The approximation is `ceil(byteLength / chars-per-token)`. We use
|
|
52
|
-
* `Buffer.byteLength` so multi-byte UTF-8 sequences count proportionally
|
|
53
|
-
* to their on-the-wire size, not their char count — this matches the
|
|
54
|
-
* tokenizer's behaviour on CJK / cyrillic / emoji where one char often
|
|
55
|
-
* eats 3-4 tokens.
|
|
56
|
-
*/
|
|
57
|
-
export function estimateTokens(text) {
|
|
58
|
-
if (text.length === 0)
|
|
59
|
-
return 0;
|
|
60
|
-
const ratio = readCharsPerTokenOverride() ?? DEFAULT_CHARS_PER_TOKEN;
|
|
61
|
-
const bytes = Buffer.byteLength(text, 'utf8');
|
|
62
|
-
return Math.max(1, Math.ceil(bytes / ratio));
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Resolve the context window in tokens for the given model slug. Falls
|
|
66
|
-
* back to the conservative 32k window when the slug is unknown.
|
|
67
|
-
*/
|
|
68
|
-
export function contextWindowForModel(model) {
|
|
69
|
-
if (!model)
|
|
70
|
-
return FALLBACK_WINDOW;
|
|
71
|
-
const known = MODEL_CONTEXT_WINDOW[model];
|
|
72
|
-
return known ?? FALLBACK_WINDOW;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Sum the token estimates of an arbitrary list of strings. Convenience
|
|
76
|
-
* for the auto-trigger which has to count across N transcript turns.
|
|
77
|
-
*/
|
|
78
|
-
export function estimateTokensInMany(parts) {
|
|
79
|
-
let total = 0;
|
|
80
|
-
for (const part of parts) {
|
|
81
|
-
total += estimateTokens(part);
|
|
82
|
-
}
|
|
83
|
-
return total;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Read the test override env. Returns the parsed chars-per-token ratio
|
|
87
|
-
* when set, or undefined when absent / malformed. Never throws.
|
|
88
|
-
*/
|
|
89
|
-
function readCharsPerTokenOverride() {
|
|
90
|
-
const raw = process.env['PUGI_TOKEN_COUNTER_OVERRIDE'];
|
|
91
|
-
if (!raw)
|
|
92
|
-
return undefined;
|
|
93
|
-
try {
|
|
94
|
-
const parsed = JSON.parse(raw);
|
|
95
|
-
if (typeof parsed === 'object'
|
|
96
|
-
&& parsed !== null
|
|
97
|
-
&& typeof parsed.charsPerToken === 'number') {
|
|
98
|
-
const ratio = parsed.charsPerToken;
|
|
99
|
-
if (Number.isFinite(ratio) && ratio > 0)
|
|
100
|
-
return ratio;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
/* malformed env, fall through */
|
|
105
|
-
}
|
|
106
|
-
return undefined;
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=token-counter.js.map
|
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Anvil fan-out — `pugi review --consensus` .
|
|
3
|
-
*
|
|
4
|
-
* Posts the captured diff to Anvil's consensus endpoint and consumes the
|
|
5
|
-
* SSE stream that interleaves per-reviewer events (`type:"verdict"`) and
|
|
6
|
-
* the final consensus event (`type:"consensus"`).
|
|
7
|
-
*
|
|
8
|
-
* Endpoint contract (admin-api side, ships as follow-up):
|
|
9
|
-
*
|
|
10
|
-
* POST {apiUrl}/api/pugi/review-consensus
|
|
11
|
-
* Authorization: Bearer {apiKey}
|
|
12
|
-
* Content-Type: application/json
|
|
13
|
-
* Body: { diff, context: { branch, commit, title } }
|
|
14
|
-
* Response: text/event-stream
|
|
15
|
-
* data: { reviewer: "codex"|"claude"|"deepseek", type:"started" }
|
|
16
|
-
* data: { reviewer, type:"verdict", severity:"P0|P1|P2|P3|CLEAN",
|
|
17
|
-
* rawContent:"<reviewer text>", latencyMs, error? }
|
|
18
|
-
* data: { type:"consensus", rubric_verdict, reasoning }
|
|
19
|
-
*
|
|
20
|
-
* The CLI side does NOT trust the server's `rubric_verdict` — we recompute
|
|
21
|
-
* it locally from the per-reviewer verdicts so a malformed / forged server
|
|
22
|
-
* cannot weaken the gate. The server-side verdict comes through as a
|
|
23
|
-
* cross-check (logged when it disagrees with the client rubric).
|
|
24
|
-
*
|
|
25
|
-
* Graceful degradation:
|
|
26
|
-
*
|
|
27
|
-
* - 404 from runtime → "endpoint_missing" (admin-api endpoint pending,
|
|
28
|
-
* ships CLI-only). Caller falls back to the
|
|
29
|
-
* legacy `pugi review --triple --remote` flow OR
|
|
30
|
-
* prints a "backend not deployed" notice depending
|
|
31
|
-
* on the operator's invocation.
|
|
32
|
-
* - 401/403 / 429 → matching status with an actionable message.
|
|
33
|
-
* - 5xx / timeout → "failed" with the truncated body.
|
|
34
|
-
*
|
|
35
|
-
* Local-first contract : this module never touches the disk,
|
|
36
|
-
* never logs the diff payload, and never retries on transient errors.
|
|
37
|
-
*/
|
|
38
|
-
/**
|
|
39
|
-
* Dispatch the consensus request and stream events back through `sink`
|
|
40
|
-
* until the SSE stream closes OR a transport error occurs.
|
|
41
|
-
*
|
|
42
|
-
* Returns the collected reviewer events plus the server's final consensus
|
|
43
|
-
* event (if it sent one). The caller computes the authoritative rubric
|
|
44
|
-
* locally from the reviewer events.
|
|
45
|
-
*/
|
|
46
|
-
export async function dispatchConsensus(config, request, sink) {
|
|
47
|
-
const url = `${config.apiUrl.replace(/\/+$/, '')}/api/pugi/review-consensus`;
|
|
48
|
-
const controller = new AbortController();
|
|
49
|
-
// Idle timeout: aborts the request when no SSE chunk has been
|
|
50
|
-
// received for `timeoutMs`. A one-shot setTimeout from request-start
|
|
51
|
-
// would kill long-running reviewers (codex ~30s, claude ~60s) even
|
|
52
|
-
// though the server is actively streaming events every few seconds.
|
|
53
|
-
// `resetIdleTimeout` is called from `parseSseStream` on each chunk.
|
|
54
|
-
let idleTimer = null;
|
|
55
|
-
const resetIdleTimeout = () => {
|
|
56
|
-
if (idleTimer)
|
|
57
|
-
clearTimeout(idleTimer);
|
|
58
|
-
idleTimer = setTimeout(() => controller.abort(), config.timeoutMs);
|
|
59
|
-
};
|
|
60
|
-
resetIdleTimeout();
|
|
61
|
-
try {
|
|
62
|
-
const res = await fetch(url, {
|
|
63
|
-
method: 'POST',
|
|
64
|
-
headers: {
|
|
65
|
-
'content-type': 'application/json',
|
|
66
|
-
accept: 'text/event-stream',
|
|
67
|
-
authorization: `Bearer ${config.apiKey}`,
|
|
68
|
-
'user-agent': 'pugi-cli-consensus/0.1.0',
|
|
69
|
-
},
|
|
70
|
-
body: JSON.stringify(request),
|
|
71
|
-
signal: controller.signal,
|
|
72
|
-
});
|
|
73
|
-
const code = res.status;
|
|
74
|
-
if (code === 404) {
|
|
75
|
-
return {
|
|
76
|
-
status: 'endpoint_missing',
|
|
77
|
-
code,
|
|
78
|
-
message: 'POST /api/pugi/review-consensus not deployed on this runtime .',
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
if (code === 401 || code === 403) {
|
|
82
|
-
return {
|
|
83
|
-
status: 'unauthenticated',
|
|
84
|
-
code,
|
|
85
|
-
message: `runtime rejected credentials (HTTP ${code})`,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
if (code === 429) {
|
|
89
|
-
const header = res.headers.get('retry-after');
|
|
90
|
-
const retryAfterMs = header ? Number.parseInt(header, 10) * 1000 : 60_000;
|
|
91
|
-
return {
|
|
92
|
-
status: 'rate_limited',
|
|
93
|
-
code,
|
|
94
|
-
retryAfterMs: Number.isFinite(retryAfterMs) ? retryAfterMs : 60_000,
|
|
95
|
-
message: 'runtime rate limit reached for this tenant',
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
if (code !== 200) {
|
|
99
|
-
const text = await safeText(res);
|
|
100
|
-
return {
|
|
101
|
-
status: 'failed',
|
|
102
|
-
code,
|
|
103
|
-
message: `runtime returned HTTP ${code}${text ? `: ${text.slice(0, 200)}` : ''}`,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
// 200 — consume the SSE stream. Surface a graceful failure if the
|
|
107
|
-
// body is missing (some intermediaries strip it on long-poll).
|
|
108
|
-
if (!res.body) {
|
|
109
|
-
return {
|
|
110
|
-
status: 'failed',
|
|
111
|
-
code,
|
|
112
|
-
message: 'runtime returned 200 but no SSE body',
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
const reviewerEvents = [];
|
|
116
|
-
let serverVerdict = null;
|
|
117
|
-
for await (const event of parseSseStream(res.body, resetIdleTimeout)) {
|
|
118
|
-
if (event.type === 'consensus') {
|
|
119
|
-
serverVerdict = event;
|
|
120
|
-
sink(event);
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
reviewerEvents.push(event);
|
|
124
|
-
sink(event);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return { status: 'ok', serverVerdict, reviewerEvents };
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
const message = error instanceof Error
|
|
131
|
-
? error.name === 'AbortError'
|
|
132
|
-
? `runtime call idle for more than ${config.timeoutMs}ms`
|
|
133
|
-
: error.message
|
|
134
|
-
: 'unknown error';
|
|
135
|
-
return { status: 'failed', code: 0, message };
|
|
136
|
-
}
|
|
137
|
-
finally {
|
|
138
|
-
if (idleTimer)
|
|
139
|
-
clearTimeout(idleTimer);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Async-iterable SSE parser. Spec'd against the
|
|
144
|
-
* [HTML SSE spec](https://html.spec.whatwg.org/multipage/server-sent-events.html):
|
|
145
|
-
*
|
|
146
|
-
* - Events are delimited by a blank line.
|
|
147
|
-
* - Each line is `field:value` (whitespace after `:` stripped).
|
|
148
|
-
* - Multiple `data:` lines in one event concatenate with `\n`.
|
|
149
|
-
* - We only care about `data:` payloads carrying JSON; everything
|
|
150
|
-
* else (event:, id:, retry:) is ignored.
|
|
151
|
-
*
|
|
152
|
-
* The parser tolerates JSON-parse failures by dropping the malformed
|
|
153
|
-
* event and continuing; a single bad event must not block the consensus
|
|
154
|
-
* gate. Errors are surfaced to the sink as an `error` reviewer event
|
|
155
|
-
* with `reviewer:"stream"`.
|
|
156
|
-
*/
|
|
157
|
-
export async function* parseSseStream(body, onChunk) {
|
|
158
|
-
const decoder = new TextDecoder('utf-8');
|
|
159
|
-
let buffer = '';
|
|
160
|
-
// Bridge Node ReadableStream and web ReadableStream. The web type has
|
|
161
|
-
// `getReader()`; the Node type is an `AsyncIterable<Buffer>`. Detect
|
|
162
|
-
// by feature so the parser works regardless of which fetch impl wrote
|
|
163
|
-
// the body.
|
|
164
|
-
const chunks = toAsyncIterable(body);
|
|
165
|
-
for await (const chunk of chunks) {
|
|
166
|
-
// Signal liveness so the dispatcher can reset its idle timeout. Any
|
|
167
|
-
// bytes received counts: even a heartbeat comment line keeps the
|
|
168
|
-
// connection alive from our perspective.
|
|
169
|
-
if (onChunk)
|
|
170
|
-
onChunk();
|
|
171
|
-
buffer += decoder.decode(chunk, { stream: true });
|
|
172
|
-
// SSE event boundary is a blank line. The spec allows either LF
|
|
173
|
-
// (`\n\n`) OR CRLF (`\r\n\r\n`). nginx, CDNs, and some load
|
|
174
|
-
// balancers rewrite to CRLF, so we accept both and find whichever
|
|
175
|
-
// delimiter appears first in the buffer.
|
|
176
|
-
let boundary = findNextEventBoundary(buffer);
|
|
177
|
-
while (boundary !== null) {
|
|
178
|
-
const rawEvent = buffer.slice(0, boundary.start);
|
|
179
|
-
buffer = buffer.slice(boundary.end);
|
|
180
|
-
const parsed = parseSseEvent(rawEvent);
|
|
181
|
-
if (parsed)
|
|
182
|
-
yield parsed;
|
|
183
|
-
boundary = findNextEventBoundary(buffer);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
// Flush trailing event if the server omitted the final blank line.
|
|
187
|
-
const tail = buffer.trim();
|
|
188
|
-
if (tail.length > 0) {
|
|
189
|
-
const parsed = parseSseEvent(tail);
|
|
190
|
-
if (parsed)
|
|
191
|
-
yield parsed;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Find the next SSE event boundary in `buffer`. Returns the start
|
|
196
|
-
* index of the delimiter and the index where the next event begins,
|
|
197
|
-
* or `null` if no complete boundary has been buffered yet.
|
|
198
|
-
*
|
|
199
|
-
* Accepts both `\n\n` (Unix-style streams) and `\r\n\r\n` (CRLF, as
|
|
200
|
-
* emitted by nginx, Cloudflare, and some Node intermediaries). Picks
|
|
201
|
-
* whichever appears FIRST so a stream that mixes both styles parses
|
|
202
|
-
* deterministically.
|
|
203
|
-
*/
|
|
204
|
-
function findNextEventBoundary(buffer) {
|
|
205
|
-
const lfIdx = buffer.indexOf('\n\n');
|
|
206
|
-
const crlfIdx = buffer.indexOf('\r\n\r\n');
|
|
207
|
-
if (lfIdx === -1 && crlfIdx === -1)
|
|
208
|
-
return null;
|
|
209
|
-
if (crlfIdx === -1)
|
|
210
|
-
return { start: lfIdx, end: lfIdx + 2 };
|
|
211
|
-
if (lfIdx === -1)
|
|
212
|
-
return { start: crlfIdx, end: crlfIdx + 4 };
|
|
213
|
-
if (lfIdx < crlfIdx)
|
|
214
|
-
return { start: lfIdx, end: lfIdx + 2 };
|
|
215
|
-
return { start: crlfIdx, end: crlfIdx + 4 };
|
|
216
|
-
}
|
|
217
|
-
function parseSseEvent(raw) {
|
|
218
|
-
const dataLines = [];
|
|
219
|
-
for (const line of raw.split(/\r?\n/)) {
|
|
220
|
-
// The SSE spec strips one leading space after the colon if present.
|
|
221
|
-
// We do the same so payloads written `data: {...}` parse correctly.
|
|
222
|
-
if (!line.startsWith('data:'))
|
|
223
|
-
continue;
|
|
224
|
-
const value = line.slice('data:'.length);
|
|
225
|
-
dataLines.push(value.startsWith(' ') ? value.slice(1) : value);
|
|
226
|
-
}
|
|
227
|
-
if (dataLines.length === 0)
|
|
228
|
-
return null;
|
|
229
|
-
const payload = dataLines.join('\n').trim();
|
|
230
|
-
if (payload.length === 0)
|
|
231
|
-
return null;
|
|
232
|
-
try {
|
|
233
|
-
const parsed = JSON.parse(payload);
|
|
234
|
-
if (parsed && typeof parsed === 'object' && typeof parsed['type'] === 'string') {
|
|
235
|
-
// Trust shape coming from the server enough to forward it; the
|
|
236
|
-
// command handler treats unknown fields defensively.
|
|
237
|
-
return parsed;
|
|
238
|
-
}
|
|
239
|
-
return null;
|
|
240
|
-
}
|
|
241
|
-
catch {
|
|
242
|
-
return null;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
function toAsyncIterable(body) {
|
|
246
|
-
// Web ReadableStream → iterate via reader.read() loop bridged to async-iter.
|
|
247
|
-
if (typeof body.getReader === 'function') {
|
|
248
|
-
return webStreamToAsyncIterable(body);
|
|
249
|
-
}
|
|
250
|
-
// Node Readable: already async-iterable.
|
|
251
|
-
return body;
|
|
252
|
-
}
|
|
253
|
-
async function* webStreamToAsyncIterable(stream) {
|
|
254
|
-
const reader = stream.getReader();
|
|
255
|
-
try {
|
|
256
|
-
while (true) {
|
|
257
|
-
const { done, value } = await reader.read();
|
|
258
|
-
if (done)
|
|
259
|
-
return;
|
|
260
|
-
if (value)
|
|
261
|
-
yield value;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
finally {
|
|
265
|
-
reader.releaseLock();
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
async function safeText(res) {
|
|
269
|
-
try {
|
|
270
|
-
return await res.text();
|
|
271
|
-
}
|
|
272
|
-
catch {
|
|
273
|
-
return '';
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
//# sourceMappingURL=anvil-fanout.js.map
|