@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,352 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Subagent dispatcher (β2 S1 + S4 —).
|
|
3
|
-
*
|
|
4
|
-
* The dispatcher is the runtime side of the @pugi/sdk subagent contracts.
|
|
5
|
-
* Given a SubagentTask, it:
|
|
6
|
-
*
|
|
7
|
-
* 1. Resolves the role to a Cyber-Zoo persona via the local registry
|
|
8
|
-
* (apps/pugi-cli/src/core/agents/registry.ts, which itself sources
|
|
9
|
-
* @pugi/personas).
|
|
10
|
-
* 2. Classifies isolation per the matrix (see isolationForRole).
|
|
11
|
-
* 3. Builds the dispatch-time permission overrides (Vera as reviewer
|
|
12
|
-
* or verifier loses every edit/write/bash class — see
|
|
13
|
-
* permissionOverridesForRole).
|
|
14
|
-
* 4. Emits subagent.spawned into the session events log.
|
|
15
|
-
* 5. Drives the dispatch via one of two backends:
|
|
16
|
-
* - REAL (β2 S1): when ctx carries an EngineLoopClient, the child
|
|
17
|
-
* runs a genuine `runEngineLoop` against Anvil with a per-child
|
|
18
|
-
* tools schema gated by the isolation-matrix capability map
|
|
19
|
-
* (β2 S4). See `dispatcher-real.ts::runRealDispatch`.
|
|
20
|
-
* - STUB (M1 legacy): when no engine client is supplied, the
|
|
21
|
-
* dispatcher returns a `shipped` result with zero metrics so
|
|
22
|
-
* the legacy `inMemoryDispatcherContext` test path stays green.
|
|
23
|
-
* This is the back-compat door for the M1 spec coverage.
|
|
24
|
-
* 6. Emits subagent.completed | blocked | failed into the session
|
|
25
|
-
* events log (real backend emits richer details; stub emits the
|
|
26
|
-
* M1-compatible shape).
|
|
27
|
-
* 7. Returns the typed SubagentResult.
|
|
28
|
-
*
|
|
29
|
-
* Why we kept the stub path: the existing M1 spec coverage exercises
|
|
30
|
-
* the dispatcher's contract surface (role-to-persona, isolation tier,
|
|
31
|
-
* permission overrides, event ordering) without any HTTP transport.
|
|
32
|
-
* β2 must not regress that surface — every existing assertion still
|
|
33
|
-
* holds for in-memory contexts. The real backend is a strict superset.
|
|
34
|
-
*
|
|
35
|
-
* The dispatcher is the only place that knows the isolation matrix and
|
|
36
|
-
* the permission overrides. Both surfaces are exported so engine adapter
|
|
37
|
-
* code, tests, and the future REPL can introspect a role without
|
|
38
|
-
* actually running a dispatch.
|
|
39
|
-
*/
|
|
40
|
-
import { randomUUID } from 'node:crypto';
|
|
41
|
-
import { subagentTaskSchema } from '@pugi/sdk';
|
|
42
|
-
import { getPersonaForRole } from '../agents/registry.js';
|
|
43
|
-
/* ------------------------------------------------------------------ */
|
|
44
|
-
/* Isolation matrix */
|
|
45
|
-
/* ------------------------------------------------------------------ */
|
|
46
|
-
/**
|
|
47
|
-
* M1 isolation matrix .
|
|
48
|
-
*
|
|
49
|
-
* The function is pure (same role in, same isolation out) and exported
|
|
50
|
-
* separately so consumers (tests, REPL UI) can introspect without
|
|
51
|
-
* dispatching.
|
|
52
|
-
*/
|
|
53
|
-
export function isolationForRole(role) {
|
|
54
|
-
switch (role) {
|
|
55
|
-
case 'orchestrator':
|
|
56
|
-
return 'prompt_only';
|
|
57
|
-
case 'architect':
|
|
58
|
-
case 'verifier':
|
|
59
|
-
case 'reviewer':
|
|
60
|
-
case 'researcher':
|
|
61
|
-
return 'shared_fs_readonly';
|
|
62
|
-
case 'coder':
|
|
63
|
-
case 'release':
|
|
64
|
-
case 'devops':
|
|
65
|
-
case 'design_qa':
|
|
66
|
-
return 'shared_fs_serialized';
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/* ------------------------------------------------------------------ */
|
|
70
|
-
/* Permission overrides */
|
|
71
|
-
/* ------------------------------------------------------------------ */
|
|
72
|
-
/**
|
|
73
|
-
* Per-role permission overrides applied at dispatch time. The dominant
|
|
74
|
-
* case is Vera's dual-role rule :
|
|
75
|
-
* when dispatched as verifier OR reviewer, Vera gets edit: deny (which
|
|
76
|
-
* we generalize to deny edit + write + bash, the three classes that can
|
|
77
|
-
* mutate the workspace) so a review pass cannot accidentally patch what
|
|
78
|
-
* it is reviewing.
|
|
79
|
-
*
|
|
80
|
-
* Read-only research roles (architect, researcher) get the same
|
|
81
|
-
* three-class deny because their shared_fs_readonly isolation tier is
|
|
82
|
-
* the load-bearing contract; repeating the override at the permission
|
|
83
|
-
* layer is defense in depth so a future bug in isolation classification
|
|
84
|
-
* cannot silently grant a write.
|
|
85
|
-
*
|
|
86
|
-
* Write-capable roles (coder, release, devops, design_qa) get no
|
|
87
|
-
* override; they inherit the workspace permission settings as-is.
|
|
88
|
-
*
|
|
89
|
-
* orchestrator also gets no override; Pugi runs inside the parent
|
|
90
|
-
* context, so the parent's permission settings already govern her.
|
|
91
|
-
*/
|
|
92
|
-
export function permissionOverridesForRole(role) {
|
|
93
|
-
switch (role) {
|
|
94
|
-
case 'verifier':
|
|
95
|
-
case 'reviewer':
|
|
96
|
-
return DENY_ALL_WRITES_VERA;
|
|
97
|
-
case 'architect':
|
|
98
|
-
case 'researcher':
|
|
99
|
-
return DENY_ALL_WRITES_READONLY;
|
|
100
|
-
case 'orchestrator':
|
|
101
|
-
case 'coder':
|
|
102
|
-
case 'release':
|
|
103
|
-
case 'devops':
|
|
104
|
-
case 'design_qa':
|
|
105
|
-
return [];
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
const DENY_ALL_WRITES_VERA = Object.freeze([
|
|
109
|
-
{
|
|
110
|
-
toolClass: 'edit',
|
|
111
|
-
allowedPaths: Object.freeze([]),
|
|
112
|
-
reason: 'Vera dispatched as verifier/reviewer ',
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
toolClass: 'write',
|
|
116
|
-
allowedPaths: Object.freeze([]),
|
|
117
|
-
reason: 'Vera dispatched as verifier/reviewer ',
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
toolClass: 'bash',
|
|
121
|
-
allowedPaths: Object.freeze([]),
|
|
122
|
-
reason: 'Vera dispatched as verifier/reviewer ',
|
|
123
|
-
},
|
|
124
|
-
]);
|
|
125
|
-
const DENY_ALL_WRITES_READONLY = Object.freeze([
|
|
126
|
-
{
|
|
127
|
-
toolClass: 'edit',
|
|
128
|
-
allowedPaths: Object.freeze([]),
|
|
129
|
-
reason: 'read-only role (shared_fs_readonly isolation tier)',
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
toolClass: 'write',
|
|
133
|
-
allowedPaths: Object.freeze([]),
|
|
134
|
-
reason: 'read-only role (shared_fs_readonly isolation tier)',
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
toolClass: 'bash',
|
|
138
|
-
allowedPaths: Object.freeze([]),
|
|
139
|
-
reason: 'read-only role (shared_fs_readonly isolation tier)',
|
|
140
|
-
},
|
|
141
|
-
]);
|
|
142
|
-
/* ------------------------------------------------------------------ */
|
|
143
|
-
/* Default budgets */
|
|
144
|
-
/* ------------------------------------------------------------------ */
|
|
145
|
-
// CEO escalation 2026-06-05: 120K coder budget exhausted mid-React-
|
|
146
|
-
// build (120214 > 120000). Match the engine-level `code` task bump
|
|
147
|
-
// (apps/pugi-cli/src/core/engine/budgets.ts:149 — 400K). Subagent
|
|
148
|
-
// dispatches inherit the upstream caller's headroom, so this needs
|
|
149
|
-
// to track the engine envelope.
|
|
150
|
-
const DEFAULT_BUDGETS = Object.freeze({
|
|
151
|
-
orchestrator: { tokens: 400_000, dollars: 8, wallClockMs: 900_000 },
|
|
152
|
-
architect: { tokens: 200_000, dollars: 4, wallClockMs: 600_000 },
|
|
153
|
-
coder: { tokens: 400_000, dollars: 8, wallClockMs: 900_000 },
|
|
154
|
-
verifier: { tokens: 150_000, dollars: 3, wallClockMs: 600_000 },
|
|
155
|
-
reviewer: { tokens: 200_000, dollars: 4, wallClockMs: 600_000 },
|
|
156
|
-
researcher: { tokens: 150_000, dollars: 3, wallClockMs: 600_000 },
|
|
157
|
-
release: { tokens: 80_000, dollars: 2, wallClockMs: 300_000 },
|
|
158
|
-
devops: { tokens: 150_000, dollars: 3, wallClockMs: 600_000 },
|
|
159
|
-
design_qa: { tokens: 150_000, dollars: 3, wallClockMs: 600_000 },
|
|
160
|
-
});
|
|
161
|
-
/**
|
|
162
|
-
* Resolve the effective budget for a dispatch by merging task overrides
|
|
163
|
-
* onto the role default. Caller-supplied limits always tighten, never
|
|
164
|
-
* relax — a missing field falls back to the role default.
|
|
165
|
-
*/
|
|
166
|
-
export function budgetForRole(role, override) {
|
|
167
|
-
const base = DEFAULT_BUDGETS[role];
|
|
168
|
-
if (!override)
|
|
169
|
-
return base;
|
|
170
|
-
return {
|
|
171
|
-
tokens: override.tokens ?? base.tokens,
|
|
172
|
-
dollars: override.dollars ?? base.dollars,
|
|
173
|
-
wallClockMs: override.wallClockMs ?? base.wallClockMs,
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
/* ------------------------------------------------------------------ */
|
|
177
|
-
/* Real-backend lazy import (memoized) */
|
|
178
|
-
/* ------------------------------------------------------------------ */
|
|
179
|
-
/**
|
|
180
|
-
* β2a r1 (Backend Architect P1): cached lazy-import of
|
|
181
|
-
* the real dispatch backend. Hoisting the dynamic import to
|
|
182
|
-
* module scope (instead of running it on every dispatch call) means
|
|
183
|
-
* the first agent spawn does not pay 50-200ms cold-start latency.
|
|
184
|
-
*
|
|
185
|
-
* The cache is a Promise so concurrent first-callers share one
|
|
186
|
-
* import; ESM's own module cache also dedups but the Promise wrapper
|
|
187
|
-
* lets `prewarmRealDispatch` kick off the import without awaiting.
|
|
188
|
-
*/
|
|
189
|
-
let realDispatchPromise = null;
|
|
190
|
-
function ensureRealDispatch() {
|
|
191
|
-
if (!realDispatchPromise) {
|
|
192
|
-
realDispatchPromise = import('./dispatcher-real.js');
|
|
193
|
-
}
|
|
194
|
-
return realDispatchPromise;
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* β2a r1: pre-warm the real dispatcher's module graph. Called by the
|
|
198
|
-
* engine adapter (`NativePugiEngineAdapter`) at construction time
|
|
199
|
-
* when an engine client is wired, so the first `dispatch()` call
|
|
200
|
-
* with `ctx.engineClient` set returns instantly. Safe to call
|
|
201
|
-
* multiple times — subsequent calls hit the cached promise.
|
|
202
|
-
*/
|
|
203
|
-
export function prewarmRealDispatch() {
|
|
204
|
-
return ensureRealDispatch();
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Spawn a subagent. Two backends:
|
|
208
|
-
*
|
|
209
|
-
* - REAL (β2 S1): when `ctx.engineClient` is set, the dispatcher
|
|
210
|
-
* spawns a genuine child engine loop. See `dispatcher-real.ts`.
|
|
211
|
-
* The child's tool surface is filtered by the isolation matrix
|
|
212
|
-
* (β2 S4) so a `researcher` role cannot see `write`/`edit`/`bash`
|
|
213
|
-
* in its tools schema and the executor refuses if the model
|
|
214
|
-
* fabricates a call.
|
|
215
|
-
*
|
|
216
|
-
* - STUB (M1 legacy): when no engine client is supplied, the
|
|
217
|
-
* dispatcher returns a `shipped` result with zero metrics. This
|
|
218
|
-
* is the back-compat door for the M1 spec coverage and for
|
|
219
|
-
* in-memory consumers that only want to assert the dispatcher's
|
|
220
|
-
* CONTRACT surface (role-to-persona, isolation tier, permission
|
|
221
|
-
* overrides, event ordering) without standing up Anvil.
|
|
222
|
-
*
|
|
223
|
-
* The function rejects with ZodError when the task fails schema
|
|
224
|
-
* validation. Throwing rather than returning a failed result is the
|
|
225
|
-
* right call here: a malformed dispatch is a caller bug, not a subagent
|
|
226
|
-
* failure, and surfacing it as a thrown error keeps the audit log
|
|
227
|
-
* clean.
|
|
228
|
-
*/
|
|
229
|
-
export async function dispatch(task, ctx) {
|
|
230
|
-
const validated = subagentTaskSchema.parse(task);
|
|
231
|
-
if (ctx.engineClient) {
|
|
232
|
-
// β2a r1 (Backend Architect P1): the lazy import
|
|
233
|
-
// chain (worktree + engine SDK graph) cost 50-200ms on the FIRST
|
|
234
|
-
// dispatch call. `ensureRealDispatch` memoizes the promise so the
|
|
235
|
-
// import happens at most once per process; subsequent dispatches
|
|
236
|
-
// hit the cached promise instantly. Production callers should
|
|
237
|
-
// prewarm via `prewarmRealDispatch()` at engine adapter init so
|
|
238
|
-
// the operator never pays cold-start on the first agent call.
|
|
239
|
-
const { runRealDispatch } = await ensureRealDispatch();
|
|
240
|
-
const outcome = await runRealDispatch(validated, {
|
|
241
|
-
sessionId: ctx.sessionId,
|
|
242
|
-
workspaceRoot: ctx.workspaceRoot,
|
|
243
|
-
appendEvent: ctx.appendEvent,
|
|
244
|
-
...(ctx.now ? { now: ctx.now } : {}),
|
|
245
|
-
engineClient: ctx.engineClient,
|
|
246
|
-
...(ctx.commandKind ? { commandKind: ctx.commandKind } : {}),
|
|
247
|
-
...(ctx.useWorktreeIsolation !== undefined
|
|
248
|
-
? { useWorktreeIsolation: ctx.useWorktreeIsolation }
|
|
249
|
-
: {}),
|
|
250
|
-
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
251
|
-
});
|
|
252
|
-
return outcome.result;
|
|
253
|
-
}
|
|
254
|
-
return runStubDispatch(validated, ctx);
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Real-backend variant that also surfaces the optional worktree
|
|
258
|
-
* handle. Callers that need to promote/drop the scratch worktree
|
|
259
|
-
* (e.g. the REPL `/agent` surface, or the Agent tool dispatcher) use
|
|
260
|
-
* this entry point.
|
|
261
|
-
*/
|
|
262
|
-
export async function dispatchWithOutcome(task, ctx) {
|
|
263
|
-
const validated = subagentTaskSchema.parse(task);
|
|
264
|
-
if (ctx.engineClient) {
|
|
265
|
-
const { runRealDispatch } = await ensureRealDispatch();
|
|
266
|
-
return runRealDispatch(validated, {
|
|
267
|
-
sessionId: ctx.sessionId,
|
|
268
|
-
workspaceRoot: ctx.workspaceRoot,
|
|
269
|
-
appendEvent: ctx.appendEvent,
|
|
270
|
-
...(ctx.now ? { now: ctx.now } : {}),
|
|
271
|
-
engineClient: ctx.engineClient,
|
|
272
|
-
...(ctx.commandKind ? { commandKind: ctx.commandKind } : {}),
|
|
273
|
-
...(ctx.useWorktreeIsolation !== undefined
|
|
274
|
-
? { useWorktreeIsolation: ctx.useWorktreeIsolation }
|
|
275
|
-
: {}),
|
|
276
|
-
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
const result = await runStubDispatch(validated, ctx);
|
|
280
|
-
return { result };
|
|
281
|
-
}
|
|
282
|
-
async function runStubDispatch(validated, ctx) {
|
|
283
|
-
const persona = getPersonaForRole(validated.role);
|
|
284
|
-
const isolation = isolationForRole(validated.role);
|
|
285
|
-
void budgetForRole(validated.role, validated.budget);
|
|
286
|
-
void permissionOverridesForRole(validated.role);
|
|
287
|
-
const now = ctx.now ?? defaultNow;
|
|
288
|
-
const startedAt = Date.now();
|
|
289
|
-
ctx.appendEvent({
|
|
290
|
-
id: randomUUID(),
|
|
291
|
-
sessionId: ctx.sessionId,
|
|
292
|
-
timestamp: now(),
|
|
293
|
-
type: 'subagent.spawned',
|
|
294
|
-
taskId: validated.id,
|
|
295
|
-
role: validated.role,
|
|
296
|
-
personaSlug: persona.slug,
|
|
297
|
-
parentSessionId: ctx.sessionId,
|
|
298
|
-
isolation,
|
|
299
|
-
});
|
|
300
|
-
const status = 'shipped';
|
|
301
|
-
const summary = stubSummaryFor(validated.role, persona.name);
|
|
302
|
-
const result = {
|
|
303
|
-
taskId: validated.id,
|
|
304
|
-
role: validated.role,
|
|
305
|
-
personaSlug: persona.slug,
|
|
306
|
-
status,
|
|
307
|
-
summary,
|
|
308
|
-
filesChanged: [],
|
|
309
|
-
toolCallCount: 0,
|
|
310
|
-
tokensIn: 0,
|
|
311
|
-
tokensOut: 0,
|
|
312
|
-
durationMs: Date.now() - startedAt,
|
|
313
|
-
};
|
|
314
|
-
ctx.appendEvent({
|
|
315
|
-
id: randomUUID(),
|
|
316
|
-
sessionId: ctx.sessionId,
|
|
317
|
-
timestamp: now(),
|
|
318
|
-
type: 'subagent.completed',
|
|
319
|
-
taskId: result.taskId,
|
|
320
|
-
role: result.role,
|
|
321
|
-
personaSlug: result.personaSlug,
|
|
322
|
-
toolCallCount: result.toolCallCount,
|
|
323
|
-
tokensIn: result.tokensIn,
|
|
324
|
-
tokensOut: result.tokensOut,
|
|
325
|
-
durationMs: result.durationMs,
|
|
326
|
-
});
|
|
327
|
-
return result;
|
|
328
|
-
}
|
|
329
|
-
function stubSummaryFor(role, personaName) {
|
|
330
|
-
return `${personaName} (${role}) dispatched: in-memory stub backend (no engine client supplied; production callers should pass DispatcherContext.engineClient)`;
|
|
331
|
-
}
|
|
332
|
-
function defaultNow() {
|
|
333
|
-
return new Date().toISOString();
|
|
334
|
-
}
|
|
335
|
-
/* ------------------------------------------------------------------ */
|
|
336
|
-
/* Convenience helpers */
|
|
337
|
-
/* ------------------------------------------------------------------ */
|
|
338
|
-
/**
|
|
339
|
-
* Build a dispatch context tied to an in-memory event sink. Useful for
|
|
340
|
-
* unit tests that want to assert on emitted events without standing up
|
|
341
|
-
* a real .pugi/ directory. Production callers use spawnSubagent (in
|
|
342
|
-
* sibling spawn.ts), which closes over a real PugiSession.
|
|
343
|
-
*/
|
|
344
|
-
export function inMemoryDispatcherContext(input) {
|
|
345
|
-
return {
|
|
346
|
-
sessionId: input.sessionId,
|
|
347
|
-
workspaceRoot: input.workspaceRoot,
|
|
348
|
-
appendEvent: (event) => input.sink.push(event),
|
|
349
|
-
now: input.now,
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
//# sourceMappingURL=dispatcher.js.map
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Subagent runtime surface for the Pugi CLI (Sprint a5.4 — M1 gap
|
|
3
|
-
* remediation D).
|
|
4
|
-
*
|
|
5
|
-
* Re-exports the dispatcher + helpers under a single import path so
|
|
6
|
-
* engine adapter code, the REPL, and tests can pull in everything they
|
|
7
|
-
* need with one import statement:
|
|
8
|
-
*
|
|
9
|
-
* import { dispatch, isolationForRole, ... } from '../core/subagents/index.js';
|
|
10
|
-
*
|
|
11
|
-
* The submodule index does not re-export persona types — those live in
|
|
12
|
-
* @pugi/personas and are pulled in by core/agents/registry.ts. Mixing
|
|
13
|
-
* the persona surface and the dispatcher surface in a single barrel
|
|
14
|
-
* would invite the kind of accidental drift the persona-registry
|
|
15
|
-
* extraction was designed to prevent.
|
|
16
|
-
*/
|
|
17
|
-
export { budgetForRole, dispatch, dispatchWithOutcome, inMemoryDispatcherContext, isolationForRole, permissionOverridesForRole, } from './dispatcher.js';
|
|
18
|
-
/**
|
|
19
|
-
* β2 S4: per-role capability matrix. Surfaced via the barrel so
|
|
20
|
-
* engine adapter code, the Agent tool, and tests can introspect a
|
|
21
|
-
* role's allowed tool set without importing the matrix module
|
|
22
|
-
* directly.
|
|
23
|
-
*/
|
|
24
|
-
export { allowedToolsForRole, capabilitiesForRole, roleHasToolAccess, ROLE_CAPABILITIES, } from './isolation-matrix.js';
|
|
25
|
-
/**
|
|
26
|
-
* β2 S1: real-backend entry point. Exposed for callers that want to
|
|
27
|
-
* drive the dispatch with the worktree handle in scope (e.g. the
|
|
28
|
-
* Agent tool, the REPL `/agent` surface). Most callers should prefer
|
|
29
|
-
* the `dispatch()` / `dispatchWithOutcome()` helpers above which
|
|
30
|
-
* route to this module when ctx.engineClient is set.
|
|
31
|
-
*/
|
|
32
|
-
export { runRealDispatch } from './dispatcher-real.js';
|
|
33
|
-
/**
|
|
34
|
-
* Spawn a subagent from inside the engine adapter loop. Re-exported via
|
|
35
|
-
* the barrel so engine code does not have to import the dispatcher
|
|
36
|
-
* module directly.
|
|
37
|
-
*/
|
|
38
|
-
export { spawnSubagent, spawnSubagentWithOutcome } from './spawn.js';
|
|
39
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
const CAP_READ_ONLY = new Set([
|
|
2
|
-
'read',
|
|
3
|
-
'task',
|
|
4
|
-
'skill',
|
|
5
|
-
]);
|
|
6
|
-
const CAP_VERIFIER = new Set([
|
|
7
|
-
'read',
|
|
8
|
-
'task',
|
|
9
|
-
'skill',
|
|
10
|
-
// β2a r1 (Codex P1): verifier previously got the FULL
|
|
11
|
-
// `bash` capability. The class-aware bash tool defaults to
|
|
12
|
-
// permission mode `auto`, which permits `write_workspace` class
|
|
13
|
-
// commands (e.g. `echo x > src/file.ts`, `sed -i`, `rm`). That
|
|
14
|
-
// silently bypassed the no-edit/no-write contract — a verifier
|
|
15
|
-
// could mutate the workspace it was meant to read.
|
|
16
|
-
//
|
|
17
|
-
// The fix splits bash into two capabilities:
|
|
18
|
-
// - `bash` → full bash (writers only)
|
|
19
|
-
// - `bash_read_only` → bash gate that forces read-only classifier
|
|
20
|
-
// mode regardless of operator settings
|
|
21
|
-
// verifier needs the read-only flavor so test commands (pnpm test,
|
|
22
|
-
// jest --listFiles, typecheck) still work but a fabricated
|
|
23
|
-
// `echo x > file.ts` is refused at the executor layer.
|
|
24
|
-
'bash_read_only',
|
|
25
|
-
]);
|
|
26
|
-
const CAP_WRITER = new Set([
|
|
27
|
-
'read',
|
|
28
|
-
'write',
|
|
29
|
-
'bash',
|
|
30
|
-
'task',
|
|
31
|
-
'skill',
|
|
32
|
-
'ask_user',
|
|
33
|
-
]);
|
|
34
|
-
const CAP_FULL = new Set([
|
|
35
|
-
'read',
|
|
36
|
-
'write',
|
|
37
|
-
'bash',
|
|
38
|
-
'task',
|
|
39
|
-
'skill',
|
|
40
|
-
'ask_user',
|
|
41
|
-
'web_fetch',
|
|
42
|
-
'agent',
|
|
43
|
-
]);
|
|
44
|
-
/**
|
|
45
|
-
* Per-role capability map. Add a new role only when the matching
|
|
46
|
-
* isolation tier classification in dispatcher.ts agrees with the
|
|
47
|
-
* capability set here — drift would let a `coder` role get write
|
|
48
|
-
* privileges with `shared_fs_readonly` isolation, which would mean
|
|
49
|
-
* the dispatcher emits readonly-isolation events while the child
|
|
50
|
-
* actually writes. Always touch both files together.
|
|
51
|
-
*/
|
|
52
|
-
export const ROLE_CAPABILITIES = new Map([
|
|
53
|
-
[
|
|
54
|
-
'orchestrator',
|
|
55
|
-
{
|
|
56
|
-
role: 'orchestrator',
|
|
57
|
-
capabilities: CAP_FULL,
|
|
58
|
-
rationale: 'orchestrator (Pugi/Pugi) runs in parent context with full toolset; '
|
|
59
|
-
+ 'parent permissions still gate any actual mutation',
|
|
60
|
-
},
|
|
61
|
-
],
|
|
62
|
-
[
|
|
63
|
-
'architect',
|
|
64
|
-
{
|
|
65
|
-
role: 'architect',
|
|
66
|
-
capabilities: CAP_READ_ONLY,
|
|
67
|
-
rationale: 'architect role is read-only by design (analysis + planning, no mutations)',
|
|
68
|
-
},
|
|
69
|
-
],
|
|
70
|
-
[
|
|
71
|
-
'coder',
|
|
72
|
-
{
|
|
73
|
-
role: 'coder',
|
|
74
|
-
capabilities: CAP_WRITER,
|
|
75
|
-
rationale: 'coder role mutates the workspace via write + edit + bash',
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
[
|
|
79
|
-
'verifier',
|
|
80
|
-
{
|
|
81
|
-
role: 'verifier',
|
|
82
|
-
capabilities: CAP_VERIFIER,
|
|
83
|
-
rationale: 'verifier role reads workspace + executes verification commands (tests, typecheck) '
|
|
84
|
-
+ 'but never edits the code it is verifying',
|
|
85
|
-
},
|
|
86
|
-
],
|
|
87
|
-
[
|
|
88
|
-
'reviewer',
|
|
89
|
-
{
|
|
90
|
-
role: 'reviewer',
|
|
91
|
-
capabilities: CAP_READ_ONLY,
|
|
92
|
-
rationale: 'reviewer role is read-only by policy (no edits to code under review); '
|
|
93
|
-
+ 'shell is denied because reviewer should not be re-running tests',
|
|
94
|
-
},
|
|
95
|
-
],
|
|
96
|
-
[
|
|
97
|
-
'researcher',
|
|
98
|
-
{
|
|
99
|
-
role: 'researcher',
|
|
100
|
-
capabilities: CAP_READ_ONLY,
|
|
101
|
-
rationale: 'researcher role is read-only (corpus search + summarization)',
|
|
102
|
-
},
|
|
103
|
-
],
|
|
104
|
-
[
|
|
105
|
-
'release',
|
|
106
|
-
{
|
|
107
|
-
role: 'release',
|
|
108
|
-
capabilities: CAP_WRITER,
|
|
109
|
-
rationale: 'release role needs write + bash for changelog edits + version bumps',
|
|
110
|
-
},
|
|
111
|
-
],
|
|
112
|
-
[
|
|
113
|
-
'devops',
|
|
114
|
-
{
|
|
115
|
-
role: 'devops',
|
|
116
|
-
capabilities: CAP_WRITER,
|
|
117
|
-
rationale: 'devops role needs write + bash for infra config + deploy scripts',
|
|
118
|
-
},
|
|
119
|
-
],
|
|
120
|
-
[
|
|
121
|
-
'design_qa',
|
|
122
|
-
{
|
|
123
|
-
role: 'design_qa',
|
|
124
|
-
capabilities: CAP_WRITER,
|
|
125
|
-
rationale: 'design_qa role needs write + bash for UI tweaks + screenshot scripts',
|
|
126
|
-
},
|
|
127
|
-
],
|
|
128
|
-
]);
|
|
129
|
-
/**
|
|
130
|
-
* Resolve the capability set for a role. Throws when the role is not
|
|
131
|
-
* registered — the closed SubagentRole union prevents that at compile
|
|
132
|
-
* time for typed callers, but the runtime guard catches dynamic dispatch
|
|
133
|
-
* paths (e.g. a tag parsed off Pugi's reply text).
|
|
134
|
-
*/
|
|
135
|
-
export function capabilitiesForRole(role) {
|
|
136
|
-
const entry = ROLE_CAPABILITIES.get(role);
|
|
137
|
-
if (!entry) {
|
|
138
|
-
throw new Error(`capabilitiesForRole: unknown role '${role}'`);
|
|
139
|
-
}
|
|
140
|
-
return entry;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Map capability classes → concrete tool names (matches tool-bridge.ts
|
|
144
|
-
* WIRED_TOOLS). This is the bridge between the policy layer (this file)
|
|
145
|
-
* and the schema-shaping layer (tool-bridge buildToolsSchema). Keep in
|
|
146
|
-
* lockstep with WIRED_TOOLS — a new tool added to the bridge should
|
|
147
|
-
* be classified here so subagents see (or do not see) it consistently.
|
|
148
|
-
*/
|
|
149
|
-
const CAPABILITY_TO_TOOLS = {
|
|
150
|
-
read: ['read', 'grep', 'glob'],
|
|
151
|
-
write: ['write', 'edit'],
|
|
152
|
-
bash: ['bash'],
|
|
153
|
-
// β2a r1 : `bash_read_only` maps to the same `bash`
|
|
154
|
-
// tool name so the model sees only one tool surface. The
|
|
155
|
-
// dispatcher-real executor wraps the verifier's bash calls with a
|
|
156
|
-
// forced read-only classifier mode (see `gatedExecutor` in
|
|
157
|
-
// dispatcher-real.ts) so a `write_workspace`-class command is
|
|
158
|
-
// rejected before the tool runs even though the capability set
|
|
159
|
-
// appears to advertise `bash`.
|
|
160
|
-
bash_read_only: ['bash'],
|
|
161
|
-
task: ['task_create', 'task_get', 'task_list', 'task_update'],
|
|
162
|
-
skill: ['skill', 'skills_list'],
|
|
163
|
-
ask_user: ['ask_user_question'],
|
|
164
|
-
web_fetch: ['web_fetch'],
|
|
165
|
-
// Agent tool is the subagent spawn primitive itself (S3). Only the
|
|
166
|
-
// orchestrator role gets it — child agents cannot recursively spawn
|
|
167
|
-
// grand-children, which keeps the spawn depth bounded at 1 and the
|
|
168
|
-
// budget rollup tractable.
|
|
169
|
-
agent: ['agent'],
|
|
170
|
-
};
|
|
171
|
-
/**
|
|
172
|
-
* Return the set of tool names a role is allowed to call. Used by the
|
|
173
|
-
* per-child tool-bridge to shape the OpenAI tools schema AND by the
|
|
174
|
-
* executor refusal gate.
|
|
175
|
-
*
|
|
176
|
-
* The function is pure — same role in, same set out — so the schema
|
|
177
|
-
* builder can call it from inside `buildToolsSchema`.
|
|
178
|
-
*/
|
|
179
|
-
export function allowedToolsForRole(role) {
|
|
180
|
-
const caps = capabilitiesForRole(role);
|
|
181
|
-
const out = new Set();
|
|
182
|
-
for (const cap of caps.capabilities) {
|
|
183
|
-
for (const name of CAPABILITY_TO_TOOLS[cap]) {
|
|
184
|
-
out.add(name);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
return out;
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Predicate: is a tool name reachable by a role under the capability
|
|
191
|
-
* matrix? Used by the executor's pre-dispatch refusal gate.
|
|
192
|
-
*
|
|
193
|
-
* Returns true for orchestrator/full-capability roles and for every
|
|
194
|
-
* specific tool the role's capability set unlocks; false otherwise.
|
|
195
|
-
*/
|
|
196
|
-
export function roleHasToolAccess(role, toolName) {
|
|
197
|
-
return allowedToolsForRole(role).has(toolName);
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* β2a r1 (Codex P1): predicate identifying roles whose
|
|
201
|
-
* bash access is restricted to read-only classifier mode. Used by
|
|
202
|
-
* dispatcher-real.ts's gatedExecutor to force-flag bash dispatches as
|
|
203
|
-
* read-only regardless of the workspace's permission settings.
|
|
204
|
-
*
|
|
205
|
-
* A role qualifies when it holds `bash_read_only` but NOT the
|
|
206
|
-
* full-power `bash` capability — orchestrators (which inherit both
|
|
207
|
-
* via CAP_FULL) keep full bash access through the regular path.
|
|
208
|
-
*/
|
|
209
|
-
export function bashIsReadOnlyForRole(role) {
|
|
210
|
-
const caps = capabilitiesForRole(role).capabilities;
|
|
211
|
-
return caps.has('bash_read_only') && !caps.has('bash');
|
|
212
|
-
}
|
|
213
|
-
//# sourceMappingURL=isolation-matrix.js.map
|