@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,192 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auto-compact (mid-loop transcript summarization) default trip point as
|
|
3
|
-
* a fraction of the per-command `maxTokens` envelope. CEO P1 #14 (CC
|
|
4
|
-
* parity): when transcript char-count tokens cross 75% of the budget,
|
|
5
|
-
* the engine loop drops the middle turns and inserts a deterministic
|
|
6
|
-
* `[auto-compact]` sentinel so the loop can continue без the model
|
|
7
|
-
* tripping the `budget_exhausted` terminal status mid-build.
|
|
8
|
-
*
|
|
9
|
-
* Empirically — `pugi code "big refactor"` hits the 80k cap on turn 4-5
|
|
10
|
-
* and refuses to finish; `pugi fix` does the same at 50k. Auto-compact
|
|
11
|
-
* keeps the recent N turns + a one-line gist of the dropped tool calls
|
|
12
|
-
* so the model retains the most recent state without paying for the
|
|
13
|
-
* full prefix.
|
|
14
|
-
*
|
|
15
|
-
* Operators can opt out / retune via `.pugi/settings.json`:
|
|
16
|
-
*
|
|
17
|
-
* {
|
|
18
|
-
* "autoCompact": { "enabled": true, "thresholdRatio": 0.75 }
|
|
19
|
-
* }
|
|
20
|
-
*
|
|
21
|
-
* Bad values fall back silently to the default — the engine loop never
|
|
22
|
-
* crashes on a malformed settings field (mirrors `resolveBudget`).
|
|
23
|
-
*/
|
|
24
|
-
export const AUTO_COMPACT_THRESHOLD_RATIO = 0.75;
|
|
25
|
-
export const DEFAULT_AUTO_COMPACT_CONFIG = {
|
|
26
|
-
enabled: true,
|
|
27
|
-
thresholdRatio: AUTO_COMPACT_THRESHOLD_RATIO,
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Pull the auto-compact override from `.pugi/settings.json`. Uses the
|
|
31
|
-
* same defensive-cast pattern as `readSettingsBudget` so an unknown
|
|
32
|
-
* field shape silently falls back к defaults (the gate is a comfort
|
|
33
|
-
* feature; a malformed settings line must not break the engine loop).
|
|
34
|
-
*
|
|
35
|
-
* Returns the merged config — caller never sees `undefined`.
|
|
36
|
-
*/
|
|
37
|
-
export function resolveAutoCompactConfig(settings) {
|
|
38
|
-
if (!settings)
|
|
39
|
-
return DEFAULT_AUTO_COMPACT_CONFIG;
|
|
40
|
-
const root = settings.autoCompact;
|
|
41
|
-
if (!root || typeof root !== 'object' || Array.isArray(root)) {
|
|
42
|
-
return DEFAULT_AUTO_COMPACT_CONFIG;
|
|
43
|
-
}
|
|
44
|
-
const r = root;
|
|
45
|
-
const enabledRaw = r['enabled'];
|
|
46
|
-
const thresholdRaw = r['thresholdRatio'];
|
|
47
|
-
const enabled = typeof enabledRaw === 'boolean'
|
|
48
|
-
? enabledRaw
|
|
49
|
-
: DEFAULT_AUTO_COMPACT_CONFIG.enabled;
|
|
50
|
-
let thresholdRatio = DEFAULT_AUTO_COMPACT_CONFIG.thresholdRatio;
|
|
51
|
-
if (typeof thresholdRaw === 'number' && Number.isFinite(thresholdRaw)) {
|
|
52
|
-
if (thresholdRaw > 0 && thresholdRaw <= 1) {
|
|
53
|
-
thresholdRatio = thresholdRaw;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return { enabled, thresholdRatio };
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* β1 defaults. Source of truth for the per-command budget envelope.
|
|
60
|
-
* The runtime is allowed to look these up directly (no need to round
|
|
61
|
-
* trip through settings.json when no override is in play).
|
|
62
|
-
*
|
|
63
|
-
* bump (post-Wave-7 hooks-v2 + 6-perm-modes + auto-classifier
|
|
64
|
-
* added ~12K tokens of system-prompt + tools-schema overhead per turn):
|
|
65
|
-
* `code` 30k → 80k и `fix` 30k → 50k so a single-file refactor on a
|
|
66
|
-
* 1000-line source file no longer exhausts the budget on turn 2.
|
|
67
|
-
* Empirical: smoke `pugi code "сделай snake.html"` on beta.37 burned
|
|
68
|
-
* 36k/30k after 2 tool calls; beta.36 same task closed in 8k. The Wave-7
|
|
69
|
-
* additions are good (the upstream tool parity), but the budget cap did not move with
|
|
70
|
-
* them. the upstream tool's `code` default is ~80k; matching that restores headroom.
|
|
71
|
-
*/
|
|
72
|
-
export const beta1DefaultBudgets = {
|
|
73
|
-
// bump (CEO #44, post-auto-compact #14 + prompt-cache #15):
|
|
74
|
-
// auto-compact at 75% threshold + cache_control on stable prefix mean
|
|
75
|
-
// real per-call token use is ~30-40% lower than legacy. Bump headroom
|
|
76
|
-
// so multi-file refactors no longer trip the cap. Anvil clamps per-call
|
|
77
|
-
// max_tokens to 128k (PR) so the engine envelope still safe.
|
|
78
|
-
// CEO escalation 2026-06-05: REPL React tic-tac-toe blew budget at
|
|
79
|
-
// 120214 > 120000 mid-build. the upstream customer expectation = 200K+
|
|
80
|
-
// context per session с recharge. Bump к 400K for code/fix + raise
|
|
81
|
-
// tool-call ceilings so multi-file front-end builds (React + tests +
|
|
82
|
-
// index.css + index.html + main.jsx) fit without forcing the operator
|
|
83
|
-
// to escalate к `--intensity=deep`.
|
|
84
|
-
fix: { maxTokens: 250_000, maxToolCalls: 40 },
|
|
85
|
-
code: { maxTokens: 400_000, maxToolCalls: 50 },
|
|
86
|
-
build: { maxTokens: 500_000, maxToolCalls: 60 },
|
|
87
|
-
plan: { maxTokens: 200_000, maxToolCalls: 8 },
|
|
88
|
-
explain: { maxTokens: 60_000, maxToolCalls: 10 },
|
|
89
|
-
review_triple: { maxTokens: 100_000, maxToolCalls: 10 },
|
|
90
|
-
};
|
|
91
|
-
/**
|
|
92
|
-
* Hard upper bounds. Anything above this is treated as user error
|
|
93
|
-
* (likely a typo or misplaced decimal) and rejected by
|
|
94
|
-
* `assertBudgetWithinTier`. Stops a careless settings.json edit from
|
|
95
|
-
* silently authorising a 100M-token run.
|
|
96
|
-
*/
|
|
97
|
-
export const HARD_MAX_TOKENS = 5_000_000;
|
|
98
|
-
export const HARD_MAX_TOOL_CALLS = 500;
|
|
99
|
-
/**
|
|
100
|
-
* Compute the effective budget for a given command, applying:
|
|
101
|
-
* 1. β1 defaults
|
|
102
|
-
* 2. settings.json `budgets.<command>` partial overrides
|
|
103
|
-
* 3. task-level override (caller-provided, e.g. CLI `--max-tokens`,
|
|
104
|
-
* `--max-turns`, or the resolved intensity profile)
|
|
105
|
-
*
|
|
106
|
-
* Throws `BudgetConfigError` when the resolved budget exceeds the
|
|
107
|
-
* HARD_MAX_* caps so misconfigured settings.json fails fast.
|
|
108
|
-
*
|
|
109
|
-
* Triple-review P1 follow-up : `maxTurns` propagates through this
|
|
110
|
-
* resolver so the SDK's `runEngineLoop` actually receives the per-tier
|
|
111
|
-
* cap that the intensity dial advertises. Override precedence matches
|
|
112
|
-
* the other knobs: explicit task override > settings.json > undefined
|
|
113
|
-
* (legacy behaviour: no turn cap, only tokens + tool-calls).
|
|
114
|
-
*/
|
|
115
|
-
export function resolveBudget(command, settings, override) {
|
|
116
|
-
const base = beta1DefaultBudgets[command];
|
|
117
|
-
const settingsBudget = readSettingsBudget(settings, command);
|
|
118
|
-
const resolvedMaxTurns = override?.maxTurns ?? settingsBudget?.maxTurns ?? undefined;
|
|
119
|
-
const resolved = {
|
|
120
|
-
maxTokens: override?.maxTokens ??
|
|
121
|
-
settingsBudget?.maxTokens ??
|
|
122
|
-
base.maxTokens,
|
|
123
|
-
maxToolCalls: override?.maxToolCalls ??
|
|
124
|
-
settingsBudget?.maxToolCalls ??
|
|
125
|
-
base.maxToolCalls,
|
|
126
|
-
...(resolvedMaxTurns !== undefined ? { maxTurns: resolvedMaxTurns } : {}),
|
|
127
|
-
};
|
|
128
|
-
assertBudgetWithinTier(command, resolved);
|
|
129
|
-
return resolved;
|
|
130
|
-
}
|
|
131
|
-
export class BudgetConfigError extends Error {
|
|
132
|
-
constructor(message) {
|
|
133
|
-
super(message);
|
|
134
|
-
this.name = 'BudgetConfigError';
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Hard upper bound on per-task LLM turns. Above this we reject the
|
|
139
|
-
* configuration as a likely typo. The marathon intensity preset is 200,
|
|
140
|
-
* so 1000 buys an order of magnitude of headroom for power-user overrides
|
|
141
|
-
* without authorising runaway loops.
|
|
142
|
-
*/
|
|
143
|
-
export const HARD_MAX_TURNS = 1000;
|
|
144
|
-
export function assertBudgetWithinTier(command, budget) {
|
|
145
|
-
if (!Number.isFinite(budget.maxTokens) || budget.maxTokens <= 0) {
|
|
146
|
-
throw new BudgetConfigError(`budget[${command}].maxTokens must be a positive number, got ${budget.maxTokens}`);
|
|
147
|
-
}
|
|
148
|
-
if (!Number.isFinite(budget.maxToolCalls) || budget.maxToolCalls <= 0) {
|
|
149
|
-
throw new BudgetConfigError(`budget[${command}].maxToolCalls must be a positive number, got ${budget.maxToolCalls}`);
|
|
150
|
-
}
|
|
151
|
-
if (budget.maxTokens > HARD_MAX_TOKENS) {
|
|
152
|
-
throw new BudgetConfigError(`budget[${command}].maxTokens=${budget.maxTokens} exceeds hard cap ${HARD_MAX_TOKENS}`);
|
|
153
|
-
}
|
|
154
|
-
if (budget.maxToolCalls > HARD_MAX_TOOL_CALLS) {
|
|
155
|
-
throw new BudgetConfigError(`budget[${command}].maxToolCalls=${budget.maxToolCalls} exceeds hard cap ${HARD_MAX_TOOL_CALLS}`);
|
|
156
|
-
}
|
|
157
|
-
if (budget.maxTurns !== undefined) {
|
|
158
|
-
if (!Number.isFinite(budget.maxTurns) || budget.maxTurns <= 0) {
|
|
159
|
-
throw new BudgetConfigError(`budget[${command}].maxTurns must be a positive number, got ${budget.maxTurns}`);
|
|
160
|
-
}
|
|
161
|
-
if (budget.maxTurns > HARD_MAX_TURNS) {
|
|
162
|
-
throw new BudgetConfigError(`budget[${command}].maxTurns=${budget.maxTurns} exceeds hard cap ${HARD_MAX_TURNS}`);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Pull a settings.json budget override for the given command, with
|
|
168
|
-
* defensive typing. `PugiSettings` does not yet declare `budgets`
|
|
169
|
-
* formally (β1 is the first sprint to land it) so we cast via unknown
|
|
170
|
-
* and validate each field at the boundary.
|
|
171
|
-
*/
|
|
172
|
-
function readSettingsBudget(settings, command) {
|
|
173
|
-
if (!settings)
|
|
174
|
-
return undefined;
|
|
175
|
-
const root = settings.budgets;
|
|
176
|
-
if (!root || typeof root !== 'object' || Array.isArray(root))
|
|
177
|
-
return undefined;
|
|
178
|
-
const map = root;
|
|
179
|
-
const entry = map[command];
|
|
180
|
-
if (!entry || typeof entry !== 'object' || Array.isArray(entry))
|
|
181
|
-
return undefined;
|
|
182
|
-
const e = entry;
|
|
183
|
-
const out = {};
|
|
184
|
-
if (typeof e['maxTokens'] === 'number')
|
|
185
|
-
out.maxTokens = e['maxTokens'];
|
|
186
|
-
if (typeof e['maxToolCalls'] === 'number')
|
|
187
|
-
out.maxToolCalls = e['maxToolCalls'];
|
|
188
|
-
if (typeof e['maxTurns'] === 'number')
|
|
189
|
-
out.maxTurns = e['maxTurns'];
|
|
190
|
-
return out;
|
|
191
|
-
}
|
|
192
|
-
//# sourceMappingURL=budgets.js.map
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
/** Hard cap on the rendered `<context>` block, bytes. */
|
|
2
|
-
export const CONTEXT_PREFIX_MAX_BYTES = 5 * 1024;
|
|
3
|
-
/** Hard cap on working-set entries surfaced in the prefix. */
|
|
4
|
-
export const CONTEXT_PREFIX_MAX_WORKING_SET = 50;
|
|
5
|
-
/** Hard cap on per-dir markdown files surfaced inline. */
|
|
6
|
-
export const CONTEXT_PREFIX_MAX_MARKDOWN = 3;
|
|
7
|
-
/** Per-markdown-file inline excerpt cap, bytes. Keeps any one file from dominating. */
|
|
8
|
-
export const CONTEXT_PREFIX_MAX_PER_MARKDOWN_BYTES = 1024;
|
|
9
|
-
/**
|
|
10
|
-
* Build the `<context>` block. Always returns a result — when there
|
|
11
|
-
* is nothing to surface (no cwd hint, no working set, no per-dir
|
|
12
|
-
* files), returns `{ block: '', bytes: 0, truncated: false, counts: ... }`
|
|
13
|
-
* so the caller can short-circuit the splice cleanly.
|
|
14
|
-
*
|
|
15
|
-
* Determinism: same input always produces byte-identical output. The
|
|
16
|
-
* working-set order comes from the caller's summary; we preserve it
|
|
17
|
-
* verbatim. Per-dir files are sorted by `distanceFromCwd` ascending
|
|
18
|
-
* (closest first) so two equal `TraversedMarkdown` arrays produce
|
|
19
|
-
* identical blocks.
|
|
20
|
-
*/
|
|
21
|
-
export function buildContextPrefix(input) {
|
|
22
|
-
const lines = [];
|
|
23
|
-
let bytes = 0;
|
|
24
|
-
let truncated = false;
|
|
25
|
-
// Walk a write-then-measure loop so we never overflow the byte cap.
|
|
26
|
-
// Each push checks budget; when full, set `truncated = true` and
|
|
27
|
-
// stop. The opener / closer tags always fit (small) — we reserve
|
|
28
|
-
// their byte cost up-front from the budget.
|
|
29
|
-
const opener = '<context>';
|
|
30
|
-
const closer = '</context>';
|
|
31
|
-
const reservedTagBytes = Buffer.byteLength(opener, 'utf8') + 1 + Buffer.byteLength(closer, 'utf8') + 1;
|
|
32
|
-
let budget = CONTEXT_PREFIX_MAX_BYTES - reservedTagBytes;
|
|
33
|
-
if (budget < 0) {
|
|
34
|
-
return {
|
|
35
|
-
block: '',
|
|
36
|
-
bytes: 0,
|
|
37
|
-
truncated: false,
|
|
38
|
-
counts: {
|
|
39
|
-
workingSetIncluded: 0,
|
|
40
|
-
workingSetTotal: input.workingSet?.length ?? 0,
|
|
41
|
-
markdownIncluded: 0,
|
|
42
|
-
markdownTotal: input.traversedMarkdown?.length ?? 0,
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
const pushLine = (line) => {
|
|
47
|
-
const lineBytes = Buffer.byteLength(line, 'utf8') + 1; // newline
|
|
48
|
-
if (lineBytes > budget) {
|
|
49
|
-
truncated = true;
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
lines.push(line);
|
|
53
|
-
budget -= lineBytes;
|
|
54
|
-
bytes += lineBytes;
|
|
55
|
-
return true;
|
|
56
|
-
};
|
|
57
|
-
// cwd — always cheap, always first.
|
|
58
|
-
pushLine(`cwd: ${input.cwdRelative || '.'}`);
|
|
59
|
-
// intent hint, if provided.
|
|
60
|
-
if (input.intentHint) {
|
|
61
|
-
pushLine(`intent: ${input.intentHint}`);
|
|
62
|
-
}
|
|
63
|
-
// Working set — render `open-files:` only when there is at least one entry.
|
|
64
|
-
const wsTotal = input.workingSet?.length ?? 0;
|
|
65
|
-
let wsIncluded = 0;
|
|
66
|
-
if (wsTotal > 0 && input.workingSet) {
|
|
67
|
-
const wsCap = Math.min(CONTEXT_PREFIX_MAX_WORKING_SET, wsTotal);
|
|
68
|
-
pushLine('open-files:');
|
|
69
|
-
for (let i = 0; i < wsCap; i += 1) {
|
|
70
|
-
const entry = input.workingSet[i];
|
|
71
|
-
if (!entry)
|
|
72
|
-
continue;
|
|
73
|
-
const ok = pushLine(` - ${entry.absPath}`);
|
|
74
|
-
if (!ok)
|
|
75
|
-
break;
|
|
76
|
-
wsIncluded += 1;
|
|
77
|
-
}
|
|
78
|
-
if (wsTotal > wsCap) {
|
|
79
|
-
pushLine(` ... (+${wsTotal - wsCap} more)`);
|
|
80
|
-
truncated = truncated || true;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
// Per-dir markdown — closest-first, max 3, each capped to 1 KB excerpt.
|
|
84
|
-
const mdTotal = input.traversedMarkdown?.length ?? 0;
|
|
85
|
-
let mdIncluded = 0;
|
|
86
|
-
if (mdTotal > 0 && input.traversedMarkdown) {
|
|
87
|
-
const sorted = [...input.traversedMarkdown].sort((a, b) => a.distanceFromCwd - b.distanceFromCwd);
|
|
88
|
-
const top = sorted.slice(0, CONTEXT_PREFIX_MAX_MARKDOWN);
|
|
89
|
-
if (top.length > 0) {
|
|
90
|
-
pushLine('per-dir-conventions:');
|
|
91
|
-
for (const md of top) {
|
|
92
|
-
// Header line names the source file for traceability.
|
|
93
|
-
const header = ` [${md.resolvedPath}]`;
|
|
94
|
-
if (!pushLine(header))
|
|
95
|
-
break;
|
|
96
|
-
// Excerpt: cap to 1 KB, single-line collapse (replace newlines
|
|
97
|
-
// with " | " so the YAML-ish block stays parseable by humans).
|
|
98
|
-
const excerpt = excerpt1KB(md.content);
|
|
99
|
-
// Indent two spaces so it nests under the file header.
|
|
100
|
-
const indented = excerpt.split('\n').map((l) => ` ${l}`).join('\n');
|
|
101
|
-
if (!pushLine(indented))
|
|
102
|
-
break;
|
|
103
|
-
mdIncluded += 1;
|
|
104
|
-
}
|
|
105
|
-
if (mdTotal > top.length) {
|
|
106
|
-
pushLine(` ... (+${mdTotal - top.length} more files; closest-3 shown)`);
|
|
107
|
-
truncated = truncated || true;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (lines.length === 0) {
|
|
112
|
-
return {
|
|
113
|
-
block: '',
|
|
114
|
-
bytes: 0,
|
|
115
|
-
truncated: false,
|
|
116
|
-
counts: {
|
|
117
|
-
workingSetIncluded: 0,
|
|
118
|
-
workingSetTotal: wsTotal,
|
|
119
|
-
markdownIncluded: 0,
|
|
120
|
-
markdownTotal: mdTotal,
|
|
121
|
-
},
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
const block = [opener, ...lines, closer].join('\n');
|
|
125
|
-
const totalBytes = Buffer.byteLength(block, 'utf8');
|
|
126
|
-
return {
|
|
127
|
-
block,
|
|
128
|
-
bytes: totalBytes,
|
|
129
|
-
truncated,
|
|
130
|
-
counts: {
|
|
131
|
-
workingSetIncluded: wsIncluded,
|
|
132
|
-
workingSetTotal: wsTotal,
|
|
133
|
-
markdownIncluded: mdIncluded,
|
|
134
|
-
markdownTotal: mdTotal,
|
|
135
|
-
},
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Splice a built context block onto the front of a user message.
|
|
140
|
-
* Empty block → message returned verbatim (no leading blank line, no
|
|
141
|
-
* empty `<context>` tag).
|
|
142
|
-
*/
|
|
143
|
-
export function spliceContextPrefix(block, userMessage) {
|
|
144
|
-
if (block.length === 0)
|
|
145
|
-
return userMessage;
|
|
146
|
-
return `${block}\n\n${userMessage}`;
|
|
147
|
-
}
|
|
148
|
-
function excerpt1KB(content) {
|
|
149
|
-
const capped = content.length <= CONTEXT_PREFIX_MAX_PER_MARKDOWN_BYTES
|
|
150
|
-
? content
|
|
151
|
-
: content.slice(0, CONTEXT_PREFIX_MAX_PER_MARKDOWN_BYTES);
|
|
152
|
-
// Trim trailing newlines so the YAML-ish render stays tight.
|
|
153
|
-
return capped.replace(/\s+$/g, '');
|
|
154
|
-
}
|
|
155
|
-
//# sourceMappingURL=context-prefix.js.map
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export * from './adapter-runner.js';
|
|
2
|
-
export * from './anvil-client.js';
|
|
3
|
-
export * from './native-pugi.js';
|
|
4
|
-
export * from './noop.js';
|
|
5
|
-
export * from './prompts.js';
|
|
6
|
-
export * from './tool-bridge.js';
|
|
7
|
-
// Subagent dispatch helper. Engine adapter code calls this from a
|
|
8
|
-
// future `task_dispatch` tool ; the re-export keeps the
|
|
9
|
-
// import path stable so adapter code does not have to reach into the
|
|
10
|
-
// subagents submodule.
|
|
11
|
-
export { spawnSubagent } from '../subagents/spawn.js';
|
|
12
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Intensity dial — single knob that derives max_turns, token budget,
|
|
3
|
-
* model tag, and parallel-agent posture for `pugi code/fix/build/plan/explain`.
|
|
4
|
-
*
|
|
5
|
-
* Spec: Pugi backlog. Pattern lifted from Karpathy's nanochat
|
|
6
|
-
* `--depth` flag — one dial that captures "how much do you want me to
|
|
7
|
-
* spend on this turn?" so operators do not have to tune four separate
|
|
8
|
-
* knobs in lockstep.
|
|
9
|
-
*
|
|
10
|
-
* Four discrete levels were chosen over a free-form integer:
|
|
11
|
-
*
|
|
12
|
-
* - operators have a mental model for "quick / standard / deep / marathon"
|
|
13
|
-
* - discrete tiers let us tune model + parallel-agent posture per tier
|
|
14
|
-
* without exposing a continuous knob that has no meaning above 200 turns
|
|
15
|
-
* - keeps env override (`PUGI_INTENSITY`) trivially parseable
|
|
16
|
-
*
|
|
17
|
-
* Defaults are conservative — the operator can always override any
|
|
18
|
-
* individual knob via the per-command flag (`--max-turns`, `--max-tokens`,
|
|
19
|
-
* `PUGI_ENGINE_MODEL_<COMMAND>`) and the explicit flag wins.
|
|
20
|
-
*
|
|
21
|
-
* | level | max_turns | budget tokens | model | parallel agents |
|
|
22
|
-
* |----------|-----------|---------------|----------|------------------|
|
|
23
|
-
* | quick | 3 | 30 000 | haiku | off |
|
|
24
|
-
* | standard | 15 | 80 000 | sonnet | off |
|
|
25
|
-
* | deep | 50 | 200 000 | sonnet | up to 3 |
|
|
26
|
-
* | marathon | 200 | 800 000 | opus | up to 3 |
|
|
27
|
-
*
|
|
28
|
-
* Model tags are abstract (`light`/`standard`/`heavy`). The CLI maps
|
|
29
|
-
* each tag to a concrete model slug via env override
|
|
30
|
-
* (`PUGI_INTENSITY_MODEL_<TAG>`) OR falls back to the per-persona default
|
|
31
|
-
* resolved by the admin-api runtime. We do NOT hard-code Anthropic /
|
|
32
|
-
* OpenAI slugs here — those move per provider release and would couple
|
|
33
|
-
* the CLI to the runtime's routing table. Operators pin a concrete model
|
|
34
|
-
* via `PUGI_ENGINE_MODEL_<COMMAND>` when they need exact control.
|
|
35
|
-
*/
|
|
36
|
-
export const INTENSITY_LEVELS = [
|
|
37
|
-
'quick',
|
|
38
|
-
'standard',
|
|
39
|
-
'deep',
|
|
40
|
-
'marathon',
|
|
41
|
-
];
|
|
42
|
-
export const DEFAULT_INTENSITY = 'standard';
|
|
43
|
-
const PROFILES = {
|
|
44
|
-
quick: {
|
|
45
|
-
level: 'quick',
|
|
46
|
-
maxTurns: 3,
|
|
47
|
-
budgetTokens: 30_000,
|
|
48
|
-
modelTag: 'light',
|
|
49
|
-
allowParallelAgents: false,
|
|
50
|
-
maxParallelAgents: 0,
|
|
51
|
-
},
|
|
52
|
-
// CEO 2026-06-05: 80K standard exhausted React multi-file build mid-
|
|
53
|
-
// turn (120K hardcoded budget). Customers compare to the upstream = 200K
|
|
54
|
-
// context per session. Bump standard к 200K so default REPL doesn't
|
|
55
|
-
// trip mid-build; deep к 500K for complex multi-file refactors;
|
|
56
|
-
// marathon к 1.5M for long-running autonomous work.
|
|
57
|
-
standard: {
|
|
58
|
-
level: 'standard',
|
|
59
|
-
maxTurns: 30,
|
|
60
|
-
budgetTokens: 200_000,
|
|
61
|
-
modelTag: 'standard',
|
|
62
|
-
allowParallelAgents: false,
|
|
63
|
-
maxParallelAgents: 0,
|
|
64
|
-
},
|
|
65
|
-
deep: {
|
|
66
|
-
level: 'deep',
|
|
67
|
-
maxTurns: 80,
|
|
68
|
-
budgetTokens: 500_000,
|
|
69
|
-
modelTag: 'standard',
|
|
70
|
-
allowParallelAgents: true,
|
|
71
|
-
maxParallelAgents: 3,
|
|
72
|
-
},
|
|
73
|
-
marathon: {
|
|
74
|
-
level: 'marathon',
|
|
75
|
-
maxTurns: 300,
|
|
76
|
-
budgetTokens: 1_500_000,
|
|
77
|
-
modelTag: 'heavy',
|
|
78
|
-
allowParallelAgents: true,
|
|
79
|
-
maxParallelAgents: 3,
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
/**
|
|
83
|
-
* Look up the profile for a level. Pure — returns the same frozen
|
|
84
|
-
* object on every call so callers can reference-compare cheaply.
|
|
85
|
-
*/
|
|
86
|
-
export function profileFor(level) {
|
|
87
|
-
return PROFILES[level];
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Resolve the effective per-task `maxTurns` cap.
|
|
91
|
-
*
|
|
92
|
-
* Precedence (triple-review P1 follow-up):
|
|
93
|
-
* 1. explicit `--max-turns=N` flag wins outright
|
|
94
|
-
* 2. otherwise the intensity profile's per-tier preset wins
|
|
95
|
-
*
|
|
96
|
-
* The function is pure so the CLI seam can call it inline and the test
|
|
97
|
-
* corpus can pin the precedence without spinning up a full adapter.
|
|
98
|
-
* Returning the resolved primitive instead of an object keeps the
|
|
99
|
-
* call site readable: `const turns = resolveMaxTurns(flags.maxTurns,
|
|
100
|
-
* profile);`. The CLI threads the result into `EngineTask.budget.turns`
|
|
101
|
-
* which the native-pugi adapter forwards to `EngineBudget.maxTurns` in
|
|
102
|
-
* the SDK loop.
|
|
103
|
-
*/
|
|
104
|
-
export function resolveMaxTurns(flagMaxTurns, profile) {
|
|
105
|
-
return flagMaxTurns ?? profile.maxTurns;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Type guard for the four-level enum. Rejects everything else,
|
|
109
|
-
* including capitalised variants — operators surface the typo at parse
|
|
110
|
-
* time rather than seeing the dial silently degrade to`standard`.
|
|
111
|
-
*/
|
|
112
|
-
export function isIntensityLevel(value) {
|
|
113
|
-
return (typeof value === 'string' &&
|
|
114
|
-
INTENSITY_LEVELS.includes(value));
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Resolve the effective intensity level from CLI input + env fallback.
|
|
118
|
-
*
|
|
119
|
-
* 1. CLI `--intensity <level>` wins when supplied.
|
|
120
|
-
* 2. `PUGI_INTENSITY` env wins next when `envFallback` (default true).
|
|
121
|
-
* 3. `DEFAULT_INTENSITY` ('standard') is the final fallback.
|
|
122
|
-
*
|
|
123
|
-
* Explicit-flag typos throw — an operator who typed `--intensity marathn`
|
|
124
|
-
* gets an immediate, deterministic error rather than silently dropping
|
|
125
|
-
* to `standard`. This matches the rule for every other named CLI flag
|
|
126
|
-
* (single source of truth lives in `parseArgs`).
|
|
127
|
-
*
|
|
128
|
-
* Env-var typos WARN and fall back — `PUGI_INTENSITY` is shell state that
|
|
129
|
-
* can persist across many sessions (rc files, container env, CI matrix).
|
|
130
|
-
* A typo there used to throw on every invocation and prevent any `pugi`
|
|
131
|
-
* command from running at all; the warn-not-throw path keeps the CLI
|
|
132
|
-
* usable and surfaces the bad value once on stderr so the operator can
|
|
133
|
-
* fix their environment. Triple-review P1 follow-up .
|
|
134
|
-
*
|
|
135
|
-
* The `warn` hook is injectable so unit tests can capture the message
|
|
136
|
-
* without depending on `process.stderr`. Production callers pass nothing
|
|
137
|
-
* and the helper falls back to `process.stderr.write`.
|
|
138
|
-
*/
|
|
139
|
-
export function resolveIntensity(opts) {
|
|
140
|
-
if (opts.intensity !== undefined && opts.intensity !== '') {
|
|
141
|
-
if (!isIntensityLevel(opts.intensity)) {
|
|
142
|
-
throw new Error(`unknown --intensity "${opts.intensity}"; expected one of ${INTENSITY_LEVELS.join(', ')}`);
|
|
143
|
-
}
|
|
144
|
-
return opts.intensity;
|
|
145
|
-
}
|
|
146
|
-
const envFallback = opts.envFallback !== false;
|
|
147
|
-
if (envFallback) {
|
|
148
|
-
const fromEnv = process.env['PUGI_INTENSITY'];
|
|
149
|
-
if (fromEnv !== undefined && fromEnv !== '') {
|
|
150
|
-
if (!isIntensityLevel(fromEnv)) {
|
|
151
|
-
const message = `pugi: PUGI_INTENSITY="${fromEnv}" is not one of ${INTENSITY_LEVELS.join(', ')}; ignoring and using default (${DEFAULT_INTENSITY}).\n`;
|
|
152
|
-
const writer = opts.warn ?? ((m) => {
|
|
153
|
-
process.stderr.write(m);
|
|
154
|
-
});
|
|
155
|
-
writer(message);
|
|
156
|
-
return DEFAULT_INTENSITY;
|
|
157
|
-
}
|
|
158
|
-
return fromEnv;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return DEFAULT_INTENSITY;
|
|
162
|
-
}
|
|
163
|
-
//# sourceMappingURL=intensity.js.map
|