gsd-pi 2.28.0 → 2.29.0-dev.2ccf3fb
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/README.md +34 -4
- package/dist/cli.js +20 -21
- package/dist/extension-discovery.d.ts +16 -0
- package/dist/extension-discovery.js +66 -0
- package/dist/headless-answers.d.ts +51 -0
- package/dist/headless-answers.js +224 -0
- package/dist/headless-context.d.ts +18 -0
- package/dist/headless-context.js +44 -0
- package/dist/headless-events.d.ts +28 -0
- package/dist/headless-events.js +59 -0
- package/dist/headless-query.d.ts +4 -0
- package/dist/headless-query.js +22 -4
- package/dist/headless-ui.d.ts +23 -0
- package/dist/headless-ui.js +103 -0
- package/dist/headless.d.ts +2 -0
- package/dist/headless.js +61 -183
- package/dist/help-text.js +4 -0
- package/dist/loader.js +18 -59
- package/dist/onboarding.js +8 -7
- package/dist/remote-questions-config.js +8 -3
- package/dist/resource-loader.d.ts +1 -6
- package/dist/resource-loader.js +125 -96
- package/dist/resources/extensions/ask-user-questions.ts +3 -2
- package/dist/resources/extensions/bg-shell/bg-shell-command.ts +219 -0
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +400 -0
- package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +985 -0
- package/dist/resources/extensions/bg-shell/index.ts +17 -1561
- package/dist/resources/extensions/bg-shell/overlay.ts +4 -0
- package/dist/resources/extensions/bg-shell/process-manager.ts +13 -0
- package/dist/resources/extensions/bg-shell/utilities.ts +4 -16
- package/dist/resources/extensions/browser-tools/capture.ts +34 -2
- package/dist/resources/extensions/browser-tools/lifecycle.ts +5 -5
- package/dist/resources/extensions/browser-tools/settle.ts +1 -1
- package/dist/resources/extensions/browser-tools/state.ts +5 -5
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +1 -1
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +3 -3
- package/dist/resources/extensions/browser-tools/tools/assertions.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/device.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/extract.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/navigation.ts +6 -6
- package/dist/resources/extensions/browser-tools/tools/network-mock.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/pages.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/screenshot.ts +28 -10
- package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +1 -1
- package/dist/resources/extensions/browser-tools/utils.ts +5 -5
- package/dist/resources/extensions/get-secrets-from-user.ts +1 -1
- package/dist/resources/extensions/google-search/index.ts +21 -8
- package/dist/resources/extensions/gsd/activity-log.ts +2 -1
- package/dist/resources/extensions/gsd/atomic-write.ts +35 -0
- package/dist/resources/extensions/gsd/auto/session.ts +12 -0
- package/dist/resources/extensions/gsd/auto-dashboard.ts +264 -62
- package/dist/resources/extensions/gsd/auto-idempotency.ts +150 -0
- package/dist/resources/extensions/gsd/auto-post-unit.ts +594 -0
- package/dist/resources/extensions/gsd/auto-prompts.ts +116 -22
- package/dist/resources/extensions/gsd/auto-recovery.ts +36 -31
- package/dist/resources/extensions/gsd/auto-start.ts +500 -0
- package/dist/resources/extensions/gsd/auto-stuck-detection.ts +220 -0
- package/dist/resources/extensions/gsd/auto-timers.ts +223 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.ts +3 -1
- package/dist/resources/extensions/gsd/auto-verification.ts +229 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.ts +29 -37
- package/dist/resources/extensions/gsd/auto-worktree.ts +83 -67
- package/dist/resources/extensions/gsd/auto.ts +375 -1890
- package/dist/resources/extensions/gsd/commands-config.ts +102 -0
- package/dist/resources/extensions/gsd/commands-handlers.ts +394 -0
- package/dist/resources/extensions/gsd/commands-inspect.ts +90 -0
- package/dist/resources/extensions/gsd/commands-logs.ts +536 -0
- package/dist/resources/extensions/gsd/commands-maintenance.ts +206 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +790 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
- package/dist/resources/extensions/gsd/commands.ts +417 -1495
- package/dist/resources/extensions/gsd/constants.ts +21 -0
- package/dist/resources/extensions/gsd/context-budget.ts +25 -2
- package/dist/resources/extensions/gsd/crash-recovery.ts +3 -4
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +15 -5
- package/dist/resources/extensions/gsd/db-writer.ts +21 -2
- package/dist/resources/extensions/gsd/detection.ts +469 -0
- package/dist/resources/extensions/gsd/diff-context.ts +2 -1
- package/dist/resources/extensions/gsd/dispatch-guard.ts +4 -0
- package/dist/resources/extensions/gsd/doctor-checks.ts +564 -0
- package/dist/resources/extensions/gsd/doctor-format.ts +78 -0
- package/dist/resources/extensions/gsd/doctor-types.ts +72 -0
- package/dist/resources/extensions/gsd/doctor.ts +64 -701
- package/dist/resources/extensions/gsd/errors.ts +0 -2
- package/dist/resources/extensions/gsd/export-html.ts +367 -11
- package/dist/resources/extensions/gsd/export.ts +31 -5
- package/dist/resources/extensions/gsd/files.ts +8 -126
- package/dist/resources/extensions/gsd/forensics.ts +2 -12
- package/dist/resources/extensions/gsd/git-constants.ts +11 -0
- package/dist/resources/extensions/gsd/git-service.ts +13 -9
- package/dist/resources/extensions/gsd/gsd-db.ts +26 -6
- package/dist/resources/extensions/gsd/guided-flow-queue.ts +451 -0
- package/dist/resources/extensions/gsd/guided-flow.ts +231 -514
- package/dist/resources/extensions/gsd/history.ts +2 -20
- package/dist/resources/extensions/gsd/index.ts +208 -46
- package/dist/resources/extensions/gsd/init-wizard.ts +615 -0
- package/dist/resources/extensions/gsd/json-persistence.ts +67 -0
- package/dist/resources/extensions/gsd/jsonl-utils.ts +21 -0
- package/dist/resources/extensions/gsd/key-manager.ts +995 -0
- package/dist/resources/extensions/gsd/metrics.ts +49 -36
- package/dist/resources/extensions/gsd/migrate/command.ts +1 -1
- package/dist/resources/extensions/gsd/migrate/parsers.ts +10 -95
- package/dist/resources/extensions/gsd/milestone-actions.ts +126 -0
- package/dist/resources/extensions/gsd/milestone-ids.ts +95 -0
- package/dist/resources/extensions/gsd/native-git-bridge.ts +5 -10
- package/dist/resources/extensions/gsd/parallel-eligibility.ts +3 -3
- package/dist/resources/extensions/gsd/paths.ts +1 -11
- package/dist/resources/extensions/gsd/plugin-importer.ts +3 -2
- package/dist/resources/extensions/gsd/preferences-models.ts +323 -0
- package/dist/resources/extensions/gsd/preferences-skills.ts +169 -0
- package/dist/resources/extensions/gsd/preferences-types.ts +223 -0
- package/dist/resources/extensions/gsd/preferences-validation.ts +597 -0
- package/dist/resources/extensions/gsd/preferences.ts +219 -1305
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +213 -0
- package/dist/resources/extensions/gsd/prompt-compressor.ts +508 -0
- package/dist/resources/extensions/gsd/prompt-loader.ts +4 -2
- package/dist/resources/extensions/gsd/prompt-ordering.ts +200 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +2 -4
- package/dist/resources/extensions/gsd/prompts/discuss.md +13 -5
- package/dist/resources/extensions/gsd/prompts/execute-task.md +0 -1
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +0 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -1
- package/dist/resources/extensions/gsd/prompts/queue.md +30 -0
- package/dist/resources/extensions/gsd/prompts/quick-task.md +0 -6
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +0 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +0 -1
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +28 -0
- package/dist/resources/extensions/gsd/provider-error-pause.ts +59 -10
- package/dist/resources/extensions/gsd/queue-order.ts +11 -12
- package/dist/resources/extensions/gsd/queue-reorder-ui.ts +15 -2
- package/dist/resources/extensions/gsd/quick.ts +18 -15
- package/dist/resources/extensions/gsd/reports.ts +1 -7
- package/dist/resources/extensions/gsd/routing-history.ts +13 -17
- package/dist/resources/extensions/gsd/safe-fs.ts +47 -0
- package/dist/resources/extensions/gsd/semantic-chunker.ts +336 -0
- package/dist/resources/extensions/gsd/session-forensics.ts +8 -23
- package/dist/resources/extensions/gsd/session-lock.ts +284 -0
- package/dist/resources/extensions/gsd/session-status-io.ts +23 -41
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +38 -1
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +35 -6
- package/dist/resources/extensions/gsd/state.ts +54 -2
- package/dist/resources/extensions/gsd/structured-data-formatter.ts +144 -0
- package/dist/resources/extensions/gsd/summary-distiller.ts +258 -0
- package/dist/resources/extensions/gsd/tests/activity-log.test.ts +213 -0
- package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +107 -0
- package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +197 -0
- package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +33 -39
- package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +108 -2
- package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +257 -0
- package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
- package/dist/resources/extensions/gsd/tests/context-budget.test.ts +69 -0
- package/dist/resources/extensions/gsd/tests/detection.test.ts +398 -0
- package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +12 -24
- package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +118 -94
- package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +126 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +7 -3
- package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +75 -0
- package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +17 -55
- package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +375 -0
- package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +144 -0
- package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +340 -0
- package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +24 -82
- package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +197 -0
- package/dist/resources/extensions/gsd/tests/key-manager.test.ts +414 -0
- package/dist/resources/extensions/gsd/tests/metrics.test.ts +173 -305
- package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +59 -1
- package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +18 -61
- package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +17 -8
- package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +276 -0
- package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +401 -0
- package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +23 -47
- package/dist/resources/extensions/gsd/tests/preferences.test.ts +284 -0
- package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +314 -0
- package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +529 -0
- package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +296 -0
- package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +338 -0
- package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +154 -0
- package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/remote-status.test.ts +2 -2
- package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +43 -60
- package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +426 -0
- package/dist/resources/extensions/gsd/tests/session-lock.test.ts +315 -0
- package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +8 -5
- package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +365 -0
- package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +323 -0
- package/dist/resources/extensions/gsd/tests/token-counter.test.ts +129 -0
- package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +1272 -0
- package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +164 -0
- package/dist/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
- package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +69 -73
- package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +222 -0
- package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +55 -0
- package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +26 -24
- package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +251 -8
- package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +2 -2
- package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +2 -1
- package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
- package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +24 -61
- package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +5 -2
- package/dist/resources/extensions/gsd/tests/write-gate.test.ts +132 -43
- package/dist/resources/extensions/gsd/token-counter.ts +20 -0
- package/dist/resources/extensions/gsd/triage-ui.ts +1 -1
- package/dist/resources/extensions/gsd/types.ts +5 -1
- package/dist/resources/extensions/gsd/unit-runtime.ts +16 -13
- package/dist/resources/extensions/gsd/validate-directory.ts +164 -0
- package/dist/resources/extensions/gsd/verification-evidence.ts +9 -4
- package/dist/resources/extensions/gsd/verification-gate.ts +83 -7
- package/dist/resources/extensions/gsd/visualizer-data.ts +1 -1
- package/dist/resources/extensions/gsd/visualizer-overlay.ts +5 -2
- package/dist/resources/extensions/gsd/visualizer-views.ts +2 -3
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +85 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +69 -0
- package/dist/resources/extensions/gsd/workflow-templates.ts +241 -0
- package/dist/resources/extensions/gsd/worktree-command.ts +4 -51
- package/dist/resources/extensions/gsd/worktree-manager.ts +7 -9
- package/dist/resources/extensions/gsd/worktree.ts +41 -1
- package/dist/resources/extensions/mcp-client/index.ts +459 -0
- package/dist/resources/extensions/remote-questions/discord-adapter.ts +9 -20
- package/dist/resources/extensions/remote-questions/http-client.ts +76 -0
- package/dist/resources/extensions/remote-questions/manager.ts +6 -24
- package/dist/resources/extensions/remote-questions/mod.ts +16 -0
- package/dist/resources/extensions/remote-questions/notify.ts +90 -0
- package/dist/resources/extensions/remote-questions/remote-command.ts +1 -1
- package/dist/resources/extensions/remote-questions/slack-adapter.ts +11 -18
- package/dist/resources/extensions/remote-questions/store.ts +5 -1
- package/dist/resources/extensions/remote-questions/telegram-adapter.ts +8 -20
- package/dist/resources/extensions/remote-questions/types.ts +29 -3
- package/dist/resources/extensions/search-the-web/native-search.ts +7 -0
- package/dist/resources/extensions/search-the-web/provider.ts +15 -3
- package/dist/resources/extensions/search-the-web/tool-llm-context.ts +1 -13
- package/dist/resources/extensions/search-the-web/tool-search.ts +1 -13
- package/dist/resources/extensions/shared/format-utils.ts +53 -0
- package/dist/resources/extensions/shared/frontmatter.ts +117 -0
- package/dist/resources/extensions/shared/mod.ts +33 -0
- package/dist/resources/extensions/shared/sanitize.ts +19 -0
- package/dist/resources/extensions/slash-commands/create-extension.ts +1 -1
- package/dist/resources/extensions/slash-commands/create-slash-command.ts +1 -1
- package/dist/resources/extensions/subagent/index.ts +1 -2
- package/dist/resources/extensions/ttsr/index.ts +5 -0
- package/dist/resources/extensions/ttsr/rule-loader.ts +4 -51
- package/dist/resources/extensions/universal-config/discovery.ts +37 -15
- package/dist/resources/extensions/voice/index.ts +1 -1
- package/dist/resources/skills/accessibility/SKILL.md +522 -0
- package/dist/resources/skills/accessibility/references/WCAG.md +162 -0
- package/dist/resources/skills/agent-browser/SKILL.md +517 -0
- package/dist/resources/skills/agent-browser/references/authentication.md +202 -0
- package/dist/resources/skills/agent-browser/references/commands.md +263 -0
- package/dist/resources/skills/agent-browser/references/profiling.md +120 -0
- package/dist/resources/skills/agent-browser/references/proxy-support.md +194 -0
- package/dist/resources/skills/agent-browser/references/session-management.md +193 -0
- package/dist/resources/skills/agent-browser/references/snapshot-refs.md +194 -0
- package/dist/resources/skills/agent-browser/references/video-recording.md +173 -0
- package/dist/resources/skills/agent-browser/templates/authenticated-session.sh +105 -0
- package/dist/resources/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/dist/resources/skills/agent-browser/templates/form-automation.sh +62 -0
- package/dist/resources/skills/best-practices/SKILL.md +583 -0
- package/dist/resources/skills/code-optimizer/SKILL.md +160 -0
- package/dist/resources/skills/code-optimizer/references/algorithmic-complexity.md +66 -0
- package/dist/resources/skills/code-optimizer/references/build-compilation.md +90 -0
- package/dist/resources/skills/code-optimizer/references/bundle-dependencies.md +82 -0
- package/dist/resources/skills/code-optimizer/references/caching-memoization.md +76 -0
- package/dist/resources/skills/code-optimizer/references/concurrency-async.md +80 -0
- package/dist/resources/skills/code-optimizer/references/config-infra.md +71 -0
- package/dist/resources/skills/code-optimizer/references/data-structures.md +80 -0
- package/dist/resources/skills/code-optimizer/references/database-queries.md +76 -0
- package/dist/resources/skills/code-optimizer/references/dead-code-redundancy.md +84 -0
- package/dist/resources/skills/code-optimizer/references/error-resilience.md +80 -0
- package/dist/resources/skills/code-optimizer/references/io-network.md +89 -0
- package/dist/resources/skills/code-optimizer/references/logging-observability.md +64 -0
- package/dist/resources/skills/code-optimizer/references/memory-resources.md +66 -0
- package/dist/resources/skills/code-optimizer/references/rendering-ui.md +90 -0
- package/dist/resources/skills/code-optimizer/references/security-performance.md +68 -0
- package/dist/resources/skills/core-web-vitals/SKILL.md +441 -0
- package/dist/resources/skills/core-web-vitals/references/LCP.md +208 -0
- package/dist/resources/skills/create-gsd-extension/SKILL.md +87 -0
- package/dist/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
- package/dist/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
- package/dist/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
- package/dist/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
- package/dist/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
- package/dist/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
- package/dist/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
- package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
- package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
- package/dist/resources/skills/create-gsd-extension/references/state-management.md +70 -0
- package/dist/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
- package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
- package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
- package/dist/resources/skills/create-skill/SKILL.md +184 -0
- package/dist/resources/skills/create-skill/references/api-security.md +226 -0
- package/dist/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
- package/dist/resources/skills/create-skill/references/common-patterns.md +595 -0
- package/dist/resources/skills/create-skill/references/core-principles.md +437 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +175 -0
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
- package/dist/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
- package/dist/resources/skills/create-skill/references/recommended-structure.md +168 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +372 -0
- package/dist/resources/skills/create-skill/references/use-xml-tags.md +466 -0
- package/dist/resources/skills/create-skill/references/using-scripts.md +113 -0
- package/dist/resources/skills/create-skill/references/using-templates.md +112 -0
- package/dist/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
- package/dist/resources/skills/create-skill/templates/router-skill.md +73 -0
- package/dist/resources/skills/create-skill/templates/simple-skill.md +33 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +96 -0
- package/dist/resources/skills/create-skill/workflows/add-script.md +93 -0
- package/dist/resources/skills/create-skill/workflows/add-template.md +74 -0
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +120 -0
- package/dist/resources/skills/create-skill/workflows/audit-skill.md +148 -0
- package/dist/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
- package/dist/resources/skills/create-skill/workflows/get-guidance.md +121 -0
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +204 -0
- package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +122 -0
- package/dist/resources/skills/make-interfaces-feel-better/animations.md +379 -0
- package/dist/resources/skills/make-interfaces-feel-better/performance.md +88 -0
- package/dist/resources/skills/make-interfaces-feel-better/surfaces.md +247 -0
- package/dist/resources/skills/make-interfaces-feel-better/typography.md +123 -0
- package/dist/resources/skills/react-best-practices/README.md +123 -0
- package/dist/resources/skills/react-best-practices/SKILL.md +136 -0
- package/dist/resources/skills/react-best-practices/metadata.json +15 -0
- package/dist/resources/skills/react-best-practices/rules/_sections.md +46 -0
- package/dist/resources/skills/react-best-practices/rules/_template.md +28 -0
- package/dist/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/resources/skills/react-best-practices/rules/advanced-init-once.md +42 -0
- package/dist/resources/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/dist/resources/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/resources/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/resources/skills/react-best-practices/rules/async-dependencies.md +51 -0
- package/dist/resources/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/resources/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/resources/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/resources/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/resources/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/resources/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/resources/skills/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/dist/resources/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/resources/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/resources/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/resources/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/resources/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/resources/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/resources/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/resources/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/resources/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/resources/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/dist/resources/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/resources/skills/react-best-practices/rules/server-auth-actions.md +96 -0
- package/dist/resources/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/resources/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/resources/skills/react-best-practices/rules/server-dedup-props.md +65 -0
- package/dist/resources/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/resources/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/resources/skills/userinterface-wiki/SKILL.md +253 -0
- package/dist/resources/skills/userinterface-wiki/rules/_sections.md +66 -0
- package/dist/resources/skills/userinterface-wiki/rules/_template.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
- package/dist/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
- package/dist/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
- package/dist/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
- package/dist/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
- package/dist/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
- package/dist/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
- package/dist/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
- package/dist/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
- package/dist/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
- package/dist/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
- package/dist/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
- package/dist/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
- package/dist/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
- package/dist/resources/skills/web-design-guidelines/SKILL.md +39 -0
- package/dist/resources/skills/web-quality-audit/SKILL.md +170 -0
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +91 -0
- package/package.json +22 -8
- package/packages/native/dist/native.d.ts +2 -0
- package/packages/native/dist/native.js +19 -5
- package/packages/native/package.json +28 -0
- package/packages/native/src/native.ts +23 -9
- package/packages/pi-agent-core/package.json +6 -0
- package/packages/pi-ai/dist/models.generated.d.ts +43 -11
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +34 -26
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +3 -2
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +14 -4
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/oauth.d.ts +1 -0
- package/packages/pi-ai/oauth.js +1 -0
- package/packages/pi-ai/package.json +2 -2
- package/packages/pi-ai/src/models.generated.ts +42 -34
- package/packages/pi-ai/src/providers/anthropic.ts +3 -2
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +15 -4
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +2 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js +2 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +3 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.js +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/constants.d.ts +29 -0
- package/packages/pi-coding-agent/dist/core/constants.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/constants.js +44 -0
- package/packages/pi-coding-agent/dist/core/constants.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +14 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +30 -4
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +13 -5
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +14 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js +12 -4
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +49 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +25 -2
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +22 -5
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +10 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.js +2 -2
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +2 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-edit.js +4 -4
- package/packages/pi-coding-agent/dist/core/tools/hashline-edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline.js +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline.test.js +8 -8
- package/packages/pi-coding-agent/dist/core/tools/hashline.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/path-utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.js +1 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/truncate.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/truncate.js +2 -1
- package/packages/pi-coding-agent/dist/core/tools/truncate.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts +9 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +47 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +4 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +12 -2
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/pipeline.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/pipeline.js +25 -3
- package/packages/pi-coding-agent/dist/resources/extensions/memory/pipeline.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -5
- package/packages/pi-coding-agent/scripts/copy-assets.cjs +39 -8
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.ts +2 -1
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -2
- package/packages/pi-coding-agent/src/core/compaction/utils.ts +2 -2
- package/packages/pi-coding-agent/src/core/constants.ts +59 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +14 -1
- package/packages/pi-coding-agent/src/core/lsp/index.ts +31 -5
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +13 -5
- package/packages/pi-coding-agent/src/core/model-resolver.ts +14 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +58 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.ts +14 -4
- package/packages/pi-coding-agent/src/core/session-manager.ts +29 -6
- package/packages/pi-coding-agent/src/core/settings-manager.ts +33 -5
- package/packages/pi-coding-agent/src/core/system-prompt.ts +11 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.ts +2 -2
- package/packages/pi-coding-agent/src/core/tools/find.ts +2 -1
- package/packages/pi-coding-agent/src/core/tools/hashline-edit.ts +4 -4
- package/packages/pi-coding-agent/src/core/tools/hashline.test.ts +8 -8
- package/packages/pi-coding-agent/src/core/tools/hashline.ts +1 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +1 -1
- package/packages/pi-coding-agent/src/core/tools/path-utils.ts +1 -1
- package/packages/pi-coding-agent/src/core/tools/truncate.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +49 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/index.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +26 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +11 -2
- package/packages/pi-coding-agent/src/resources/extensions/memory/pipeline.ts +23 -3
- package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +149 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.js +94 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.js.map +1 -0
- package/packages/pi-tui/dist/autocomplete.d.ts +8 -1
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +20 -2
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/package.json +8 -2
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +186 -0
- package/packages/pi-tui/src/__tests__/fuzzy.test.ts +112 -0
- package/packages/pi-tui/src/autocomplete.ts +26 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +3 -2
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +219 -0
- package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +400 -0
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +985 -0
- package/src/resources/extensions/bg-shell/index.ts +17 -1561
- package/src/resources/extensions/bg-shell/overlay.ts +4 -0
- package/src/resources/extensions/bg-shell/process-manager.ts +13 -0
- package/src/resources/extensions/bg-shell/utilities.ts +4 -16
- package/src/resources/extensions/browser-tools/capture.ts +34 -2
- package/src/resources/extensions/browser-tools/lifecycle.ts +5 -5
- package/src/resources/extensions/browser-tools/settle.ts +1 -1
- package/src/resources/extensions/browser-tools/state.ts +5 -5
- package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +1 -1
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +3 -3
- package/src/resources/extensions/browser-tools/tools/assertions.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/device.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/extract.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/navigation.ts +6 -6
- package/src/resources/extensions/browser-tools/tools/network-mock.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/pages.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +28 -10
- package/src/resources/extensions/browser-tools/tools/state-persistence.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/visual-diff.ts +1 -1
- package/src/resources/extensions/browser-tools/utils.ts +5 -5
- package/src/resources/extensions/get-secrets-from-user.ts +1 -1
- package/src/resources/extensions/google-search/index.ts +21 -8
- package/src/resources/extensions/gsd/activity-log.ts +2 -1
- package/src/resources/extensions/gsd/atomic-write.ts +35 -0
- package/src/resources/extensions/gsd/auto/session.ts +12 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +264 -62
- package/src/resources/extensions/gsd/auto-idempotency.ts +150 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +594 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +116 -22
- package/src/resources/extensions/gsd/auto-recovery.ts +36 -31
- package/src/resources/extensions/gsd/auto-start.ts +500 -0
- package/src/resources/extensions/gsd/auto-stuck-detection.ts +220 -0
- package/src/resources/extensions/gsd/auto-timers.ts +223 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +3 -1
- package/src/resources/extensions/gsd/auto-verification.ts +229 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +29 -37
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -67
- package/src/resources/extensions/gsd/auto.ts +375 -1890
- package/src/resources/extensions/gsd/commands-config.ts +102 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +394 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +90 -0
- package/src/resources/extensions/gsd/commands-logs.ts +536 -0
- package/src/resources/extensions/gsd/commands-maintenance.ts +206 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +790 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
- package/src/resources/extensions/gsd/commands.ts +417 -1495
- package/src/resources/extensions/gsd/constants.ts +21 -0
- package/src/resources/extensions/gsd/context-budget.ts +25 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +3 -4
- package/src/resources/extensions/gsd/dashboard-overlay.ts +15 -5
- package/src/resources/extensions/gsd/db-writer.ts +21 -2
- package/src/resources/extensions/gsd/detection.ts +469 -0
- package/src/resources/extensions/gsd/diff-context.ts +2 -1
- package/src/resources/extensions/gsd/dispatch-guard.ts +4 -0
- package/src/resources/extensions/gsd/doctor-checks.ts +564 -0
- package/src/resources/extensions/gsd/doctor-format.ts +78 -0
- package/src/resources/extensions/gsd/doctor-types.ts +72 -0
- package/src/resources/extensions/gsd/doctor.ts +64 -701
- package/src/resources/extensions/gsd/errors.ts +0 -2
- package/src/resources/extensions/gsd/export-html.ts +367 -11
- package/src/resources/extensions/gsd/export.ts +31 -5
- package/src/resources/extensions/gsd/files.ts +8 -126
- package/src/resources/extensions/gsd/forensics.ts +2 -12
- package/src/resources/extensions/gsd/git-constants.ts +11 -0
- package/src/resources/extensions/gsd/git-service.ts +13 -9
- package/src/resources/extensions/gsd/gsd-db.ts +26 -6
- package/src/resources/extensions/gsd/guided-flow-queue.ts +451 -0
- package/src/resources/extensions/gsd/guided-flow.ts +231 -514
- package/src/resources/extensions/gsd/history.ts +2 -20
- package/src/resources/extensions/gsd/index.ts +208 -46
- package/src/resources/extensions/gsd/init-wizard.ts +615 -0
- package/src/resources/extensions/gsd/json-persistence.ts +67 -0
- package/src/resources/extensions/gsd/jsonl-utils.ts +21 -0
- package/src/resources/extensions/gsd/key-manager.ts +995 -0
- package/src/resources/extensions/gsd/metrics.ts +49 -36
- package/src/resources/extensions/gsd/migrate/command.ts +1 -1
- package/src/resources/extensions/gsd/migrate/parsers.ts +10 -95
- package/src/resources/extensions/gsd/milestone-actions.ts +126 -0
- package/src/resources/extensions/gsd/milestone-ids.ts +95 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +5 -10
- package/src/resources/extensions/gsd/parallel-eligibility.ts +3 -3
- package/src/resources/extensions/gsd/paths.ts +1 -11
- package/src/resources/extensions/gsd/plugin-importer.ts +3 -2
- package/src/resources/extensions/gsd/preferences-models.ts +323 -0
- package/src/resources/extensions/gsd/preferences-skills.ts +169 -0
- package/src/resources/extensions/gsd/preferences-types.ts +223 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +597 -0
- package/src/resources/extensions/gsd/preferences.ts +219 -1305
- package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +213 -0
- package/src/resources/extensions/gsd/prompt-compressor.ts +508 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +4 -2
- package/src/resources/extensions/gsd/prompt-ordering.ts +200 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +2 -4
- package/src/resources/extensions/gsd/prompts/discuss.md +13 -5
- package/src/resources/extensions/gsd/prompts/execute-task.md +0 -1
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +0 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -1
- package/src/resources/extensions/gsd/prompts/queue.md +30 -0
- package/src/resources/extensions/gsd/prompts/quick-task.md +0 -6
- package/src/resources/extensions/gsd/prompts/replan-slice.md +0 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +0 -1
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +28 -0
- package/src/resources/extensions/gsd/provider-error-pause.ts +59 -10
- package/src/resources/extensions/gsd/queue-order.ts +11 -12
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +15 -2
- package/src/resources/extensions/gsd/quick.ts +18 -15
- package/src/resources/extensions/gsd/reports.ts +1 -7
- package/src/resources/extensions/gsd/routing-history.ts +13 -17
- package/src/resources/extensions/gsd/safe-fs.ts +47 -0
- package/src/resources/extensions/gsd/semantic-chunker.ts +336 -0
- package/src/resources/extensions/gsd/session-forensics.ts +8 -23
- package/src/resources/extensions/gsd/session-lock.ts +284 -0
- package/src/resources/extensions/gsd/session-status-io.ts +23 -41
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +38 -1
- package/src/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +35 -6
- package/src/resources/extensions/gsd/state.ts +54 -2
- package/src/resources/extensions/gsd/structured-data-formatter.ts +144 -0
- package/src/resources/extensions/gsd/summary-distiller.ts +258 -0
- package/src/resources/extensions/gsd/tests/activity-log.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +197 -0
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +33 -39
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +108 -2
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +257 -0
- package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/detection.test.ts +398 -0
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +12 -24
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +118 -94
- package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +126 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -3
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +17 -55
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +375 -0
- package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +340 -0
- package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +24 -82
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +197 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +414 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +173 -305
- package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +59 -1
- package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +18 -61
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +17 -8
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +276 -0
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +401 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +23 -47
- package/src/resources/extensions/gsd/tests/preferences.test.ts +284 -0
- package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +314 -0
- package/src/resources/extensions/gsd/tests/prompt-compressor.test.ts +529 -0
- package/src/resources/extensions/gsd/tests/prompt-ordering.test.ts +296 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +338 -0
- package/src/resources/extensions/gsd/tests/reassess-detection.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/remote-status.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +43 -60
- package/src/resources/extensions/gsd/tests/semantic-chunker.test.ts +426 -0
- package/src/resources/extensions/gsd/tests/session-lock.test.ts +315 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +8 -5
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +365 -0
- package/src/resources/extensions/gsd/tests/summary-distiller.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/token-counter.test.ts +129 -0
- package/src/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +1272 -0
- package/src/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +69 -73
- package/src/resources/extensions/gsd/tests/validate-directory.test.ts +222 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +26 -24
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +251 -8
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/workspace-index.test.ts +24 -61
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +132 -43
- package/src/resources/extensions/gsd/token-counter.ts +20 -0
- package/src/resources/extensions/gsd/triage-ui.ts +1 -1
- package/src/resources/extensions/gsd/types.ts +5 -1
- package/src/resources/extensions/gsd/unit-runtime.ts +16 -13
- package/src/resources/extensions/gsd/validate-directory.ts +164 -0
- package/src/resources/extensions/gsd/verification-evidence.ts +9 -4
- package/src/resources/extensions/gsd/verification-gate.ts +83 -7
- package/src/resources/extensions/gsd/visualizer-data.ts +1 -1
- package/src/resources/extensions/gsd/visualizer-overlay.ts +5 -2
- package/src/resources/extensions/gsd/visualizer-views.ts +2 -3
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +85 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +69 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +241 -0
- package/src/resources/extensions/gsd/worktree-command.ts +4 -51
- package/src/resources/extensions/gsd/worktree-manager.ts +7 -9
- package/src/resources/extensions/gsd/worktree.ts +41 -1
- package/src/resources/extensions/mcp-client/index.ts +459 -0
- package/src/resources/extensions/remote-questions/discord-adapter.ts +9 -20
- package/src/resources/extensions/remote-questions/http-client.ts +76 -0
- package/src/resources/extensions/remote-questions/manager.ts +6 -24
- package/src/resources/extensions/remote-questions/mod.ts +16 -0
- package/src/resources/extensions/remote-questions/notify.ts +90 -0
- package/src/resources/extensions/remote-questions/remote-command.ts +1 -1
- package/src/resources/extensions/remote-questions/slack-adapter.ts +11 -18
- package/src/resources/extensions/remote-questions/store.ts +5 -1
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +8 -20
- package/src/resources/extensions/remote-questions/types.ts +29 -3
- package/src/resources/extensions/search-the-web/native-search.ts +7 -0
- package/src/resources/extensions/search-the-web/provider.ts +15 -3
- package/src/resources/extensions/search-the-web/tool-llm-context.ts +1 -13
- package/src/resources/extensions/search-the-web/tool-search.ts +1 -13
- package/src/resources/extensions/shared/format-utils.ts +53 -0
- package/src/resources/extensions/shared/frontmatter.ts +117 -0
- package/src/resources/extensions/shared/mod.ts +33 -0
- package/src/resources/extensions/shared/sanitize.ts +19 -0
- package/src/resources/extensions/slash-commands/create-extension.ts +1 -1
- package/src/resources/extensions/slash-commands/create-slash-command.ts +1 -1
- package/src/resources/extensions/subagent/index.ts +1 -2
- package/src/resources/extensions/ttsr/index.ts +5 -0
- package/src/resources/extensions/ttsr/rule-loader.ts +4 -51
- package/src/resources/extensions/universal-config/discovery.ts +37 -15
- package/src/resources/extensions/voice/index.ts +1 -1
- package/src/resources/skills/accessibility/SKILL.md +522 -0
- package/src/resources/skills/accessibility/references/WCAG.md +162 -0
- package/src/resources/skills/agent-browser/SKILL.md +517 -0
- package/src/resources/skills/agent-browser/references/authentication.md +202 -0
- package/src/resources/skills/agent-browser/references/commands.md +263 -0
- package/src/resources/skills/agent-browser/references/profiling.md +120 -0
- package/src/resources/skills/agent-browser/references/proxy-support.md +194 -0
- package/src/resources/skills/agent-browser/references/session-management.md +193 -0
- package/src/resources/skills/agent-browser/references/snapshot-refs.md +194 -0
- package/src/resources/skills/agent-browser/references/video-recording.md +173 -0
- package/src/resources/skills/agent-browser/templates/authenticated-session.sh +105 -0
- package/src/resources/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/src/resources/skills/agent-browser/templates/form-automation.sh +62 -0
- package/src/resources/skills/best-practices/SKILL.md +583 -0
- package/src/resources/skills/code-optimizer/SKILL.md +160 -0
- package/src/resources/skills/code-optimizer/references/algorithmic-complexity.md +66 -0
- package/src/resources/skills/code-optimizer/references/build-compilation.md +90 -0
- package/src/resources/skills/code-optimizer/references/bundle-dependencies.md +82 -0
- package/src/resources/skills/code-optimizer/references/caching-memoization.md +76 -0
- package/src/resources/skills/code-optimizer/references/concurrency-async.md +80 -0
- package/src/resources/skills/code-optimizer/references/config-infra.md +71 -0
- package/src/resources/skills/code-optimizer/references/data-structures.md +80 -0
- package/src/resources/skills/code-optimizer/references/database-queries.md +76 -0
- package/src/resources/skills/code-optimizer/references/dead-code-redundancy.md +84 -0
- package/src/resources/skills/code-optimizer/references/error-resilience.md +80 -0
- package/src/resources/skills/code-optimizer/references/io-network.md +89 -0
- package/src/resources/skills/code-optimizer/references/logging-observability.md +64 -0
- package/src/resources/skills/code-optimizer/references/memory-resources.md +66 -0
- package/src/resources/skills/code-optimizer/references/rendering-ui.md +90 -0
- package/src/resources/skills/code-optimizer/references/security-performance.md +68 -0
- package/src/resources/skills/core-web-vitals/SKILL.md +441 -0
- package/src/resources/skills/core-web-vitals/references/LCP.md +208 -0
- package/src/resources/skills/create-gsd-extension/SKILL.md +87 -0
- package/src/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
- package/src/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
- package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
- package/src/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
- package/src/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
- package/src/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
- package/src/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
- package/src/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
- package/src/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
- package/src/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
- package/src/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
- package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
- package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
- package/src/resources/skills/create-gsd-extension/references/state-management.md +70 -0
- package/src/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
- package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
- package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
- package/src/resources/skills/create-skill/SKILL.md +184 -0
- package/src/resources/skills/create-skill/references/api-security.md +226 -0
- package/src/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
- package/src/resources/skills/create-skill/references/common-patterns.md +595 -0
- package/src/resources/skills/create-skill/references/core-principles.md +437 -0
- package/src/resources/skills/create-skill/references/executable-code.md +175 -0
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
- package/src/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
- package/src/resources/skills/create-skill/references/recommended-structure.md +168 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +372 -0
- package/src/resources/skills/create-skill/references/use-xml-tags.md +466 -0
- package/src/resources/skills/create-skill/references/using-scripts.md +113 -0
- package/src/resources/skills/create-skill/references/using-templates.md +112 -0
- package/src/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
- package/src/resources/skills/create-skill/templates/router-skill.md +73 -0
- package/src/resources/skills/create-skill/templates/simple-skill.md +33 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +96 -0
- package/src/resources/skills/create-skill/workflows/add-script.md +93 -0
- package/src/resources/skills/create-skill/workflows/add-template.md +74 -0
- package/src/resources/skills/create-skill/workflows/add-workflow.md +120 -0
- package/src/resources/skills/create-skill/workflows/audit-skill.md +148 -0
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
- package/src/resources/skills/create-skill/workflows/get-guidance.md +121 -0
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
- package/src/resources/skills/create-skill/workflows/verify-skill.md +204 -0
- package/src/resources/skills/make-interfaces-feel-better/SKILL.md +122 -0
- package/src/resources/skills/make-interfaces-feel-better/animations.md +379 -0
- package/src/resources/skills/make-interfaces-feel-better/performance.md +88 -0
- package/src/resources/skills/make-interfaces-feel-better/surfaces.md +247 -0
- package/src/resources/skills/make-interfaces-feel-better/typography.md +123 -0
- package/src/resources/skills/react-best-practices/README.md +123 -0
- package/src/resources/skills/react-best-practices/SKILL.md +136 -0
- package/src/resources/skills/react-best-practices/metadata.json +15 -0
- package/src/resources/skills/react-best-practices/rules/_sections.md +46 -0
- package/src/resources/skills/react-best-practices/rules/_template.md +28 -0
- package/src/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/src/resources/skills/react-best-practices/rules/advanced-init-once.md +42 -0
- package/src/resources/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/src/resources/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/src/resources/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/src/resources/skills/react-best-practices/rules/async-dependencies.md +51 -0
- package/src/resources/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/src/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/src/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/src/resources/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/src/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/src/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/src/resources/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/src/resources/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/src/resources/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/src/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/src/resources/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/src/resources/skills/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/src/resources/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/src/resources/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/src/resources/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/src/resources/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/src/resources/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/src/resources/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/src/resources/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/src/resources/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/src/resources/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/src/resources/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/src/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/src/resources/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/src/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/src/resources/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/src/resources/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/src/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/src/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/src/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/src/resources/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/src/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/src/resources/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/src/resources/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/src/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/src/resources/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/src/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/src/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/src/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/src/resources/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/src/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/src/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/src/resources/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/src/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/src/resources/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/src/resources/skills/react-best-practices/rules/server-auth-actions.md +96 -0
- package/src/resources/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/src/resources/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/src/resources/skills/react-best-practices/rules/server-dedup-props.md +65 -0
- package/src/resources/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/src/resources/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/src/resources/skills/userinterface-wiki/SKILL.md +253 -0
- package/src/resources/skills/userinterface-wiki/rules/_sections.md +66 -0
- package/src/resources/skills/userinterface-wiki/rules/_template.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
- package/src/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
- package/src/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
- package/src/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
- package/src/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
- package/src/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
- package/src/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
- package/src/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
- package/src/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
- package/src/resources/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
- package/src/resources/skills/web-design-guidelines/SKILL.md +39 -0
- package/src/resources/skills/web-quality-audit/SKILL.md +170 -0
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +91 -0
- package/dist/resources/extensions/gsd/complexity.ts +0 -237
- package/dist/resources/extensions/gsd/github-client.ts +0 -235
- package/dist/resources/extensions/gsd/tests/activity-log-prune.test.ts +0 -297
- package/dist/resources/extensions/gsd/tests/activity-log-save.test.ts +0 -127
- package/dist/resources/extensions/gsd/tests/agent-end-provider-error.test.ts +0 -110
- package/dist/resources/extensions/gsd/tests/auto-draft-pause.test.ts +0 -115
- package/dist/resources/extensions/gsd/tests/complexity-routing.test.ts +0 -294
- package/dist/resources/extensions/gsd/tests/metrics-io.test.ts +0 -176
- package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +0 -104
- package/dist/resources/extensions/gsd/tests/preferences-git.test.ts +0 -120
- package/dist/resources/extensions/gsd/tests/preferences-hooks.test.ts +0 -226
- package/dist/resources/extensions/gsd/tests/preferences-mode.test.ts +0 -110
- package/dist/resources/extensions/gsd/tests/preferences-models.test.ts +0 -207
- package/dist/resources/extensions/gsd/tests/preferences-schema-validation.test.ts +0 -183
- package/dist/resources/extensions/gsd/tests/preferences-wizard-fields.test.ts +0 -168
- package/dist/resources/extensions/mcporter/index.ts +0 -512
- package/dist/resources/extensions/shared/progress-widget.ts +0 -282
- package/dist/resources/extensions/shared/thinking-widget.ts +0 -107
- package/src/resources/extensions/gsd/complexity.ts +0 -237
- package/src/resources/extensions/gsd/github-client.ts +0 -235
- package/src/resources/extensions/gsd/tests/activity-log-prune.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/activity-log-save.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/agent-end-provider-error.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/auto-draft-pause.test.ts +0 -115
- package/src/resources/extensions/gsd/tests/complexity-routing.test.ts +0 -294
- package/src/resources/extensions/gsd/tests/metrics-io.test.ts +0 -176
- package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +0 -104
- package/src/resources/extensions/gsd/tests/preferences-git.test.ts +0 -120
- package/src/resources/extensions/gsd/tests/preferences-hooks.test.ts +0 -226
- package/src/resources/extensions/gsd/tests/preferences-mode.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/preferences-models.test.ts +0 -207
- package/src/resources/extensions/gsd/tests/preferences-schema-validation.test.ts +0 -183
- package/src/resources/extensions/gsd/tests/preferences-wizard-fields.test.ts +0 -168
- package/src/resources/extensions/mcporter/index.ts +0 -512
- package/src/resources/extensions/shared/progress-widget.ts +0 -282
- package/src/resources/extensions/shared/thinking-widget.ts +0 -107
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension loader - loads TypeScript extension modules using jiti.\n *\n * Uses @mariozechner/jiti fork with virtualModules support for compiled Bun binaries.\n */\n\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createJiti } from \"@mariozechner/jiti\";\nimport * as _bundledPiAgentCore from \"@gsd/pi-agent-core\";\nimport * as _bundledPiAi from \"@gsd/pi-ai\";\nimport * as _bundledPiAiOauth from \"@gsd/pi-ai/oauth\";\nimport type { KeyId } from \"@gsd/pi-tui\";\nimport * as _bundledPiTui from \"@gsd/pi-tui\";\n// Static imports of packages that extensions may use.\n// These MUST be static so Bun bundles them into the compiled binary.\n// The virtualModules option then makes them available to extensions.\nimport * as _bundledTypebox from \"@sinclair/typebox\";\nimport * as _bundledYaml from \"yaml\";\nimport { getAgentDir, isBunBinary } from \"../../config.js\";\n// NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,\n// avoiding a circular dependency. Extensions can import from @gsd/pi-coding-agent.\nimport * as _bundledPiCodingAgent from \"../../index.js\";\nimport { createEventBus, type EventBus } from \"../event-bus.js\";\nimport type { ExecOptions } from \"../exec.js\";\nimport { execCommand } from \"../exec.js\";\nimport { getUntrustedExtensionPaths } from \"./project-trust.js\";\nexport { isProjectTrusted, trustProject, getUntrustedExtensionPaths } from \"./project-trust.js\";\nimport type {\n\tExtension,\n\tExtensionAPI,\n\tExtensionFactory,\n\tExtensionRuntime,\n\tLoadExtensionsResult,\n\tMessageRenderer,\n\tProviderConfig,\n\tRegisteredCommand,\n\tToolDefinition,\n} from \"./types.js\";\n\n/** Modules available to extensions via virtualModules (for compiled Bun binary) */\nconst VIRTUAL_MODULES: Record<string, unknown> = {\n\t\"@sinclair/typebox\": _bundledTypebox,\n\t\"@gsd/pi-agent-core\": _bundledPiAgentCore,\n\t\"@gsd/pi-tui\": _bundledPiTui,\n\t\"@gsd/pi-ai\": _bundledPiAi,\n\t\"@gsd/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@gsd/pi-coding-agent\": _bundledPiCodingAgent,\n\t\"yaml\": _bundledYaml,\n\t// Aliases for external PI ecosystem packages that import from the original scope\n\t\"@mariozechner/pi-agent-core\": _bundledPiAgentCore,\n\t\"@mariozechner/pi-tui\": _bundledPiTui,\n\t\"@mariozechner/pi-ai\": _bundledPiAi,\n\t\"@mariozechner/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@mariozechner/pi-coding-agent\": _bundledPiCodingAgent,\n};\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Get aliases for jiti (used in Node.js/development mode).\n * In Bun binary mode, virtualModules is used instead.\n */\nlet _aliases: Record<string, string> | null = null;\nfunction getAliases(): Record<string, string> {\n\tif (_aliases) return _aliases;\n\n\tconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\tconst packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\n\tconst typeboxEntry = require.resolve(\"@sinclair/typebox\");\n\tconst typeboxRoot = typeboxEntry.replace(/[\\\\/]build[\\\\/]cjs[\\\\/]index\\.js$/, \"\");\n\n\tconst yamlEntry = require.resolve(\"yaml\");\n\tconst yamlRoot = yamlEntry.replace(/[\\\\/]dist[\\\\/]index\\.js$/, \"\");\n\n\tconst packagesRoot = path.resolve(__dirname, \"../../../../\");\n\tconst resolveWorkspaceOrImport = (workspaceRelativePath: string, specifier: string): string => {\n\t\tconst workspacePath = path.join(packagesRoot, workspaceRelativePath);\n\t\tif (fs.existsSync(workspacePath)) {\n\t\t\treturn workspacePath;\n\t\t}\n\t\treturn fileURLToPath(import.meta.resolve(specifier));\n\t};\n\n\t_aliases = {\n\t\t\"@gsd/pi-coding-agent\": packageIndex,\n\t\t\"@gsd/pi-agent-core\": resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@gsd/pi-agent-core\"),\n\t\t\"@gsd/pi-tui\": resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@gsd/pi-tui\"),\n\t\t\"@gsd/pi-ai\": resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@gsd/pi-ai\"),\n\t\t\"@gsd/pi-ai/oauth\": resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@gsd/pi-ai/oauth\"),\n\t\t\"@sinclair/typebox\": typeboxRoot,\n\t\t\"yaml\": yamlRoot,\n\t\t// Aliases for external PI ecosystem packages that import from the original scope\n\t\t\"@mariozechner/pi-coding-agent\": packageIndex,\n\t\t\"@mariozechner/pi-agent-core\": resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@gsd/pi-agent-core\"),\n\t\t\"@mariozechner/pi-tui\": resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@gsd/pi-tui\"),\n\t\t\"@mariozechner/pi-ai\": resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@gsd/pi-ai\"),\n\t\t\"@mariozechner/pi-ai/oauth\": resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@gsd/pi-ai/oauth\"),\n\t};\n\n\treturn _aliases;\n}\n\nconst UNICODE_SPACES = /[\\u00A0\\u2000-\\u200A\\u202F\\u205F\\u3000]/g;\n\nfunction normalizeUnicodeSpaces(str: string): string {\n\treturn str.replace(UNICODE_SPACES, \" \");\n}\n\nfunction expandPath(p: string): string {\n\tconst normalized = normalizeUnicodeSpaces(p);\n\tif (normalized.startsWith(\"~/\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(2));\n\t}\n\tif (normalized.startsWith(\"~\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(1));\n\t}\n\treturn normalized;\n}\n\nfunction resolvePath(extPath: string, cwd: string): string {\n\tconst expanded = expandPath(extPath);\n\tif (path.isAbsolute(expanded)) {\n\t\treturn expanded;\n\t}\n\treturn path.resolve(cwd, expanded);\n}\n\ntype HandlerFn = (...args: unknown[]) => Promise<unknown>;\n\n/**\n * Create a runtime with throwing stubs for action methods.\n * Runner.bindCore() replaces these with real implementations.\n */\nexport function createExtensionRuntime(): ExtensionRuntime {\n\tconst notInitialized = () => {\n\t\tthrow new Error(\"Extension runtime not initialized. Action methods cannot be called during extension loading.\");\n\t};\n\n\tconst runtime: ExtensionRuntime = {\n\t\tsendMessage: notInitialized,\n\t\tsendUserMessage: notInitialized,\n\t\tappendEntry: notInitialized,\n\t\tsetSessionName: notInitialized,\n\t\tgetSessionName: notInitialized,\n\t\tsetLabel: notInitialized,\n\t\tgetActiveTools: notInitialized,\n\t\tgetAllTools: notInitialized,\n\t\tsetActiveTools: notInitialized,\n\t\t// registerTool() is valid during extension load; refresh is only needed post-bind.\n\t\trefreshTools: () => {},\n\t\tgetCommands: notInitialized,\n\t\tsetModel: () => Promise.reject(new Error(\"Extension runtime not initialized\")),\n\t\tgetThinkingLevel: notInitialized,\n\t\tsetThinkingLevel: notInitialized,\n\t\tflagValues: new Map(),\n\t\tpendingProviderRegistrations: [],\n\t\t// Pre-bind: queue registrations so bindCore() can flush them once the\n\t\t// model registry is available. bindCore() replaces both with direct calls.\n\t\tregisterProvider: (name, config) => {\n\t\t\truntime.pendingProviderRegistrations.push({ name, config });\n\t\t},\n\t\tunregisterProvider: (name) => {\n\t\t\truntime.pendingProviderRegistrations = runtime.pendingProviderRegistrations.filter((r) => r.name !== name);\n\t\t},\n\t};\n\n\treturn runtime;\n}\n\n/**\n * Create the ExtensionAPI for an extension.\n * Registration methods write to the extension object.\n * Action methods delegate to the shared runtime.\n */\nfunction createExtensionAPI(\n\textension: Extension,\n\truntime: ExtensionRuntime,\n\tcwd: string,\n\teventBus: EventBus,\n): ExtensionAPI {\n\tconst api = {\n\t\t// Registration methods - write to extension\n\t\ton(event: string, handler: HandlerFn): void {\n\t\t\tconst list = extension.handlers.get(event) ?? [];\n\t\t\tlist.push(handler);\n\t\t\textension.handlers.set(event, list);\n\t\t},\n\n\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\textension.tools.set(tool.name, {\n\t\t\t\tdefinition: tool,\n\t\t\t\textensionPath: extension.path,\n\t\t\t});\n\t\t\truntime.refreshTools();\n\t\t},\n\n\t\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\">): void {\n\t\t\textension.commands.set(name, { name, ...options });\n\t\t},\n\n\t\tregisterShortcut(\n\t\t\tshortcut: KeyId,\n\t\t\toptions: {\n\t\t\t\tdescription?: string;\n\t\t\t\thandler: (ctx: import(\"./types.js\").ExtensionContext) => Promise<void> | void;\n\t\t\t},\n\t\t): void {\n\t\t\textension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });\n\t\t},\n\n\t\tregisterFlag(\n\t\t\tname: string,\n\t\t\toptions: { description?: string; type: \"boolean\" | \"string\"; default?: boolean | string },\n\t\t): void {\n\t\t\textension.flags.set(name, { name, extensionPath: extension.path, ...options });\n\t\t\tif (options.default !== undefined && !runtime.flagValues.has(name)) {\n\t\t\t\truntime.flagValues.set(name, options.default);\n\t\t\t}\n\t\t},\n\n\t\tregisterMessageRenderer<T>(customType: string, renderer: MessageRenderer<T>): void {\n\t\t\textension.messageRenderers.set(customType, renderer as MessageRenderer);\n\t\t},\n\n\t\t// Flag access - checks extension registered it, reads from runtime\n\t\tgetFlag(name: string): boolean | string | undefined {\n\t\t\tif (!extension.flags.has(name)) return undefined;\n\t\t\treturn runtime.flagValues.get(name);\n\t\t},\n\n\t\t// Action methods - delegate to shared runtime\n\t\tsendMessage(message, options): void {\n\t\t\truntime.sendMessage(message, options);\n\t\t},\n\n\t\tsendUserMessage(content, options): void {\n\t\t\truntime.sendUserMessage(content, options);\n\t\t},\n\n\t\tappendEntry(customType: string, data?: unknown): void {\n\t\t\truntime.appendEntry(customType, data);\n\t\t},\n\n\t\tsetSessionName(name: string): void {\n\t\t\truntime.setSessionName(name);\n\t\t},\n\n\t\tgetSessionName(): string | undefined {\n\t\t\treturn runtime.getSessionName();\n\t\t},\n\n\t\tsetLabel(entryId: string, label: string | undefined): void {\n\t\t\truntime.setLabel(entryId, label);\n\t\t},\n\n\t\texec(command: string, args: string[], options?: ExecOptions) {\n\t\t\treturn execCommand(command, args, options?.cwd ?? cwd, options);\n\t\t},\n\n\t\tgetActiveTools(): string[] {\n\t\t\treturn runtime.getActiveTools();\n\t\t},\n\n\t\tgetAllTools() {\n\t\t\treturn runtime.getAllTools();\n\t\t},\n\n\t\tsetActiveTools(toolNames: string[]): void {\n\t\t\truntime.setActiveTools(toolNames);\n\t\t},\n\n\t\tgetCommands() {\n\t\t\treturn runtime.getCommands();\n\t\t},\n\n\t\tsetModel(model) {\n\t\t\treturn runtime.setModel(model);\n\t\t},\n\n\t\tgetThinkingLevel() {\n\t\t\treturn runtime.getThinkingLevel();\n\t\t},\n\n\t\tsetThinkingLevel(level) {\n\t\t\truntime.setThinkingLevel(level);\n\t\t},\n\n\t\tregisterProvider(name: string, config: ProviderConfig) {\n\t\t\truntime.registerProvider(name, config);\n\t\t},\n\n\t\tunregisterProvider(name: string) {\n\t\t\truntime.unregisterProvider(name);\n\t\t},\n\n\t\tevents: eventBus,\n\t} as ExtensionAPI;\n\n\treturn api;\n}\n\nasync function loadExtensionModule(extensionPath: string) {\n\tconst jiti = createJiti(import.meta.url, {\n\t\tmoduleCache: false,\n\t\t// In Bun binary: use virtualModules for bundled packages (no filesystem resolution)\n\t\t// Also disable tryNative so jiti handles ALL imports (not just the entry point)\n\t\t// In Node.js/dev: use aliases to resolve to node_modules paths\n\t\t...(isBunBinary ? { virtualModules: VIRTUAL_MODULES, tryNative: false } : { alias: getAliases() }),\n\t});\n\n\tconst module = await jiti.import(extensionPath, { default: true });\n\tconst factory = module as ExtensionFactory;\n\treturn typeof factory !== \"function\" ? undefined : factory;\n}\n\n/**\n * Create an Extension object with empty collections.\n */\nfunction createExtension(extensionPath: string, resolvedPath: string): Extension {\n\treturn {\n\t\tpath: extensionPath,\n\t\tresolvedPath,\n\t\thandlers: new Map(),\n\t\ttools: new Map(),\n\t\tmessageRenderers: new Map(),\n\t\tcommands: new Map(),\n\t\tflags: new Map(),\n\t\tshortcuts: new Map(),\n\t};\n}\n\nasync function loadExtension(\n\textensionPath: string,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n): Promise<{ extension: Extension | null; error: string | null }> {\n\tconst resolvedPath = resolvePath(extensionPath, cwd);\n\n\ttry {\n\t\tconst factory = await loadExtensionModule(resolvedPath);\n\t\tif (!factory) {\n\t\t\treturn { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };\n\t\t}\n\n\t\tconst extension = createExtension(extensionPath, resolvedPath);\n\t\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\t\tawait factory(api);\n\n\t\treturn { extension, error: null };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn { extension: null, error: `Failed to load extension: ${message}` };\n\t}\n}\n\n/**\n * Create an Extension from an inline factory function.\n */\nexport async function loadExtensionFromFactory(\n\tfactory: ExtensionFactory,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\textensionPath = \"<inline>\",\n): Promise<Extension> {\n\tconst extension = createExtension(extensionPath, extensionPath);\n\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\tawait factory(api);\n\treturn extension;\n}\n\n/**\n * Load extensions from paths.\n *\n * Extensions are loaded in parallel to reduce wall-clock time (~30-50% faster\n * than sequential loading for I/O-bound jiti compilation).\n */\nexport async function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus): Promise<LoadExtensionsResult> {\n\tconst resolvedEventBus = eventBus ?? createEventBus();\n\tconst runtime = createExtensionRuntime();\n\n\tconst results = await Promise.all(\n\t\tpaths.map((extPath) => loadExtension(extPath, cwd, resolvedEventBus, runtime)),\n\t);\n\n\tconst extensions: Extension[] = [];\n\tconst errors: Array<{ path: string; error: string }> = [];\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst { extension, error } = results[i];\n\t\tif (error) {\n\t\t\terrors.push({ path: paths[i], error });\n\t\t} else if (extension) {\n\t\t\textensions.push(extension);\n\t\t}\n\t}\n\n\treturn {\n\t\textensions,\n\t\terrors,\n\t\truntime,\n\t};\n}\n\ninterface PiManifest {\n\textensions?: string[];\n\tthemes?: string[];\n\tskills?: string[];\n\tprompts?: string[];\n}\n\nfunction readPiManifest(packageJsonPath: string): PiManifest | null {\n\ttry {\n\t\tconst content = fs.readFileSync(packageJsonPath, \"utf-8\");\n\t\tconst pkg = JSON.parse(content);\n\t\tif (pkg.pi && typeof pkg.pi === \"object\") {\n\t\t\treturn pkg.pi as PiManifest;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isExtensionFile(name: string): boolean {\n\treturn name.endsWith(\".ts\") || name.endsWith(\".js\");\n}\n\n/**\n * Resolve extension entry points from a directory.\n *\n * Checks for:\n * 1. package.json with \"pi.extensions\" field -> returns declared paths\n * 2. index.ts or index.js -> returns the index file\n *\n * Returns resolved paths or null if no entry points found.\n */\nfunction resolveExtensionEntries(dir: string): string[] | null {\n\t// Check for package.json with \"pi\" field first\n\tconst packageJsonPath = path.join(dir, \"package.json\");\n\tif (fs.existsSync(packageJsonPath)) {\n\t\tconst manifest = readPiManifest(packageJsonPath);\n\t\tif (manifest?.extensions?.length) {\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const extPath of manifest.extensions) {\n\t\t\t\tconst resolvedExtPath = path.resolve(dir, extPath);\n\t\t\t\tif (fs.existsSync(resolvedExtPath)) {\n\t\t\t\t\tentries.push(resolvedExtPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entries.length > 0) {\n\t\t\t\treturn entries;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check for index.ts or index.js\n\tconst indexTs = path.join(dir, \"index.ts\");\n\tconst indexJs = path.join(dir, \"index.js\");\n\tif (fs.existsSync(indexTs)) {\n\t\treturn [indexTs];\n\t}\n\tif (fs.existsSync(indexJs)) {\n\t\treturn [indexJs];\n\t}\n\n\treturn null;\n}\n\n/**\n * Discover extensions in a directory.\n *\n * Discovery rules:\n * 1. Direct files: `extensions/*.ts` or `*.js` → load\n * 2. Subdirectory with index: `extensions/* /index.ts` or `index.js` → load\n * 3. Subdirectory with package.json: `extensions/* /package.json` with \"pi\" field → load what it declares\n *\n * No recursion beyond one level. Complex packages must use package.json manifest.\n */\nfunction discoverExtensionsInDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\tconst discovered: string[] = [];\n\n\ttry {\n\t\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst entryPath = path.join(dir, entry.name);\n\n\t\t\t// 1. Direct files: *.ts or *.js\n\t\t\tif ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {\n\t\t\t\tdiscovered.push(entryPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// 2 & 3. Subdirectories\n\t\t\tif (entry.isDirectory() || entry.isSymbolicLink()) {\n\t\t\t\tconst entries = resolveExtensionEntries(entryPath);\n\t\t\t\tif (entries) {\n\t\t\t\t\tdiscovered.push(...entries);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn discovered;\n}\n\n/**\n * Discover and load extensions from standard locations.\n */\nexport async function discoverAndLoadExtensions(\n\tconfiguredPaths: string[],\n\tcwd: string,\n\tagentDir: string = getAgentDir(),\n\teventBus?: EventBus,\n): Promise<LoadExtensionsResult> {\n\tconst allPaths: string[] = [];\n\tconst seen = new Set<string>();\n\n\tconst addPaths = (paths: string[]) => {\n\t\tfor (const p of paths) {\n\t\t\tconst resolved = path.resolve(p);\n\t\t\tif (!seen.has(resolved)) {\n\t\t\t\tseen.add(resolved);\n\t\t\t\tallPaths.push(p);\n\t\t\t}\n\t\t}\n\t};\n\n\t// 1. Project-local extensions: cwd/.pi/extensions/\n\t// Only loaded when the project path has been explicitly trusted (TOFU model).\n\tconst localExtDir = path.join(cwd, \".pi\", \"extensions\");\n\tconst localDiscovered = discoverExtensionsInDir(localExtDir);\n\tif (localDiscovered.length > 0) {\n\t\tconst untrusted = getUntrustedExtensionPaths(cwd, localDiscovered, agentDir);\n\t\tif (untrusted.length > 0) {\n\t\t\tprocess.stderr.write(\n\t\t\t\t`[pi] Skipping ${untrusted.length} project-local extension(s) in ${localExtDir} — project not trusted. Use trustProject() to enable.\\n`,\n\t\t\t);\n\t\t}\n\t\tconst trusted = localDiscovered.filter((p) => !untrusted.includes(p));\n\t\taddPaths(trusted);\n\t}\n\n\t// 2. Global extensions: agentDir/extensions/\n\tconst globalExtDir = path.join(agentDir, \"extensions\");\n\taddPaths(discoverExtensionsInDir(globalExtDir));\n\n\t// 3. Explicitly configured paths\n\tfor (const p of configuredPaths) {\n\t\tconst resolved = resolvePath(p, cwd);\n\t\tif (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {\n\t\t\t// Check for package.json with pi manifest or index.ts\n\t\t\tconst entries = resolveExtensionEntries(resolved);\n\t\t\tif (entries) {\n\t\t\t\taddPaths(entries);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// No explicit entries - discover individual files in directory\n\t\t\taddPaths(discoverExtensionsInDir(resolved));\n\t\t\tcontinue;\n\t\t}\n\n\t\taddPaths([resolved]);\n\t}\n\n\treturn loadExtensions(allPaths, cwd, eventBus);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension loader - loads TypeScript extension modules using jiti.\n *\n * Uses @mariozechner/jiti fork with virtualModules support for compiled Bun binaries.\n */\n\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createJiti } from \"@mariozechner/jiti\";\nimport * as _bundledPiAgentCore from \"@gsd/pi-agent-core\";\nimport * as _bundledPiAi from \"@gsd/pi-ai\";\nimport * as _bundledPiAiOauth from \"@gsd/pi-ai/oauth\";\nimport type { KeyId } from \"@gsd/pi-tui\";\nimport * as _bundledPiTui from \"@gsd/pi-tui\";\n// Static imports of packages that extensions may use.\n// These MUST be static so Bun bundles them into the compiled binary.\n// The virtualModules option then makes them available to extensions.\nimport * as _bundledTypebox from \"@sinclair/typebox\";\nimport * as _bundledYaml from \"yaml\";\nimport * as _bundledMcpClient from \"@modelcontextprotocol/sdk/client\";\nimport * as _bundledMcpStdio from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport * as _bundledMcpStreamableHttp from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { getAgentDir, isBunBinary } from \"../../config.js\";\n// NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,\n// avoiding a circular dependency. Extensions can import from @gsd/pi-coding-agent.\nimport * as _bundledPiCodingAgent from \"../../index.js\";\nimport { createEventBus, type EventBus } from \"../event-bus.js\";\nimport type { ExecOptions } from \"../exec.js\";\nimport { execCommand } from \"../exec.js\";\nimport { getUntrustedExtensionPaths } from \"./project-trust.js\";\nexport { isProjectTrusted, trustProject, getUntrustedExtensionPaths } from \"./project-trust.js\";\nimport type {\n\tExtension,\n\tExtensionAPI,\n\tExtensionFactory,\n\tExtensionRuntime,\n\tLoadExtensionsResult,\n\tMessageRenderer,\n\tProviderConfig,\n\tRegisteredCommand,\n\tToolDefinition,\n} from \"./types.js\";\n\n/** Modules available to extensions via virtualModules (for compiled Bun binary) */\nconst VIRTUAL_MODULES: Record<string, unknown> = {\n\t\"@sinclair/typebox\": _bundledTypebox,\n\t\"@gsd/pi-agent-core\": _bundledPiAgentCore,\n\t\"@gsd/pi-tui\": _bundledPiTui,\n\t\"@gsd/pi-ai\": _bundledPiAi,\n\t\"@gsd/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@gsd/pi-coding-agent\": _bundledPiCodingAgent,\n\t\"yaml\": _bundledYaml,\n\t\"@modelcontextprotocol/sdk/client\": _bundledMcpClient,\n\t\"@modelcontextprotocol/sdk/client/stdio\": _bundledMcpStdio,\n\t\"@modelcontextprotocol/sdk/client/stdio.js\": _bundledMcpStdio,\n\t\"@modelcontextprotocol/sdk/client/streamableHttp\": _bundledMcpStreamableHttp,\n\t\"@modelcontextprotocol/sdk/client/streamableHttp.js\": _bundledMcpStreamableHttp,\n\t// Aliases for external PI ecosystem packages that import from the original scope\n\t\"@mariozechner/pi-agent-core\": _bundledPiAgentCore,\n\t\"@mariozechner/pi-tui\": _bundledPiTui,\n\t\"@mariozechner/pi-ai\": _bundledPiAi,\n\t\"@mariozechner/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@mariozechner/pi-coding-agent\": _bundledPiCodingAgent,\n};\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Get aliases for jiti (used in Node.js/development mode).\n * In Bun binary mode, virtualModules is used instead.\n */\nlet _aliases: Record<string, string> | null = null;\nfunction getAliases(): Record<string, string> {\n\tif (_aliases) return _aliases;\n\n\tconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\tconst packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\n\tconst typeboxEntry = require.resolve(\"@sinclair/typebox\");\n\tconst typeboxRoot = typeboxEntry.replace(/[\\\\/]build[\\\\/]cjs[\\\\/]index\\.js$/, \"\");\n\n\tconst yamlEntry = require.resolve(\"yaml\");\n\tconst yamlRoot = yamlEntry.replace(/[\\\\/]dist[\\\\/]index\\.js$/, \"\");\n\n\tconst packagesRoot = path.resolve(__dirname, \"../../../../\");\n\tconst resolveWorkspaceOrImport = (workspaceRelativePath: string, specifier: string): string => {\n\t\tconst workspacePath = path.join(packagesRoot, workspaceRelativePath);\n\t\tif (fs.existsSync(workspacePath)) {\n\t\t\treturn workspacePath;\n\t\t}\n\t\treturn fileURLToPath(import.meta.resolve(specifier));\n\t};\n\n\t_aliases = {\n\t\t\"@gsd/pi-coding-agent\": packageIndex,\n\t\t\"@gsd/pi-agent-core\": resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@gsd/pi-agent-core\"),\n\t\t\"@gsd/pi-tui\": resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@gsd/pi-tui\"),\n\t\t\"@gsd/pi-ai\": resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@gsd/pi-ai\"),\n\t\t\"@gsd/pi-ai/oauth\": resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@gsd/pi-ai/oauth\"),\n\t\t\"@sinclair/typebox\": typeboxRoot,\n\t\t\"yaml\": yamlRoot,\n\t\t\"@modelcontextprotocol/sdk/client\": require.resolve(\"@modelcontextprotocol/sdk/client\"),\n\t\t\"@modelcontextprotocol/sdk/client/stdio\": require.resolve(\"@modelcontextprotocol/sdk/client/stdio.js\"),\n\t\t\"@modelcontextprotocol/sdk/client/stdio.js\": require.resolve(\"@modelcontextprotocol/sdk/client/stdio.js\"),\n\t\t\"@modelcontextprotocol/sdk/client/streamableHttp\": require.resolve(\"@modelcontextprotocol/sdk/client/streamableHttp.js\"),\n\t\t\"@modelcontextprotocol/sdk/client/streamableHttp.js\": require.resolve(\"@modelcontextprotocol/sdk/client/streamableHttp.js\"),\n\t\t// Aliases for external PI ecosystem packages that import from the original scope\n\t\t\"@mariozechner/pi-coding-agent\": packageIndex,\n\t\t\"@mariozechner/pi-agent-core\": resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@gsd/pi-agent-core\"),\n\t\t\"@mariozechner/pi-tui\": resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@gsd/pi-tui\"),\n\t\t\"@mariozechner/pi-ai\": resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@gsd/pi-ai\"),\n\t\t\"@mariozechner/pi-ai/oauth\": resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@gsd/pi-ai/oauth\"),\n\t};\n\n\treturn _aliases;\n}\n\nconst UNICODE_SPACES = /[\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/g;\n\nfunction normalizeUnicodeSpaces(str: string): string {\n\treturn str.replace(UNICODE_SPACES, \" \");\n}\n\nfunction expandPath(p: string): string {\n\tconst normalized = normalizeUnicodeSpaces(p);\n\tif (normalized.startsWith(\"~/\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(2));\n\t}\n\tif (normalized.startsWith(\"~\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(1));\n\t}\n\treturn normalized;\n}\n\nfunction resolvePath(extPath: string, cwd: string): string {\n\tconst expanded = expandPath(extPath);\n\tif (path.isAbsolute(expanded)) {\n\t\treturn expanded;\n\t}\n\treturn path.resolve(cwd, expanded);\n}\n\ntype HandlerFn = (...args: unknown[]) => Promise<unknown>;\n\n/**\n * Create a runtime with throwing stubs for action methods.\n * Runner.bindCore() replaces these with real implementations.\n */\nexport function createExtensionRuntime(): ExtensionRuntime {\n\tconst notInitialized = () => {\n\t\tthrow new Error(\"Extension runtime not initialized. Action methods cannot be called during extension loading.\");\n\t};\n\n\tconst runtime: ExtensionRuntime = {\n\t\tsendMessage: notInitialized,\n\t\tsendUserMessage: notInitialized,\n\t\tappendEntry: notInitialized,\n\t\tsetSessionName: notInitialized,\n\t\tgetSessionName: notInitialized,\n\t\tsetLabel: notInitialized,\n\t\tgetActiveTools: notInitialized,\n\t\tgetAllTools: notInitialized,\n\t\tsetActiveTools: notInitialized,\n\t\t// registerTool() is valid during extension load; refresh is only needed post-bind.\n\t\trefreshTools: () => {},\n\t\tgetCommands: notInitialized,\n\t\tsetModel: () => Promise.reject(new Error(\"Extension runtime not initialized\")),\n\t\tgetThinkingLevel: notInitialized,\n\t\tsetThinkingLevel: notInitialized,\n\t\tflagValues: new Map(),\n\t\tpendingProviderRegistrations: [],\n\t\t// Pre-bind: queue registrations so bindCore() can flush them once the\n\t\t// model registry is available. bindCore() replaces both with direct calls.\n\t\tregisterProvider: (name, config) => {\n\t\t\truntime.pendingProviderRegistrations.push({ name, config });\n\t\t},\n\t\tunregisterProvider: (name) => {\n\t\t\truntime.pendingProviderRegistrations = runtime.pendingProviderRegistrations.filter((r) => r.name !== name);\n\t\t},\n\t};\n\n\treturn runtime;\n}\n\n/**\n * Create the ExtensionAPI for an extension.\n * Registration methods write to the extension object.\n * Action methods delegate to the shared runtime.\n */\nfunction createExtensionAPI(\n\textension: Extension,\n\truntime: ExtensionRuntime,\n\tcwd: string,\n\teventBus: EventBus,\n): ExtensionAPI {\n\tconst api = {\n\t\t// Registration methods - write to extension\n\t\ton(event: string, handler: HandlerFn): void {\n\t\t\tconst list = extension.handlers.get(event) ?? [];\n\t\t\tlist.push(handler);\n\t\t\textension.handlers.set(event, list);\n\t\t},\n\n\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\textension.tools.set(tool.name, {\n\t\t\t\tdefinition: tool,\n\t\t\t\textensionPath: extension.path,\n\t\t\t});\n\t\t\truntime.refreshTools();\n\t\t},\n\n\t\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\">): void {\n\t\t\textension.commands.set(name, { name, ...options });\n\t\t},\n\n\t\tregisterShortcut(\n\t\t\tshortcut: KeyId,\n\t\t\toptions: {\n\t\t\t\tdescription?: string;\n\t\t\t\thandler: (ctx: import(\"./types.js\").ExtensionContext) => Promise<void> | void;\n\t\t\t},\n\t\t): void {\n\t\t\textension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });\n\t\t},\n\n\t\tregisterFlag(\n\t\t\tname: string,\n\t\t\toptions: { description?: string; type: \"boolean\" | \"string\"; default?: boolean | string },\n\t\t): void {\n\t\t\textension.flags.set(name, { name, extensionPath: extension.path, ...options });\n\t\t\tif (options.default !== undefined && !runtime.flagValues.has(name)) {\n\t\t\t\truntime.flagValues.set(name, options.default);\n\t\t\t}\n\t\t},\n\n\t\tregisterMessageRenderer<T>(customType: string, renderer: MessageRenderer<T>): void {\n\t\t\textension.messageRenderers.set(customType, renderer as MessageRenderer);\n\t\t},\n\n\t\t// Flag access - checks extension registered it, reads from runtime\n\t\tgetFlag(name: string): boolean | string | undefined {\n\t\t\tif (!extension.flags.has(name)) return undefined;\n\t\t\treturn runtime.flagValues.get(name);\n\t\t},\n\n\t\t// Action methods - delegate to shared runtime\n\t\tsendMessage(message, options): void {\n\t\t\truntime.sendMessage(message, options);\n\t\t},\n\n\t\tsendUserMessage(content, options): void {\n\t\t\truntime.sendUserMessage(content, options);\n\t\t},\n\n\t\tappendEntry(customType: string, data?: unknown): void {\n\t\t\truntime.appendEntry(customType, data);\n\t\t},\n\n\t\tsetSessionName(name: string): void {\n\t\t\truntime.setSessionName(name);\n\t\t},\n\n\t\tgetSessionName(): string | undefined {\n\t\t\treturn runtime.getSessionName();\n\t\t},\n\n\t\tsetLabel(entryId: string, label: string | undefined): void {\n\t\t\truntime.setLabel(entryId, label);\n\t\t},\n\n\t\texec(command: string, args: string[], options?: ExecOptions) {\n\t\t\treturn execCommand(command, args, options?.cwd ?? cwd, options);\n\t\t},\n\n\t\tgetActiveTools(): string[] {\n\t\t\treturn runtime.getActiveTools();\n\t\t},\n\n\t\tgetAllTools() {\n\t\t\treturn runtime.getAllTools();\n\t\t},\n\n\t\tsetActiveTools(toolNames: string[]): void {\n\t\t\truntime.setActiveTools(toolNames);\n\t\t},\n\n\t\tgetCommands() {\n\t\t\treturn runtime.getCommands();\n\t\t},\n\n\t\tsetModel(model) {\n\t\t\treturn runtime.setModel(model);\n\t\t},\n\n\t\tgetThinkingLevel() {\n\t\t\treturn runtime.getThinkingLevel();\n\t\t},\n\n\t\tsetThinkingLevel(level) {\n\t\t\truntime.setThinkingLevel(level);\n\t\t},\n\n\t\tregisterProvider(name: string, config: ProviderConfig) {\n\t\t\truntime.registerProvider(name, config);\n\t\t},\n\n\t\tunregisterProvider(name: string) {\n\t\t\truntime.unregisterProvider(name);\n\t\t},\n\n\t\tevents: eventBus,\n\t} as ExtensionAPI;\n\n\treturn api;\n}\n\nasync function loadExtensionModule(extensionPath: string) {\n\tconst jiti = createJiti(import.meta.url, {\n\t\tmoduleCache: false,\n\t\t// In Bun binary: use virtualModules for bundled packages (no filesystem resolution)\n\t\t// Also disable tryNative so jiti handles ALL imports (not just the entry point)\n\t\t// In Node.js/dev: use aliases to resolve to node_modules paths\n\t\t...(isBunBinary ? { virtualModules: VIRTUAL_MODULES, tryNative: false } : { alias: getAliases() }),\n\t});\n\n\tconst module = await jiti.import(extensionPath, { default: true });\n\tconst factory = module as ExtensionFactory;\n\treturn typeof factory !== \"function\" ? undefined : factory;\n}\n\n/**\n * Create an Extension object with empty collections.\n */\nfunction createExtension(extensionPath: string, resolvedPath: string): Extension {\n\treturn {\n\t\tpath: extensionPath,\n\t\tresolvedPath,\n\t\thandlers: new Map(),\n\t\ttools: new Map(),\n\t\tmessageRenderers: new Map(),\n\t\tcommands: new Map(),\n\t\tflags: new Map(),\n\t\tshortcuts: new Map(),\n\t};\n}\n\nasync function loadExtension(\n\textensionPath: string,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n): Promise<{ extension: Extension | null; error: string | null }> {\n\tconst resolvedPath = resolvePath(extensionPath, cwd);\n\n\ttry {\n\t\tconst factory = await loadExtensionModule(resolvedPath);\n\t\tif (!factory) {\n\t\t\treturn { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };\n\t\t}\n\n\t\tconst extension = createExtension(extensionPath, resolvedPath);\n\t\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\t\tawait factory(api);\n\n\t\treturn { extension, error: null };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn { extension: null, error: `Failed to load extension: ${message}` };\n\t}\n}\n\n/**\n * Create an Extension from an inline factory function.\n */\nexport async function loadExtensionFromFactory(\n\tfactory: ExtensionFactory,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\textensionPath = \"<inline>\",\n): Promise<Extension> {\n\tconst extension = createExtension(extensionPath, extensionPath);\n\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\tawait factory(api);\n\treturn extension;\n}\n\n/**\n * Load extensions from paths.\n *\n * Extensions are loaded in parallel to reduce wall-clock time (~30-50% faster\n * than sequential loading for I/O-bound jiti compilation).\n */\nexport async function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus): Promise<LoadExtensionsResult> {\n\tconst resolvedEventBus = eventBus ?? createEventBus();\n\tconst runtime = createExtensionRuntime();\n\n\tconst results = await Promise.all(\n\t\tpaths.map((extPath) => loadExtension(extPath, cwd, resolvedEventBus, runtime)),\n\t);\n\n\tconst extensions: Extension[] = [];\n\tconst errors: Array<{ path: string; error: string }> = [];\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst { extension, error } = results[i];\n\t\tif (error) {\n\t\t\terrors.push({ path: paths[i], error });\n\t\t} else if (extension) {\n\t\t\textensions.push(extension);\n\t\t}\n\t}\n\n\treturn {\n\t\textensions,\n\t\terrors,\n\t\truntime,\n\t};\n}\n\ninterface PiManifest {\n\textensions?: string[];\n\tthemes?: string[];\n\tskills?: string[];\n\tprompts?: string[];\n}\n\nfunction readPiManifest(packageJsonPath: string): PiManifest | null {\n\ttry {\n\t\tconst content = fs.readFileSync(packageJsonPath, \"utf-8\");\n\t\tconst pkg = JSON.parse(content);\n\t\tif (pkg.pi && typeof pkg.pi === \"object\") {\n\t\t\treturn pkg.pi as PiManifest;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isExtensionFile(name: string): boolean {\n\treturn name.endsWith(\".ts\") || name.endsWith(\".js\");\n}\n\n/**\n * Resolve extension entry points from a directory.\n *\n * Checks for:\n * 1. package.json with \"pi.extensions\" field -> returns declared paths\n * 2. index.ts or index.js -> returns the index file\n *\n * Returns resolved paths or null if no entry points found.\n */\nfunction resolveExtensionEntries(dir: string): string[] | null {\n\t// Check for package.json with \"pi\" field first\n\tconst packageJsonPath = path.join(dir, \"package.json\");\n\tif (fs.existsSync(packageJsonPath)) {\n\t\tconst manifest = readPiManifest(packageJsonPath);\n\t\tif (manifest?.extensions?.length) {\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const extPath of manifest.extensions) {\n\t\t\t\tconst resolvedExtPath = path.resolve(dir, extPath);\n\t\t\t\tif (fs.existsSync(resolvedExtPath)) {\n\t\t\t\t\tentries.push(resolvedExtPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entries.length > 0) {\n\t\t\t\treturn entries;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check for index.ts or index.js\n\tconst indexTs = path.join(dir, \"index.ts\");\n\tconst indexJs = path.join(dir, \"index.js\");\n\tif (fs.existsSync(indexTs)) {\n\t\treturn [indexTs];\n\t}\n\tif (fs.existsSync(indexJs)) {\n\t\treturn [indexJs];\n\t}\n\n\treturn null;\n}\n\n/**\n * Discover extensions in a directory.\n *\n * Discovery rules:\n * 1. Direct files: `extensions/*.ts` or `*.js` → load\n * 2. Subdirectory with index: `extensions/* /index.ts` or `index.js` → load\n * 3. Subdirectory with package.json: `extensions/* /package.json` with \"pi\" field → load what it declares\n *\n * No recursion beyond one level. Complex packages must use package.json manifest.\n */\nfunction discoverExtensionsInDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\tconst discovered: string[] = [];\n\n\ttry {\n\t\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst entryPath = path.join(dir, entry.name);\n\n\t\t\t// 1. Direct files: *.ts or *.js\n\t\t\tif ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {\n\t\t\t\tdiscovered.push(entryPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// 2 & 3. Subdirectories\n\t\t\tif (entry.isDirectory() || entry.isSymbolicLink()) {\n\t\t\t\tconst entries = resolveExtensionEntries(entryPath);\n\t\t\t\tif (entries) {\n\t\t\t\t\tdiscovered.push(...entries);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn discovered;\n}\n\n/**\n * Discover and load extensions from standard locations.\n */\nexport async function discoverAndLoadExtensions(\n\tconfiguredPaths: string[],\n\tcwd: string,\n\tagentDir: string = getAgentDir(),\n\teventBus?: EventBus,\n): Promise<LoadExtensionsResult> {\n\tconst allPaths: string[] = [];\n\tconst seen = new Set<string>();\n\n\tconst addPaths = (paths: string[]) => {\n\t\tfor (const p of paths) {\n\t\t\tconst resolved = path.resolve(p);\n\t\t\tif (!seen.has(resolved)) {\n\t\t\t\tseen.add(resolved);\n\t\t\t\tallPaths.push(p);\n\t\t\t}\n\t\t}\n\t};\n\n\t// 1. Project-local extensions: cwd/.pi/extensions/\n\t// Only loaded when the project path has been explicitly trusted (TOFU model).\n\tconst localExtDir = path.join(cwd, \".pi\", \"extensions\");\n\tconst localDiscovered = discoverExtensionsInDir(localExtDir);\n\tif (localDiscovered.length > 0) {\n\t\tconst untrusted = getUntrustedExtensionPaths(cwd, localDiscovered, agentDir);\n\t\tif (untrusted.length > 0) {\n\t\t\tprocess.stderr.write(\n\t\t\t\t`[pi] Skipping ${untrusted.length} project-local extension(s) in ${localExtDir} — project not trusted. Use trustProject() to enable.\\n`,\n\t\t\t);\n\t\t}\n\t\tconst trusted = localDiscovered.filter((p) => !untrusted.includes(p));\n\t\taddPaths(trusted);\n\t}\n\n\t// 2. Global extensions: agentDir/extensions/\n\tconst globalExtDir = path.join(agentDir, \"extensions\");\n\taddPaths(discoverExtensionsInDir(globalExtDir));\n\n\t// 3. Explicitly configured paths\n\tfor (const p of configuredPaths) {\n\t\tconst resolved = resolvePath(p, cwd);\n\t\tif (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {\n\t\t\t// Check for package.json with pi manifest or index.ts\n\t\t\tconst entries = resolveExtensionEntries(resolved);\n\t\t\tif (entries) {\n\t\t\t\taddPaths(entries);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// No explicit entries - discover individual files in directory\n\t\t\taddPaths(discoverExtensionsInDir(resolved));\n\t\t\tcontinue;\n\t\t}\n\n\t\taddPaths([resolved]);\n\t}\n\n\treturn loadExtensions(allPaths, cwd, eventBus);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAA4C,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAIN,KAAK,eAAe,EAKpB,MAAM,aAAa,CAAC;AAKrB,OAAO,EAcN,KAAK,cAAc,EACnB,SAAS,EAMT,MAAM,YAAY,CAAC;AA0BpB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AASvC,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;QAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACH;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAiC5E;AAED,wBAAgB,YAAY,IAAI,eAAe,EAAE,CAEhD;AAsND;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,SAAS,EAAE,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/lsp/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAA4C,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAIN,KAAK,eAAe,EAKpB,MAAM,aAAa,CAAC;AAKrB,OAAO,EAcN,KAAK,cAAc,EACnB,SAAS,EAMT,MAAM,YAAY,CAAC;AA0BpB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AASvC,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;QAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACH;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAiC5E;AAED,wBAAgB,YAAY,IAAI,eAAe,EAAE,CAEhD;AAsND;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,SAAS,EAAE,cAAc,CAAC,CAgxBtF;AAED;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;mBAA+B,CAAC"}
|
|
@@ -4,7 +4,7 @@ import * as path from "node:path";
|
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
import { ensureFileOpen, getActiveClients, getOrCreateClient, refreshFile, sendRequest, setIdleTimeout, WARMUP_TIMEOUT_MS, } from "./client.js";
|
|
7
|
-
import { getServersForFile, loadConfig } from "./config.js";
|
|
7
|
+
import { getServersForFile, loadConfig, hasRootMarkers, resolveCommand } from "./config.js";
|
|
8
8
|
import { applyTextEdits, applyWorkspaceEdit } from "./edits.js";
|
|
9
9
|
import { ToolAbortError, clampTimeout, throwIfAborted } from "./helpers.js";
|
|
10
10
|
import { detectLspmux } from "./lspmux.js";
|
|
@@ -242,9 +242,35 @@ export function createLspTool(cwd) {
|
|
|
242
242
|
? "lspmux: active (multiplexing enabled)"
|
|
243
243
|
: "lspmux: installed but server not running"
|
|
244
244
|
: "";
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
245
|
+
let serverStatus;
|
|
246
|
+
if (servers.length > 0) {
|
|
247
|
+
serverStatus = `Active language servers: ${servers.join(", ")}`;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// Diagnose why no servers were detected
|
|
251
|
+
const DEFAULTS = (await import("./defaults.json", { with: { type: "json" } })).default;
|
|
252
|
+
const diagnostics = ["No language servers configured for this project."];
|
|
253
|
+
const matchedButMissing = [];
|
|
254
|
+
const noMarkers = [];
|
|
255
|
+
for (const [name, def] of Object.entries(DEFAULTS)) {
|
|
256
|
+
if (hasRootMarkers(cwd, def.rootMarkers)) {
|
|
257
|
+
const resolved = resolveCommand(def.command, cwd);
|
|
258
|
+
if (!resolved) {
|
|
259
|
+
matchedButMissing.push(` ${name}: project detected (${def.rootMarkers[0]}) but '${def.command}' not found — install it with npm/pip/brew`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (matchedButMissing.length > 0) {
|
|
264
|
+
diagnostics.push("\nDetected projects missing language servers:");
|
|
265
|
+
diagnostics.push(...matchedButMissing);
|
|
266
|
+
diagnostics.push("\nInstall the missing server command and restart GSD, or run: lsp reload");
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
diagnostics.push("No recognized project markers found in the working directory.");
|
|
270
|
+
diagnostics.push("LSP auto-detects projects via files like package.json, Cargo.toml, go.mod, pyproject.toml, etc.");
|
|
271
|
+
}
|
|
272
|
+
serverStatus = diagnostics.join("\n");
|
|
273
|
+
}
|
|
248
274
|
const output = lspmuxStatus ? `${serverStatus}\n${lspmuxStatus}` : serverStatus;
|
|
249
275
|
return {
|
|
250
276
|
content: [{ type: "text", text: output }],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/lsp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as fsSync from \"node:fs\";\nimport * as path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from \"@gsd/pi-agent-core\";\nimport {\n\tensureFileOpen,\n\tgetActiveClients,\n\tgetOrCreateClient,\n\ttype LspServerStatus,\n\trefreshFile,\n\tsendRequest,\n\tsetIdleTimeout,\n\tWARMUP_TIMEOUT_MS,\n} from \"./client.js\";\nimport { getServersForFile, type LspConfig, loadConfig } from \"./config.js\";\nimport { applyTextEdits, applyWorkspaceEdit } from \"./edits.js\";\nimport { ToolAbortError, clampTimeout, throwIfAborted } from \"./helpers.js\";\nimport { detectLspmux } from \"./lspmux.js\";\nimport {\n\ttype CallHierarchyIncomingCall,\n\ttype CallHierarchyItem,\n\ttype CallHierarchyOutgoingCall,\n\ttype CodeAction,\n\ttype CodeActionContext,\n\ttype Command,\n\ttype Diagnostic,\n\ttype DocumentSymbol,\n\ttype Hover,\n\ttype Location,\n\ttype LocationLink,\n\ttype LspClient,\n\ttype LspParams,\n\ttype LspToolDetails,\n\tlspSchema,\n\ttype ServerConfig,\n\ttype SignatureHelp,\n\ttype SymbolInformation,\n\ttype TextEdit,\n\ttype WorkspaceEdit,\n} from \"./types.js\";\nimport {\n\tapplyCodeAction,\n\tcollectGlobMatches,\n\tdedupeWorkspaceSymbols,\n\textractHoverText,\n\tfileToUri,\n\tfilterWorkspaceSymbols,\n\tformatCallHierarchyItem,\n\tformatCodeAction,\n\tformatDiagnostic,\n\tformatDiagnosticsSummary,\n\tformatDocumentSymbol,\n\tformatGroupedDiagnosticMessages,\n\tformatLocation,\n\tformatSignatureHelp,\n\tformatSymbolInformation,\n\tformatWorkspaceEdit,\n\thasGlobPattern,\n\treadLocationContext,\n\tresolveSymbolColumn,\n\tsortDiagnostics,\n\tsymbolKindToIcon,\n\turiToFile,\n} from \"./utils.js\";\n\nexport type { LspServerStatus } from \"./client.js\";\nexport type { LspToolDetails } from \"./types.js\";\nexport { lspSchema } from \"./types.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst lspDescription = fsSync.readFileSync(path.join(__dirname, \"lsp.md\"), \"utf-8\");\n\n// =============================================================================\n// Warmup API\n// =============================================================================\n\nexport interface LspWarmupResult {\n\tservers: Array<{\n\t\tname: string;\n\t\tstatus: \"ready\" | \"error\";\n\t\tfileTypes: string[];\n\t\terror?: string;\n\t}>;\n}\n\nexport async function warmupLspServers(cwd: string): Promise<LspWarmupResult> {\n\tconst config = loadConfig(cwd);\n\tsetIdleTimeout(config.idleTimeoutMs);\n\tconst servers: LspWarmupResult[\"servers\"] = [];\n\tconst lspServers = getLspServers(config);\n\n\tconst results = await Promise.allSettled(\n\t\tlspServers.map(async ([name, serverConfig]) => {\n\t\t\tconst client = await getOrCreateClient(serverConfig, cwd, serverConfig.warmupTimeoutMs ?? WARMUP_TIMEOUT_MS);\n\t\t\treturn { name, client, fileTypes: serverConfig.fileTypes };\n\t\t}),\n\t);\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst result = results[i];\n\t\tconst [name, serverConfig] = lspServers[i];\n\t\tif (result.status === \"fulfilled\") {\n\t\t\tservers.push({\n\t\t\t\tname: result.value.name,\n\t\t\t\tstatus: \"ready\",\n\t\t\t\tfileTypes: result.value.fileTypes,\n\t\t\t});\n\t\t} else {\n\t\t\tservers.push({\n\t\t\t\tname,\n\t\t\t\tstatus: \"error\",\n\t\t\t\tfileTypes: serverConfig.fileTypes,\n\t\t\t\terror: result.reason?.message ?? String(result.reason),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { servers };\n}\n\nexport function getLspStatus(): LspServerStatus[] {\n\treturn getActiveClients();\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\nconst configCache = new Map<string, LspConfig>();\n\nfunction getConfig(cwd: string): LspConfig {\n\tlet config = configCache.get(cwd);\n\tif (!config) {\n\t\tconfig = loadConfig(cwd);\n\t\tsetIdleTimeout(config.idleTimeoutMs);\n\t\tconfigCache.set(cwd, config);\n\t}\n\treturn config;\n}\n\nfunction getLspServers(config: LspConfig): Array<[string, ServerConfig]> {\n\treturn Object.entries(config.servers) as Array<[string, ServerConfig]>;\n}\n\nfunction getLspServersForFile(config: LspConfig, filePath: string): Array<[string, ServerConfig]> {\n\treturn getServersForFile(config, filePath);\n}\n\nfunction getLspServerForFile(config: LspConfig, filePath: string): [string, ServerConfig] | null {\n\tconst servers = getLspServersForFile(config, filePath);\n\treturn servers.length > 0 ? servers[0] : null;\n}\n\nconst DIAGNOSTIC_MESSAGE_LIMIT = 50;\nconst SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS = 3000;\nconst BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS = 400;\nconst MAX_GLOB_DIAGNOSTIC_TARGETS = 20;\nconst WORKSPACE_SYMBOL_LIMIT = 200;\n\nfunction limitDiagnosticMessages(messages: string[]): string[] {\n\tif (messages.length <= DIAGNOSTIC_MESSAGE_LIMIT) {\n\t\treturn messages;\n\t}\n\treturn messages.slice(0, DIAGNOSTIC_MESSAGE_LIMIT);\n}\n\nconst LOCATION_CONTEXT_LINES = 1;\nconst REFERENCE_CONTEXT_LIMIT = 50;\n\nfunction normalizeLocationResult(result: Location | Location[] | LocationLink | LocationLink[] | null): Location[] {\n\tif (!result) return [];\n\tconst raw = Array.isArray(result) ? result : [result];\n\treturn raw.flatMap(loc => {\n\t\tif (\"uri\" in loc) {\n\t\t\treturn [loc as Location];\n\t\t}\n\t\tif (\"targetUri\" in loc) {\n\t\t\tconst link = loc as LocationLink;\n\t\t\treturn [{ uri: link.targetUri, range: link.targetSelectionRange ?? link.targetRange }];\n\t\t}\n\t\treturn [];\n\t});\n}\n\nasync function formatLocationWithContext(location: Location, cwd: string): Promise<string> {\n\tconst header = ` ${formatLocation(location, cwd)}`;\n\tconst context = await readLocationContext(\n\t\turiToFile(location.uri),\n\t\tlocation.range.start.line + 1,\n\t\tLOCATION_CONTEXT_LINES,\n\t);\n\tif (context.length === 0) {\n\t\treturn header;\n\t}\n\treturn `${header}\\n${context.map(lineText => ` ${lineText}`).join(\"\\n\")}`;\n}\n\nasync function reloadServer(client: LspClient, serverName: string, signal?: AbortSignal): Promise<string> {\n\tlet output = `Restarted ${serverName}`;\n\tconst reloadMethods = [\"rust-analyzer/reloadWorkspace\", \"workspace/didChangeConfiguration\"];\n\tfor (const method of reloadMethods) {\n\t\ttry {\n\t\t\tawait sendRequest(client, method, method.includes(\"Configuration\") ? { settings: {} } : null, signal);\n\t\t\toutput = `Reloaded ${serverName}`;\n\t\t\tbreak;\n\t\t} catch {\n\t\t\t// Method not supported, try next\n\t\t}\n\t}\n\tif (output.startsWith(\"Restarted\")) {\n\t\tclient.proc.kill();\n\t\t// Wait for the process to actually exit so the crash recovery handler\n\t\t// removes the client from the cache. Without this, the next\n\t\t// getOrCreateClient call may return the dead client (#815).\n\t\tawait Promise.race([\n\t\t\tclient.proc.exited,\n\t\t\tnew Promise(r => setTimeout(r, 3000)),\n\t\t]);\n\t}\n\treturn output;\n}\n\nasync function waitForDiagnostics(\n\tclient: LspClient,\n\turi: string,\n\ttimeoutMs = 3000,\n\tsignal?: AbortSignal,\n\tminVersion?: number,\n): Promise<Diagnostic[]> {\n\tconst start = Date.now();\n\twhile (Date.now() - start < timeoutMs) {\n\t\tthrowIfAborted(signal);\n\t\tconst diagnostics = client.diagnostics.get(uri);\n\t\tconst versionOk = minVersion === undefined || client.diagnosticsVersion > minVersion;\n\t\tif (diagnostics !== undefined && versionOk) return diagnostics;\n\t\tawait new Promise<void>(resolve => setTimeout(resolve, 100));\n\t}\n\treturn client.diagnostics.get(uri) ?? [];\n}\n\n// =============================================================================\n// Workspace Diagnostics\n// =============================================================================\n\ninterface ProjectType {\n\ttype: \"rust\" | \"typescript\" | \"go\" | \"python\" | \"unknown\";\n\tcommand?: string[];\n\tdescription: string;\n}\n\nfunction detectProjectType(cwd: string): ProjectType {\n\tif (fs.existsSync(path.join(cwd, \"Cargo.toml\"))) {\n\t\treturn { type: \"rust\", command: [\"cargo\", \"check\", \"--message-format=short\"], description: \"Rust (cargo check)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"tsconfig.json\"))) {\n\t\treturn { type: \"typescript\", command: [\"npx\", \"tsc\", \"--noEmit\"], description: \"TypeScript (tsc --noEmit)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"go.mod\"))) {\n\t\treturn { type: \"go\", command: [\"go\", \"build\", \"./...\"], description: \"Go (go build)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"pyproject.toml\")) || fs.existsSync(path.join(cwd, \"pyrightconfig.json\"))) {\n\t\treturn { type: \"python\", command: [\"pyright\"], description: \"Python (pyright)\" };\n\t}\n\treturn { type: \"unknown\", description: \"Unknown project type\" };\n}\n\nasync function runWorkspaceDiagnostics(\n\tcwd: string,\n\tsignal?: AbortSignal,\n): Promise<{ output: string; projectType: ProjectType }> {\n\tthrowIfAborted(signal);\n\tconst projectType = detectProjectType(cwd);\n\tif (!projectType.command) {\n\t\treturn {\n\t\t\toutput: \"Cannot detect project type. Supported: Rust (Cargo.toml), TypeScript (tsconfig.json), Go (go.mod), Python (pyproject.toml)\",\n\t\t\tprojectType,\n\t\t};\n\t}\n\tconst [cmd, ...cmdArgs] = projectType.command;\n\tconst proc = spawn(cmd, cmdArgs, {\n\t\tcwd,\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t});\n\tconst abortHandler = () => {\n\t\tproc.kill();\n\t};\n\tif (signal) {\n\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t}\n\n\ttry {\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\n\t\tproc.stdout?.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n\t\tproc.stderr?.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\tproc.on(\"exit\", (code: number | null) => resolve(code ?? 1));\n\t\t});\n\n\t\tconst stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\");\n\t\tconst stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n\n\t\tthrowIfAborted(signal);\n\t\tconst combined = (stdout + stderr).trim();\n\t\tif (!combined) {\n\t\t\treturn { output: \"No issues found\", projectType };\n\t\t}\n\t\tconst lines = combined.split(\"\\n\");\n\t\tif (lines.length > 50) {\n\t\t\treturn { output: `${lines.slice(0, 50).join(\"\\n\")}\\n... and ${lines.length - 50} more lines`, projectType };\n\t\t}\n\t\treturn { output: combined, projectType };\n\t} catch (e: unknown) {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new ToolAbortError();\n\t\t}\n\t\treturn { output: `Failed to run ${projectType.command.join(\" \")}: ${e}`, projectType };\n\t} finally {\n\t\tsignal?.removeEventListener(\"abort\", abortHandler);\n\t}\n}\n\n// =============================================================================\n// Path Resolution\n// =============================================================================\n\nfunction resolveToCwd(file: string, cwd: string): string {\n\treturn path.resolve(cwd, file);\n}\n\n// =============================================================================\n// Tool Factory\n// =============================================================================\n\n/**\n * Create an LSP tool configured for a specific working directory.\n */\nexport function createLspTool(cwd: string): AgentTool<typeof lspSchema, LspToolDetails> {\n\treturn {\n\t\tname: \"lsp\",\n\t\tlabel: \"LSP\",\n\t\tdescription: lspDescription,\n\t\tparameters: lspSchema,\n\n\t\tasync execute(\n\t\t\t_toolCallId: string,\n\t\t\tparams: LspParams,\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?: AgentToolUpdateCallback<LspToolDetails>,\n\t\t): Promise<AgentToolResult<LspToolDetails>> {\n\t\t\tconst { action, file, line, symbol, occurrence, query, new_name, apply, tab_size, insert_spaces, timeout } = params;\n\t\t\tconst timeoutSec = clampTimeout(timeout);\n\t\t\tconst timeoutSignal = AbortSignal.timeout(timeoutSec * 1000);\n\t\t\tsignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;\n\t\t\tthrowIfAborted(signal);\n\n\t\t\tconst config = getConfig(cwd);\n\n\t\t\t// Status action doesn't need a file\n\t\t\tif (action === \"status\") {\n\t\t\t\tconst servers = Object.keys(config.servers);\n\t\t\t\tconst lspmuxState = await detectLspmux();\n\t\t\t\tconst lspmuxStatus = lspmuxState.available\n\t\t\t\t\t? lspmuxState.running\n\t\t\t\t\t\t? \"lspmux: active (multiplexing enabled)\"\n\t\t\t\t\t\t: \"lspmux: installed but server not running\"\n\t\t\t\t\t: \"\";\n\n\t\t\t\tconst serverStatus =\n\t\t\t\t\tservers.length > 0\n\t\t\t\t\t\t? `Active language servers: ${servers.join(\", \")}`\n\t\t\t\t\t\t: \"No language servers configured for this project\";\n\n\t\t\t\tconst output = lspmuxStatus ? `${serverStatus}\\n${lspmuxStatus}` : serverStatus;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Diagnostics can be batch or single-file\n\t\t\tif (action === \"diagnostics\") {\n\t\t\t\tif (!file) {\n\t\t\t\t\tconst result = await runWorkspaceDiagnostics(cwd, signal);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Workspace diagnostics (${result.projectType.description}):\\n${result.output}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlet targets: string[];\n\t\t\t\tlet truncatedGlobTargets = false;\n\t\t\t\tif (hasGlobPattern(file)) {\n\t\t\t\t\tconst globMatches = await collectGlobMatches(file, cwd, MAX_GLOB_DIAGNOSTIC_TARGETS);\n\t\t\t\t\ttargets = globMatches.matches;\n\t\t\t\t\ttruncatedGlobTargets = globMatches.truncated;\n\t\t\t\t} else {\n\t\t\t\t\ttargets = [file];\n\t\t\t\t}\n\n\t\t\t\tif (targets.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No files matched pattern: ${file}` }],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst detailed = targets.length > 1 || truncatedGlobTargets;\n\t\t\t\tconst diagnosticsWaitTimeoutMs = detailed\n\t\t\t\t\t? Math.min(BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000)\n\t\t\t\t\t: Math.min(SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000);\n\t\t\t\tconst results: string[] = [];\n\t\t\t\tconst allServerNames = new Set<string>();\n\t\t\t\tif (truncatedGlobTargets) {\n\t\t\t\t\tresults.push(\n\t\t\t\t\t\t`[W] Pattern matched more than ${MAX_GLOB_DIAGNOSTIC_TARGETS} files; showing first ${MAX_GLOB_DIAGNOSTIC_TARGETS}. Narrow the glob or use workspace diagnostics.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const target of targets) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\tconst resolved = resolveToCwd(target, cwd);\n\t\t\t\t\tconst servers = getServersForFile(config, resolved);\n\t\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\t\tresults.push(`[E] ${target}: No language server found`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst uri = fileToUri(resolved);\n\t\t\t\t\tconst relPath = path.relative(cwd, resolved);\n\t\t\t\t\tconst allDiagnostics: Diagnostic[] = [];\n\n\t\t\t\t\tfor (const [serverName, serverConfig] of servers) {\n\t\t\t\t\t\tallServerNames.add(serverName);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\t\t\t\tconst minVersion = client.diagnosticsVersion;\n\t\t\t\t\t\t\tawait refreshFile(client, resolved, signal);\n\t\t\t\t\t\t\tconst diagnostics = await waitForDiagnostics(\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\turi,\n\t\t\t\t\t\t\t\tdiagnosticsWaitTimeoutMs,\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\tminVersion,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tallDiagnostics.push(...diagnostics);\n\t\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Deduplicate\n\t\t\t\t\tconst seen = new Set<string>();\n\t\t\t\t\tconst uniqueDiagnostics: Diagnostic[] = [];\n\t\t\t\t\tfor (const d of allDiagnostics) {\n\t\t\t\t\t\tconst key = `${d.range.start.line}:${d.range.start.character}:${d.range.end.line}:${d.range.end.character}:${d.message}`;\n\t\t\t\t\t\tif (!seen.has(key)) {\n\t\t\t\t\t\t\tseen.add(key);\n\t\t\t\t\t\t\tuniqueDiagnostics.push(d);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsortDiagnostics(uniqueDiagnostics);\n\n\t\t\t\t\tif (!detailed && targets.length === 1) {\n\t\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No diagnostics\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tconst output = `${summary}:\\n${formatGroupedDiagnosticMessages(formatted)}`;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\tresults.push(`OK ${relPath}: no issues`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tresults.push(`[E] ${relPath}: ${summary}`);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tresults.push(formatGroupedDiagnosticMessages(formatted));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: results.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst requiresFile = !file && action !== \"symbols\" && action !== \"reload\";\n\n\t\t\tif (requiresFile) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: file parameter required for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst resolvedFile = file ? resolveToCwd(file, cwd) : null;\n\n\t\t\t// Workspace symbol search (no file)\n\t\t\tif (action === \"symbols\" && !resolvedFile) {\n\t\t\t\tconst normalizedQuery = query?.trim();\n\t\t\t\tif (!normalizedQuery) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: query parameter required for workspace symbol search\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst aggregatedSymbols: SymbolInformation[] = [];\n\t\t\t\tconst respondingServers = new Set<string>();\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\tconst workspaceResult = (await sendRequest(\n\t\t\t\t\t\t\tworkspaceClient,\n\t\t\t\t\t\t\t\"workspace/symbol\",\n\t\t\t\t\t\t\t{ query: normalizedQuery },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SymbolInformation[] | null;\n\t\t\t\t\t\tif (!workspaceResult || workspaceResult.length === 0) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespondingServers.add(workspaceServerName);\n\t\t\t\t\t\taggregatedSymbols.push(...filterWorkspaceSymbols(workspaceResult, normalizedQuery));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst dedupedSymbols = dedupeWorkspaceSymbols(aggregatedSymbols);\n\t\t\t\tif (dedupedSymbols.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No symbols matching \"${normalizedQuery}\"` }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\trequest: params,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst limitedSymbols = dedupedSymbols.slice(0, WORKSPACE_SYMBOL_LIMIT);\n\t\t\t\tconst lines = limitedSymbols.map(s => formatSymbolInformation(s, cwd));\n\t\t\t\tconst truncationLine =\n\t\t\t\t\tdedupedSymbols.length > WORKSPACE_SYMBOL_LIMIT\n\t\t\t\t\t\t? `\\n... ${dedupedSymbols.length - WORKSPACE_SYMBOL_LIMIT} additional symbol(s) omitted`\n\t\t\t\t\t\t: \"\";\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Found ${dedupedSymbols.length} symbol(s) matching \"${normalizedQuery}\":\\n${lines.map(l => ` ${l}`).join(\"\\n\")}${truncationLine}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\trequest: params,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Reload all servers (no file)\n\t\t\tif (action === \"reload\" && !resolvedFile) {\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst outputs: string[] = [];\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\toutputs.push(await reloadServer(workspaceClient, workspaceServerName, signal));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\toutputs.push(`Failed to reload ${workspaceServerName}: ${errorMessage}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: outputs.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: servers.map(([name]) => name).join(\", \"), success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// File-specific actions\n\t\t\tconst serverInfo = resolvedFile ? getLspServerForFile(config, resolvedFile) : null;\n\t\t\tif (!serverInfo) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst [serverName, serverConfig] = serverInfo;\n\n\t\t\ttry {\n\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\tconst targetFile = resolvedFile;\n\n\t\t\t\tif (targetFile) {\n\t\t\t\t\tawait ensureFileOpen(client, targetFile, signal);\n\t\t\t\t}\n\n\t\t\t\tconst uri = targetFile ? fileToUri(targetFile) : \"\";\n\t\t\t\tconst resolvedLine = line ?? 1;\n\t\t\t\tconst resolvedCharacter = targetFile\n\t\t\t\t\t? await resolveSymbolColumn(targetFile, resolvedLine, symbol, occurrence)\n\t\t\t\t\t: 0;\n\t\t\t\tconst position = { line: resolvedLine - 1, character: resolvedCharacter };\n\n\t\t\t\tlet output: string;\n\n\t\t\t\tswitch (action) {\n\t\t\t\t\tcase \"definition\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/definition\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location | Location[] | LocationLink | LocationLink[] | null;\n\n\t\t\t\t\t\tconst locations = normalizeLocationResult(result);\n\n\t\t\t\t\t\tif (locations.length === 0) {\n\t\t\t\t\t\t\toutput = \"No definition found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst lines = await Promise.all(\n\t\t\t\t\t\t\t\tlocations.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\toutput = `Found ${locations.length} definition(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"type_definition\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/typeDefinition\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location | Location[] | LocationLink | LocationLink[] | null;\n\n\t\t\t\t\t\tconst locations = normalizeLocationResult(result);\n\n\t\t\t\t\t\tif (locations.length === 0) {\n\t\t\t\t\t\t\toutput = \"No type definition found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst lines = await Promise.all(\n\t\t\t\t\t\t\t\tlocations.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\toutput = `Found ${locations.length} type definition(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"implementation\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/implementation\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location | Location[] | LocationLink | LocationLink[] | null;\n\n\t\t\t\t\t\tconst locations = normalizeLocationResult(result);\n\n\t\t\t\t\t\tif (locations.length === 0) {\n\t\t\t\t\t\t\toutput = \"No implementation found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst lines = await Promise.all(\n\t\t\t\t\t\t\t\tlocations.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\toutput = `Found ${locations.length} implementation(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"references\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/references\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tcontext: { includeDeclaration: true },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No references found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst contextualReferences = result.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst plainReferences = result.slice(REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst contextualLines = await Promise.all(\n\t\t\t\t\t\t\t\tcontextualReferences.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst plainLines = plainReferences.map(location => ` ${formatLocation(location, cwd)}`);\n\t\t\t\t\t\t\tconst lines = plainLines.length\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t...contextualLines,\n\t\t\t\t\t\t\t\t\t\t` ... ${plainLines.length} additional reference(s) shown without context`,\n\t\t\t\t\t\t\t\t\t\t...plainLines,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: contextualLines;\n\t\t\t\t\t\t\toutput = `Found ${result.length} reference(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"hover\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/hover\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Hover | null;\n\n\t\t\t\t\t\tif (!result || !result.contents) {\n\t\t\t\t\t\t\toutput = \"No hover information\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = extractHoverText(result.contents);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"code_actions\": {\n\t\t\t\t\t\tconst diagnostics = client.diagnostics.get(uri) ?? [];\n\t\t\t\t\t\tconst context: CodeActionContext = {\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\tonly: !apply && query ? [query] : undefined,\n\t\t\t\t\t\t\ttriggerKind: 1,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/codeAction\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\trange: { start: position, end: position },\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (CodeAction | Command)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No code actions available\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (apply === true && query) {\n\t\t\t\t\t\t\tconst normalizedQuery = query.trim();\n\t\t\t\t\t\t\tif (normalizedQuery.length === 0) {\n\t\t\t\t\t\t\t\toutput = \"Error: query parameter required when apply=true for code_actions\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst parsedIndex = /^\\d+$/.test(normalizedQuery) ? Number.parseInt(normalizedQuery, 10) : null;\n\t\t\t\t\t\t\tconst selectedAction = result.find(\n\t\t\t\t\t\t\t\t(actionItem, index) =>\n\t\t\t\t\t\t\t\t\t(parsedIndex !== null && index === parsedIndex) ||\n\t\t\t\t\t\t\t\t\tactionItem.title.toLowerCase().includes(normalizedQuery.toLowerCase()),\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!selectedAction) {\n\t\t\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\t\t\toutput = `No code action matches \"${normalizedQuery}\". Available actions:\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst appliedAction = await applyCodeAction(selectedAction, {\n\t\t\t\t\t\t\t\tresolveCodeAction: async (actionItem: CodeAction) =>\n\t\t\t\t\t\t\t\t\t(await sendRequest(client, \"codeAction/resolve\", actionItem, signal)) as CodeAction,\n\t\t\t\t\t\t\t\tapplyWorkspaceEdit: async (edit: WorkspaceEdit) => applyWorkspaceEdit(edit, cwd),\n\t\t\t\t\t\t\t\texecuteCommand: async (commandItem: Command) => {\n\t\t\t\t\t\t\t\t\tawait sendRequest(\n\t\t\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\t\t\t\"workspace/executeCommand\",\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tcommand: commandItem.command,\n\t\t\t\t\t\t\t\t\t\t\targuments: commandItem.arguments ?? [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!appliedAction) {\n\t\t\t\t\t\t\t\toutput = `Action \"${selectedAction.title}\" has no workspace edit or command to apply`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst summaryLines: string[] = [];\n\t\t\t\t\t\t\tif (appliedAction.edits.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Workspace edit:\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.edits.map(item => ` ${item}`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (appliedAction.executedCommands.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Executed command(s):\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.executedCommands.map(commandName => ` ${commandName}`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toutput = `Applied \"${appliedAction.title}\":\\n${summaryLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\toutput = `${result.length} code action(s):\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"symbols\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for document symbols\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/documentSymbol\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (DocumentSymbol | SymbolInformation)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No symbols found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\tif (\"selectionRange\" in result[0]) {\n\t\t\t\t\t\t\t\tconst lines = (result as DocumentSymbol[]).flatMap(s => formatDocumentSymbol(s));\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst lines = (result as SymbolInformation[]).map(s => {\n\t\t\t\t\t\t\t\t\tconst line = s.location.range.start.line + 1;\n\t\t\t\t\t\t\t\t\tconst icon = symbolKindToIcon(s.kind);\n\t\t\t\t\t\t\t\t\treturn `${icon} ${s.name} @ line ${line}`;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"incoming_calls\": {\n\t\t\t\t\t\tconst prepareResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/prepareCallHierarchy\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyItem[] | null;\n\n\t\t\t\t\t\tif (!prepareResult || prepareResult.length === 0) {\n\t\t\t\t\t\t\toutput = \"No call hierarchy item found at this position\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst incomingResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"callHierarchy/incomingCalls\",\n\t\t\t\t\t\t\t{ item: prepareResult[0] },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyIncomingCall[] | null;\n\n\t\t\t\t\t\tif (!incomingResult || incomingResult.length === 0) {\n\t\t\t\t\t\t\toutput = `No incoming calls found for ${prepareResult[0].name}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst incomingLines: string[] = [];\n\t\t\t\t\t\tconst limitedIncoming = incomingResult.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\tfor (const call of limitedIncoming) {\n\t\t\t\t\t\t\tconst header = formatCallHierarchyItem(call.from, cwd);\n\t\t\t\t\t\t\tconst filePath = uriToFile(call.from.uri);\n\t\t\t\t\t\t\tconst callLine = call.fromRanges[0]?.start.line ?? call.from.selectionRange.start.line;\n\t\t\t\t\t\t\tconst context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);\n\t\t\t\t\t\t\tif (context.length > 0) {\n\t\t\t\t\t\t\t\tincomingLines.push(` ${header}\\n${context.map(l => ` ${l}`).join(\"\\n\")}`);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tincomingLines.push(` ${header}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst truncation = incomingResult.length > REFERENCE_CONTEXT_LIMIT\n\t\t\t\t\t\t\t? `\\n ... ${incomingResult.length - REFERENCE_CONTEXT_LIMIT} additional caller(s) omitted`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\toutput = `${incomingResult.length} caller(s) of ${prepareResult[0].name}:\\n${incomingLines.join(\"\\n\")}${truncation}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"outgoing_calls\": {\n\t\t\t\t\t\tconst prepareResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/prepareCallHierarchy\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyItem[] | null;\n\n\t\t\t\t\t\tif (!prepareResult || prepareResult.length === 0) {\n\t\t\t\t\t\t\toutput = \"No call hierarchy item found at this position\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst outgoingResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"callHierarchy/outgoingCalls\",\n\t\t\t\t\t\t\t{ item: prepareResult[0] },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyOutgoingCall[] | null;\n\n\t\t\t\t\t\tif (!outgoingResult || outgoingResult.length === 0) {\n\t\t\t\t\t\t\toutput = `No outgoing calls found from ${prepareResult[0].name}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst outgoingLines: string[] = [];\n\t\t\t\t\t\tconst limitedOutgoing = outgoingResult.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\tfor (const call of limitedOutgoing) {\n\t\t\t\t\t\t\tconst header = formatCallHierarchyItem(call.to, cwd);\n\t\t\t\t\t\t\tconst filePath = uriToFile(call.to.uri);\n\t\t\t\t\t\t\tconst callLine = call.to.selectionRange.start.line;\n\t\t\t\t\t\t\tconst context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);\n\t\t\t\t\t\t\tif (context.length > 0) {\n\t\t\t\t\t\t\t\toutgoingLines.push(` ${header}\\n${context.map(l => ` ${l}`).join(\"\\n\")}`);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutgoingLines.push(` ${header}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst outTruncation = outgoingResult.length > REFERENCE_CONTEXT_LIMIT\n\t\t\t\t\t\t\t? `\\n ... ${outgoingResult.length - REFERENCE_CONTEXT_LIMIT} additional callee(s) omitted`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\toutput = `${outgoingResult.length} callee(s) from ${prepareResult[0].name}:\\n${outgoingLines.join(\"\\n\")}${outTruncation}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"format\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for format\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst formatResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/formatting\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\t\ttabSize: tab_size ?? 4,\n\t\t\t\t\t\t\t\t\tinsertSpaces: insert_spaces ?? true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as TextEdit[] | null;\n\n\t\t\t\t\t\tif (!formatResult || formatResult.length === 0) {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\toutput = `${relPath}: already formatted (no changes)`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait applyTextEdits(targetFile, formatResult);\n\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\toutput = `Formatted ${relPath}: ${formatResult.length} edit(s) applied`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"signature\": {\n\t\t\t\t\t\tconst sigResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/signatureHelp\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SignatureHelp | null;\n\n\t\t\t\t\t\tif (!sigResult || !sigResult.signatures || sigResult.signatures.length === 0) {\n\t\t\t\t\t\t\toutput = \"No signature information at this position\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = formatSignatureHelp(sigResult);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"rename\": {\n\t\t\t\t\t\tif (!new_name) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: new_name parameter required for rename\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName, success: false },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/rename\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tnewName: new_name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as WorkspaceEdit | null;\n\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\toutput = \"Rename returned no edits\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst shouldApply = apply !== false;\n\t\t\t\t\t\t\tif (shouldApply) {\n\t\t\t\t\t\t\t\tconst applied = await applyWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Applied rename:\\n${applied.map(a => ` ${a}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst preview = formatWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Rename preview:\\n${preview.map(p => ` ${p}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"reload\": {\n\t\t\t\t\t\toutput = await reloadServer(client, serverName, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\toutput = `Unknown action: ${action}`;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { serverName, action, success: true, request: params },\n\t\t\t\t};\n\t\t\t} catch (err: unknown) {\n\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\tthrow new ToolAbortError();\n\t\t\t\t}\n\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `LSP error: ${errorMessage}` }],\n\t\t\t\t\tdetails: { serverName, action, success: false, request: params },\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Default LSP tool using process.cwd().\n */\nexport const lspTool = createLspTool(process.cwd());\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/lsp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as fsSync from \"node:fs\";\nimport * as path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from \"@gsd/pi-agent-core\";\nimport {\n\tensureFileOpen,\n\tgetActiveClients,\n\tgetOrCreateClient,\n\ttype LspServerStatus,\n\trefreshFile,\n\tsendRequest,\n\tsetIdleTimeout,\n\tWARMUP_TIMEOUT_MS,\n} from \"./client.js\";\nimport { getServersForFile, type LspConfig, loadConfig, hasRootMarkers, resolveCommand } from \"./config.js\";\nimport { applyTextEdits, applyWorkspaceEdit } from \"./edits.js\";\nimport { ToolAbortError, clampTimeout, throwIfAborted } from \"./helpers.js\";\nimport { detectLspmux } from \"./lspmux.js\";\nimport {\n\ttype CallHierarchyIncomingCall,\n\ttype CallHierarchyItem,\n\ttype CallHierarchyOutgoingCall,\n\ttype CodeAction,\n\ttype CodeActionContext,\n\ttype Command,\n\ttype Diagnostic,\n\ttype DocumentSymbol,\n\ttype Hover,\n\ttype Location,\n\ttype LocationLink,\n\ttype LspClient,\n\ttype LspParams,\n\ttype LspToolDetails,\n\tlspSchema,\n\ttype ServerConfig,\n\ttype SignatureHelp,\n\ttype SymbolInformation,\n\ttype TextEdit,\n\ttype WorkspaceEdit,\n} from \"./types.js\";\nimport {\n\tapplyCodeAction,\n\tcollectGlobMatches,\n\tdedupeWorkspaceSymbols,\n\textractHoverText,\n\tfileToUri,\n\tfilterWorkspaceSymbols,\n\tformatCallHierarchyItem,\n\tformatCodeAction,\n\tformatDiagnostic,\n\tformatDiagnosticsSummary,\n\tformatDocumentSymbol,\n\tformatGroupedDiagnosticMessages,\n\tformatLocation,\n\tformatSignatureHelp,\n\tformatSymbolInformation,\n\tformatWorkspaceEdit,\n\thasGlobPattern,\n\treadLocationContext,\n\tresolveSymbolColumn,\n\tsortDiagnostics,\n\tsymbolKindToIcon,\n\turiToFile,\n} from \"./utils.js\";\n\nexport type { LspServerStatus } from \"./client.js\";\nexport type { LspToolDetails } from \"./types.js\";\nexport { lspSchema } from \"./types.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst lspDescription = fsSync.readFileSync(path.join(__dirname, \"lsp.md\"), \"utf-8\");\n\n// =============================================================================\n// Warmup API\n// =============================================================================\n\nexport interface LspWarmupResult {\n\tservers: Array<{\n\t\tname: string;\n\t\tstatus: \"ready\" | \"error\";\n\t\tfileTypes: string[];\n\t\terror?: string;\n\t}>;\n}\n\nexport async function warmupLspServers(cwd: string): Promise<LspWarmupResult> {\n\tconst config = loadConfig(cwd);\n\tsetIdleTimeout(config.idleTimeoutMs);\n\tconst servers: LspWarmupResult[\"servers\"] = [];\n\tconst lspServers = getLspServers(config);\n\n\tconst results = await Promise.allSettled(\n\t\tlspServers.map(async ([name, serverConfig]) => {\n\t\t\tconst client = await getOrCreateClient(serverConfig, cwd, serverConfig.warmupTimeoutMs ?? WARMUP_TIMEOUT_MS);\n\t\t\treturn { name, client, fileTypes: serverConfig.fileTypes };\n\t\t}),\n\t);\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst result = results[i];\n\t\tconst [name, serverConfig] = lspServers[i];\n\t\tif (result.status === \"fulfilled\") {\n\t\t\tservers.push({\n\t\t\t\tname: result.value.name,\n\t\t\t\tstatus: \"ready\",\n\t\t\t\tfileTypes: result.value.fileTypes,\n\t\t\t});\n\t\t} else {\n\t\t\tservers.push({\n\t\t\t\tname,\n\t\t\t\tstatus: \"error\",\n\t\t\t\tfileTypes: serverConfig.fileTypes,\n\t\t\t\terror: result.reason?.message ?? String(result.reason),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { servers };\n}\n\nexport function getLspStatus(): LspServerStatus[] {\n\treturn getActiveClients();\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\nconst configCache = new Map<string, LspConfig>();\n\nfunction getConfig(cwd: string): LspConfig {\n\tlet config = configCache.get(cwd);\n\tif (!config) {\n\t\tconfig = loadConfig(cwd);\n\t\tsetIdleTimeout(config.idleTimeoutMs);\n\t\tconfigCache.set(cwd, config);\n\t}\n\treturn config;\n}\n\nfunction getLspServers(config: LspConfig): Array<[string, ServerConfig]> {\n\treturn Object.entries(config.servers) as Array<[string, ServerConfig]>;\n}\n\nfunction getLspServersForFile(config: LspConfig, filePath: string): Array<[string, ServerConfig]> {\n\treturn getServersForFile(config, filePath);\n}\n\nfunction getLspServerForFile(config: LspConfig, filePath: string): [string, ServerConfig] | null {\n\tconst servers = getLspServersForFile(config, filePath);\n\treturn servers.length > 0 ? servers[0] : null;\n}\n\nconst DIAGNOSTIC_MESSAGE_LIMIT = 50;\nconst SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS = 3000;\nconst BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS = 400;\nconst MAX_GLOB_DIAGNOSTIC_TARGETS = 20;\nconst WORKSPACE_SYMBOL_LIMIT = 200;\n\nfunction limitDiagnosticMessages(messages: string[]): string[] {\n\tif (messages.length <= DIAGNOSTIC_MESSAGE_LIMIT) {\n\t\treturn messages;\n\t}\n\treturn messages.slice(0, DIAGNOSTIC_MESSAGE_LIMIT);\n}\n\nconst LOCATION_CONTEXT_LINES = 1;\nconst REFERENCE_CONTEXT_LIMIT = 50;\n\nfunction normalizeLocationResult(result: Location | Location[] | LocationLink | LocationLink[] | null): Location[] {\n\tif (!result) return [];\n\tconst raw = Array.isArray(result) ? result : [result];\n\treturn raw.flatMap(loc => {\n\t\tif (\"uri\" in loc) {\n\t\t\treturn [loc as Location];\n\t\t}\n\t\tif (\"targetUri\" in loc) {\n\t\t\tconst link = loc as LocationLink;\n\t\t\treturn [{ uri: link.targetUri, range: link.targetSelectionRange ?? link.targetRange }];\n\t\t}\n\t\treturn [];\n\t});\n}\n\nasync function formatLocationWithContext(location: Location, cwd: string): Promise<string> {\n\tconst header = ` ${formatLocation(location, cwd)}`;\n\tconst context = await readLocationContext(\n\t\turiToFile(location.uri),\n\t\tlocation.range.start.line + 1,\n\t\tLOCATION_CONTEXT_LINES,\n\t);\n\tif (context.length === 0) {\n\t\treturn header;\n\t}\n\treturn `${header}\\n${context.map(lineText => ` ${lineText}`).join(\"\\n\")}`;\n}\n\nasync function reloadServer(client: LspClient, serverName: string, signal?: AbortSignal): Promise<string> {\n\tlet output = `Restarted ${serverName}`;\n\tconst reloadMethods = [\"rust-analyzer/reloadWorkspace\", \"workspace/didChangeConfiguration\"];\n\tfor (const method of reloadMethods) {\n\t\ttry {\n\t\t\tawait sendRequest(client, method, method.includes(\"Configuration\") ? { settings: {} } : null, signal);\n\t\t\toutput = `Reloaded ${serverName}`;\n\t\t\tbreak;\n\t\t} catch {\n\t\t\t// Method not supported, try next\n\t\t}\n\t}\n\tif (output.startsWith(\"Restarted\")) {\n\t\tclient.proc.kill();\n\t\t// Wait for the process to actually exit so the crash recovery handler\n\t\t// removes the client from the cache. Without this, the next\n\t\t// getOrCreateClient call may return the dead client (#815).\n\t\tawait Promise.race([\n\t\t\tclient.proc.exited,\n\t\t\tnew Promise(r => setTimeout(r, 3000)),\n\t\t]);\n\t}\n\treturn output;\n}\n\nasync function waitForDiagnostics(\n\tclient: LspClient,\n\turi: string,\n\ttimeoutMs = 3000,\n\tsignal?: AbortSignal,\n\tminVersion?: number,\n): Promise<Diagnostic[]> {\n\tconst start = Date.now();\n\twhile (Date.now() - start < timeoutMs) {\n\t\tthrowIfAborted(signal);\n\t\tconst diagnostics = client.diagnostics.get(uri);\n\t\tconst versionOk = minVersion === undefined || client.diagnosticsVersion > minVersion;\n\t\tif (diagnostics !== undefined && versionOk) return diagnostics;\n\t\tawait new Promise<void>(resolve => setTimeout(resolve, 100));\n\t}\n\treturn client.diagnostics.get(uri) ?? [];\n}\n\n// =============================================================================\n// Workspace Diagnostics\n// =============================================================================\n\ninterface ProjectType {\n\ttype: \"rust\" | \"typescript\" | \"go\" | \"python\" | \"unknown\";\n\tcommand?: string[];\n\tdescription: string;\n}\n\nfunction detectProjectType(cwd: string): ProjectType {\n\tif (fs.existsSync(path.join(cwd, \"Cargo.toml\"))) {\n\t\treturn { type: \"rust\", command: [\"cargo\", \"check\", \"--message-format=short\"], description: \"Rust (cargo check)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"tsconfig.json\"))) {\n\t\treturn { type: \"typescript\", command: [\"npx\", \"tsc\", \"--noEmit\"], description: \"TypeScript (tsc --noEmit)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"go.mod\"))) {\n\t\treturn { type: \"go\", command: [\"go\", \"build\", \"./...\"], description: \"Go (go build)\" };\n\t}\n\tif (fs.existsSync(path.join(cwd, \"pyproject.toml\")) || fs.existsSync(path.join(cwd, \"pyrightconfig.json\"))) {\n\t\treturn { type: \"python\", command: [\"pyright\"], description: \"Python (pyright)\" };\n\t}\n\treturn { type: \"unknown\", description: \"Unknown project type\" };\n}\n\nasync function runWorkspaceDiagnostics(\n\tcwd: string,\n\tsignal?: AbortSignal,\n): Promise<{ output: string; projectType: ProjectType }> {\n\tthrowIfAborted(signal);\n\tconst projectType = detectProjectType(cwd);\n\tif (!projectType.command) {\n\t\treturn {\n\t\t\toutput: \"Cannot detect project type. Supported: Rust (Cargo.toml), TypeScript (tsconfig.json), Go (go.mod), Python (pyproject.toml)\",\n\t\t\tprojectType,\n\t\t};\n\t}\n\tconst [cmd, ...cmdArgs] = projectType.command;\n\tconst proc = spawn(cmd, cmdArgs, {\n\t\tcwd,\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t});\n\tconst abortHandler = () => {\n\t\tproc.kill();\n\t};\n\tif (signal) {\n\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t}\n\n\ttry {\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\n\t\tproc.stdout?.on(\"data\", (chunk: Buffer) => stdoutChunks.push(chunk));\n\t\tproc.stderr?.on(\"data\", (chunk: Buffer) => stderrChunks.push(chunk));\n\n\t\tconst exitCode = await new Promise<number>((resolve) => {\n\t\t\tproc.on(\"exit\", (code: number | null) => resolve(code ?? 1));\n\t\t});\n\n\t\tconst stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\");\n\t\tconst stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n\n\t\tthrowIfAborted(signal);\n\t\tconst combined = (stdout + stderr).trim();\n\t\tif (!combined) {\n\t\t\treturn { output: \"No issues found\", projectType };\n\t\t}\n\t\tconst lines = combined.split(\"\\n\");\n\t\tif (lines.length > 50) {\n\t\t\treturn { output: `${lines.slice(0, 50).join(\"\\n\")}\\n... and ${lines.length - 50} more lines`, projectType };\n\t\t}\n\t\treturn { output: combined, projectType };\n\t} catch (e: unknown) {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new ToolAbortError();\n\t\t}\n\t\treturn { output: `Failed to run ${projectType.command.join(\" \")}: ${e}`, projectType };\n\t} finally {\n\t\tsignal?.removeEventListener(\"abort\", abortHandler);\n\t}\n}\n\n// =============================================================================\n// Path Resolution\n// =============================================================================\n\nfunction resolveToCwd(file: string, cwd: string): string {\n\treturn path.resolve(cwd, file);\n}\n\n// =============================================================================\n// Tool Factory\n// =============================================================================\n\n/**\n * Create an LSP tool configured for a specific working directory.\n */\nexport function createLspTool(cwd: string): AgentTool<typeof lspSchema, LspToolDetails> {\n\treturn {\n\t\tname: \"lsp\",\n\t\tlabel: \"LSP\",\n\t\tdescription: lspDescription,\n\t\tparameters: lspSchema,\n\n\t\tasync execute(\n\t\t\t_toolCallId: string,\n\t\t\tparams: LspParams,\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?: AgentToolUpdateCallback<LspToolDetails>,\n\t\t): Promise<AgentToolResult<LspToolDetails>> {\n\t\t\tconst { action, file, line, symbol, occurrence, query, new_name, apply, tab_size, insert_spaces, timeout } = params;\n\t\t\tconst timeoutSec = clampTimeout(timeout);\n\t\t\tconst timeoutSignal = AbortSignal.timeout(timeoutSec * 1000);\n\t\t\tsignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;\n\t\t\tthrowIfAborted(signal);\n\n\t\t\tconst config = getConfig(cwd);\n\n\t\t\t// Status action doesn't need a file\n\t\t\tif (action === \"status\") {\n\t\t\t\tconst servers = Object.keys(config.servers);\n\t\t\t\tconst lspmuxState = await detectLspmux();\n\t\t\t\tconst lspmuxStatus = lspmuxState.available\n\t\t\t\t\t? lspmuxState.running\n\t\t\t\t\t\t? \"lspmux: active (multiplexing enabled)\"\n\t\t\t\t\t\t: \"lspmux: installed but server not running\"\n\t\t\t\t\t: \"\";\n\n\t\t\t\tlet serverStatus: string;\n\t\t\t\tif (servers.length > 0) {\n\t\t\t\t\tserverStatus = `Active language servers: ${servers.join(\", \")}`;\n\t\t\t\t} else {\n\t\t\t\t\t// Diagnose why no servers were detected\n\t\t\t\t\tconst DEFAULTS = (await import(\"./defaults.json\", { with: { type: \"json\" } })).default as Record<string, { command: string; rootMarkers: string[] }>;\n\t\t\t\t\tconst diagnostics: string[] = [\"No language servers configured for this project.\"];\n\t\t\t\t\tconst matchedButMissing: string[] = [];\n\t\t\t\t\tconst noMarkers: string[] = [];\n\n\t\t\t\t\tfor (const [name, def] of Object.entries(DEFAULTS)) {\n\t\t\t\t\t\tif (hasRootMarkers(cwd, def.rootMarkers)) {\n\t\t\t\t\t\t\tconst resolved = resolveCommand(def.command, cwd);\n\t\t\t\t\t\t\tif (!resolved) {\n\t\t\t\t\t\t\t\tmatchedButMissing.push(` ${name}: project detected (${def.rootMarkers[0]}) but '${def.command}' not found — install it with npm/pip/brew`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (matchedButMissing.length > 0) {\n\t\t\t\t\t\tdiagnostics.push(\"\\nDetected projects missing language servers:\");\n\t\t\t\t\t\tdiagnostics.push(...matchedButMissing);\n\t\t\t\t\t\tdiagnostics.push(\"\\nInstall the missing server command and restart GSD, or run: lsp reload\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiagnostics.push(\"No recognized project markers found in the working directory.\");\n\t\t\t\t\t\tdiagnostics.push(\"LSP auto-detects projects via files like package.json, Cargo.toml, go.mod, pyproject.toml, etc.\");\n\t\t\t\t\t}\n\n\t\t\t\t\tserverStatus = diagnostics.join(\"\\n\");\n\t\t\t\t}\n\n\t\t\t\tconst output = lspmuxStatus ? `${serverStatus}\\n${lspmuxStatus}` : serverStatus;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Diagnostics can be batch or single-file\n\t\t\tif (action === \"diagnostics\") {\n\t\t\t\tif (!file) {\n\t\t\t\t\tconst result = await runWorkspaceDiagnostics(cwd, signal);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: `Workspace diagnostics (${result.projectType.description}):\\n${result.output}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlet targets: string[];\n\t\t\t\tlet truncatedGlobTargets = false;\n\t\t\t\tif (hasGlobPattern(file)) {\n\t\t\t\t\tconst globMatches = await collectGlobMatches(file, cwd, MAX_GLOB_DIAGNOSTIC_TARGETS);\n\t\t\t\t\ttargets = globMatches.matches;\n\t\t\t\t\ttruncatedGlobTargets = globMatches.truncated;\n\t\t\t\t} else {\n\t\t\t\t\ttargets = [file];\n\t\t\t\t}\n\n\t\t\t\tif (targets.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No files matched pattern: ${file}` }],\n\t\t\t\t\t\tdetails: { action, success: true, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst detailed = targets.length > 1 || truncatedGlobTargets;\n\t\t\t\tconst diagnosticsWaitTimeoutMs = detailed\n\t\t\t\t\t? Math.min(BATCH_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000)\n\t\t\t\t\t: Math.min(SINGLE_DIAGNOSTICS_WAIT_TIMEOUT_MS, timeoutSec * 1000);\n\t\t\t\tconst results: string[] = [];\n\t\t\t\tconst allServerNames = new Set<string>();\n\t\t\t\tif (truncatedGlobTargets) {\n\t\t\t\t\tresults.push(\n\t\t\t\t\t\t`[W] Pattern matched more than ${MAX_GLOB_DIAGNOSTIC_TARGETS} files; showing first ${MAX_GLOB_DIAGNOSTIC_TARGETS}. Narrow the glob or use workspace diagnostics.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const target of targets) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\tconst resolved = resolveToCwd(target, cwd);\n\t\t\t\t\tconst servers = getServersForFile(config, resolved);\n\t\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\t\tresults.push(`[E] ${target}: No language server found`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst uri = fileToUri(resolved);\n\t\t\t\t\tconst relPath = path.relative(cwd, resolved);\n\t\t\t\t\tconst allDiagnostics: Diagnostic[] = [];\n\n\t\t\t\t\tfor (const [serverName, serverConfig] of servers) {\n\t\t\t\t\t\tallServerNames.add(serverName);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\t\t\t\tconst minVersion = client.diagnosticsVersion;\n\t\t\t\t\t\t\tawait refreshFile(client, resolved, signal);\n\t\t\t\t\t\t\tconst diagnostics = await waitForDiagnostics(\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\turi,\n\t\t\t\t\t\t\t\tdiagnosticsWaitTimeoutMs,\n\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\tminVersion,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tallDiagnostics.push(...diagnostics);\n\t\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Deduplicate\n\t\t\t\t\tconst seen = new Set<string>();\n\t\t\t\t\tconst uniqueDiagnostics: Diagnostic[] = [];\n\t\t\t\t\tfor (const d of allDiagnostics) {\n\t\t\t\t\t\tconst key = `${d.range.start.line}:${d.range.start.character}:${d.range.end.line}:${d.range.end.character}:${d.message}`;\n\t\t\t\t\t\tif (!seen.has(key)) {\n\t\t\t\t\t\t\tseen.add(key);\n\t\t\t\t\t\t\tuniqueDiagnostics.push(d);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tsortDiagnostics(uniqueDiagnostics);\n\n\t\t\t\t\tif (!detailed && targets.length === 1) {\n\t\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No diagnostics\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tconst output = `${summary}:\\n${formatGroupedDiagnosticMessages(formatted)}`;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (uniqueDiagnostics.length === 0) {\n\t\t\t\t\t\tresults.push(`OK ${relPath}: no issues`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst summary = formatDiagnosticsSummary(uniqueDiagnostics);\n\t\t\t\t\t\tresults.push(`[E] ${relPath}: ${summary}`);\n\t\t\t\t\t\tconst formatted = uniqueDiagnostics.map(d => formatDiagnostic(d, relPath));\n\t\t\t\t\t\tresults.push(formatGroupedDiagnosticMessages(formatted));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: results.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: Array.from(allServerNames).join(\", \"), success: true },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst requiresFile = !file && action !== \"symbols\" && action !== \"reload\";\n\n\t\t\tif (requiresFile) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: file parameter required for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst resolvedFile = file ? resolveToCwd(file, cwd) : null;\n\n\t\t\t// Workspace symbol search (no file)\n\t\t\tif (action === \"symbols\" && !resolvedFile) {\n\t\t\t\tconst normalizedQuery = query?.trim();\n\t\t\t\tif (!normalizedQuery) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: query parameter required for workspace symbol search\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst aggregatedSymbols: SymbolInformation[] = [];\n\t\t\t\tconst respondingServers = new Set<string>();\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\tconst workspaceResult = (await sendRequest(\n\t\t\t\t\t\t\tworkspaceClient,\n\t\t\t\t\t\t\t\"workspace/symbol\",\n\t\t\t\t\t\t\t{ query: normalizedQuery },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SymbolInformation[] | null;\n\t\t\t\t\t\tif (!workspaceResult || workspaceResult.length === 0) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespondingServers.add(workspaceServerName);\n\t\t\t\t\t\taggregatedSymbols.push(...filterWorkspaceSymbols(workspaceResult, normalizedQuery));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst dedupedSymbols = dedupeWorkspaceSymbols(aggregatedSymbols);\n\t\t\t\tif (dedupedSymbols.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `No symbols matching \"${normalizedQuery}\"` }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\trequest: params,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst limitedSymbols = dedupedSymbols.slice(0, WORKSPACE_SYMBOL_LIMIT);\n\t\t\t\tconst lines = limitedSymbols.map(s => formatSymbolInformation(s, cwd));\n\t\t\t\tconst truncationLine =\n\t\t\t\t\tdedupedSymbols.length > WORKSPACE_SYMBOL_LIMIT\n\t\t\t\t\t\t? `\\n... ${dedupedSymbols.length - WORKSPACE_SYMBOL_LIMIT} additional symbol(s) omitted`\n\t\t\t\t\t\t: \"\";\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Found ${dedupedSymbols.length} symbol(s) matching \"${normalizedQuery}\":\\n${lines.map(l => ` ${l}`).join(\"\\n\")}${truncationLine}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tserverName: Array.from(respondingServers).join(\", \"),\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\trequest: params,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Reload all servers (no file)\n\t\t\tif (action === \"reload\" && !resolvedFile) {\n\t\t\t\tconst servers = getLspServers(config);\n\t\t\t\tif (servers.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\t\tdetails: { action, success: false, request: params },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst outputs: string[] = [];\n\t\t\t\tfor (const [workspaceServerName, workspaceServerConfig] of servers) {\n\t\t\t\t\tthrowIfAborted(signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst workspaceClient = await getOrCreateClient(workspaceServerConfig, cwd);\n\t\t\t\t\t\toutputs.push(await reloadServer(workspaceClient, workspaceServerName, signal));\n\t\t\t\t\t} catch (err: unknown) {\n\t\t\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\t\t\tthrow err;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\toutputs.push(`Failed to reload ${workspaceServerName}: ${errorMessage}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: outputs.join(\"\\n\") }],\n\t\t\t\t\tdetails: { action, serverName: servers.map(([name]) => name).join(\", \"), success: true, request: params },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// File-specific actions\n\t\t\tconst serverInfo = resolvedFile ? getLspServerForFile(config, resolvedFile) : null;\n\t\t\tif (!serverInfo) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"No language server found for this action\" }],\n\t\t\t\t\tdetails: { action, success: false },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst [serverName, serverConfig] = serverInfo;\n\n\t\t\ttry {\n\t\t\t\tconst client = await getOrCreateClient(serverConfig, cwd);\n\t\t\t\tconst targetFile = resolvedFile;\n\n\t\t\t\tif (targetFile) {\n\t\t\t\t\tawait ensureFileOpen(client, targetFile, signal);\n\t\t\t\t}\n\n\t\t\t\tconst uri = targetFile ? fileToUri(targetFile) : \"\";\n\t\t\t\tconst resolvedLine = line ?? 1;\n\t\t\t\tconst resolvedCharacter = targetFile\n\t\t\t\t\t? await resolveSymbolColumn(targetFile, resolvedLine, symbol, occurrence)\n\t\t\t\t\t: 0;\n\t\t\t\tconst position = { line: resolvedLine - 1, character: resolvedCharacter };\n\n\t\t\t\tlet output: string;\n\n\t\t\t\tswitch (action) {\n\t\t\t\t\tcase \"definition\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/definition\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location | Location[] | LocationLink | LocationLink[] | null;\n\n\t\t\t\t\t\tconst locations = normalizeLocationResult(result);\n\n\t\t\t\t\t\tif (locations.length === 0) {\n\t\t\t\t\t\t\toutput = \"No definition found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst lines = await Promise.all(\n\t\t\t\t\t\t\t\tlocations.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\toutput = `Found ${locations.length} definition(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"type_definition\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/typeDefinition\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location | Location[] | LocationLink | LocationLink[] | null;\n\n\t\t\t\t\t\tconst locations = normalizeLocationResult(result);\n\n\t\t\t\t\t\tif (locations.length === 0) {\n\t\t\t\t\t\t\toutput = \"No type definition found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst lines = await Promise.all(\n\t\t\t\t\t\t\t\tlocations.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\toutput = `Found ${locations.length} type definition(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"implementation\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/implementation\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location | Location[] | LocationLink | LocationLink[] | null;\n\n\t\t\t\t\t\tconst locations = normalizeLocationResult(result);\n\n\t\t\t\t\t\tif (locations.length === 0) {\n\t\t\t\t\t\t\toutput = \"No implementation found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst lines = await Promise.all(\n\t\t\t\t\t\t\t\tlocations.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\toutput = `Found ${locations.length} implementation(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"references\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/references\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tcontext: { includeDeclaration: true },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Location[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No references found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst contextualReferences = result.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst plainReferences = result.slice(REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\t\tconst contextualLines = await Promise.all(\n\t\t\t\t\t\t\t\tcontextualReferences.map(location => formatLocationWithContext(location, cwd)),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst plainLines = plainReferences.map(location => ` ${formatLocation(location, cwd)}`);\n\t\t\t\t\t\t\tconst lines = plainLines.length\n\t\t\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\t\t...contextualLines,\n\t\t\t\t\t\t\t\t\t\t` ... ${plainLines.length} additional reference(s) shown without context`,\n\t\t\t\t\t\t\t\t\t\t...plainLines,\n\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t: contextualLines;\n\t\t\t\t\t\t\toutput = `Found ${result.length} reference(s):\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"hover\": {\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/hover\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as Hover | null;\n\n\t\t\t\t\t\tif (!result || !result.contents) {\n\t\t\t\t\t\t\toutput = \"No hover information\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = extractHoverText(result.contents);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"code_actions\": {\n\t\t\t\t\t\tconst diagnostics = client.diagnostics.get(uri) ?? [];\n\t\t\t\t\t\tconst context: CodeActionContext = {\n\t\t\t\t\t\t\tdiagnostics,\n\t\t\t\t\t\t\tonly: !apply && query ? [query] : undefined,\n\t\t\t\t\t\t\ttriggerKind: 1,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/codeAction\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\trange: { start: position, end: position },\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (CodeAction | Command)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No code actions available\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (apply === true && query) {\n\t\t\t\t\t\t\tconst normalizedQuery = query.trim();\n\t\t\t\t\t\t\tif (normalizedQuery.length === 0) {\n\t\t\t\t\t\t\t\toutput = \"Error: query parameter required when apply=true for code_actions\";\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst parsedIndex = /^\\d+$/.test(normalizedQuery) ? Number.parseInt(normalizedQuery, 10) : null;\n\t\t\t\t\t\t\tconst selectedAction = result.find(\n\t\t\t\t\t\t\t\t(actionItem, index) =>\n\t\t\t\t\t\t\t\t\t(parsedIndex !== null && index === parsedIndex) ||\n\t\t\t\t\t\t\t\t\tactionItem.title.toLowerCase().includes(normalizedQuery.toLowerCase()),\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (!selectedAction) {\n\t\t\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\t\t\toutput = `No code action matches \"${normalizedQuery}\". Available actions:\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst appliedAction = await applyCodeAction(selectedAction, {\n\t\t\t\t\t\t\t\tresolveCodeAction: async (actionItem: CodeAction) =>\n\t\t\t\t\t\t\t\t\t(await sendRequest(client, \"codeAction/resolve\", actionItem, signal)) as CodeAction,\n\t\t\t\t\t\t\t\tapplyWorkspaceEdit: async (edit: WorkspaceEdit) => applyWorkspaceEdit(edit, cwd),\n\t\t\t\t\t\t\t\texecuteCommand: async (commandItem: Command) => {\n\t\t\t\t\t\t\t\t\tawait sendRequest(\n\t\t\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\t\t\t\"workspace/executeCommand\",\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tcommand: commandItem.command,\n\t\t\t\t\t\t\t\t\t\t\targuments: commandItem.arguments ?? [],\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!appliedAction) {\n\t\t\t\t\t\t\t\toutput = `Action \"${selectedAction.title}\" has no workspace edit or command to apply`;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst summaryLines: string[] = [];\n\t\t\t\t\t\t\tif (appliedAction.edits.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Workspace edit:\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.edits.map(item => ` ${item}`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (appliedAction.executedCommands.length > 0) {\n\t\t\t\t\t\t\t\tsummaryLines.push(\" Executed command(s):\");\n\t\t\t\t\t\t\t\tsummaryLines.push(...appliedAction.executedCommands.map(commandName => ` ${commandName}`));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\toutput = `Applied \"${appliedAction.title}\":\\n${summaryLines.join(\"\\n\")}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst actionLines = result.map((actionItem, index) => ` ${formatCodeAction(actionItem, index)}`);\n\t\t\t\t\t\toutput = `${result.length} code action(s):\\n${actionLines.join(\"\\n\")}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"symbols\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for document symbols\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/documentSymbol\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as (DocumentSymbol | SymbolInformation)[] | null;\n\n\t\t\t\t\t\tif (!result || result.length === 0) {\n\t\t\t\t\t\t\toutput = \"No symbols found\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\tif (\"selectionRange\" in result[0]) {\n\t\t\t\t\t\t\t\tconst lines = (result as DocumentSymbol[]).flatMap(s => formatDocumentSymbol(s));\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst lines = (result as SymbolInformation[]).map(s => {\n\t\t\t\t\t\t\t\t\tconst line = s.location.range.start.line + 1;\n\t\t\t\t\t\t\t\t\tconst icon = symbolKindToIcon(s.kind);\n\t\t\t\t\t\t\t\t\treturn `${icon} ${s.name} @ line ${line}`;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\toutput = `Symbols in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"incoming_calls\": {\n\t\t\t\t\t\tconst prepareResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/prepareCallHierarchy\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyItem[] | null;\n\n\t\t\t\t\t\tif (!prepareResult || prepareResult.length === 0) {\n\t\t\t\t\t\t\toutput = \"No call hierarchy item found at this position\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst incomingResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"callHierarchy/incomingCalls\",\n\t\t\t\t\t\t\t{ item: prepareResult[0] },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyIncomingCall[] | null;\n\n\t\t\t\t\t\tif (!incomingResult || incomingResult.length === 0) {\n\t\t\t\t\t\t\toutput = `No incoming calls found for ${prepareResult[0].name}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst incomingLines: string[] = [];\n\t\t\t\t\t\tconst limitedIncoming = incomingResult.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\tfor (const call of limitedIncoming) {\n\t\t\t\t\t\t\tconst header = formatCallHierarchyItem(call.from, cwd);\n\t\t\t\t\t\t\tconst filePath = uriToFile(call.from.uri);\n\t\t\t\t\t\t\tconst callLine = call.fromRanges[0]?.start.line ?? call.from.selectionRange.start.line;\n\t\t\t\t\t\t\tconst context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);\n\t\t\t\t\t\t\tif (context.length > 0) {\n\t\t\t\t\t\t\t\tincomingLines.push(` ${header}\\n${context.map(l => ` ${l}`).join(\"\\n\")}`);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tincomingLines.push(` ${header}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst truncation = incomingResult.length > REFERENCE_CONTEXT_LIMIT\n\t\t\t\t\t\t\t? `\\n ... ${incomingResult.length - REFERENCE_CONTEXT_LIMIT} additional caller(s) omitted`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\toutput = `${incomingResult.length} caller(s) of ${prepareResult[0].name}:\\n${incomingLines.join(\"\\n\")}${truncation}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"outgoing_calls\": {\n\t\t\t\t\t\tconst prepareResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/prepareCallHierarchy\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyItem[] | null;\n\n\t\t\t\t\t\tif (!prepareResult || prepareResult.length === 0) {\n\t\t\t\t\t\t\toutput = \"No call hierarchy item found at this position\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst outgoingResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"callHierarchy/outgoingCalls\",\n\t\t\t\t\t\t\t{ item: prepareResult[0] },\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as CallHierarchyOutgoingCall[] | null;\n\n\t\t\t\t\t\tif (!outgoingResult || outgoingResult.length === 0) {\n\t\t\t\t\t\t\toutput = `No outgoing calls found from ${prepareResult[0].name}`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst outgoingLines: string[] = [];\n\t\t\t\t\t\tconst limitedOutgoing = outgoingResult.slice(0, REFERENCE_CONTEXT_LIMIT);\n\t\t\t\t\t\tfor (const call of limitedOutgoing) {\n\t\t\t\t\t\t\tconst header = formatCallHierarchyItem(call.to, cwd);\n\t\t\t\t\t\t\tconst filePath = uriToFile(call.to.uri);\n\t\t\t\t\t\t\tconst callLine = call.to.selectionRange.start.line;\n\t\t\t\t\t\t\tconst context = await readLocationContext(filePath, callLine + 1, LOCATION_CONTEXT_LINES);\n\t\t\t\t\t\t\tif (context.length > 0) {\n\t\t\t\t\t\t\t\toutgoingLines.push(` ${header}\\n${context.map(l => ` ${l}`).join(\"\\n\")}`);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutgoingLines.push(` ${header}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst outTruncation = outgoingResult.length > REFERENCE_CONTEXT_LIMIT\n\t\t\t\t\t\t\t? `\\n ... ${outgoingResult.length - REFERENCE_CONTEXT_LIMIT} additional callee(s) omitted`\n\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\toutput = `${outgoingResult.length} callee(s) from ${prepareResult[0].name}:\\n${outgoingLines.join(\"\\n\")}${outTruncation}`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"format\": {\n\t\t\t\t\t\tif (!targetFile) {\n\t\t\t\t\t\t\toutput = \"Error: file parameter required for format\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst formatResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/formatting\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\t\ttabSize: tab_size ?? 4,\n\t\t\t\t\t\t\t\t\tinsertSpaces: insert_spaces ?? true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as TextEdit[] | null;\n\n\t\t\t\t\t\tif (!formatResult || formatResult.length === 0) {\n\t\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\t\toutput = `${relPath}: already formatted (no changes)`;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait applyTextEdits(targetFile, formatResult);\n\t\t\t\t\t\tconst relPath = path.relative(cwd, targetFile);\n\t\t\t\t\t\toutput = `Formatted ${relPath}: ${formatResult.length} edit(s) applied`;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"signature\": {\n\t\t\t\t\t\tconst sigResult = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/signatureHelp\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as SignatureHelp | null;\n\n\t\t\t\t\t\tif (!sigResult || !sigResult.signatures || sigResult.signatures.length === 0) {\n\t\t\t\t\t\t\toutput = \"No signature information at this position\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutput = formatSignatureHelp(sigResult);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"rename\": {\n\t\t\t\t\t\tif (!new_name) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: new_name parameter required for rename\" }],\n\t\t\t\t\t\t\t\tdetails: { action, serverName, success: false },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst result = (await sendRequest(\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\"textDocument/rename\",\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttextDocument: { uri },\n\t\t\t\t\t\t\t\tposition,\n\t\t\t\t\t\t\t\tnewName: new_name,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t)) as WorkspaceEdit | null;\n\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\toutput = \"Rename returned no edits\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst shouldApply = apply !== false;\n\t\t\t\t\t\t\tif (shouldApply) {\n\t\t\t\t\t\t\t\tconst applied = await applyWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Applied rename:\\n${applied.map(a => ` ${a}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst preview = formatWorkspaceEdit(result, cwd);\n\t\t\t\t\t\t\t\toutput = `Rename preview:\\n${preview.map(p => ` ${p}`).join(\"\\n\")}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase \"reload\": {\n\t\t\t\t\t\toutput = await reloadServer(client, serverName, signal);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\toutput = `Unknown action: ${action}`;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { serverName, action, success: true, request: params },\n\t\t\t\t};\n\t\t\t} catch (err: unknown) {\n\t\t\t\tif (err instanceof ToolAbortError || signal?.aborted) {\n\t\t\t\t\tthrow new ToolAbortError();\n\t\t\t\t}\n\t\t\t\tconst errorMessage = err instanceof Error ? err.message : String(err);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `LSP error: ${errorMessage}` }],\n\t\t\t\t\tdetails: { serverName, action, success: false, request: params },\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Default LSP tool using process.cwd().\n */\nexport const lspTool = createLspTool(process.cwd());\n"]}
|