@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
package/dist/tools/lsp-tools.js
DELETED
|
@@ -1,565 +0,0 @@
|
|
|
1
|
-
import { callHierarchyAt, codeActionsAt, diagnosticsFor, findDefinition as symbolsFindDefinition, findImplementations, findReferences as symbolsFindReferences, findTypeDefinition, findWorkspaceSymbol, formatFile, hoverSymbol, listDocumentSymbols, renameSymbol, signatureAt, transportFromLspClient, } from '../core/lsp/symbol-tools.js';
|
|
2
|
-
import { gateOnCancellation, OperatorAbortedError } from './file-tools.js';
|
|
3
|
-
import { recordToolCall, recordToolResult } from '../core/session.js';
|
|
4
|
-
import { getGlobalSymbolCache, SymbolCache } from '../core/lsp/symbol-cache.js';
|
|
5
|
-
/** Cap for any single LSP tool's payload size. Keeps model context lean. */
|
|
6
|
-
const LSP_PAYLOAD_CAP_BYTES = 8 * 1024;
|
|
7
|
-
export async function lspHover(ctx, lang, file, line, col) {
|
|
8
|
-
const toolCallId = recordToolCall(ctx.session, 'lsp_hover', `${lang}:${file}:${line}:${col}`);
|
|
9
|
-
return guard(ctx, 'lsp_hover', toolCallId, async () => {
|
|
10
|
-
const client = ctx.lspClients?.get(lang);
|
|
11
|
-
if (!client)
|
|
12
|
-
return unavailable(lang);
|
|
13
|
-
const result = await client.hover(file, { line, character: col }, ctx.cancellation);
|
|
14
|
-
if (!result.ok)
|
|
15
|
-
return failure(result);
|
|
16
|
-
if (!result.value) {
|
|
17
|
-
return { ok: true, value: { content: '' } };
|
|
18
|
-
}
|
|
19
|
-
const content = truncate(result.value.content);
|
|
20
|
-
return {
|
|
21
|
-
ok: true,
|
|
22
|
-
value: {
|
|
23
|
-
content: content.text,
|
|
24
|
-
...(result.value.range ? { range: result.value.range } : {}),
|
|
25
|
-
},
|
|
26
|
-
...(content.truncated ? { truncated: true } : {}),
|
|
27
|
-
};
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
export async function lspDefinition(ctx, lang, file, line, col) {
|
|
31
|
-
const toolCallId = recordToolCall(ctx.session, 'lsp_definition', `${lang}:${file}:${line}:${col}`);
|
|
32
|
-
return guard(ctx, 'lsp_definition', toolCallId, async () => {
|
|
33
|
-
const client = ctx.lspClients?.get(lang);
|
|
34
|
-
if (!client)
|
|
35
|
-
return unavailable(lang);
|
|
36
|
-
const result = await client.definition(file, { line, character: col }, ctx.cancellation);
|
|
37
|
-
if (!result.ok)
|
|
38
|
-
return failure(result);
|
|
39
|
-
const capped = capLocations(result.value);
|
|
40
|
-
return {
|
|
41
|
-
ok: true,
|
|
42
|
-
value: capped.value,
|
|
43
|
-
...(capped.truncated ? { truncated: true } : {}),
|
|
44
|
-
};
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
export async function lspReferences(ctx, lang, file, line, col) {
|
|
48
|
-
const toolCallId = recordToolCall(ctx.session, 'lsp_references', `${lang}:${file}:${line}:${col}`);
|
|
49
|
-
return guard(ctx, 'lsp_references', toolCallId, async () => {
|
|
50
|
-
const client = ctx.lspClients?.get(lang);
|
|
51
|
-
if (!client)
|
|
52
|
-
return unavailable(lang);
|
|
53
|
-
const result = await client.references(file, { line, character: col }, ctx.cancellation);
|
|
54
|
-
if (!result.ok)
|
|
55
|
-
return failure(result);
|
|
56
|
-
const capped = capLocations(result.value);
|
|
57
|
-
return {
|
|
58
|
-
ok: true,
|
|
59
|
-
value: capped.value,
|
|
60
|
-
...(capped.truncated ? { truncated: true } : {}),
|
|
61
|
-
};
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
export async function lspDiagnostics(ctx, lang, file) {
|
|
65
|
-
const toolCallId = recordToolCall(ctx.session, 'lsp_diagnostics', `${lang}:${file}`);
|
|
66
|
-
return guard(ctx, 'lsp_diagnostics', toolCallId, async () => {
|
|
67
|
-
const client = ctx.lspClients?.get(lang);
|
|
68
|
-
if (!client)
|
|
69
|
-
return unavailable(lang);
|
|
70
|
-
const result = await client.diagnostics(file, ctx.cancellation);
|
|
71
|
-
if (!result.ok)
|
|
72
|
-
return failure(result);
|
|
73
|
-
const capped = capDiagnostics(result.value);
|
|
74
|
-
return {
|
|
75
|
-
ok: true,
|
|
76
|
-
value: capped.value,
|
|
77
|
-
...(capped.truncated ? { truncated: true } : {}),
|
|
78
|
-
};
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
async function guard(ctx, toolName, toolCallId, op) {
|
|
82
|
-
try {
|
|
83
|
-
gateOnCancellation(ctx, toolName);
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
if (error instanceof OperatorAbortedError) {
|
|
87
|
-
recordToolResult(ctx.session, toolCallId, 'cancelled', error.message);
|
|
88
|
-
return { ok: false, reason: 'operator_aborted', detail: error.message };
|
|
89
|
-
}
|
|
90
|
-
throw error;
|
|
91
|
-
}
|
|
92
|
-
try {
|
|
93
|
-
const result = await op();
|
|
94
|
-
if (result.ok) {
|
|
95
|
-
recordToolResult(ctx.session, toolCallId, 'success', summarize(result.value));
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
recordToolResult(ctx.session, toolCallId, 'error', `${result.reason ?? 'error'}: ${result.detail ?? ''}`);
|
|
99
|
-
}
|
|
100
|
-
return result;
|
|
101
|
-
}
|
|
102
|
-
catch (error) {
|
|
103
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
104
|
-
recordToolResult(ctx.session, toolCallId, 'error', message);
|
|
105
|
-
return { ok: false, reason: 'lsp_error', detail: message };
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
function unavailable(lang) {
|
|
109
|
-
return {
|
|
110
|
-
ok: false,
|
|
111
|
-
reason: 'lsp_unavailable',
|
|
112
|
-
detail: `no LSP server started for ${lang}. Install the server and re-run ` +
|
|
113
|
-
`with --lsp ${lang}, or fall back to grep.`,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
function failure(result) {
|
|
117
|
-
if (result.ok) {
|
|
118
|
-
// Shouldn't be hit — caller checks first.
|
|
119
|
-
return { ok: true, value: result.value };
|
|
120
|
-
}
|
|
121
|
-
return { ok: false, reason: result.reason, detail: result.detail };
|
|
122
|
-
}
|
|
123
|
-
function summarize(value) {
|
|
124
|
-
if (value === null || value === undefined)
|
|
125
|
-
return 'no result';
|
|
126
|
-
if (Array.isArray(value))
|
|
127
|
-
return `${value.length} items`;
|
|
128
|
-
if (typeof value === 'object')
|
|
129
|
-
return Object.keys(value).join(',');
|
|
130
|
-
return String(value);
|
|
131
|
-
}
|
|
132
|
-
function truncate(text) {
|
|
133
|
-
const bytes = Buffer.byteLength(text, 'utf8');
|
|
134
|
-
if (bytes <= LSP_PAYLOAD_CAP_BYTES)
|
|
135
|
-
return { text, truncated: false };
|
|
136
|
-
// Truncate to the cap byte boundary. We don't try to honor codepoint
|
|
137
|
-
// alignment — UTF-8 surrogate splits show up as a single ? at the
|
|
138
|
-
// boundary, which is acceptable for a debug surface; the dispatcher
|
|
139
|
-
// is the trust boundary for "this is what the model will see".
|
|
140
|
-
const buf = Buffer.from(text, 'utf8').subarray(0, LSP_PAYLOAD_CAP_BYTES);
|
|
141
|
-
return { text: `${buf.toString('utf8')}\n... [truncated]`, truncated: true };
|
|
142
|
-
}
|
|
143
|
-
function capLocations(locations) {
|
|
144
|
-
// Cap at 200 locations OR the byte cap, whichever hits first. The
|
|
145
|
-
// 200 number is the operator-facing "this is a hot symbol" threshold —
|
|
146
|
-
// a richer surface (paginated `pugi lsp references --offset N`) is
|
|
147
|
-
// open backlog.
|
|
148
|
-
const COUNT_CAP = 200;
|
|
149
|
-
if (locations.length === 0)
|
|
150
|
-
return { value: locations, truncated: false };
|
|
151
|
-
const trimmed = locations.slice(0, COUNT_CAP);
|
|
152
|
-
const serialized = JSON.stringify(trimmed);
|
|
153
|
-
if (Buffer.byteLength(serialized, 'utf8') <= LSP_PAYLOAD_CAP_BYTES && trimmed.length === locations.length) {
|
|
154
|
-
return { value: trimmed, truncated: false };
|
|
155
|
-
}
|
|
156
|
-
// Trim by halves until we fit the byte cap. Worst case ~10 iterations
|
|
157
|
-
// for the 200 max, fine for an interactive tool.
|
|
158
|
-
let upper = trimmed.length;
|
|
159
|
-
while (upper > 1) {
|
|
160
|
-
const half = Math.floor(upper / 2);
|
|
161
|
-
const sub = trimmed.slice(0, half);
|
|
162
|
-
if (Buffer.byteLength(JSON.stringify(sub), 'utf8') <= LSP_PAYLOAD_CAP_BYTES) {
|
|
163
|
-
return { value: sub, truncated: true };
|
|
164
|
-
}
|
|
165
|
-
upper = half;
|
|
166
|
-
}
|
|
167
|
-
return { value: trimmed.slice(0, 1), truncated: true };
|
|
168
|
-
}
|
|
169
|
-
function capDiagnostics(items) {
|
|
170
|
-
if (items.length === 0)
|
|
171
|
-
return { value: items, truncated: false };
|
|
172
|
-
const serialized = JSON.stringify(items);
|
|
173
|
-
if (Buffer.byteLength(serialized, 'utf8') <= LSP_PAYLOAD_CAP_BYTES) {
|
|
174
|
-
return { value: items, truncated: false };
|
|
175
|
-
}
|
|
176
|
-
// Diagnostics are sorted error-first in LSP convention; trim from the
|
|
177
|
-
// tail so we keep the highest-severity items.
|
|
178
|
-
let upper = items.length;
|
|
179
|
-
while (upper > 1) {
|
|
180
|
-
const half = Math.floor(upper / 2);
|
|
181
|
-
const sub = items.slice(0, half);
|
|
182
|
-
if (Buffer.byteLength(JSON.stringify(sub), 'utf8') <= LSP_PAYLOAD_CAP_BYTES) {
|
|
183
|
-
return { value: sub, truncated: true };
|
|
184
|
-
}
|
|
185
|
-
upper = half;
|
|
186
|
-
}
|
|
187
|
-
return { value: items.slice(0, 1), truncated: true };
|
|
188
|
-
}
|
|
189
|
-
/* ------------------------------------------------------------------------- */
|
|
190
|
-
/* PUGI-78 Phase 1: symbols.* namespace tools (13 categories). */
|
|
191
|
-
/* ------------------------------------------------------------------------- */
|
|
192
|
-
/**
|
|
193
|
-
* PUGI-78 Phase 1: symbols.find_definition.
|
|
194
|
-
*
|
|
195
|
-
* Pugi reads a whole file (~5-50 KB tokens) every time the model wants
|
|
196
|
-
* to know "where is foo defined?". The LSP wire here returns ~200 bytes
|
|
197
|
-
* (file + line + character). Two orders of magnitude reduction in token
|
|
198
|
-
* cost per refactor turn, hence the BIG-leverage classification in the
|
|
199
|
-
* spec (10-100x token savings per refactor).
|
|
200
|
-
*
|
|
201
|
-
* Failure folds to `lsp_unavailable` when no client is registered for
|
|
202
|
-
* the inferred language. The agent surface is expected to fall back to
|
|
203
|
-
* grep when this fires (the tool-preference prompt rule steers it).
|
|
204
|
-
*/
|
|
205
|
-
export async function symbolsFindDefinitionTool(ctx, lang, file, line, col) {
|
|
206
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_find_definition', `${lang}:${file}:${line}:${col}`);
|
|
207
|
-
return guard(ctx, 'symbols_find_definition', toolCallId, async () => {
|
|
208
|
-
const client = ctx.lspClients?.get(lang);
|
|
209
|
-
if (!client)
|
|
210
|
-
return unavailable(lang);
|
|
211
|
-
const cache = getSymbolCacheFromCtx(ctx);
|
|
212
|
-
const cwd = workspaceForCache(ctx);
|
|
213
|
-
const key = SymbolCache.makeKey(lang, cwd, 'find_definition', { file, line, col });
|
|
214
|
-
const cached = cache?.get(key);
|
|
215
|
-
if (cached !== undefined) {
|
|
216
|
-
if (cached === null)
|
|
217
|
-
return notFound('definition');
|
|
218
|
-
return { ok: true, value: cached };
|
|
219
|
-
}
|
|
220
|
-
const result = await symbolsFindDefinition(transportFromLspClient(client), file, line, col);
|
|
221
|
-
cache?.set(key, result);
|
|
222
|
-
if (!result)
|
|
223
|
-
return notFound('definition');
|
|
224
|
-
return { ok: true, value: result };
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* PUGI-78 Phase 1: symbols.find_references.
|
|
229
|
-
*
|
|
230
|
-
* Returns the flat list of call sites for the symbol at (line, col).
|
|
231
|
-
* The 200-row cap from the legacy `lspReferences` carries over via
|
|
232
|
-
* `capSymbolReferences`.
|
|
233
|
-
*/
|
|
234
|
-
export async function symbolsFindReferencesTool(ctx, lang, file, line, col) {
|
|
235
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_find_references', `${lang}:${file}:${line}:${col}`);
|
|
236
|
-
return guard(ctx, 'symbols_find_references', toolCallId, async () => {
|
|
237
|
-
const client = ctx.lspClients?.get(lang);
|
|
238
|
-
if (!client)
|
|
239
|
-
return unavailable(lang);
|
|
240
|
-
const cache = getSymbolCacheFromCtx(ctx);
|
|
241
|
-
const cwd = workspaceForCache(ctx);
|
|
242
|
-
const key = SymbolCache.makeKey(lang, cwd, 'find_references', { file, line, col });
|
|
243
|
-
const cached = cache?.get(key);
|
|
244
|
-
if (cached !== undefined) {
|
|
245
|
-
const capped = capSymbolReferences(cached);
|
|
246
|
-
return { ok: true, value: capped.value, ...(capped.truncated ? { truncated: true } : {}) };
|
|
247
|
-
}
|
|
248
|
-
const result = await symbolsFindReferences(transportFromLspClient(client), file, line, col);
|
|
249
|
-
cache?.set(key, result);
|
|
250
|
-
const capped = capSymbolReferences(result);
|
|
251
|
-
return { ok: true, value: capped.value, ...(capped.truncated ? { truncated: true } : {}) };
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* PUGI-78 Phase 1: symbols.list_in_file.
|
|
256
|
-
*
|
|
257
|
-
* Outline view — the document-symbol surface. Returns the flat list of
|
|
258
|
-
* top-level + nested symbols with their kind. Cache HIT on the same
|
|
259
|
-
* file across consecutive turns is the common case (the model usually
|
|
260
|
-
* lists, then dives into a single symbol).
|
|
261
|
-
*/
|
|
262
|
-
export async function symbolsListInFileTool(ctx, lang, file) {
|
|
263
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_list_in_file', `${lang}:${file}`);
|
|
264
|
-
return guard(ctx, 'symbols_list_in_file', toolCallId, async () => {
|
|
265
|
-
const client = ctx.lspClients?.get(lang);
|
|
266
|
-
if (!client)
|
|
267
|
-
return unavailable(lang);
|
|
268
|
-
const cache = getSymbolCacheFromCtx(ctx);
|
|
269
|
-
const cwd = workspaceForCache(ctx);
|
|
270
|
-
const key = SymbolCache.makeKey(lang, cwd, 'list_in_file', { file });
|
|
271
|
-
const cached = cache?.get(key);
|
|
272
|
-
if (cached !== undefined) {
|
|
273
|
-
return { ok: true, value: [...cached] };
|
|
274
|
-
}
|
|
275
|
-
const result = await listDocumentSymbols(transportFromLspClient(client), file);
|
|
276
|
-
cache?.set(key, result);
|
|
277
|
-
return { ok: true, value: result };
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* PUGI-78 Phase 1: symbols.rename.
|
|
282
|
-
*
|
|
283
|
-
* Returns the workspace-edit preview the server proposes. The
|
|
284
|
-
* dispatcher applies via `apply_patch` in a future ticket; Phase 1 is
|
|
285
|
-
* read-only — the agent surface gets the affected file list + per-edit
|
|
286
|
-
* line/character so the model can summarize the change.
|
|
287
|
-
*/
|
|
288
|
-
export async function symbolsRenameTool(ctx, lang, file, line, col, newName) {
|
|
289
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_rename', `${lang}:${file}:${line}:${col}:${newName}`);
|
|
290
|
-
return guard(ctx, 'symbols_rename', toolCallId, async () => {
|
|
291
|
-
const client = ctx.lspClients?.get(lang);
|
|
292
|
-
if (!client)
|
|
293
|
-
return unavailable(lang);
|
|
294
|
-
// No cache for rename — the edit set depends on the live source
|
|
295
|
-
// file state. A subsequent rename of the same symbol after the
|
|
296
|
-
// first applied would otherwise return stale edits.
|
|
297
|
-
const result = await renameSymbol(transportFromLspClient(client), file, line, col, newName);
|
|
298
|
-
if (!result)
|
|
299
|
-
return notFound('rename');
|
|
300
|
-
return { ok: true, value: result };
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* PUGI-78 Phase 1: symbols.hover.
|
|
305
|
-
*
|
|
306
|
-
* Returns the hover content (type info + docstring) at the position.
|
|
307
|
-
* Body capped at 4 KB so a verbose generic does not blow context.
|
|
308
|
-
*/
|
|
309
|
-
export async function symbolsHoverTool(ctx, lang, file, line, col) {
|
|
310
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_hover', `${lang}:${file}:${line}:${col}`);
|
|
311
|
-
return guard(ctx, 'symbols_hover', toolCallId, async () => {
|
|
312
|
-
const client = ctx.lspClients?.get(lang);
|
|
313
|
-
if (!client)
|
|
314
|
-
return unavailable(lang);
|
|
315
|
-
const cache = getSymbolCacheFromCtx(ctx);
|
|
316
|
-
const cwd = workspaceForCache(ctx);
|
|
317
|
-
const key = SymbolCache.makeKey(lang, cwd, 'hover', { file, line, col });
|
|
318
|
-
const cached = cache?.get(key);
|
|
319
|
-
if (cached !== undefined) {
|
|
320
|
-
if (cached === null)
|
|
321
|
-
return notFound('hover');
|
|
322
|
-
const next = {
|
|
323
|
-
ok: true,
|
|
324
|
-
value: { content: cached.content, ...(cached.range ? { range: cached.range } : {}) },
|
|
325
|
-
...(cached.truncated ? { truncated: true } : {}),
|
|
326
|
-
};
|
|
327
|
-
return next;
|
|
328
|
-
}
|
|
329
|
-
const result = await hoverSymbol(transportFromLspClient(client), file, line, col);
|
|
330
|
-
cache?.set(key, result);
|
|
331
|
-
if (!result)
|
|
332
|
-
return notFound('hover');
|
|
333
|
-
return {
|
|
334
|
-
ok: true,
|
|
335
|
-
value: { content: result.content, ...(result.range ? { range: result.range } : {}) },
|
|
336
|
-
...(result.truncated ? { truncated: true } : {}),
|
|
337
|
-
};
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* PUGI-78 Phase 1: symbols.signature.
|
|
342
|
-
*
|
|
343
|
-
* Function signature at a call site. Returns the active overload's
|
|
344
|
-
* label, parameters, and active-parameter index.
|
|
345
|
-
*/
|
|
346
|
-
export async function symbolsSignatureTool(ctx, lang, file, line, col) {
|
|
347
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_signature', `${lang}:${file}:${line}:${col}`);
|
|
348
|
-
return guard(ctx, 'symbols_signature', toolCallId, async () => {
|
|
349
|
-
const client = ctx.lspClients?.get(lang);
|
|
350
|
-
if (!client)
|
|
351
|
-
return unavailable(lang);
|
|
352
|
-
const result = await signatureAt(transportFromLspClient(client), file, line, col);
|
|
353
|
-
if (!result)
|
|
354
|
-
return notFound('signature');
|
|
355
|
-
return { ok: true, value: result };
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* PUGI-78 Phase 1: symbols.workspace_symbols.
|
|
360
|
-
*
|
|
361
|
-
* Workspace-wide fuzzy search. The server picks the matching algorithm
|
|
362
|
-
* (substring / fuzzy / prefix); we forward verbatim.
|
|
363
|
-
*/
|
|
364
|
-
export async function symbolsWorkspaceSymbolsTool(ctx, lang, query) {
|
|
365
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_workspace_symbols', `${lang}:${query}`);
|
|
366
|
-
return guard(ctx, 'symbols_workspace_symbols', toolCallId, async () => {
|
|
367
|
-
const client = ctx.lspClients?.get(lang);
|
|
368
|
-
if (!client)
|
|
369
|
-
return unavailable(lang);
|
|
370
|
-
const cache = getSymbolCacheFromCtx(ctx);
|
|
371
|
-
const cwd = workspaceForCache(ctx);
|
|
372
|
-
const key = SymbolCache.makeKey(lang, cwd, 'workspace_symbols', { query });
|
|
373
|
-
const cached = cache?.get(key);
|
|
374
|
-
if (cached !== undefined) {
|
|
375
|
-
return { ok: true, value: [...cached] };
|
|
376
|
-
}
|
|
377
|
-
const result = await findWorkspaceSymbol(transportFromLspClient(client), query);
|
|
378
|
-
cache?.set(key, result);
|
|
379
|
-
return { ok: true, value: result };
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* PUGI-78 Phase 1: symbols.call_hierarchy.
|
|
384
|
-
*
|
|
385
|
-
* Returns the incoming + outgoing call edges at the symbol position.
|
|
386
|
-
* The two arrays are independent — a function may have many incoming
|
|
387
|
-
* callers and zero outgoing calls (a pure leaf), or vice versa.
|
|
388
|
-
*/
|
|
389
|
-
export async function symbolsCallHierarchyTool(ctx, lang, file, line, col) {
|
|
390
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_call_hierarchy', `${lang}:${file}:${line}:${col}`);
|
|
391
|
-
return guard(ctx, 'symbols_call_hierarchy', toolCallId, async () => {
|
|
392
|
-
const client = ctx.lspClients?.get(lang);
|
|
393
|
-
if (!client)
|
|
394
|
-
return unavailable(lang);
|
|
395
|
-
const cache = getSymbolCacheFromCtx(ctx);
|
|
396
|
-
const cwd = workspaceForCache(ctx);
|
|
397
|
-
const key = SymbolCache.makeKey(lang, cwd, 'call_hierarchy', { file, line, col });
|
|
398
|
-
const cached = cache?.get(key);
|
|
399
|
-
if (cached !== undefined) {
|
|
400
|
-
return { ok: true, value: { incoming: [...cached.incoming], outgoing: [...cached.outgoing] } };
|
|
401
|
-
}
|
|
402
|
-
const result = await callHierarchyAt(transportFromLspClient(client), file, line, col);
|
|
403
|
-
cache?.set(key, result);
|
|
404
|
-
return { ok: true, value: result };
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
/**
|
|
408
|
-
* PUGI-78 Phase 1: symbols.implementations.
|
|
409
|
-
*
|
|
410
|
-
* Implementations of an interface / abstract method. Returns the flat
|
|
411
|
-
* list of concrete sites.
|
|
412
|
-
*/
|
|
413
|
-
export async function symbolsImplementationsTool(ctx, lang, file, line, col) {
|
|
414
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_implementations', `${lang}:${file}:${line}:${col}`);
|
|
415
|
-
return guard(ctx, 'symbols_implementations', toolCallId, async () => {
|
|
416
|
-
const client = ctx.lspClients?.get(lang);
|
|
417
|
-
if (!client)
|
|
418
|
-
return unavailable(lang);
|
|
419
|
-
const cache = getSymbolCacheFromCtx(ctx);
|
|
420
|
-
const cwd = workspaceForCache(ctx);
|
|
421
|
-
const key = SymbolCache.makeKey(lang, cwd, 'implementations', { file, line, col });
|
|
422
|
-
const cached = cache?.get(key);
|
|
423
|
-
if (cached !== undefined) {
|
|
424
|
-
const capped = capSymbolReferences(cached);
|
|
425
|
-
return { ok: true, value: capped.value, ...(capped.truncated ? { truncated: true } : {}) };
|
|
426
|
-
}
|
|
427
|
-
const result = await findImplementations(transportFromLspClient(client), file, line, col);
|
|
428
|
-
cache?.set(key, result);
|
|
429
|
-
const capped = capSymbolReferences(result);
|
|
430
|
-
return { ok: true, value: capped.value, ...(capped.truncated ? { truncated: true } : {}) };
|
|
431
|
-
});
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* PUGI-78 Phase 1: symbols.type_definition.
|
|
435
|
-
*
|
|
436
|
-
* Type definition (vs value definition). Useful for "what type is foo?"
|
|
437
|
-
* questions when the model has a variable and wants its type declaration.
|
|
438
|
-
*/
|
|
439
|
-
export async function symbolsTypeDefinitionTool(ctx, lang, file, line, col) {
|
|
440
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_type_definition', `${lang}:${file}:${line}:${col}`);
|
|
441
|
-
return guard(ctx, 'symbols_type_definition', toolCallId, async () => {
|
|
442
|
-
const client = ctx.lspClients?.get(lang);
|
|
443
|
-
if (!client)
|
|
444
|
-
return unavailable(lang);
|
|
445
|
-
const cache = getSymbolCacheFromCtx(ctx);
|
|
446
|
-
const cwd = workspaceForCache(ctx);
|
|
447
|
-
const key = SymbolCache.makeKey(lang, cwd, 'type_definition', { file, line, col });
|
|
448
|
-
const cached = cache?.get(key);
|
|
449
|
-
if (cached !== undefined) {
|
|
450
|
-
if (cached === null)
|
|
451
|
-
return notFound('type_definition');
|
|
452
|
-
return { ok: true, value: cached };
|
|
453
|
-
}
|
|
454
|
-
const result = await findTypeDefinition(transportFromLspClient(client), file, line, col);
|
|
455
|
-
cache?.set(key, result);
|
|
456
|
-
if (!result)
|
|
457
|
-
return notFound('type_definition');
|
|
458
|
-
return { ok: true, value: result };
|
|
459
|
-
});
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* PUGI-78 Phase 1: symbols.code_actions.
|
|
463
|
-
*
|
|
464
|
-
* Quick-fix list at the given range. Server-provided actions include
|
|
465
|
-
* auto-import, unused-import removal, refactor extractions, etc.
|
|
466
|
-
*/
|
|
467
|
-
export async function symbolsCodeActionsTool(ctx, lang, file, startLine, startChar, endLine, endChar) {
|
|
468
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_code_actions', `${lang}:${file}:${startLine}:${startChar}-${endLine}:${endChar}`);
|
|
469
|
-
return guard(ctx, 'symbols_code_actions', toolCallId, async () => {
|
|
470
|
-
const client = ctx.lspClients?.get(lang);
|
|
471
|
-
if (!client)
|
|
472
|
-
return unavailable(lang);
|
|
473
|
-
const result = await codeActionsAt(transportFromLspClient(client), file, startLine, startChar, endLine, endChar);
|
|
474
|
-
return { ok: true, value: result };
|
|
475
|
-
});
|
|
476
|
-
}
|
|
477
|
-
/**
|
|
478
|
-
* PUGI-78 Phase 1: symbols.format.
|
|
479
|
-
*
|
|
480
|
-
* Formatter — returns the text edits the LSP server would apply for
|
|
481
|
-
* `textDocument/formatting`. Phase 1 is read-only (returns the edits);
|
|
482
|
-
* the dispatcher composes + applies in a future ticket.
|
|
483
|
-
*/
|
|
484
|
-
export async function symbolsFormatTool(ctx, lang, file, options) {
|
|
485
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_format', `${lang}:${file}`);
|
|
486
|
-
return guard(ctx, 'symbols_format', toolCallId, async () => {
|
|
487
|
-
const client = ctx.lspClients?.get(lang);
|
|
488
|
-
if (!client)
|
|
489
|
-
return unavailable(lang);
|
|
490
|
-
const result = await formatFile(transportFromLspClient(client), file, options);
|
|
491
|
-
return { ok: true, value: result };
|
|
492
|
-
});
|
|
493
|
-
}
|
|
494
|
-
/**
|
|
495
|
-
* PUGI-78 Phase 1: symbols.diagnostics.
|
|
496
|
-
*
|
|
497
|
-
* Pulls the cached `publishDiagnostics` payload for the file. Mirrors
|
|
498
|
-
* the legacy `lspDiagnostics` tool but exposed via the namespaced
|
|
499
|
-
* `symbols.*` surface for discoverability.
|
|
500
|
-
*/
|
|
501
|
-
export async function symbolsDiagnosticsTool(ctx, lang, file) {
|
|
502
|
-
const toolCallId = recordToolCall(ctx.session, 'symbols_diagnostics', `${lang}:${file}`);
|
|
503
|
-
return guard(ctx, 'symbols_diagnostics', toolCallId, async () => {
|
|
504
|
-
const client = ctx.lspClients?.get(lang);
|
|
505
|
-
if (!client)
|
|
506
|
-
return unavailable(lang);
|
|
507
|
-
const result = await diagnosticsFor(transportFromLspClient(client), file);
|
|
508
|
-
const capped = capDiagnostics(result);
|
|
509
|
-
return { ok: true, value: capped.value, ...(capped.truncated ? { truncated: true } : {}) };
|
|
510
|
-
});
|
|
511
|
-
}
|
|
512
|
-
function workspaceForCache(ctx) {
|
|
513
|
-
// ToolContext exposes `root` (the workspace root). Fall back to a
|
|
514
|
-
// tagged anonymous workspace when somehow absent so the cache still
|
|
515
|
-
// keys deterministically.
|
|
516
|
-
const root = ctx.root;
|
|
517
|
-
if (typeof root === 'string' && root.length > 0)
|
|
518
|
-
return root;
|
|
519
|
-
return '<unknown>';
|
|
520
|
-
}
|
|
521
|
-
function getSymbolCacheFromCtx(ctx) {
|
|
522
|
-
// The agent dispatcher injects an optional cache via the ctx — when
|
|
523
|
-
// present we use the dispatcher-scoped cache so test harnesses can
|
|
524
|
-
// inject a deterministic clock. When absent, we fall back to the
|
|
525
|
-
// process-global cache.
|
|
526
|
-
if (ctx.symbolCache)
|
|
527
|
-
return ctx.symbolCache;
|
|
528
|
-
return getGlobalSymbolCache();
|
|
529
|
-
}
|
|
530
|
-
function notFound(verb) {
|
|
531
|
-
return {
|
|
532
|
-
ok: false,
|
|
533
|
-
reason: 'lsp_not_found',
|
|
534
|
-
detail: `LSP returned no ${verb} for the requested position.`,
|
|
535
|
-
};
|
|
536
|
-
}
|
|
537
|
-
function capSymbolReferences(items) {
|
|
538
|
-
const COUNT_CAP = 200;
|
|
539
|
-
if (items.length === 0)
|
|
540
|
-
return { value: items, truncated: false };
|
|
541
|
-
const trimmed = items.slice(0, COUNT_CAP);
|
|
542
|
-
const serialized = JSON.stringify(trimmed);
|
|
543
|
-
if (Buffer.byteLength(serialized, 'utf8') <= LSP_PAYLOAD_CAP_BYTES && trimmed.length === items.length) {
|
|
544
|
-
return { value: trimmed, truncated: false };
|
|
545
|
-
}
|
|
546
|
-
let upper = trimmed.length;
|
|
547
|
-
while (upper > 1) {
|
|
548
|
-
const half = Math.floor(upper / 2);
|
|
549
|
-
const sub = trimmed.slice(0, half);
|
|
550
|
-
if (Buffer.byteLength(JSON.stringify(sub), 'utf8') <= LSP_PAYLOAD_CAP_BYTES) {
|
|
551
|
-
return { value: sub, truncated: true };
|
|
552
|
-
}
|
|
553
|
-
upper = half;
|
|
554
|
-
}
|
|
555
|
-
return { value: trimmed.slice(0, 1), truncated: true };
|
|
556
|
-
}
|
|
557
|
-
/** Test-only surface so specs can poke truncation directly. */
|
|
558
|
-
export const __test__ = {
|
|
559
|
-
truncate,
|
|
560
|
-
capLocations,
|
|
561
|
-
capDiagnostics,
|
|
562
|
-
capSymbolReferences,
|
|
563
|
-
LSP_PAYLOAD_CAP_BYTES,
|
|
564
|
-
};
|
|
565
|
-
//# sourceMappingURL=lsp-tools.js.map
|