oh-my-opencode 5.0.0-beta.6 → 5.0.0-beta.60
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/.agents/command/publish.md +59 -23
- package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +1 -3
- package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +1 -1
- package/.agents/skills/pre-publish-review/SKILL.md +9 -12
- package/.agents/skills/publish/SKILL.md +59 -23
- package/.agents/skills/senpi-qa/SKILL.md +80 -0
- package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs +65 -0
- package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs +171 -0
- package/.agents/skills/tech-debt-audit/SKILL.md +6 -76
- package/.agents/skills/work-with-pr/SKILL.md +37 -23
- package/.opencode/command/publish.md +59 -23
- package/.opencode/skills/pre-publish-review/SKILL.md +9 -12
- package/.opencode/skills/work-with-pr/SKILL.md +37 -23
- package/README.ja.md +65 -60
- package/README.ko.md +66 -61
- package/README.md +65 -72
- package/README.ru.md +62 -60
- package/README.zh-cn.md +61 -60
- package/THIRD-PARTY-NOTICES.md +27 -99
- package/dist/agents/atlas/agent.d.ts +0 -1
- package/dist/agents/gpt-prompt-identity.d.ts +1 -1
- package/dist/agents/sisyphus/grok-4.d.ts +20 -0
- package/dist/agents/sisyphus/index.d.ts +2 -0
- package/dist/agents/sisyphus-agent-config.d.ts +6 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
- package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
- package/dist/agents/types.d.ts +4 -2
- package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
- package/dist/cli/doctor/checks/index.d.ts +2 -0
- package/dist/cli/doctor/checks/latest-version.d.ts +11 -0
- package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
- package/dist/cli/doctor/framework/constants.d.ts +5 -0
- package/dist/cli/doctor/framework/types.d.ts +2 -0
- package/dist/cli/fallback-lane-policy.d.ts +1 -0
- package/dist/cli/index.js +51738 -59690
- package/dist/cli/install-codex/install-codex-test-fixtures.d.ts +1 -1
- package/dist/cli/run/on-complete-hook.d.ts +2 -0
- package/dist/cli/runtime-commands.d.ts +1 -1
- package/dist/cli/worktree-sweep/classify.d.ts +16 -0
- package/dist/cli/worktree-sweep/format.d.ts +8 -0
- package/dist/cli/worktree-sweep/git.d.ts +19 -0
- package/dist/cli/worktree-sweep/index.d.ts +7 -0
- package/dist/cli/worktree-sweep/options.d.ts +2 -0
- package/dist/cli/worktree-sweep/parse-worktree-list.d.ts +8 -0
- package/dist/cli/worktree-sweep/sweep.d.ts +2 -0
- package/dist/cli/worktree-sweep/types.d.ts +65 -0
- package/dist/cli/worktree-sweep/worktree-sweep.d.ts +2 -0
- package/dist/cli-node/index.js +50900 -58829
- package/dist/config/index.d.ts +1 -1
- package/dist/config/schema/background-task.d.ts +1 -0
- package/dist/config/schema/commands.d.ts +1 -1
- package/dist/config/schema/hooks.d.ts +1 -2
- package/dist/config/schema/oh-my-opencode-config.d.ts +5 -11
- package/dist/config/schema/ulw-execute.d.ts +5 -0
- package/dist/config/schema.d.ts +0 -1
- package/dist/config/validate.d.ts +2 -0
- package/dist/create-hooks.d.ts +3 -2
- package/dist/features/background-agent/compaction-aware-message-resolver.d.ts +1 -0
- package/dist/features/background-agent/constants.d.ts +0 -7
- package/dist/features/background-agent/error-classifier.d.ts +1 -0
- package/dist/features/background-agent/manager.d.ts +9 -1
- package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +0 -1
- package/dist/features/background-agent/parent-wake-notifier-types.d.ts +1 -1
- package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -1
- package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -1
- package/dist/features/background-agent/subagent-spawn-limits.d.ts +8 -0
- package/dist/features/background-agent/types.d.ts +4 -0
- package/dist/features/btw-side/btw-command-draft.d.ts +7 -0
- package/dist/features/btw-side/context-injector.d.ts +15 -0
- package/dist/features/btw-side/index.d.ts +8 -0
- package/dist/features/btw-side/metadata.d.ts +15 -0
- package/dist/features/btw-side/parent-context-budget.d.ts +9 -0
- package/dist/features/btw-side/server-session-registry.d.ts +8 -0
- package/dist/features/btw-side/tui-adoption-cache.d.ts +13 -0
- package/dist/features/btw-side/tui-adoption-guard.d.ts +5 -0
- package/dist/features/btw-side/tui-controller-types.d.ts +68 -0
- package/dist/features/btw-side/tui-controller.d.ts +19 -0
- package/dist/features/btw-side/tui-escape-return.d.ts +12 -0
- package/dist/features/btw-side/tui-keymap.d.ts +17 -0
- package/dist/features/btw-side/tui-parent-validator.d.ts +6 -0
- package/dist/features/btw-side/tui-picker-options.d.ts +20 -0
- package/dist/features/btw-side/tui-picker.d.ts +9 -0
- package/dist/features/btw-side/tui-prompt-queue.d.ts +8 -0
- package/dist/features/btw-side/tui-session-bridge.d.ts +11 -0
- package/dist/features/btw-side/tui-session-catalog.d.ts +35 -0
- package/dist/features/btw-side/tui-side-removal.d.ts +11 -0
- package/dist/features/btw-side/tui-side-start.d.ts +9 -0
- package/dist/features/btw-side/tui-wiring.d.ts +8 -0
- package/dist/features/builtin-commands/templates/ulw-execute.d.ts +1 -0
- package/dist/features/builtin-commands/types.d.ts +1 -1
- package/dist/features/claude-tasks/storage.d.ts +7 -2
- package/dist/features/hook-message-injector/index.d.ts +1 -0
- package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +1 -0
- package/dist/features/monitor/manager-internals.d.ts +1 -1
- package/dist/features/monitor/output-injector-types.d.ts +1 -1
- package/dist/features/opengateway-provider/index.d.ts +13 -0
- package/dist/features/task-toast-manager/manager.d.ts +0 -24
- package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +17 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +3 -0
- package/dist/features/team-mode/tools/messaging-runtime.d.ts +7 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/message-storage-directory.d.ts +0 -3
- package/dist/hooks/anthropic-context-window-limit-recovery/state.d.ts +1 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/storage/empty-messages.d.ts +0 -1
- package/dist/hooks/anthropic-context-window-limit-recovery/tool-result-storage.d.ts +11 -0
- package/dist/hooks/atlas/atlas-hook.d.ts +1 -0
- package/dist/hooks/atlas/atlas-lifecycle-store.d.ts +50 -0
- package/dist/hooks/atlas/event-handler.d.ts +1 -0
- package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
- package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
- package/dist/hooks/atlas/tool-execute-before.d.ts +3 -0
- package/dist/hooks/atlas/types.d.ts +1 -0
- package/dist/hooks/claude-code-hooks/session-hook-state.d.ts +1 -0
- package/dist/hooks/claude-code-hooks/stop.d.ts +2 -0
- package/dist/hooks/claude-code-hooks/todo.d.ts +0 -1
- package/dist/hooks/claude-code-hooks/transcript.d.ts +2 -0
- package/dist/hooks/compaction-context-injector/validated-model.d.ts +2 -0
- package/dist/hooks/fsync-skip-warning/index.d.ts +4 -0
- package/dist/hooks/hashline-edit-diff-enhancer/hook.d.ts +1 -0
- package/dist/hooks/hashline-edit-diff-enhancer/pending-captures.d.ts +13 -0
- package/dist/hooks/index.d.ts +1 -2
- package/dist/hooks/keyword-detector/hook.d.ts +9 -0
- package/dist/hooks/keyword-detector/ultrawork/index.d.ts +2 -0
- package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +0 -1
- package/dist/hooks/model-fallback/hook.d.ts +1 -1
- package/dist/hooks/prometheus-md-only/agent-resolution.d.ts +2 -2
- package/dist/hooks/runtime-fallback/chat-message-handler.d.ts +2 -0
- package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +1 -0
- package/dist/hooks/runtime-fallback/runtime-model-settings.d.ts +6 -0
- package/dist/hooks/runtime-fallback/session-status-handler.d.ts +1 -1
- package/dist/hooks/runtime-fallback/types.d.ts +3 -1
- package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
- package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
- package/dist/hooks/{start-work → ulw-execute}/context-info-builder.d.ts +1 -1
- package/dist/hooks/{start-work → ulw-execute}/index.d.ts +1 -1
- package/dist/hooks/ulw-execute/ulw-execute-hook.d.ts +23 -0
- package/dist/hooks/unstable-agent-babysitter/task-message-analyzer.d.ts +1 -0
- package/dist/index.js +29256 -25391
- package/dist/mcp/index.d.ts +0 -4
- package/dist/mcp/types.d.ts +0 -1
- package/dist/oh-my-opencode.schema.json +21 -47
- package/dist/plugin/chat-message/types.d.ts +6 -4
- package/dist/plugin/chat-message/ulw-execute-message.d.ts +5 -0
- package/dist/plugin/event-session-lifecycle.d.ts +1 -0
- package/dist/plugin/hooks/create-core-hooks.d.ts +2 -2
- package/dist/plugin/hooks/create-session-hooks.d.ts +2 -3
- package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -0
- package/dist/plugin/messages-transform.d.ts +1 -0
- package/dist/plugin/stop-continuation.d.ts +3 -0
- package/dist/plugin/system-transform.d.ts +5 -1
- package/dist/plugin-dispose.d.ts +3 -0
- package/dist/shared/agent-tool-restrictions.d.ts +0 -1
- package/dist/shared/compaction-agent-config-checkpoint.d.ts +1 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/legacy-plugin-warning.d.ts +2 -1
- package/dist/shared/normalize-sdk-response.d.ts +1 -0
- package/dist/shared/omo-process-sweep.d.ts +2 -4
- package/dist/shared/plugin-entry-migrator.d.ts +4 -3
- package/dist/shared/plugin-entry-shape.d.ts +6 -0
- package/dist/shared/runtime-fallback-retry-marker.d.ts +16 -0
- package/dist/shared/shell-env.d.ts +1 -1
- package/dist/skills/ast-grep/AGENTS.md +51 -0
- package/dist/skills/ast-grep/SKILL.md +1 -1
- package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/dist/skills/coding-agent-sessions/SKILL.md +1 -1
- package/dist/skills/data-scientist/SKILL.md +99 -239
- package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/dist/skills/data-scientist/references/placement.md +74 -0
- package/dist/skills/data-scientist/references/polars-lane.md +95 -0
- package/dist/skills/data-scientist/references/uv-setup.md +1 -1
- package/dist/skills/data-scientist/references/visualization.md +64 -0
- package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/dist/skills/debugging/SKILL.md +3 -1
- package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
- package/dist/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/dist/skills/debugging/references/runtimes/go.md +15 -1
- package/dist/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/dist/skills/debugging/references/runtimes/node.md +25 -0
- package/dist/skills/debugging/references/runtimes/python.md +13 -0
- package/dist/skills/debugging/references/runtimes/rust.md +41 -0
- package/dist/skills/debugging/references/scripts/dap.mjs +267 -0
- package/dist/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/dist/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/dist/skills/debugging/references/tools/dap.md +103 -0
- package/dist/skills/debugging/references/tools/frida.md +193 -0
- package/dist/skills/frontend/ATTRIBUTION.md +10 -0
- package/dist/skills/frontend/SKILL.md +15 -8
- package/dist/skills/frontend/references/design/README.md +10 -2
- package/dist/skills/frontend/references/design/_INDEX.md +2 -0
- package/dist/skills/frontend/references/design/ambience-skill.md +145 -0
- package/dist/skills/frontend/references/design/interaction-skill.md +2 -0
- package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
- package/dist/skills/frontend/references/design/stylegallery.md +80 -0
- package/dist/skills/frontend/references/designpowers/README.md +1 -1
- package/dist/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/dist/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/dist/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/dist/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/dist/skills/frontend/references/designpowers/routing.md +5 -5
- package/dist/skills/git-master/SKILL.md +1 -1
- package/dist/skills/init-deep/SKILL.md +14 -14
- package/dist/skills/lsp-setup/SKILL.md +1 -1
- package/dist/skills/programming/SKILL.md +1 -1
- package/dist/skills/refactor/SKILL.md +4 -4
- package/dist/skills/remove-ai-slops/SKILL.md +1 -1
- package/dist/skills/review-work/SKILL.md +101 -419
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
- package/dist/skills/ultimate-browsing/SKILL.md +26 -9
- package/dist/skills/ultimate-browsing/engine/AGENTS.md +110 -0
- package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
- package/dist/skills/ultimate-browsing/references/insane-search/README.md +9 -2
- package/dist/skills/{start-work → ulw-execute}/SKILL.md +20 -19
- package/dist/skills/ulw-plan/SKILL.md +7 -8
- package/dist/skills/ulw-plan/references/full-workflow.md +31 -7
- package/dist/skills/ulw-plan/references/intent-clear.md +2 -1
- package/dist/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
- package/dist/skills/ulw-research/SKILL.md +8 -3
- package/dist/skills/visual-qa/AGENTS.md +58 -0
- package/dist/skills/visual-qa/SKILL.md +4 -3
- package/dist/tools/delegate-task/builtin-categories.d.ts +3 -1
- package/dist/tools/delegate-task/builtin-category-definition.d.ts +2 -1
- package/dist/tools/delegate-task/constants.d.ts +2 -2
- package/dist/tools/delegate-task/openai-categories.d.ts +7 -2
- package/dist/tools/delegate-task/sync-session-cleanup.d.ts +3 -0
- package/dist/tools/delegate-task/sync-session-poller.d.ts +1 -0
- package/dist/tools/delegate-task/tool-description.d.ts +3 -1
- package/dist/tools/delegate-task/types.d.ts +4 -0
- package/dist/tools/session-manager/directory-filter.d.ts +2 -0
- package/dist/tui.d.ts +12 -0
- package/dist/tui.js +37048 -46599
- package/package.json +47 -41
- package/packages/git-bash-mcp/dist/cli.js +6 -1
- package/packages/git-bash-mcp/package.json +1 -1
- package/packages/lsp-core/src/index.ts +1 -0
- package/packages/lsp-core/src/lsp/client-diagnostics-concurrency.integration.test.ts +44 -0
- package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +57 -48
- package/packages/lsp-core/src/lsp/client-diagnostics-pull-timeout.test.ts +64 -0
- package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
- package/packages/lsp-core/src/lsp/client-wrapper.test.ts +103 -6
- package/packages/lsp-core/src/lsp/client-wrapper.ts +50 -16
- package/packages/lsp-core/src/lsp/client.ts +32 -3
- package/packages/lsp-core/src/lsp/connection.ts +16 -0
- package/packages/lsp-core/src/lsp/constants.ts +6 -0
- package/packages/lsp-core/src/lsp/controlled-clock-test-support.ts +61 -0
- package/packages/lsp-core/src/lsp/errors.ts +15 -0
- package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +10 -3
- package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
- package/packages/lsp-core/src/lsp/format-document.ts +90 -0
- package/packages/lsp-core/src/lsp/json-rpc-connection.ts +11 -6
- package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
- package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
- package/packages/lsp-core/src/lsp/manager.ts +138 -12
- package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
- package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
- package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
- package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
- package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
- package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
- package/packages/lsp-core/src/lsp/timer-provider.ts +13 -0
- package/packages/lsp-core/src/lsp/transport-request-timeout.test.ts +73 -0
- package/packages/lsp-core/src/lsp/transport.ts +16 -2
- package/packages/lsp-core/src/lsp/types.ts +8 -0
- package/packages/lsp-core/src/lsp/workspace-apply-edit-test-support.ts +29 -1
- package/packages/lsp-core/src/lsp/workspace-document-state.test.ts +84 -1
- package/packages/lsp-core/src/lsp/workspace-document-state.ts +30 -11
- package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
- package/packages/lsp-core/src/mcp.ts +3 -0
- package/packages/lsp-core/src/request-context.test.ts +29 -0
- package/packages/lsp-core/src/request-context.ts +1 -1
- package/packages/lsp-core/src/tool-surface.test.ts +13 -1
- package/packages/lsp-core/src/tools/definitions.ts +14 -0
- package/packages/lsp-core/src/tools/format.test.ts +56 -0
- package/packages/lsp-core/src/tools/format.ts +56 -0
- package/packages/lsp-core/src/tools/index.ts +1 -0
- package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
- package/packages/lsp-core/src/tools/types.ts +10 -0
- package/packages/lsp-daemon/dist/cli.js +902 -479
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +920 -493
- package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
- package/packages/lsp-daemon/dist/daemon-client.js +3 -0
- package/packages/lsp-daemon/dist/ensure-daemon.d.ts +6 -1
- package/packages/lsp-daemon/dist/ensure-daemon.js +10 -2
- package/packages/lsp-daemon/dist/index.js +824 -402
- package/packages/lsp-daemon/dist/ownership.js +2 -2
- package/packages/lsp-daemon/dist/proxy.js +3 -0
- package/packages/lsp-daemon/dist/version-reap.js +1 -1
- package/packages/lsp-daemon/package.json +1 -1
- package/packages/lsp-tools-mcp/dist/cli.js +762 -341
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +272 -138
- package/packages/lsp-tools-mcp/dist/mcp.js +787 -368
- package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
- package/packages/lsp-tools-mcp/dist/tools.js +717 -302
- package/packages/lsp-tools-mcp/package.json +1 -1
- package/packages/omo-codex/THIRD-PARTY-NOTICES.md +4 -21
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
- package/packages/omo-codex/plugin/.mcp.json +0 -6
- package/packages/omo-codex/plugin/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/README.md +6 -2
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +197 -148
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
- package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
- package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
- package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
- package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
- package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +1 -1
- package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +2 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
- package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +2 -1
- package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +36 -29
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +32 -26
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +32 -28
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +137 -28
- package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +4 -2
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
- package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +941 -540
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
- package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
- package/packages/omo-codex/plugin/components/rules/README.md +2 -0
- package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +123 -0
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +91 -68
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +7 -7
- package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +15 -5
- package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
- package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
- package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
- package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -3
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +29 -6
- package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
- package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +4 -10
- package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2407 -684
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2411 -689
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
- package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
- package/packages/omo-codex/plugin/components/ultrawork/README.md +2 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +490 -4
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -6
- package/packages/omo-codex/plugin/components/ultrawork/scripts/sync-directive.mjs +30 -14
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -7
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
- package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
- package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +4 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +6 -6
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +10 -10
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +16 -16
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +16 -0
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +4 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +4 -11
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +24 -22
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +26 -13
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +16 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +25 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +10 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +2 -5
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -78
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +114 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +7 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +50 -42
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +21 -8
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +40 -37
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +1396 -516
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +28 -8
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +2 -5
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +24 -20
- package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +17 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +13 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +34 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +14 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +29 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +72 -117
- package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +16 -7
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.js +125 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.d.ts +46 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.js +28 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.d.ts +127 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.js +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.d.ts +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.js +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +195 -29
- package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +227 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +33 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +20 -6
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +75 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +17 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +6 -6
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +10 -4
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +32 -8
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +40 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +8 -6
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +5 -98
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +52 -73
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +10 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +24 -8
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +52 -46
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +8 -6
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +35 -7
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +34 -28
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +19 -9
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +25 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +39 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +38 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +71 -15
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +92 -136
- package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +29 -8
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/factory.ts +159 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/manifest.ts +42 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/types.ts +140 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk.ts +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +205 -28
- package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +239 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +36 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +19 -6
- package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +107 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +131 -82
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +147 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +16 -22
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +31 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +35 -8
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +38 -4
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +27 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-scope-required.test.ts +144 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +185 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +8 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +37 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +52 -11
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/cli-session.ts +4 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +9 -4
- package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +67 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io-cross-process.test.ts +106 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +36 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-fields-messages.test.ts +98 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-lazycodex-surface.test.ts +93 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +51 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +58 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +9 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +137 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-session-context.test.ts +148 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +444 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +218 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +8 -5
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +13 -8
- package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +18 -0
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +16 -7
- package/packages/omo-codex/plugin/package-lock.json +676 -524
- package/packages/omo-codex/plugin/package.json +2 -3
- package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
- package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +19 -90
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +94 -55
- package/packages/omo-codex/plugin/shared/package.json +3 -4
- package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
- package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
- package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
- package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +3 -1
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/omo-codex/plugin/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/omo-codex/plugin/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/dap.md +103 -0
- package/packages/omo-codex/plugin/skills/debugging/references/tools/frida.md +193 -0
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -0
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +15 -8
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +10 -2
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +2 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +145 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +2 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +18 -16
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +4 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +8 -6
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +5 -3
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +114 -422
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +26 -9
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +110 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -2
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +26 -13
- package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +29 -31
- package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +34 -4
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +108 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +32 -8
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -7
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +12 -5
- package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +8 -5
- package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +16 -51
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
- package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -29
- package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
- package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
- package/packages/omo-codex/plugin/test/component-bin-names.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +1 -51
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +88 -2
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +5 -6
- package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
- package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
- package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
- package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +168 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +54 -24
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +18 -119
- package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
- package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
- package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
- package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
- package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
- package/packages/omo-codex/scripts/AGENTS.md +36 -0
- package/packages/omo-codex/scripts/check-model-catalog-parity.mjs +42 -0
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +27 -1
- package/packages/omo-codex/scripts/install-config-autonomous-features.test.mjs +1 -1
- package/packages/omo-codex/scripts/install-config-autonomous.test.mjs +2 -1
- package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
- package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
- package/packages/omo-codex/scripts/install-config.test.mjs +15 -17
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +2987 -1370
- package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +3 -4
- package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
- package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
- package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
- package/packages/omo-codex/scripts/install-packaged-local.test.mjs +1 -6
- package/packages/{omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md → prompts-core/prompts/ultrawork/codex.md} +26 -20
- package/packages/shared-skills/package.json +7 -1
- package/packages/shared-skills/skill-source-filter.d.ts +16 -0
- package/packages/shared-skills/skill-source-filter.mjs +44 -0
- package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
- package/packages/shared-skills/skills/ast-grep/SKILL.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
- package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
- package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
- package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +3 -1
- package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +21 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/go.md +15 -1
- package/packages/shared-skills/skills/debugging/references/runtimes/native-binary.md +38 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/node.md +25 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/python.md +13 -0
- package/packages/shared-skills/skills/debugging/references/runtimes/rust.md +41 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.mjs +267 -0
- package/packages/shared-skills/skills/debugging/references/scripts/dap.test.ts +86 -0
- package/packages/shared-skills/skills/debugging/references/scripts/fixture-adapter.mjs +59 -0
- package/packages/shared-skills/skills/debugging/references/tools/dap.md +103 -0
- package/packages/shared-skills/skills/debugging/references/tools/frida.md +193 -0
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -0
- package/packages/shared-skills/skills/frontend/SKILL.md +15 -8
- package/packages/shared-skills/skills/frontend/references/design/README.md +10 -2
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +2 -0
- package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +145 -0
- package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +2 -0
- package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +80 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/README.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +11 -11
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +3 -3
- package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +1 -1
- package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +5 -5
- package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
- package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
- package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +1 -1
- package/packages/shared-skills/skills/refactor/SKILL.md +4 -4
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +1 -1
- package/packages/shared-skills/skills/review-work/SKILL.md +101 -419
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +38 -11
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +26 -9
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +110 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +23 -18
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +9 -2
- package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +20 -19
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +7 -8
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +31 -7
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +2 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +5 -5
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -1
- package/packages/shared-skills/skills/ulw-research/SKILL.md +8 -3
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
- package/postinstall.mjs +2 -0
- package/script/qa/web-terminal-visual-qa.mjs +2 -0
- package/script/qa/xterm-live-terminal.mjs +18 -2
- package/dist/config/schema/codegraph.d.ts +0 -12
- package/dist/config/schema/start-work.d.ts +0 -5
- package/dist/features/builtin-commands/templates/start-work.d.ts +0 -1
- package/dist/features/builtin-skills/index.d.ts +0 -1
- package/dist/features/builtin-skills/skill-file-loader.d.ts +0 -1
- package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +0 -1
- package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +0 -1
- package/dist/features/builtin-skills/skills/debugging.d.ts +0 -1
- package/dist/features/builtin-skills/skills/dev-browser.d.ts +0 -1
- package/dist/features/builtin-skills/skills/frontend.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/history-search-workflow.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/overview.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/quick-reference.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/rebase-workflow.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-skill-metadata.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master.d.ts +0 -1
- package/dist/features/builtin-skills/skills/index.d.ts +0 -1
- package/dist/features/builtin-skills/skills/init-deep.d.ts +0 -1
- package/dist/features/builtin-skills/skills/playwright-cli.d.ts +0 -1
- package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +0 -1
- package/dist/features/builtin-skills/skills/playwright.d.ts +0 -1
- package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +0 -1
- package/dist/features/builtin-skills/skills/review-work.d.ts +0 -1
- package/dist/features/builtin-skills/skills/security-research.d.ts +0 -1
- package/dist/features/builtin-skills/skills/security-review.d.ts +0 -1
- package/dist/features/builtin-skills/skills/team-mode.d.ts +0 -1
- package/dist/features/builtin-skills/skills/visual-qa.d.ts +0 -1
- package/dist/features/builtin-skills/skills.d.ts +0 -1
- package/dist/features/builtin-skills/types.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/command-loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/discovery.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/hook-loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/index.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/mcp-server-loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/plugin-path-resolver.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/scope-filter.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/skill-loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/types.d.ts +0 -1
- package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
- package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
- package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
- package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
- package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
- package/dist/hooks/ralph-loop/completion-promise-detector-test-input.d.ts +0 -11
- package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
- package/dist/hooks/start-work/start-work-hook.d.ts +0 -23
- package/dist/mcp/codegraph.d.ts +0 -16
- package/dist/plugin/chat-message/start-work-message.d.ts +0 -5
- package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +0 -1
- package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +0 -1
- package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +0 -1
- package/dist/shared/prompt-async-gate/queue.d.ts +0 -1
- package/dist/shared/prompt-async-gate/recent-dispatches.d.ts +0 -1
- package/dist/shared/prompt-async-gate/reservations.d.ts +0 -1
- package/dist/shared/prompt-async-gate/semantic-dedupe.d.ts +0 -1
- package/dist/shared/prompt-async-gate/session-idle-dispatch.d.ts +0 -1
- package/dist/shared/prompt-async-gate/timing.d.ts +0 -1
- package/dist/shared/prompt-async-gate/types.d.ts +0 -1
- package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
- package/dist/skills/data-scientist/references/execution-templates.md +0 -197
- package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
- package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
- package/dist/tools/call-omo-agent/message-storage-directory.d.ts +0 -1
- package/dist/tools/delegate-task/anthropic-categories.d.ts +0 -2
- package/dist/tools/delegate-task/model-string-parser.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
- package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
- package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12149
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9747
- package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
- package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
- package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
- package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
- package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
- package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
- package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
- package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
- package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
- package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
- package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
- package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
- package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -471
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
- package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
- package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
- package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
- package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
- /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
- /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
2
|
-
import { existsSync as
|
|
3
|
-
import { basename as basename3, dirname as
|
|
2
|
+
import { existsSync as existsSync10, realpathSync as realpathSync5, statSync as statSync3 } from "node:fs";
|
|
3
|
+
import { basename as basename3, dirname as dirname8, join as join5, resolve as resolve8 } from "node:path";
|
|
4
4
|
|
|
5
5
|
// ../lsp-core/src/request-context.ts
|
|
6
6
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
@@ -9,18 +9,17 @@ import { homedir } from "node:os";
|
|
|
9
9
|
import { basename, delimiter, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
10
10
|
|
|
11
11
|
class LspRequestContextParseError extends Error {
|
|
12
|
-
code;
|
|
13
|
-
name = "LspRequestContextParseError";
|
|
14
12
|
constructor(code, message) {
|
|
15
13
|
super(message);
|
|
16
14
|
this.code = code;
|
|
15
|
+
this.name = "LspRequestContextParseError";
|
|
17
16
|
}
|
|
18
17
|
}
|
|
19
18
|
|
|
20
19
|
class LspRequestContextUnavailableError extends Error {
|
|
21
|
-
name = "LspRequestContextUnavailableError";
|
|
22
20
|
constructor() {
|
|
23
21
|
super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
|
|
22
|
+
this.name = "LspRequestContextUnavailableError";
|
|
24
23
|
}
|
|
25
24
|
}
|
|
26
25
|
var storage = new AsyncLocalStorage;
|
|
@@ -50,7 +49,7 @@ function contextEnv(key) {
|
|
|
50
49
|
}
|
|
51
50
|
function createStandaloneMcpRequestContext(input = {}) {
|
|
52
51
|
const env = input.env ?? process.env;
|
|
53
|
-
const cwd = canonicalCwd(input.cwd ?? process.cwd());
|
|
52
|
+
const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
|
|
54
53
|
const home = input.homeDir ?? homedir();
|
|
55
54
|
const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
|
|
56
55
|
const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
|
|
@@ -193,22 +192,15 @@ function effectiveExtension(filePath) {
|
|
|
193
192
|
|
|
194
193
|
// ../lsp-core/src/lsp/errors.ts
|
|
195
194
|
class LspConnectionClosedError extends Error {
|
|
196
|
-
serverId;
|
|
197
|
-
root;
|
|
198
|
-
name = "LspConnectionClosedError";
|
|
199
195
|
constructor(serverId, root, message) {
|
|
200
196
|
super(message ?? `LSP connection closed for ${serverId} at ${root}`);
|
|
201
197
|
this.serverId = serverId;
|
|
202
198
|
this.root = root;
|
|
199
|
+
this.name = "LspConnectionClosedError";
|
|
203
200
|
}
|
|
204
201
|
}
|
|
205
202
|
|
|
206
203
|
class LspProcessExitedError extends Error {
|
|
207
|
-
serverId;
|
|
208
|
-
root;
|
|
209
|
-
exitCode;
|
|
210
|
-
stderrTail;
|
|
211
|
-
name = "LspProcessExitedError";
|
|
212
204
|
constructor(serverId, root, exitCode, stderrTail) {
|
|
213
205
|
const stderrSuffix = stderrTail ? `
|
|
214
206
|
stderr tail: ${stderrTail}` : "";
|
|
@@ -217,46 +209,59 @@ stderr tail: ${stderrTail}` : "";
|
|
|
217
209
|
this.root = root;
|
|
218
210
|
this.exitCode = exitCode;
|
|
219
211
|
this.stderrTail = stderrTail;
|
|
212
|
+
this.name = "LspProcessExitedError";
|
|
220
213
|
}
|
|
221
214
|
}
|
|
222
215
|
|
|
223
216
|
class LspRequestTimeoutError extends Error {
|
|
224
|
-
method;
|
|
225
|
-
stderrTail;
|
|
226
|
-
name = "LspRequestTimeoutError";
|
|
227
217
|
constructor(method, stderrTail) {
|
|
228
218
|
const stderrSuffix = stderrTail ? `
|
|
229
219
|
recent stderr: ${stderrTail}` : "";
|
|
230
220
|
super(`LSP request timeout (method: ${method})${stderrSuffix}`);
|
|
231
221
|
this.method = method;
|
|
232
222
|
this.stderrTail = stderrTail;
|
|
223
|
+
this.name = "LspRequestTimeoutError";
|
|
233
224
|
}
|
|
234
225
|
}
|
|
235
226
|
|
|
236
227
|
class LspInvalidPathError extends Error {
|
|
237
|
-
|
|
228
|
+
constructor() {
|
|
229
|
+
super(...arguments);
|
|
230
|
+
this.name = "LspInvalidPathError";
|
|
231
|
+
}
|
|
238
232
|
}
|
|
239
233
|
|
|
240
234
|
class LspServerLookupError extends Error {
|
|
241
|
-
lookup;
|
|
242
|
-
name = "LspServerLookupError";
|
|
243
235
|
constructor(message, lookup) {
|
|
244
236
|
super(message);
|
|
245
237
|
this.lookup = lookup;
|
|
238
|
+
this.name = "LspServerLookupError";
|
|
246
239
|
}
|
|
247
240
|
}
|
|
248
241
|
|
|
249
242
|
class LspServerInitializingError extends Error {
|
|
250
|
-
originalError;
|
|
251
|
-
name = "LspServerInitializingError";
|
|
252
243
|
constructor(originalError) {
|
|
253
244
|
super(`LSP server is still initializing. Please retry in a few seconds. Original error: ${originalError.message}`);
|
|
254
245
|
this.originalError = originalError;
|
|
246
|
+
this.name = "LspServerInitializingError";
|
|
255
247
|
}
|
|
256
248
|
}
|
|
257
249
|
|
|
258
250
|
class LspProcessSpawnError extends Error {
|
|
259
|
-
|
|
251
|
+
constructor() {
|
|
252
|
+
super(...arguments);
|
|
253
|
+
this.name = "LspProcessSpawnError";
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
class LspClientRespawnBudgetExceededError extends Error {
|
|
258
|
+
constructor(serverId, root, retryLimit) {
|
|
259
|
+
super(`LSP server ${serverId} at ${root} failed to stay alive; respawn budget exhausted ` + `(${retryLimit} consecutive dead generations). Retrying after the cooldown may succeed.`);
|
|
260
|
+
this.serverId = serverId;
|
|
261
|
+
this.root = root;
|
|
262
|
+
this.retryLimit = retryLimit;
|
|
263
|
+
this.name = "LspClientRespawnBudgetExceededError";
|
|
264
|
+
}
|
|
260
265
|
}
|
|
261
266
|
function isLspDeadConnectionError(err) {
|
|
262
267
|
return err instanceof LspConnectionClosedError || err instanceof LspProcessExitedError;
|
|
@@ -279,6 +284,13 @@ import { pathToFileURL as pathToFileURL3 } from "node:url";
|
|
|
279
284
|
// ../lsp-core/src/lsp/connection.ts
|
|
280
285
|
import { pathToFileURL } from "node:url";
|
|
281
286
|
|
|
287
|
+
// ../lsp-core/src/lsp/timer-provider.ts
|
|
288
|
+
var realTimerProvider = {
|
|
289
|
+
now: () => Date.now(),
|
|
290
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
291
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
292
|
+
};
|
|
293
|
+
|
|
282
294
|
// ../lsp-core/src/lsp/constants.ts
|
|
283
295
|
var DEFAULT_MAX_REFERENCES = 200;
|
|
284
296
|
var DEFAULT_MAX_SYMBOLS = 200;
|
|
@@ -287,9 +299,12 @@ var DEFAULT_MAX_DIRECTORY_FILES = 50;
|
|
|
287
299
|
var REQUEST_TIMEOUT_MS = 15000;
|
|
288
300
|
var INIT_TIMEOUT_MS = 60000;
|
|
289
301
|
var IDLE_TIMEOUT_MS = 5 * 60000;
|
|
302
|
+
var MAX_RESIDENT_CLIENTS = 6;
|
|
290
303
|
var REAPER_INTERVAL_MS = 60000;
|
|
291
304
|
var STOP_HARD_KILL_TIMEOUT_MS = 5000;
|
|
292
305
|
var STOP_SIGKILL_GRACE_MS = 1000;
|
|
306
|
+
var CLIENT_RESPAWN_RETRY_LIMIT = 2;
|
|
307
|
+
var CLIENT_RESPAWN_COOLDOWN_MS = 60000;
|
|
293
308
|
|
|
294
309
|
// ../lsp-core/src/lsp/json-rpc-connection.ts
|
|
295
310
|
var HEADER_SEPARATOR = `\r
|
|
@@ -301,20 +316,31 @@ var METHOD_NOT_FOUND = -32601;
|
|
|
301
316
|
var INTERNAL_ERROR = -32603;
|
|
302
317
|
|
|
303
318
|
class JsonRpcConnection {
|
|
304
|
-
reader;
|
|
305
|
-
writer;
|
|
306
|
-
pendingRequests = new Map;
|
|
307
|
-
notificationHandlers = new Map;
|
|
308
|
-
requestHandlers = new Map;
|
|
309
|
-
closeHandlers = [];
|
|
310
|
-
errorHandlers = [];
|
|
311
|
-
inputBuffer = Buffer.alloc(0);
|
|
312
|
-
nextRequestId = 1;
|
|
313
|
-
listening = false;
|
|
314
|
-
disposed = false;
|
|
315
319
|
constructor(reader, writer) {
|
|
316
320
|
this.reader = reader;
|
|
317
321
|
this.writer = writer;
|
|
322
|
+
this.pendingRequests = new Map;
|
|
323
|
+
this.notificationHandlers = new Map;
|
|
324
|
+
this.requestHandlers = new Map;
|
|
325
|
+
this.closeHandlers = [];
|
|
326
|
+
this.errorHandlers = [];
|
|
327
|
+
this.inputBuffer = Buffer.alloc(0);
|
|
328
|
+
this.nextRequestId = 1;
|
|
329
|
+
this.listening = false;
|
|
330
|
+
this.disposed = false;
|
|
331
|
+
this.handleData = (chunk) => {
|
|
332
|
+
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
333
|
+
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
334
|
+
this.drainInputBuffer();
|
|
335
|
+
};
|
|
336
|
+
this.handleClose = () => {
|
|
337
|
+
for (const handler of this.closeHandlers) {
|
|
338
|
+
handler();
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
this.handleStreamError = (error) => {
|
|
342
|
+
this.emitError(error);
|
|
343
|
+
};
|
|
318
344
|
}
|
|
319
345
|
listen() {
|
|
320
346
|
if (this.listening)
|
|
@@ -349,7 +375,8 @@ class JsonRpcConnection {
|
|
|
349
375
|
let cancelAfterWrite = false;
|
|
350
376
|
let settled = false;
|
|
351
377
|
const writeCancel = () => this.writeMessage({ jsonrpc: "2.0", method: "$/cancelRequest", params: { id } });
|
|
352
|
-
|
|
378
|
+
let rejectAfterCancelWrite;
|
|
379
|
+
const responsePromise = new Promise((resolve, reject) => {
|
|
353
380
|
const cleanup = () => {
|
|
354
381
|
options.signal?.removeEventListener("abort", onAbort);
|
|
355
382
|
};
|
|
@@ -360,22 +387,26 @@ class JsonRpcConnection {
|
|
|
360
387
|
this.pendingRequests.delete(key);
|
|
361
388
|
cleanup();
|
|
362
389
|
const rejectCancelled = () => reject(abortError(options.signal));
|
|
390
|
+
rejectAfterCancelWrite = async () => {
|
|
391
|
+
try {
|
|
392
|
+
await writeCancel();
|
|
393
|
+
} catch (error) {
|
|
394
|
+
this.emitError(toError(error));
|
|
395
|
+
}
|
|
396
|
+
rejectCancelled();
|
|
397
|
+
};
|
|
363
398
|
if (!requestWritten) {
|
|
364
399
|
cancelAfterWrite = true;
|
|
365
|
-
rejectCancelled();
|
|
366
400
|
return;
|
|
367
401
|
}
|
|
368
|
-
|
|
369
|
-
this.emitError(toError(error));
|
|
370
|
-
rejectCancelled();
|
|
371
|
-
});
|
|
402
|
+
rejectAfterCancelWrite();
|
|
372
403
|
};
|
|
373
404
|
const onAbort = () => settleCancel();
|
|
374
405
|
this.pendingRequests.set(key, {
|
|
375
406
|
resolve(result) {
|
|
376
407
|
settled = true;
|
|
377
408
|
cleanup();
|
|
378
|
-
|
|
409
|
+
resolve(result);
|
|
379
410
|
},
|
|
380
411
|
reject(error) {
|
|
381
412
|
settled = true;
|
|
@@ -396,7 +427,7 @@ class JsonRpcConnection {
|
|
|
396
427
|
await this.writeMessage(message);
|
|
397
428
|
requestWritten = true;
|
|
398
429
|
if (cancelAfterWrite)
|
|
399
|
-
await
|
|
430
|
+
await rejectAfterCancelWrite?.();
|
|
400
431
|
} catch (error) {
|
|
401
432
|
if (settled)
|
|
402
433
|
return responsePromise;
|
|
@@ -435,19 +466,6 @@ class JsonRpcConnection {
|
|
|
435
466
|
this.notificationHandlers.clear();
|
|
436
467
|
this.requestHandlers.clear();
|
|
437
468
|
}
|
|
438
|
-
handleData = (chunk) => {
|
|
439
|
-
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
440
|
-
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
441
|
-
this.drainInputBuffer();
|
|
442
|
-
};
|
|
443
|
-
handleClose = () => {
|
|
444
|
-
for (const handler of this.closeHandlers) {
|
|
445
|
-
handler();
|
|
446
|
-
}
|
|
447
|
-
};
|
|
448
|
-
handleStreamError = (error) => {
|
|
449
|
-
this.emitError(error);
|
|
450
|
-
};
|
|
451
469
|
drainInputBuffer() {
|
|
452
470
|
while (true) {
|
|
453
471
|
const headerEnd = this.inputBuffer.indexOf(HEADER_SEPARATOR);
|
|
@@ -547,13 +565,13 @@ class JsonRpcConnection {
|
|
|
547
565
|
const payload = `Content-Length: ${Buffer.byteLength(body, "utf8")}\r
|
|
548
566
|
\r
|
|
549
567
|
${body}`;
|
|
550
|
-
return new Promise((
|
|
568
|
+
return new Promise((resolve, reject) => {
|
|
551
569
|
this.writer.write(payload, (error) => {
|
|
552
570
|
if (error) {
|
|
553
571
|
reject(error);
|
|
554
572
|
return;
|
|
555
573
|
}
|
|
556
|
-
|
|
574
|
+
resolve();
|
|
557
575
|
});
|
|
558
576
|
});
|
|
559
577
|
}
|
|
@@ -640,9 +658,9 @@ function validateCwd(cwd) {
|
|
|
640
658
|
}
|
|
641
659
|
}
|
|
642
660
|
function wrap(proc) {
|
|
643
|
-
const exitedPromise = new Promise((
|
|
644
|
-
proc.once("close", (code) =>
|
|
645
|
-
proc.once("error", () =>
|
|
661
|
+
const exitedPromise = new Promise((resolve) => {
|
|
662
|
+
proc.once("close", (code) => resolve(code ?? 0));
|
|
663
|
+
proc.once("error", () => resolve(1));
|
|
646
664
|
});
|
|
647
665
|
if (!proc.stdin || !proc.stdout || !proc.stderr) {
|
|
648
666
|
throw new LspProcessSpawnError("Spawned process is missing one of stdin/stdout/stderr pipes");
|
|
@@ -795,33 +813,29 @@ function isPosition(value) {
|
|
|
795
813
|
|
|
796
814
|
// ../lsp-core/src/lsp/transport.ts
|
|
797
815
|
class LspClientNotStartedError extends Error {
|
|
798
|
-
serverId;
|
|
799
|
-
root;
|
|
800
|
-
name = "LspClientNotStartedError";
|
|
801
816
|
constructor(serverId, root) {
|
|
802
817
|
super("LSP client not started");
|
|
803
818
|
this.serverId = serverId;
|
|
804
819
|
this.root = root;
|
|
820
|
+
this.name = "LspClientNotStartedError";
|
|
805
821
|
}
|
|
806
822
|
}
|
|
807
823
|
|
|
808
824
|
class LspClientTransport {
|
|
809
|
-
root;
|
|
810
|
-
server;
|
|
811
|
-
proc = null;
|
|
812
|
-
connection = null;
|
|
813
|
-
stderrBuffer = [];
|
|
814
|
-
processExited = false;
|
|
815
|
-
diagnosticsStore = new Map;
|
|
816
|
-
requestTimeoutMs;
|
|
817
|
-
initializeTimeoutMs;
|
|
818
|
-
workspaceApplyEditHandler = null;
|
|
819
|
-
diagnosticPullSupported = false;
|
|
820
825
|
constructor(root, server, timeouts = {}) {
|
|
821
826
|
this.root = root;
|
|
822
827
|
this.server = server;
|
|
828
|
+
this.proc = null;
|
|
829
|
+
this.connection = null;
|
|
830
|
+
this.stderrBuffer = [];
|
|
831
|
+
this.processExited = false;
|
|
832
|
+
this.diagnosticsStore = new Map;
|
|
833
|
+
this.workspaceApplyEditHandler = null;
|
|
834
|
+
this.diagnosticPullSupported = false;
|
|
835
|
+
this.documentFormattingSupported = false;
|
|
823
836
|
this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
|
|
824
837
|
this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
838
|
+
this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
|
|
825
839
|
}
|
|
826
840
|
pid() {
|
|
827
841
|
return this.proc?.pid;
|
|
@@ -841,6 +855,12 @@ class LspClientTransport {
|
|
|
841
855
|
isDiagnosticPullSupported() {
|
|
842
856
|
return this.diagnosticPullSupported;
|
|
843
857
|
}
|
|
858
|
+
setDocumentFormattingSupported(supported) {
|
|
859
|
+
this.documentFormattingSupported = supported;
|
|
860
|
+
}
|
|
861
|
+
isDocumentFormattingSupported() {
|
|
862
|
+
return this.documentFormattingSupported;
|
|
863
|
+
}
|
|
844
864
|
handlePublishDiagnostics(params) {
|
|
845
865
|
this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
|
|
846
866
|
}
|
|
@@ -916,7 +936,7 @@ class LspClientTransport {
|
|
|
916
936
|
const options = args[1];
|
|
917
937
|
const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
|
|
918
938
|
const timeoutController = new AbortController;
|
|
919
|
-
const timeoutHandle = setTimeout(() => {
|
|
939
|
+
const timeoutHandle = this.timerProvider.setTimeout(() => {
|
|
920
940
|
const stderrTail = this.stderrBuffer.slice(-5).join(`
|
|
921
941
|
`);
|
|
922
942
|
timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
|
|
@@ -935,7 +955,7 @@ class LspClientTransport {
|
|
|
935
955
|
}
|
|
936
956
|
throw error;
|
|
937
957
|
} finally {
|
|
938
|
-
clearTimeout(timeoutHandle);
|
|
958
|
+
this.timerProvider.clearTimeout(timeoutHandle);
|
|
939
959
|
combinedSignal.dispose();
|
|
940
960
|
}
|
|
941
961
|
}
|
|
@@ -986,8 +1006,8 @@ class LspClientTransport {
|
|
|
986
1006
|
try {
|
|
987
1007
|
proc.kill();
|
|
988
1008
|
let timeoutId;
|
|
989
|
-
const timeoutPromise = new Promise((
|
|
990
|
-
timeoutId = setTimeout(
|
|
1009
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
1010
|
+
timeoutId = setTimeout(resolve, STOP_HARD_KILL_TIMEOUT_MS);
|
|
991
1011
|
});
|
|
992
1012
|
await Promise.race([
|
|
993
1013
|
proc.exited.then(() => {
|
|
@@ -1003,7 +1023,7 @@ class LspClientTransport {
|
|
|
1003
1023
|
proc.kill("SIGKILL");
|
|
1004
1024
|
await Promise.race([
|
|
1005
1025
|
proc.exited,
|
|
1006
|
-
new Promise((
|
|
1026
|
+
new Promise((resolve) => setTimeout(resolve, STOP_SIGKILL_GRACE_MS))
|
|
1007
1027
|
]);
|
|
1008
1028
|
} catch (error) {
|
|
1009
1029
|
reportBestEffortCleanupError("hard process kill", error instanceof Error ? error : String(error));
|
|
@@ -1054,6 +1074,14 @@ function supportsDiagnosticPull(capabilities) {
|
|
|
1054
1074
|
return false;
|
|
1055
1075
|
return Object.hasOwn(capabilities, "diagnosticProvider");
|
|
1056
1076
|
}
|
|
1077
|
+
function supportsDocumentFormatting(capabilities) {
|
|
1078
|
+
if (capabilities === undefined)
|
|
1079
|
+
return false;
|
|
1080
|
+
const provider = capabilities.documentFormattingProvider;
|
|
1081
|
+
if (provider === undefined || provider === null || provider === false)
|
|
1082
|
+
return false;
|
|
1083
|
+
return provider === true || typeof provider === "object";
|
|
1084
|
+
}
|
|
1057
1085
|
|
|
1058
1086
|
class LspClientConnection extends LspClientTransport {
|
|
1059
1087
|
async initialize() {
|
|
@@ -1070,6 +1098,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
1070
1098
|
references: {},
|
|
1071
1099
|
documentSymbol: { hierarchicalDocumentSymbolSupport: true },
|
|
1072
1100
|
publishDiagnostics: {},
|
|
1101
|
+
formatting: { dynamicRegistration: false },
|
|
1073
1102
|
rename: {
|
|
1074
1103
|
prepareSupport: true,
|
|
1075
1104
|
prepareSupportDefaultBehavior: 1
|
|
@@ -1111,6 +1140,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
1111
1140
|
initializationOptions: this.server.initialization
|
|
1112
1141
|
}, { timeoutMs: this.initializeTimeoutMs });
|
|
1113
1142
|
this.setDiagnosticPullSupported(supportsDiagnosticPull(result?.capabilities));
|
|
1143
|
+
this.setDocumentFormattingSupported(supportsDocumentFormatting(result?.capabilities));
|
|
1114
1144
|
await this.sendNotification("initialized", {});
|
|
1115
1145
|
await this.sendNotification("workspace/didChangeConfiguration", {
|
|
1116
1146
|
settings: { json: { validate: { enable: true } } }
|
|
@@ -1306,6 +1336,17 @@ function canonicalPath(filePath) {
|
|
|
1306
1336
|
return absolute;
|
|
1307
1337
|
}
|
|
1308
1338
|
}
|
|
1339
|
+
function normalizeDocumentUri(uri) {
|
|
1340
|
+
let decoded = uri;
|
|
1341
|
+
try {
|
|
1342
|
+
decoded = decodeURIComponent(uri);
|
|
1343
|
+
} catch {
|
|
1344
|
+
decoded = uri;
|
|
1345
|
+
}
|
|
1346
|
+
if (process.platform !== "win32")
|
|
1347
|
+
return decoded;
|
|
1348
|
+
return decoded.replace(/^(file:\/\/\/)([a-z]):/, (_match, prefix, drive) => `${prefix}${drive.toUpperCase()}:`);
|
|
1349
|
+
}
|
|
1309
1350
|
function isSameOrDescendant(candidate, parent) {
|
|
1310
1351
|
const suffix = relative2(parent, candidate);
|
|
1311
1352
|
return suffix === "" || !suffix.startsWith("..") && suffix !== "..";
|
|
@@ -1316,17 +1357,18 @@ function movedPath(candidate, oldPath, newPath) {
|
|
|
1316
1357
|
}
|
|
1317
1358
|
|
|
1318
1359
|
class WorkspaceDocumentState {
|
|
1319
|
-
sendNotification;
|
|
1320
|
-
clearDiagnostics;
|
|
1321
|
-
openDocuments = new Map;
|
|
1322
|
-
openByUri = new Map;
|
|
1323
|
-
openPromises = new Map;
|
|
1324
|
-
now;
|
|
1325
|
-
versionlessPublishQuiescenceMs;
|
|
1326
1360
|
constructor(sendNotification, clearDiagnostics, options = {}) {
|
|
1327
1361
|
this.sendNotification = sendNotification;
|
|
1328
1362
|
this.clearDiagnostics = clearDiagnostics;
|
|
1329
|
-
this.
|
|
1363
|
+
this.openDocuments = new Map;
|
|
1364
|
+
this.openByUri = new Map;
|
|
1365
|
+
this.openPromises = new Map;
|
|
1366
|
+
this.timerProvider = options.timerProvider ?? {
|
|
1367
|
+
now: options.now ?? (() => Date.now()),
|
|
1368
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
1369
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
1370
|
+
};
|
|
1371
|
+
this.now = () => this.timerProvider.now();
|
|
1330
1372
|
this.versionlessPublishQuiescenceMs = options.versionlessPublishQuiescenceMs ?? DEFAULT_VERSIONLESS_PUBLISH_QUIESCENCE_MS;
|
|
1331
1373
|
}
|
|
1332
1374
|
async openFile(filePath) {
|
|
@@ -1348,7 +1390,7 @@ class WorkspaceDocumentState {
|
|
|
1348
1390
|
return this.openDocuments.get(canonicalPath(filePath))?.version;
|
|
1349
1391
|
}
|
|
1350
1392
|
getStoredDiagnostics(uri) {
|
|
1351
|
-
const state = this.openByUri.get(uri);
|
|
1393
|
+
const state = this.openByUri.get(normalizeDocumentUri(uri));
|
|
1352
1394
|
if (!state)
|
|
1353
1395
|
return [];
|
|
1354
1396
|
return state.lastPublish?.diagnostics ?? state.pullCache?.diagnostics ?? [];
|
|
@@ -1370,13 +1412,13 @@ class WorkspaceDocumentState {
|
|
|
1370
1412
|
return state !== undefined && state.uri === snapshot.uri && state.version === snapshot.version && state.generation === snapshot.documentGeneration;
|
|
1371
1413
|
}
|
|
1372
1414
|
getPullCache(snapshot) {
|
|
1373
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1415
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1374
1416
|
if (!state?.pullCache || state.pullCache.documentVersion !== snapshot.version)
|
|
1375
1417
|
return null;
|
|
1376
1418
|
return state.pullCache;
|
|
1377
1419
|
}
|
|
1378
1420
|
recordPullDiagnostics(snapshot, report) {
|
|
1379
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1421
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1380
1422
|
if (!state)
|
|
1381
1423
|
return;
|
|
1382
1424
|
state.pullCache = {
|
|
@@ -1386,7 +1428,7 @@ class WorkspaceDocumentState {
|
|
|
1386
1428
|
};
|
|
1387
1429
|
}
|
|
1388
1430
|
recordPublishedDiagnostics(params) {
|
|
1389
|
-
const state = this.openByUri.get(params.uri);
|
|
1431
|
+
const state = this.openByUri.get(normalizeDocumentUri(params.uri));
|
|
1390
1432
|
if (!state)
|
|
1391
1433
|
return;
|
|
1392
1434
|
state.publishGeneration += 1;
|
|
@@ -1400,7 +1442,7 @@ class WorkspaceDocumentState {
|
|
|
1400
1442
|
this.notifyWaiters(state);
|
|
1401
1443
|
}
|
|
1402
1444
|
resolvePushDiagnostics(snapshot) {
|
|
1403
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1445
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1404
1446
|
if (!state?.lastPublish)
|
|
1405
1447
|
return { status: "missing" };
|
|
1406
1448
|
const publish = state.lastPublish;
|
|
@@ -1414,7 +1456,7 @@ class WorkspaceDocumentState {
|
|
|
1414
1456
|
return waitMs === 0 ? { status: "ready", diagnostics: publish.diagnostics } : { status: "wait", waitMs };
|
|
1415
1457
|
}
|
|
1416
1458
|
waitForDiagnosticsActivity(snapshot, timeoutMs) {
|
|
1417
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1459
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1418
1460
|
if (!state || timeoutMs <= 0)
|
|
1419
1461
|
return Promise.resolve();
|
|
1420
1462
|
return new Promise((resolveActivity) => {
|
|
@@ -1423,11 +1465,11 @@ class WorkspaceDocumentState {
|
|
|
1423
1465
|
if (settled)
|
|
1424
1466
|
return;
|
|
1425
1467
|
settled = true;
|
|
1426
|
-
clearTimeout(timer);
|
|
1468
|
+
this.timerProvider.clearTimeout(timer);
|
|
1427
1469
|
state.waiters.delete(finish);
|
|
1428
1470
|
resolveActivity();
|
|
1429
1471
|
};
|
|
1430
|
-
const timer = setTimeout(finish, timeoutMs);
|
|
1472
|
+
const timer = this.timerProvider.setTimeout(finish, timeoutMs);
|
|
1431
1473
|
if (typeof timer.unref === "function")
|
|
1432
1474
|
timer.unref();
|
|
1433
1475
|
state.waiters.add(finish);
|
|
@@ -1535,7 +1577,7 @@ class WorkspaceDocumentState {
|
|
|
1535
1577
|
waiters: new Set
|
|
1536
1578
|
};
|
|
1537
1579
|
this.openDocuments.set(path, state);
|
|
1538
|
-
this.openByUri.set(state.uri, state);
|
|
1580
|
+
this.openByUri.set(normalizeDocumentUri(state.uri), state);
|
|
1539
1581
|
this.notifyWaiters(state);
|
|
1540
1582
|
await this.sendNotification("textDocument/didOpen", {
|
|
1541
1583
|
textDocument: { uri: state.uri, languageId: state.languageId, version: state.version, text }
|
|
@@ -1560,7 +1602,7 @@ class WorkspaceDocumentState {
|
|
|
1560
1602
|
}
|
|
1561
1603
|
async closeDocument(state) {
|
|
1562
1604
|
this.openDocuments.delete(state.path);
|
|
1563
|
-
this.openByUri.delete(state.uri);
|
|
1605
|
+
this.openByUri.delete(normalizeDocumentUri(state.uri));
|
|
1564
1606
|
this.clearDiagnostics(state.uri);
|
|
1565
1607
|
this.notifyWaiters(state);
|
|
1566
1608
|
await this.sendNotification("textDocument/didClose", { textDocument: { uri: state.uri } });
|
|
@@ -1589,13 +1631,11 @@ import { dirname as dirname2, isAbsolute as isAbsolute2, relative as relative3,
|
|
|
1589
1631
|
import { fileURLToPath } from "node:url";
|
|
1590
1632
|
|
|
1591
1633
|
class WorkspaceEditPathError extends Error {
|
|
1592
|
-
path;
|
|
1593
|
-
detail;
|
|
1594
|
-
name = "WorkspaceEditPathError";
|
|
1595
1634
|
constructor(path, detail) {
|
|
1596
1635
|
super(`${detail}: ${path}`);
|
|
1597
1636
|
this.path = path;
|
|
1598
1637
|
this.detail = detail;
|
|
1638
|
+
this.name = "WorkspaceEditPathError";
|
|
1599
1639
|
}
|
|
1600
1640
|
}
|
|
1601
1641
|
function isPathInsideWorkspace(filePath, workspaceRoot) {
|
|
@@ -1887,13 +1927,11 @@ function canonicalFingerprint(operations) {
|
|
|
1887
1927
|
|
|
1888
1928
|
// ../lsp-core/src/lsp/workspace-edit-types.ts
|
|
1889
1929
|
class WorkspaceEditValidationError extends Error {
|
|
1890
|
-
changeIndex;
|
|
1891
|
-
detail;
|
|
1892
|
-
name = "WorkspaceEditValidationError";
|
|
1893
1930
|
constructor(changeIndex, detail) {
|
|
1894
1931
|
super(`change ${changeIndex}: ${detail}`);
|
|
1895
1932
|
this.changeIndex = changeIndex;
|
|
1896
1933
|
this.detail = detail;
|
|
1934
|
+
this.name = "WorkspaceEditValidationError";
|
|
1897
1935
|
}
|
|
1898
1936
|
}
|
|
1899
1937
|
|
|
@@ -1979,14 +2017,14 @@ function parseSinglePathResource(input, kind) {
|
|
|
1979
2017
|
return;
|
|
1980
2018
|
}
|
|
1981
2019
|
if (kind === "create") {
|
|
1982
|
-
const
|
|
2020
|
+
const options = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
|
|
1983
2021
|
target.operations.push({
|
|
1984
2022
|
kind,
|
|
1985
2023
|
changeIndex,
|
|
1986
2024
|
path: resolvedPath.path,
|
|
1987
2025
|
reportedPath: resolvedPath.requestedPath,
|
|
1988
|
-
overwrite:
|
|
1989
|
-
ignoreIfExists:
|
|
2026
|
+
overwrite: options["overwrite"] ?? false,
|
|
2027
|
+
ignoreIfExists: options["ignoreIfExists"] ?? false,
|
|
1990
2028
|
followedSymbolicLink: resolvedPath.followedSymbolicLink
|
|
1991
2029
|
});
|
|
1992
2030
|
return;
|
|
@@ -2391,10 +2429,9 @@ function simulateDelete(operation, virtual) {
|
|
|
2391
2429
|
import { existsSync as existsSync5, lstatSync as lstatSync3, readdirSync as readdirSync2 } from "node:fs";
|
|
2392
2430
|
import { dirname as dirname4, resolve as resolve5 } from "node:path";
|
|
2393
2431
|
class WorkspaceSnapshotBuilder {
|
|
2394
|
-
workspaceRoot;
|
|
2395
|
-
snapshots = new Map;
|
|
2396
2432
|
constructor(workspaceRoot) {
|
|
2397
2433
|
this.workspaceRoot = workspaceRoot;
|
|
2434
|
+
this.snapshots = new Map;
|
|
2398
2435
|
}
|
|
2399
2436
|
build(operations) {
|
|
2400
2437
|
this.add(this.workspaceRoot, false);
|
|
@@ -2438,8 +2475,10 @@ function snapshotOperations(operations, workspaceRoot) {
|
|
|
2438
2475
|
|
|
2439
2476
|
// ../lsp-core/src/lsp/workspace-edit-plan.ts
|
|
2440
2477
|
class PlanPathIndex {
|
|
2441
|
-
|
|
2442
|
-
|
|
2478
|
+
constructor() {
|
|
2479
|
+
this.firstChangeByPath = new Map;
|
|
2480
|
+
this.reportedPathByCanonical = new Map;
|
|
2481
|
+
}
|
|
2443
2482
|
build(operations) {
|
|
2444
2483
|
for (const operation of operations) {
|
|
2445
2484
|
switch (operation.kind) {
|
|
@@ -2455,11 +2494,11 @@ class PlanPathIndex {
|
|
|
2455
2494
|
}
|
|
2456
2495
|
}
|
|
2457
2496
|
}
|
|
2458
|
-
add(path,
|
|
2497
|
+
add(path, reportedPath, changeIndex) {
|
|
2459
2498
|
if (!this.firstChangeByPath.has(path))
|
|
2460
2499
|
this.firstChangeByPath.set(path, changeIndex);
|
|
2461
2500
|
if (!this.reportedPathByCanonical.has(path))
|
|
2462
|
-
this.reportedPathByCanonical.set(path,
|
|
2501
|
+
this.reportedPathByCanonical.set(path, reportedPath);
|
|
2463
2502
|
}
|
|
2464
2503
|
}
|
|
2465
2504
|
function fingerprintWorkspaceEdit(edit, workspaceRoot) {
|
|
@@ -2528,14 +2567,11 @@ function isRecord4(value) {
|
|
|
2528
2567
|
}
|
|
2529
2568
|
|
|
2530
2569
|
class WorkspaceMutationController {
|
|
2531
|
-
workspaceRoot;
|
|
2532
|
-
documents;
|
|
2533
|
-
activeLease = null;
|
|
2534
|
-
nextLeaseId = 1;
|
|
2535
|
-
io;
|
|
2536
2570
|
constructor(workspaceRoot, documents) {
|
|
2537
2571
|
this.workspaceRoot = workspaceRoot;
|
|
2538
2572
|
this.documents = documents;
|
|
2573
|
+
this.activeLease = null;
|
|
2574
|
+
this.nextLeaseId = 1;
|
|
2539
2575
|
}
|
|
2540
2576
|
setIo(io) {
|
|
2541
2577
|
this.io = io;
|
|
@@ -2574,8 +2610,8 @@ class WorkspaceMutationController {
|
|
|
2574
2610
|
};
|
|
2575
2611
|
}
|
|
2576
2612
|
lease.phase = "applying";
|
|
2577
|
-
lease.applyCompletion = new Promise((
|
|
2578
|
-
lease.resolveApply =
|
|
2613
|
+
lease.applyCompletion = new Promise((resolve) => {
|
|
2614
|
+
lease.resolveApply = resolve;
|
|
2579
2615
|
});
|
|
2580
2616
|
const edit = isRecord4(params) ? params["edit"] : undefined;
|
|
2581
2617
|
const record = edit === undefined ? { fingerprint: null, result: failure("workspace/applyEdit params.edit is required", 0) } : await this.applyEdit(edit, lease);
|
|
@@ -2648,14 +2684,12 @@ var DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3000;
|
|
|
2648
2684
|
var VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
|
|
2649
2685
|
|
|
2650
2686
|
class LspClient extends LspClientConnection {
|
|
2651
|
-
diagnosticPullErrors = [];
|
|
2652
|
-
documents;
|
|
2653
|
-
workspaceMutations;
|
|
2654
|
-
diagnosticsFreshnessTimeoutMs;
|
|
2655
2687
|
constructor(root, server, options = {}) {
|
|
2656
2688
|
super(root, server, options);
|
|
2689
|
+
this.diagnosticPullErrors = [];
|
|
2657
2690
|
this.diagnosticsFreshnessTimeoutMs = options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
|
|
2658
2691
|
this.documents = new WorkspaceDocumentState((method, params) => this.sendNotification(method, params), (uri) => this.diagnosticsStore.delete(uri), {
|
|
2692
|
+
timerProvider: this.timerProvider,
|
|
2659
2693
|
versionlessPublishQuiescenceMs: options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS
|
|
2660
2694
|
});
|
|
2661
2695
|
this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
|
|
@@ -2708,6 +2742,18 @@ class LspClient extends LspClientConnection {
|
|
|
2708
2742
|
textDocument: { uri: pathToFileURL3(absPath).href }
|
|
2709
2743
|
}, options);
|
|
2710
2744
|
}
|
|
2745
|
+
async formatDocument(filePath, options, signal) {
|
|
2746
|
+
if (!this.isDocumentFormattingSupported())
|
|
2747
|
+
return null;
|
|
2748
|
+
const absPath = this.resolveWorkspacePath(filePath);
|
|
2749
|
+
await this.openFile(absPath);
|
|
2750
|
+
const requestOptions = signal === undefined ? {} : { signal };
|
|
2751
|
+
const edits = await this.sendRequest("textDocument/formatting", {
|
|
2752
|
+
textDocument: { uri: pathToFileURL3(absPath).href },
|
|
2753
|
+
options
|
|
2754
|
+
}, requestOptions);
|
|
2755
|
+
return edits ?? [];
|
|
2756
|
+
}
|
|
2711
2757
|
async workspaceSymbols(query, signal) {
|
|
2712
2758
|
const options = signal === undefined ? {} : { signal };
|
|
2713
2759
|
return this.sendRequest("workspace/symbol", { query }, options);
|
|
@@ -2747,7 +2793,7 @@ class LspClient extends LspClientConnection {
|
|
|
2747
2793
|
const absPath = this.resolveWorkspacePath(filePath);
|
|
2748
2794
|
const uri = pathToFileURL3(absPath).href;
|
|
2749
2795
|
await this.openFile(absPath);
|
|
2750
|
-
const deadlineAt =
|
|
2796
|
+
const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
|
|
2751
2797
|
for (;; ) {
|
|
2752
2798
|
signal?.throwIfAborted();
|
|
2753
2799
|
const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
|
|
@@ -2760,13 +2806,13 @@ class LspClient extends LspClientConnection {
|
|
|
2760
2806
|
if (!pushFallbackOnly) {
|
|
2761
2807
|
const cached = this.documents.getPullCache(snapshot);
|
|
2762
2808
|
try {
|
|
2763
|
-
const
|
|
2764
|
-
if (
|
|
2809
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
2810
|
+
if (remainingMs <= 0)
|
|
2765
2811
|
return this.freshnessTimeout(absPath);
|
|
2766
2812
|
const result = await this.sendRequest("textDocument/diagnostic", {
|
|
2767
2813
|
textDocument: { uri },
|
|
2768
2814
|
...cached?.resultId === undefined ? {} : { previousResultId: cached.resultId }
|
|
2769
|
-
}, { timeoutMs:
|
|
2815
|
+
}, { timeoutMs: remainingMs, ...signal === undefined ? {} : { signal } });
|
|
2770
2816
|
if (!this.documents.isCurrentSnapshot(snapshot))
|
|
2771
2817
|
continue;
|
|
2772
2818
|
const report = this.parseDiagnosticPullReport(result);
|
|
@@ -2795,7 +2841,7 @@ class LspClient extends LspClientConnection {
|
|
|
2795
2841
|
}
|
|
2796
2842
|
if (!pushFallbackOnly)
|
|
2797
2843
|
continue;
|
|
2798
|
-
const remainingMs = deadlineAt -
|
|
2844
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
2799
2845
|
if (remainingMs <= 0) {
|
|
2800
2846
|
if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
|
|
2801
2847
|
const cached = this.documents.getPullCache(snapshot);
|
|
@@ -2847,7 +2893,7 @@ function waitForDiagnosticsActivity(wait, signal) {
|
|
|
2847
2893
|
return wait;
|
|
2848
2894
|
if (signal.aborted)
|
|
2849
2895
|
return Promise.reject(abortError2(signal));
|
|
2850
|
-
return new Promise((
|
|
2896
|
+
return new Promise((resolve, reject) => {
|
|
2851
2897
|
const onAbort = () => {
|
|
2852
2898
|
signal.removeEventListener("abort", onAbort);
|
|
2853
2899
|
reject(abortError2(signal));
|
|
@@ -2855,7 +2901,7 @@ function waitForDiagnosticsActivity(wait, signal) {
|
|
|
2855
2901
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
2856
2902
|
wait.then(() => {
|
|
2857
2903
|
signal.removeEventListener("abort", onAbort);
|
|
2858
|
-
|
|
2904
|
+
resolve();
|
|
2859
2905
|
}, (error) => {
|
|
2860
2906
|
signal.removeEventListener("abort", onAbort);
|
|
2861
2907
|
reject(error);
|
|
@@ -2923,7 +2969,7 @@ async function stopClientBestEffort(client) {
|
|
|
2923
2969
|
function awaitWithSignal(promise, signal) {
|
|
2924
2970
|
if (!signal)
|
|
2925
2971
|
return promise;
|
|
2926
|
-
return new Promise((
|
|
2972
|
+
return new Promise((resolve, reject) => {
|
|
2927
2973
|
let settled = false;
|
|
2928
2974
|
const onAbort = () => {
|
|
2929
2975
|
if (settled)
|
|
@@ -2941,7 +2987,7 @@ function awaitWithSignal(promise, signal) {
|
|
|
2941
2987
|
return;
|
|
2942
2988
|
settled = true;
|
|
2943
2989
|
signal.removeEventListener("abort", onAbort);
|
|
2944
|
-
|
|
2990
|
+
resolve(value);
|
|
2945
2991
|
}, (err) => {
|
|
2946
2992
|
if (settled)
|
|
2947
2993
|
return;
|
|
@@ -2953,18 +2999,16 @@ function awaitWithSignal(promise, signal) {
|
|
|
2953
2999
|
}
|
|
2954
3000
|
|
|
2955
3001
|
class LspManager {
|
|
2956
|
-
clients = new Map;
|
|
2957
|
-
reaperHandle = null;
|
|
2958
|
-
signalDisposer = null;
|
|
2959
|
-
disposed = false;
|
|
2960
|
-
idleTimeoutMs;
|
|
2961
|
-
initTimeoutMs;
|
|
2962
|
-
reaperIntervalMs;
|
|
2963
|
-
clientFactory;
|
|
2964
|
-
now;
|
|
2965
3002
|
constructor(options = {}) {
|
|
3003
|
+
this.clients = new Map;
|
|
3004
|
+
this.pendingStops = new Map;
|
|
3005
|
+
this.respawnBudgets = new Map;
|
|
3006
|
+
this.reaperHandle = null;
|
|
3007
|
+
this.signalDisposer = null;
|
|
3008
|
+
this.disposed = false;
|
|
2966
3009
|
this.idleTimeoutMs = options.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
|
|
2967
3010
|
this.initTimeoutMs = options.initTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
3011
|
+
this.maxResidentClients = options.maxResidentClients ?? MAX_RESIDENT_CLIENTS;
|
|
2968
3012
|
this.reaperIntervalMs = options.reaperIntervalMs ?? REAPER_INTERVAL_MS;
|
|
2969
3013
|
this.clientFactory = options.clientFactory ?? ((root, server) => new LspClient(root, server));
|
|
2970
3014
|
this.now = options.now ?? (() => Date.now());
|
|
@@ -2984,24 +3028,79 @@ class LspManager {
|
|
|
2984
3028
|
getKey(root, serverId) {
|
|
2985
3029
|
return `${root}::${serverId}`;
|
|
2986
3030
|
}
|
|
3031
|
+
tombstoneStop(key, client) {
|
|
3032
|
+
const stop = stopClientBestEffort(client);
|
|
3033
|
+
this.pendingStops.set(key, stop);
|
|
3034
|
+
stop.finally(() => {
|
|
3035
|
+
if (this.pendingStops.get(key) === stop) {
|
|
3036
|
+
this.pendingStops.delete(key);
|
|
3037
|
+
}
|
|
3038
|
+
});
|
|
3039
|
+
return stop;
|
|
3040
|
+
}
|
|
3041
|
+
recordDeadGeneration(key) {
|
|
3042
|
+
let budget = this.respawnBudgets.get(key);
|
|
3043
|
+
if (budget === undefined) {
|
|
3044
|
+
budget = { deadGenerations: 0, exhaustedAt: null };
|
|
3045
|
+
this.respawnBudgets.set(key, budget);
|
|
3046
|
+
}
|
|
3047
|
+
budget.deadGenerations += 1;
|
|
3048
|
+
}
|
|
3049
|
+
markHealthyGeneration(key) {
|
|
3050
|
+
this.respawnBudgets.delete(key);
|
|
3051
|
+
}
|
|
3052
|
+
ensureRespawnAllowed(key, root, serverId) {
|
|
3053
|
+
const budget = this.respawnBudgets.get(key);
|
|
3054
|
+
if (budget === undefined || budget.deadGenerations < CLIENT_RESPAWN_RETRY_LIMIT)
|
|
3055
|
+
return;
|
|
3056
|
+
if (budget.exhaustedAt === null) {
|
|
3057
|
+
budget.exhaustedAt = this.now();
|
|
3058
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
3059
|
+
}
|
|
3060
|
+
if (this.now() - budget.exhaustedAt < CLIENT_RESPAWN_COOLDOWN_MS) {
|
|
3061
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
3062
|
+
}
|
|
3063
|
+
budget.deadGenerations = 0;
|
|
3064
|
+
budget.exhaustedAt = null;
|
|
3065
|
+
}
|
|
2987
3066
|
reapStale() {
|
|
2988
3067
|
const t = this.now();
|
|
2989
3068
|
for (const [key, managed] of this.clients) {
|
|
2990
3069
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
2991
|
-
stopClientBestEffort(managed.client);
|
|
2992
3070
|
this.clients.delete(key);
|
|
3071
|
+
this.tombstoneStop(key, managed.client);
|
|
2993
3072
|
continue;
|
|
2994
3073
|
}
|
|
2995
3074
|
if (!managed.isInitializing && managed.refCount === 0 && managed.pendingWaiters === 0 && t - managed.lastUsedAt > this.idleTimeoutMs) {
|
|
2996
|
-
stopClientBestEffort(managed.client);
|
|
2997
3075
|
this.clients.delete(key);
|
|
3076
|
+
this.tombstoneStop(key, managed.client);
|
|
3077
|
+
}
|
|
3078
|
+
}
|
|
3079
|
+
}
|
|
3080
|
+
evictForAdmission() {
|
|
3081
|
+
while (this.clients.size >= this.maxResidentClients) {
|
|
3082
|
+
const victim = this.leastRecentlyUsedIdleClient();
|
|
3083
|
+
if (!victim)
|
|
3084
|
+
return;
|
|
3085
|
+
this.clients.delete(victim.key);
|
|
3086
|
+
this.tombstoneStop(victim.key, victim.managed.client);
|
|
3087
|
+
}
|
|
3088
|
+
}
|
|
3089
|
+
leastRecentlyUsedIdleClient() {
|
|
3090
|
+
let candidate = null;
|
|
3091
|
+
for (const [key, managed] of this.clients) {
|
|
3092
|
+
if (managed.refCount > 0 || managed.pendingWaiters > 0 || managed.isInitializing)
|
|
3093
|
+
continue;
|
|
3094
|
+
if (candidate === null || managed.lastUsedAt < candidate.managed.lastUsedAt) {
|
|
3095
|
+
candidate = { key, managed };
|
|
2998
3096
|
}
|
|
2999
3097
|
}
|
|
3098
|
+
return candidate;
|
|
3000
3099
|
}
|
|
3001
3100
|
async tryDeleteIfOrphaned(key, managed) {
|
|
3002
3101
|
if (managed.refCount === 0 && managed.pendingWaiters === 0 && !managed.isInitializing && this.clients.get(key) === managed) {
|
|
3003
3102
|
this.clients.delete(key);
|
|
3004
|
-
await
|
|
3103
|
+
await this.tombstoneStop(key, managed.client);
|
|
3005
3104
|
}
|
|
3006
3105
|
}
|
|
3007
3106
|
async getClient(root, server, signal) {
|
|
@@ -3010,12 +3109,22 @@ class LspManager {
|
|
|
3010
3109
|
}
|
|
3011
3110
|
signal?.throwIfAborted();
|
|
3012
3111
|
const key = this.getKey(root, server.id);
|
|
3112
|
+
for (;; ) {
|
|
3113
|
+
const pendingStop = this.pendingStops.get(key);
|
|
3114
|
+
if (pendingStop === undefined)
|
|
3115
|
+
break;
|
|
3116
|
+
await awaitWithSignal(pendingStop, signal);
|
|
3117
|
+
signal?.throwIfAborted();
|
|
3118
|
+
}
|
|
3119
|
+
if (this.disposed) {
|
|
3120
|
+
throw new Error("LspManager has been disposed");
|
|
3121
|
+
}
|
|
3013
3122
|
let managed = this.clients.get(key);
|
|
3014
3123
|
if (managed) {
|
|
3015
3124
|
const t = this.now();
|
|
3016
3125
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
3017
|
-
await stopClientBestEffort(managed.client);
|
|
3018
3126
|
this.clients.delete(key);
|
|
3127
|
+
await this.tombstoneStop(key, managed.client);
|
|
3019
3128
|
managed = undefined;
|
|
3020
3129
|
}
|
|
3021
3130
|
}
|
|
@@ -3036,14 +3145,20 @@ class LspManager {
|
|
|
3036
3145
|
signal.throwIfAborted();
|
|
3037
3146
|
}
|
|
3038
3147
|
if (!managed.client.isAlive()) {
|
|
3039
|
-
|
|
3040
|
-
this.clients.
|
|
3148
|
+
this.recordDeadGeneration(key);
|
|
3149
|
+
if (this.clients.get(key) === managed) {
|
|
3150
|
+
this.clients.delete(key);
|
|
3151
|
+
}
|
|
3152
|
+
await this.tombstoneStop(key, managed.client);
|
|
3041
3153
|
return this.getClient(root, server, signal);
|
|
3042
3154
|
}
|
|
3155
|
+
this.markHealthyGeneration(key);
|
|
3043
3156
|
managed.refCount++;
|
|
3044
3157
|
managed.lastUsedAt = this.now();
|
|
3045
3158
|
return managed.client;
|
|
3046
3159
|
}
|
|
3160
|
+
this.evictForAdmission();
|
|
3161
|
+
this.ensureRespawnAllowed(key, root, server.id);
|
|
3047
3162
|
const client = this.clientFactory(root, server);
|
|
3048
3163
|
const initStartedAt = this.now();
|
|
3049
3164
|
const initPromise = (async () => {
|
|
@@ -3067,7 +3182,7 @@ class LspManager {
|
|
|
3067
3182
|
if (this.clients.get(key) === newManaged) {
|
|
3068
3183
|
this.clients.delete(key);
|
|
3069
3184
|
}
|
|
3070
|
-
await
|
|
3185
|
+
await this.tombstoneStop(key, client);
|
|
3071
3186
|
throw err;
|
|
3072
3187
|
}
|
|
3073
3188
|
newManaged.pendingWaiters--;
|
|
@@ -3078,6 +3193,15 @@ class LspManager {
|
|
|
3078
3193
|
await this.tryDeleteIfOrphaned(key, newManaged);
|
|
3079
3194
|
signal.throwIfAborted();
|
|
3080
3195
|
}
|
|
3196
|
+
if (!client.isAlive()) {
|
|
3197
|
+
this.recordDeadGeneration(key);
|
|
3198
|
+
if (this.clients.get(key) === newManaged) {
|
|
3199
|
+
this.clients.delete(key);
|
|
3200
|
+
}
|
|
3201
|
+
await this.tombstoneStop(key, client);
|
|
3202
|
+
return this.getClient(root, server, signal);
|
|
3203
|
+
}
|
|
3204
|
+
this.markHealthyGeneration(key);
|
|
3081
3205
|
newManaged.refCount++;
|
|
3082
3206
|
newManaged.lastUsedAt = this.now();
|
|
3083
3207
|
return client;
|
|
@@ -3098,14 +3222,20 @@ class LspManager {
|
|
|
3098
3222
|
if (client && managed.client !== client)
|
|
3099
3223
|
return;
|
|
3100
3224
|
this.clients.delete(key);
|
|
3101
|
-
|
|
3225
|
+
this.tombstoneStop(key, managed.client);
|
|
3102
3226
|
}
|
|
3103
3227
|
warmupClient(root, server) {
|
|
3104
3228
|
if (this.disposed)
|
|
3105
3229
|
return;
|
|
3106
3230
|
const key = this.getKey(root, server.id);
|
|
3107
|
-
if (this.clients.has(key))
|
|
3231
|
+
if (this.clients.has(key) || this.pendingStops.has(key))
|
|
3108
3232
|
return;
|
|
3233
|
+
this.evictForAdmission();
|
|
3234
|
+
try {
|
|
3235
|
+
this.ensureRespawnAllowed(key, root, server.id);
|
|
3236
|
+
} catch {
|
|
3237
|
+
return;
|
|
3238
|
+
}
|
|
3109
3239
|
const client = this.clientFactory(root, server);
|
|
3110
3240
|
const initStartedAt = this.now();
|
|
3111
3241
|
const initPromise = (async () => {
|
|
@@ -3131,7 +3261,7 @@ class LspManager {
|
|
|
3131
3261
|
if (this.clients.get(key) === managed) {
|
|
3132
3262
|
this.clients.delete(key);
|
|
3133
3263
|
}
|
|
3134
|
-
|
|
3264
|
+
this.tombstoneStop(key, client);
|
|
3135
3265
|
});
|
|
3136
3266
|
}
|
|
3137
3267
|
isServerInitializing(root, serverId) {
|
|
@@ -3175,8 +3305,11 @@ class LspManager {
|
|
|
3175
3305
|
for (const managed of this.clients.values()) {
|
|
3176
3306
|
stopPromises.push(stopClientBestEffort(managed.client));
|
|
3177
3307
|
}
|
|
3308
|
+
const tombstonedStops = [...this.pendingStops.values()];
|
|
3178
3309
|
this.clients.clear();
|
|
3179
|
-
|
|
3310
|
+
this.respawnBudgets.clear();
|
|
3311
|
+
await Promise.allSettled([...stopPromises, ...tombstonedStops]);
|
|
3312
|
+
this.pendingStops.clear();
|
|
3180
3313
|
}
|
|
3181
3314
|
}
|
|
3182
3315
|
var _defaultInstance = null;
|
|
@@ -3194,57 +3327,52 @@ async function disposeDefaultLspManager() {
|
|
|
3194
3327
|
}
|
|
3195
3328
|
}
|
|
3196
3329
|
|
|
3197
|
-
// ../lsp-core/src/lsp/
|
|
3198
|
-
import { existsSync as existsSync6,
|
|
3199
|
-
import { dirname as dirname5 } from "node:path";
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3206
|
-
|
|
3207
|
-
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
|
|
3330
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
3331
|
+
import { existsSync as existsSync6, realpathSync as realpathSync4 } from "node:fs";
|
|
3332
|
+
import { dirname as dirname5, join as join3 } from "node:path";
|
|
3333
|
+
|
|
3334
|
+
// ../lsp-core/src/lsp/workspace-markers.ts
|
|
3335
|
+
var GIT_WORKSPACE_MARKER = ".git";
|
|
3336
|
+
var PROJECT_WORKSPACE_MARKERS = [
|
|
3337
|
+
"package.json",
|
|
3338
|
+
"pyproject.toml",
|
|
3339
|
+
"Cargo.toml",
|
|
3340
|
+
"go.mod",
|
|
3341
|
+
"pom.xml",
|
|
3342
|
+
"build.gradle"
|
|
3343
|
+
];
|
|
3344
|
+
var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
|
|
3345
|
+
|
|
3346
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
3347
|
+
function findWorkspaceRootOutsideContext(directory) {
|
|
3348
|
+
const marked = nearestMarkedAncestor(directory);
|
|
3349
|
+
if (marked !== undefined)
|
|
3350
|
+
return marked;
|
|
3351
|
+
return realpathSync4(nearestExistingAncestor(directory));
|
|
3352
|
+
}
|
|
3353
|
+
function nearestMarkedAncestor(directory) {
|
|
3354
|
+
let current = directory;
|
|
3355
|
+
for (;; ) {
|
|
3356
|
+
if (existsSync6(current) && WORKSPACE_MARKERS.some((marker) => existsSync6(join3(current, marker)))) {
|
|
3357
|
+
return realpathSync4(current);
|
|
3358
|
+
}
|
|
3359
|
+
const parent = dirname5(current);
|
|
3360
|
+
if (parent === current)
|
|
3361
|
+
return;
|
|
3362
|
+
current = parent;
|
|
3212
3363
|
}
|
|
3213
3364
|
}
|
|
3214
|
-
function
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
|
|
3221
|
-
}
|
|
3222
|
-
|
|
3223
|
-
return value === "declined" || value === "allowed";
|
|
3224
|
-
}
|
|
3225
|
-
function writeInstallDecisions(decisions) {
|
|
3226
|
-
const path = getInstallDecisionsPath();
|
|
3227
|
-
mkdirSync(dirname5(path), { recursive: true });
|
|
3228
|
-
const tmpPath = `${path}.tmp`;
|
|
3229
|
-
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
3230
|
-
`, "utf8");
|
|
3231
|
-
renameSync2(tmpPath, path);
|
|
3232
|
-
}
|
|
3233
|
-
function isInstallDecisions(value) {
|
|
3234
|
-
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
3235
|
-
}
|
|
3236
|
-
function isInstallDecisionRecord(value) {
|
|
3237
|
-
if (!isRecord5(value))
|
|
3238
|
-
return false;
|
|
3239
|
-
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
3240
|
-
}
|
|
3241
|
-
function isRecord5(value) {
|
|
3242
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3365
|
+
function nearestExistingAncestor(directory) {
|
|
3366
|
+
let current = directory;
|
|
3367
|
+
while (!existsSync6(current)) {
|
|
3368
|
+
const parent = dirname5(current);
|
|
3369
|
+
if (parent === current)
|
|
3370
|
+
return current;
|
|
3371
|
+
current = parent;
|
|
3372
|
+
}
|
|
3373
|
+
return current;
|
|
3243
3374
|
}
|
|
3244
3375
|
|
|
3245
|
-
// ../lsp-core/src/lsp/config-loader.ts
|
|
3246
|
-
import { existsSync as existsSync7, readFileSync as readFileSync4 } from "node:fs";
|
|
3247
|
-
|
|
3248
3376
|
// ../lsp-core/src/lsp/server-definitions.ts
|
|
3249
3377
|
var LSP_INSTALL_HINTS = {
|
|
3250
3378
|
typescript: "npm install -g typescript-language-server typescript",
|
|
@@ -3290,6 +3418,26 @@ var LSP_INSTALL_HINTS = {
|
|
|
3290
3418
|
julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
|
|
3291
3419
|
razor: "Razor runs through the Roslyn language server (cohosting). " + "Install: dotnet tool install -g roslyn-language-server --prerelease (requires v5.8.0+). See https://github.com/dotnet/razor"
|
|
3292
3420
|
};
|
|
3421
|
+
var LSP_LOCAL_INSTALL_HINTS = {
|
|
3422
|
+
typescript: "bun add -d typescript-language-server typescript",
|
|
3423
|
+
vue: "bun add -d @vue/language-server",
|
|
3424
|
+
eslint: "bun add -d vscode-langservers-extracted",
|
|
3425
|
+
oxlint: "bun add -d oxlint",
|
|
3426
|
+
biome: "bun add -d @biomejs/biome",
|
|
3427
|
+
svelte: "bun add -d svelte-language-server",
|
|
3428
|
+
astro: "bun add -d @astrojs/language-server",
|
|
3429
|
+
bash: "bun add -d bash-language-server",
|
|
3430
|
+
"bash-ls": "bun add -d bash-language-server",
|
|
3431
|
+
"yaml-ls": "bun add -d yaml-language-server",
|
|
3432
|
+
php: "bun add -d intelephense",
|
|
3433
|
+
prisma: "bun add -d prisma",
|
|
3434
|
+
dockerfile: "bun add -d dockerfile-language-server-nodejs",
|
|
3435
|
+
pyright: "uv add --dev pyright",
|
|
3436
|
+
basedpyright: "uv add --dev basedpyright",
|
|
3437
|
+
ruff: "uv add --dev ruff",
|
|
3438
|
+
ty: "uv add --dev ty",
|
|
3439
|
+
"ruby-lsp": "bundle add ruby-lsp --group development"
|
|
3440
|
+
};
|
|
3293
3441
|
var BUILTIN_SERVERS = {
|
|
3294
3442
|
typescript: {
|
|
3295
3443
|
command: ["typescript-language-server", "--stdio"],
|
|
@@ -3392,7 +3540,56 @@ var BUILTIN_SERVERS = {
|
|
|
3392
3540
|
}
|
|
3393
3541
|
};
|
|
3394
3542
|
|
|
3543
|
+
// ../lsp-core/src/lsp/server-install-state.ts
|
|
3544
|
+
import { existsSync as existsSync7, mkdirSync, readFileSync as readFileSync3, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
3545
|
+
import { dirname as dirname6 } from "node:path";
|
|
3546
|
+
function getInstallDecisionsPath() {
|
|
3547
|
+
return lspRequestContext().installDecisionsPath;
|
|
3548
|
+
}
|
|
3549
|
+
function loadInstallDecisions() {
|
|
3550
|
+
const path = getInstallDecisionsPath();
|
|
3551
|
+
if (!existsSync7(path))
|
|
3552
|
+
return {};
|
|
3553
|
+
try {
|
|
3554
|
+
const parsed = JSON.parse(readFileSync3(path, "utf8"));
|
|
3555
|
+
return isInstallDecisions(parsed) ? parsed : {};
|
|
3556
|
+
} catch {
|
|
3557
|
+
return {};
|
|
3558
|
+
}
|
|
3559
|
+
}
|
|
3560
|
+
function loadInstallDecision(serverId) {
|
|
3561
|
+
return loadInstallDecisions()[serverId];
|
|
3562
|
+
}
|
|
3563
|
+
function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
|
|
3564
|
+
const decisions = loadInstallDecisions();
|
|
3565
|
+
decisions[serverId] = { decision, decidedAt };
|
|
3566
|
+
writeInstallDecisions(decisions);
|
|
3567
|
+
}
|
|
3568
|
+
function isInstallDecision(value) {
|
|
3569
|
+
return value === "declined" || value === "allowed";
|
|
3570
|
+
}
|
|
3571
|
+
function writeInstallDecisions(decisions) {
|
|
3572
|
+
const path = getInstallDecisionsPath();
|
|
3573
|
+
mkdirSync(dirname6(path), { recursive: true });
|
|
3574
|
+
const tmpPath = `${path}.tmp`;
|
|
3575
|
+
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
3576
|
+
`, "utf8");
|
|
3577
|
+
renameSync2(tmpPath, path);
|
|
3578
|
+
}
|
|
3579
|
+
function isInstallDecisions(value) {
|
|
3580
|
+
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
3581
|
+
}
|
|
3582
|
+
function isInstallDecisionRecord(value) {
|
|
3583
|
+
if (!isRecord5(value))
|
|
3584
|
+
return false;
|
|
3585
|
+
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
3586
|
+
}
|
|
3587
|
+
function isRecord5(value) {
|
|
3588
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3589
|
+
}
|
|
3590
|
+
|
|
3395
3591
|
// ../lsp-core/src/lsp/config-loader.ts
|
|
3592
|
+
import { existsSync as existsSync8, readFileSync as readFileSync4 } from "node:fs";
|
|
3396
3593
|
function getProjectConfigPaths() {
|
|
3397
3594
|
return lspRequestContext().projectConfigPaths;
|
|
3398
3595
|
}
|
|
@@ -3400,7 +3597,7 @@ function getUserConfigPath() {
|
|
|
3400
3597
|
return lspRequestContext().userConfigPath;
|
|
3401
3598
|
}
|
|
3402
3599
|
function loadJsonFile(path) {
|
|
3403
|
-
if (!
|
|
3600
|
+
if (!existsSync8(path))
|
|
3404
3601
|
return null;
|
|
3405
3602
|
try {
|
|
3406
3603
|
const parsed = JSON.parse(readFileSync4(path, "utf-8"));
|
|
@@ -3482,7 +3679,7 @@ function createServerFromEntry(id, entry, source) {
|
|
|
3482
3679
|
if (source === "project") {
|
|
3483
3680
|
if (!builtin)
|
|
3484
3681
|
return null;
|
|
3485
|
-
const
|
|
3682
|
+
const server = createServer({
|
|
3486
3683
|
id,
|
|
3487
3684
|
command: builtin.command,
|
|
3488
3685
|
extensions: entry.extensions ?? builtin.extensions,
|
|
@@ -3490,20 +3687,20 @@ function createServerFromEntry(id, entry, source) {
|
|
|
3490
3687
|
source
|
|
3491
3688
|
});
|
|
3492
3689
|
if (entry.initialization !== undefined) {
|
|
3493
|
-
|
|
3690
|
+
server.initialization = entry.initialization;
|
|
3494
3691
|
}
|
|
3495
|
-
return
|
|
3692
|
+
return server;
|
|
3496
3693
|
}
|
|
3497
3694
|
if (entry.command && entry.extensions) {
|
|
3498
|
-
const
|
|
3695
|
+
const server = createServer({
|
|
3499
3696
|
id,
|
|
3500
3697
|
command: entry.command,
|
|
3501
3698
|
extensions: entry.extensions,
|
|
3502
3699
|
priority: entry.priority ?? 0,
|
|
3503
3700
|
source
|
|
3504
3701
|
});
|
|
3505
|
-
applyOptionalServerFields(
|
|
3506
|
-
return
|
|
3702
|
+
applyOptionalServerFields(server, entry);
|
|
3703
|
+
return server;
|
|
3507
3704
|
}
|
|
3508
3705
|
if (!builtin)
|
|
3509
3706
|
return null;
|
|
@@ -3588,54 +3785,155 @@ function getDisabledServerIds() {
|
|
|
3588
3785
|
}
|
|
3589
3786
|
|
|
3590
3787
|
// ../lsp-core/src/lsp/server-installation.ts
|
|
3591
|
-
import { existsSync as
|
|
3592
|
-
import { delimiter as delimiter3, join as
|
|
3593
|
-
|
|
3594
|
-
|
|
3595
|
-
|
|
3596
|
-
|
|
3597
|
-
|
|
3598
|
-
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
-
|
|
3788
|
+
import { existsSync as existsSync9 } from "node:fs";
|
|
3789
|
+
import { delimiter as delimiter3, dirname as dirname7, isAbsolute as isAbsolute3, join as join4, resolve as resolve7 } from "node:path";
|
|
3790
|
+
var LOCAL_BIN_RULES = [
|
|
3791
|
+
{
|
|
3792
|
+
markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
|
|
3793
|
+
binDirs: [join4("node_modules", ".bin")]
|
|
3794
|
+
},
|
|
3795
|
+
{
|
|
3796
|
+
markers: [
|
|
3797
|
+
"pyproject.toml",
|
|
3798
|
+
"ty.toml",
|
|
3799
|
+
"requirements.txt",
|
|
3800
|
+
"setup.py",
|
|
3801
|
+
"setup.cfg",
|
|
3802
|
+
"Pipfile",
|
|
3803
|
+
"pyrightconfig.json",
|
|
3804
|
+
"ruff.toml",
|
|
3805
|
+
".ruff.toml"
|
|
3806
|
+
],
|
|
3807
|
+
binDirs: [
|
|
3808
|
+
join4(".venv", "bin"),
|
|
3809
|
+
join4(".venv", "Scripts"),
|
|
3810
|
+
join4("venv", "bin"),
|
|
3811
|
+
join4("venv", "Scripts"),
|
|
3812
|
+
join4(".env", "bin"),
|
|
3813
|
+
join4(".env", "Scripts")
|
|
3814
|
+
]
|
|
3815
|
+
},
|
|
3816
|
+
{
|
|
3817
|
+
markers: ["Gemfile", "Gemfile.lock"],
|
|
3818
|
+
binDirs: [join4("vendor", "bundle", "bin"), "bin"]
|
|
3819
|
+
},
|
|
3820
|
+
{
|
|
3821
|
+
markers: ["go.mod", "go.sum", "go.work"],
|
|
3822
|
+
binDirs: ["bin"]
|
|
3823
|
+
}
|
|
3824
|
+
];
|
|
3825
|
+
var resolutionCache = new Map;
|
|
3826
|
+
var probeCount = 0;
|
|
3827
|
+
function probe(path) {
|
|
3828
|
+
probeCount += 1;
|
|
3829
|
+
return existsSync9(path);
|
|
3830
|
+
}
|
|
3831
|
+
function executableSuffixes(platform, pathExt) {
|
|
3832
|
+
if (platform !== "win32")
|
|
3833
|
+
return [""];
|
|
3834
|
+
const configured = pathExt ?? process.env["PATHEXT"] ?? "";
|
|
3835
|
+
const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
|
|
3836
|
+
return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
|
|
3837
|
+
}
|
|
3838
|
+
function probeWithSuffixes(directory, command, suffixes) {
|
|
3839
|
+
for (const suffix of suffixes) {
|
|
3840
|
+
const candidate = join4(directory, command + suffix);
|
|
3841
|
+
if (probe(candidate))
|
|
3842
|
+
return candidate;
|
|
3602
3843
|
}
|
|
3603
|
-
|
|
3604
|
-
|
|
3605
|
-
|
|
3606
|
-
|
|
3607
|
-
|
|
3608
|
-
|
|
3609
|
-
|
|
3610
|
-
|
|
3611
|
-
|
|
3844
|
+
return null;
|
|
3845
|
+
}
|
|
3846
|
+
function resolveLocal(command, workingDirectory, suffixes, stopAt) {
|
|
3847
|
+
const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
|
|
3848
|
+
let current = resolve7(workingDirectory);
|
|
3849
|
+
while (true) {
|
|
3850
|
+
for (const rule of LOCAL_BIN_RULES) {
|
|
3851
|
+
if (!rule.markers.some((marker) => probe(join4(current, marker))))
|
|
3852
|
+
continue;
|
|
3853
|
+
for (const binDir of rule.binDirs) {
|
|
3854
|
+
const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
|
|
3855
|
+
if (found !== null)
|
|
3856
|
+
return found;
|
|
3857
|
+
}
|
|
3612
3858
|
}
|
|
3859
|
+
if (probe(join4(current, ".git")))
|
|
3860
|
+
return null;
|
|
3861
|
+
if (boundary !== undefined && current === boundary)
|
|
3862
|
+
return null;
|
|
3863
|
+
const parent = dirname7(current);
|
|
3864
|
+
if (parent === current)
|
|
3865
|
+
return null;
|
|
3866
|
+
current = parent;
|
|
3613
3867
|
}
|
|
3614
|
-
|
|
3615
|
-
|
|
3868
|
+
}
|
|
3869
|
+
function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
|
|
3870
|
+
let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
|
|
3871
|
+
if (platform === "win32" && !pathEnv) {
|
|
3616
3872
|
pathEnv = process.env["Path"] ?? "";
|
|
3617
3873
|
}
|
|
3618
|
-
const
|
|
3619
|
-
|
|
3620
|
-
|
|
3621
|
-
|
|
3622
|
-
|
|
3623
|
-
|
|
3624
|
-
}
|
|
3874
|
+
for (const entry of pathEnv.split(delimiter3)) {
|
|
3875
|
+
if (entry.length === 0)
|
|
3876
|
+
continue;
|
|
3877
|
+
const found = probeWithSuffixes(entry, command, suffixes);
|
|
3878
|
+
if (found !== null)
|
|
3879
|
+
return found;
|
|
3625
3880
|
}
|
|
3626
|
-
|
|
3627
|
-
|
|
3628
|
-
|
|
3881
|
+
return null;
|
|
3882
|
+
}
|
|
3883
|
+
function resolveServerBinary(command, workingDirectory, options = {}) {
|
|
3884
|
+
if (command.length === 0)
|
|
3885
|
+
return null;
|
|
3886
|
+
const [cmd] = command;
|
|
3887
|
+
if (cmd === undefined || cmd.length === 0)
|
|
3888
|
+
return null;
|
|
3889
|
+
const platform = options.platform ?? process.platform;
|
|
3890
|
+
const suffixes = executableSuffixes(platform, options.pathExt);
|
|
3891
|
+
if (cmd.includes("/") || cmd.includes("\\")) {
|
|
3892
|
+
const explicit = isAbsolute3(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
|
|
3893
|
+
return probe(explicit) ? explicit : null;
|
|
3894
|
+
}
|
|
3895
|
+
const cacheKey = JSON.stringify([
|
|
3896
|
+
workingDirectory ?? "",
|
|
3897
|
+
cmd,
|
|
3898
|
+
platform,
|
|
3899
|
+
options.stopAt ?? "",
|
|
3900
|
+
options.pathExt ?? "",
|
|
3901
|
+
options.pathEnv ?? process.env["PATH"] ?? ""
|
|
3902
|
+
]);
|
|
3903
|
+
const cached = resolutionCache.get(cacheKey);
|
|
3904
|
+
if (cached !== undefined)
|
|
3905
|
+
return cached;
|
|
3906
|
+
let resolved = null;
|
|
3907
|
+
if (workingDirectory !== undefined && workingDirectory.length > 0) {
|
|
3908
|
+
resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
|
|
3909
|
+
}
|
|
3910
|
+
resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
|
|
3911
|
+
if (resolved === null && cmd === "node")
|
|
3912
|
+
resolved = cmd;
|
|
3913
|
+
resolutionCache.set(cacheKey, resolved);
|
|
3914
|
+
return resolved;
|
|
3915
|
+
}
|
|
3916
|
+
function isServerInstalled(command, workingDirectory, options = {}) {
|
|
3917
|
+
if (command.length === 0)
|
|
3918
|
+
return false;
|
|
3919
|
+
return resolveServerBinary(command, workingDirectory, options) !== null;
|
|
3629
3920
|
}
|
|
3630
3921
|
|
|
3631
3922
|
// ../lsp-core/src/lsp/server-resolution.ts
|
|
3923
|
+
function withResolvedCommand(command, binaryPath) {
|
|
3924
|
+
return [binaryPath, ...command.slice(1)];
|
|
3925
|
+
}
|
|
3632
3926
|
function findServerForExtension(ext) {
|
|
3633
3927
|
const servers = getMergedServers();
|
|
3928
|
+
const workingDirectory = contextCwd();
|
|
3634
3929
|
for (const server of servers) {
|
|
3635
|
-
if (server.extensions.includes(ext)
|
|
3930
|
+
if (!server.extensions.includes(ext))
|
|
3931
|
+
continue;
|
|
3932
|
+
const binaryPath = resolveServerBinary(server.command, workingDirectory);
|
|
3933
|
+
if (binaryPath !== null) {
|
|
3636
3934
|
const resolvedServer = {
|
|
3637
3935
|
id: server.id,
|
|
3638
|
-
command: server.command,
|
|
3936
|
+
command: withResolvedCommand(server.command, binaryPath),
|
|
3639
3937
|
extensions: server.extensions,
|
|
3640
3938
|
priority: server.priority
|
|
3641
3939
|
};
|
|
@@ -3682,6 +3980,7 @@ function findServerForExtension(ext) {
|
|
|
3682
3980
|
function getAllServers() {
|
|
3683
3981
|
const servers = getMergedServers();
|
|
3684
3982
|
const disabled = getDisabledServerIds();
|
|
3983
|
+
const workingDirectory = contextCwd();
|
|
3685
3984
|
const result = [];
|
|
3686
3985
|
const seen = new Set;
|
|
3687
3986
|
for (const server of servers) {
|
|
@@ -3689,7 +3988,7 @@ function getAllServers() {
|
|
|
3689
3988
|
continue;
|
|
3690
3989
|
result.push({
|
|
3691
3990
|
id: server.id,
|
|
3692
|
-
installed: isServerInstalled(server.command),
|
|
3991
|
+
installed: isServerInstalled(server.command, workingDirectory),
|
|
3693
3992
|
extensions: server.extensions,
|
|
3694
3993
|
disabled: false,
|
|
3695
3994
|
source: server.source,
|
|
@@ -3703,7 +4002,7 @@ function getAllServers() {
|
|
|
3703
4002
|
const builtin = BUILTIN_SERVERS[id];
|
|
3704
4003
|
result.push({
|
|
3705
4004
|
id,
|
|
3706
|
-
installed: builtin ? isServerInstalled(builtin.command) : false,
|
|
4005
|
+
installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
|
|
3707
4006
|
extensions: builtin?.extensions ?? [],
|
|
3708
4007
|
disabled: true,
|
|
3709
4008
|
source: "disabled",
|
|
@@ -3714,7 +4013,6 @@ function getAllServers() {
|
|
|
3714
4013
|
}
|
|
3715
4014
|
|
|
3716
4015
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
3717
|
-
var WORKSPACE_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle"];
|
|
3718
4016
|
function isDirectoryPath(filePath) {
|
|
3719
4017
|
try {
|
|
3720
4018
|
return statSync3(filePath).isDirectory();
|
|
@@ -3727,36 +4025,40 @@ function findWorkspaceRoot(filePath) {
|
|
|
3727
4025
|
const abs = resolveReadablePathInsideContext(filePath);
|
|
3728
4026
|
let dir = abs;
|
|
3729
4027
|
if (!isDirectoryPath(dir)) {
|
|
3730
|
-
dir =
|
|
4028
|
+
dir = dirname8(dir);
|
|
3731
4029
|
}
|
|
4030
|
+
if (!isPathInside(cwd, abs))
|
|
4031
|
+
return findWorkspaceRootOutsideContext(dir);
|
|
3732
4032
|
const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
|
|
4033
|
+
let nearestPackageRoot;
|
|
3733
4034
|
while (isPathInside(cwd, dir)) {
|
|
3734
4035
|
const canonicalDir = existingDirectoryInsideContext(dir, cwd);
|
|
3735
4036
|
if (canonicalDir !== undefined) {
|
|
3736
|
-
|
|
3737
|
-
|
|
3738
|
-
|
|
3739
|
-
|
|
4037
|
+
if (existsSync10(join5(dir, GIT_WORKSPACE_MARKER))) {
|
|
4038
|
+
return canonicalDir;
|
|
4039
|
+
}
|
|
4040
|
+
if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
|
|
4041
|
+
nearestPackageRoot = canonicalDir;
|
|
3740
4042
|
}
|
|
3741
4043
|
}
|
|
3742
4044
|
if (dir === cwd)
|
|
3743
4045
|
break;
|
|
3744
|
-
dir =
|
|
4046
|
+
dir = dirname8(dir);
|
|
3745
4047
|
}
|
|
3746
|
-
return fallbackRoot;
|
|
4048
|
+
return nearestPackageRoot ?? fallbackRoot;
|
|
4049
|
+
}
|
|
4050
|
+
function hasProjectWorkspaceMarker(directory) {
|
|
4051
|
+
return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync10(join5(directory, marker)));
|
|
3747
4052
|
}
|
|
3748
4053
|
function resolveReadablePathInsideContext(filePath) {
|
|
3749
4054
|
const cwd = contextCwd();
|
|
3750
|
-
const abs =
|
|
4055
|
+
const abs = resolve8(cwd, filePath);
|
|
3751
4056
|
if (isPathInside(cwd, abs))
|
|
3752
4057
|
return abs;
|
|
3753
4058
|
const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
|
|
3754
4059
|
if (rebased !== undefined)
|
|
3755
4060
|
return rebased;
|
|
3756
|
-
|
|
3757
|
-
if (isPathInside(cwd, canonical))
|
|
3758
|
-
return canonical;
|
|
3759
|
-
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
4061
|
+
return canonicalizeExistingOrNearestAncestor(abs);
|
|
3760
4062
|
}
|
|
3761
4063
|
function resolvePathInsideContext(filePath) {
|
|
3762
4064
|
const cwd = contextCwd();
|
|
@@ -3771,12 +4073,12 @@ function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
|
3771
4073
|
let current = path;
|
|
3772
4074
|
const suffix = [];
|
|
3773
4075
|
while (true) {
|
|
3774
|
-
if (
|
|
3775
|
-
const canonical =
|
|
4076
|
+
if (existsSync10(current)) {
|
|
4077
|
+
const canonical = realpathSync5(current);
|
|
3776
4078
|
if (isPathInside(cwd, canonical))
|
|
3777
|
-
return suffix.length === 0 ? canonical :
|
|
4079
|
+
return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
|
|
3778
4080
|
}
|
|
3779
|
-
const parent =
|
|
4081
|
+
const parent = dirname8(current);
|
|
3780
4082
|
if (parent === current)
|
|
3781
4083
|
return;
|
|
3782
4084
|
suffix.unshift(basename3(current));
|
|
@@ -3784,9 +4086,9 @@ function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
|
3784
4086
|
}
|
|
3785
4087
|
}
|
|
3786
4088
|
function existingDirectoryInsideContext(directory, cwd) {
|
|
3787
|
-
if (!
|
|
4089
|
+
if (!existsSync10(directory))
|
|
3788
4090
|
return;
|
|
3789
|
-
const canonical =
|
|
4091
|
+
const canonical = realpathSync5(directory);
|
|
3790
4092
|
if (!statSync3(canonical).isDirectory())
|
|
3791
4093
|
return;
|
|
3792
4094
|
return isPathInside(cwd, canonical) ? canonical : undefined;
|
|
@@ -3799,7 +4101,7 @@ function nearestExistingDirectoryInsideContext(directory, cwd) {
|
|
|
3799
4101
|
return canonical;
|
|
3800
4102
|
if (current === cwd)
|
|
3801
4103
|
return;
|
|
3802
|
-
current =
|
|
4104
|
+
current = dirname8(current);
|
|
3803
4105
|
}
|
|
3804
4106
|
return;
|
|
3805
4107
|
}
|
|
@@ -3826,6 +4128,19 @@ function formatServerLookupError(result) {
|
|
|
3826
4128
|
].join(`
|
|
3827
4129
|
`);
|
|
3828
4130
|
}
|
|
4131
|
+
function formatInstallOptions(serverId, installHint) {
|
|
4132
|
+
const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
|
|
4133
|
+
if (localHint === undefined) {
|
|
4134
|
+
return ["To install, run:", ` ${installHint}`];
|
|
4135
|
+
}
|
|
4136
|
+
return [
|
|
4137
|
+
"To install in THIS repository (preferred — no global install needed):",
|
|
4138
|
+
` ${localHint}`,
|
|
4139
|
+
"",
|
|
4140
|
+
"Or install it globally:",
|
|
4141
|
+
` ${installHint}`
|
|
4142
|
+
];
|
|
4143
|
+
}
|
|
3829
4144
|
function formatNotInstalled(result) {
|
|
3830
4145
|
const { server, installHint } = result;
|
|
3831
4146
|
const extensions = server.extensions.join(", ");
|
|
@@ -3840,19 +4155,19 @@ function formatNotInstalled(result) {
|
|
|
3840
4155
|
`Command not found: ${server.command[0]}`,
|
|
3841
4156
|
""
|
|
3842
4157
|
];
|
|
4158
|
+
const installOptions = formatInstallOptions(server.id, installHint);
|
|
3843
4159
|
if (decision === "allowed") {
|
|
3844
4160
|
return [
|
|
3845
4161
|
...header,
|
|
3846
4162
|
"The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
|
|
3847
|
-
|
|
4163
|
+
...installOptions.slice(1)
|
|
3848
4164
|
].join(`
|
|
3849
4165
|
`);
|
|
3850
4166
|
}
|
|
3851
4167
|
if (!context.capabilities.installDecisionTool) {
|
|
3852
4168
|
return [
|
|
3853
4169
|
...header,
|
|
3854
|
-
|
|
3855
|
-
` ${installHint}`,
|
|
4170
|
+
...installOptions,
|
|
3856
4171
|
"",
|
|
3857
4172
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
3858
4173
|
"Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
|
|
@@ -3861,8 +4176,7 @@ function formatNotInstalled(result) {
|
|
|
3861
4176
|
}
|
|
3862
4177
|
return [
|
|
3863
4178
|
...header,
|
|
3864
|
-
|
|
3865
|
-
` ${installHint}`,
|
|
4179
|
+
...installOptions,
|
|
3866
4180
|
"",
|
|
3867
4181
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
3868
4182
|
"- If the user agrees: run the install command above, then retry this tool.",
|
|
@@ -3917,8 +4231,8 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
|
3917
4231
|
}
|
|
3918
4232
|
|
|
3919
4233
|
// ../lsp-core/src/lsp/directory-diagnostics.ts
|
|
3920
|
-
import { existsSync as
|
|
3921
|
-
import { join as
|
|
4234
|
+
import { existsSync as existsSync11, lstatSync as lstatSync4, readdirSync as readdirSync3 } from "node:fs";
|
|
4235
|
+
import { join as join6, resolve as resolve9 } from "node:path";
|
|
3922
4236
|
|
|
3923
4237
|
// ../lsp-core/src/lsp/formatters.ts
|
|
3924
4238
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
@@ -3933,10 +4247,10 @@ function uriToPath(uri) {
|
|
|
3933
4247
|
}
|
|
3934
4248
|
function formatLocation(loc) {
|
|
3935
4249
|
if ("targetUri" in loc) {
|
|
3936
|
-
const
|
|
3937
|
-
const
|
|
3938
|
-
const
|
|
3939
|
-
return `${
|
|
4250
|
+
const uri = uriToPath(loc.targetUri);
|
|
4251
|
+
const line = loc.targetRange.start.line + 1;
|
|
4252
|
+
const char = loc.targetRange.start.character;
|
|
4253
|
+
return `${uri}:${line}:${char}`;
|
|
3940
4254
|
}
|
|
3941
4255
|
const uri = uriToPath(loc.uri);
|
|
3942
4256
|
const line = loc.range.start.line + 1;
|
|
@@ -4048,7 +4362,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
|
|
|
4048
4362
|
for (const entry of entries) {
|
|
4049
4363
|
if (files.length >= maxFiles)
|
|
4050
4364
|
return;
|
|
4051
|
-
const fullPath =
|
|
4365
|
+
const fullPath = join6(currentDir, entry);
|
|
4052
4366
|
let stat;
|
|
4053
4367
|
try {
|
|
4054
4368
|
stat = lstatSync4(fullPath);
|
|
@@ -4073,8 +4387,8 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
4073
4387
|
if (!extension.startsWith(".")) {
|
|
4074
4388
|
throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
|
|
4075
4389
|
}
|
|
4076
|
-
const absDir =
|
|
4077
|
-
if (!
|
|
4390
|
+
const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
|
|
4391
|
+
if (!existsSync11(absDir)) {
|
|
4078
4392
|
throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
|
|
4079
4393
|
}
|
|
4080
4394
|
const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
|
|
@@ -4161,7 +4475,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
4161
4475
|
|
|
4162
4476
|
// ../lsp-core/src/lsp/infer-extension.ts
|
|
4163
4477
|
import { lstatSync as lstatSync5, readdirSync as readdirSync4 } from "node:fs";
|
|
4164
|
-
import { join as
|
|
4478
|
+
import { join as join7 } from "node:path";
|
|
4165
4479
|
var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
|
|
4166
4480
|
var MAX_SCAN_ENTRIES = 500;
|
|
4167
4481
|
function inferExtensionFromDirectory(directory) {
|
|
@@ -4179,7 +4493,7 @@ function inferExtensionFromDirectory(directory) {
|
|
|
4179
4493
|
for (const entry of entries) {
|
|
4180
4494
|
if (scanned >= MAX_SCAN_ENTRIES)
|
|
4181
4495
|
return;
|
|
4182
|
-
const fullPath =
|
|
4496
|
+
const fullPath = join7(dir, entry);
|
|
4183
4497
|
let stat;
|
|
4184
4498
|
try {
|
|
4185
4499
|
stat = lstatSync5(fullPath);
|
|
@@ -4338,8 +4652,8 @@ function clientOptions(signal) {
|
|
|
4338
4652
|
}
|
|
4339
4653
|
|
|
4340
4654
|
// ../lsp-core/src/tools/result.ts
|
|
4341
|
-
function text(
|
|
4342
|
-
return { content: [{ type: "text", text
|
|
4655
|
+
function text(text, details, isError = false) {
|
|
4656
|
+
return { content: [{ type: "text", text }], details, isError };
|
|
4343
4657
|
}
|
|
4344
4658
|
|
|
4345
4659
|
// ../lsp-core/src/tools/diagnostics.ts
|
|
@@ -4359,7 +4673,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4359
4673
|
const extension = inferExtensionFromDirectory(absPath);
|
|
4360
4674
|
if (!extension) {
|
|
4361
4675
|
const message = `No supported source files found in directory: ${absPath}`;
|
|
4362
|
-
const
|
|
4676
|
+
const details = {
|
|
4363
4677
|
filePath,
|
|
4364
4678
|
severity,
|
|
4365
4679
|
mode: "directory",
|
|
@@ -4369,24 +4683,24 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4369
4683
|
error: message,
|
|
4370
4684
|
errorKind: "no_files"
|
|
4371
4685
|
};
|
|
4372
|
-
return text(message,
|
|
4686
|
+
return text(message, details);
|
|
4373
4687
|
}
|
|
4374
|
-
const
|
|
4375
|
-
const
|
|
4688
|
+
const output = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
|
|
4689
|
+
const details = {
|
|
4376
4690
|
filePath,
|
|
4377
4691
|
severity,
|
|
4378
4692
|
mode: "directory",
|
|
4379
4693
|
diagnostics: [],
|
|
4380
|
-
totalDiagnostics:
|
|
4694
|
+
totalDiagnostics: output.totalDiagnostics,
|
|
4381
4695
|
truncated: false,
|
|
4382
|
-
fileFailures: [...
|
|
4696
|
+
fileFailures: [...output.fileFailures]
|
|
4383
4697
|
};
|
|
4384
|
-
return text(
|
|
4698
|
+
return text(output.output, details);
|
|
4385
4699
|
}
|
|
4386
4700
|
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
|
|
4387
4701
|
if (result.transientError) {
|
|
4388
4702
|
const message = result.transientError.message;
|
|
4389
|
-
const
|
|
4703
|
+
const details = {
|
|
4390
4704
|
filePath,
|
|
4391
4705
|
severity,
|
|
4392
4706
|
mode: "file",
|
|
@@ -4396,7 +4710,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4396
4710
|
error: message,
|
|
4397
4711
|
errorKind: result.transientError.kind
|
|
4398
4712
|
};
|
|
4399
|
-
return text(message,
|
|
4713
|
+
return text(message, details, true);
|
|
4400
4714
|
}
|
|
4401
4715
|
const diagnostics = filterDiagnosticsBySeverity(asDiagnosticArray(result), severity);
|
|
4402
4716
|
const total = diagnostics.length;
|
|
@@ -4430,6 +4744,96 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4430
4744
|
throw error;
|
|
4431
4745
|
}
|
|
4432
4746
|
}
|
|
4747
|
+
// ../lsp-core/src/lsp/format-document.ts
|
|
4748
|
+
import { readFileSync as readFileSync5, renameSync as renameSync3, unlinkSync, writeFileSync as writeFileSync3 } from "node:fs";
|
|
4749
|
+
var DEFAULT_FORMATTING_OPTIONS = {
|
|
4750
|
+
tabSize: 4,
|
|
4751
|
+
insertSpaces: false,
|
|
4752
|
+
trimTrailingWhitespace: true,
|
|
4753
|
+
insertFinalNewline: true,
|
|
4754
|
+
trimFinalNewlines: true
|
|
4755
|
+
};
|
|
4756
|
+
var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
|
|
4757
|
+
async function formatDocumentWithClient(client, filePath, options = {}) {
|
|
4758
|
+
const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
|
|
4759
|
+
if (edits === null)
|
|
4760
|
+
return { status: "unavailable", reason: "capability_not_advertised" };
|
|
4761
|
+
if (edits.length === 0)
|
|
4762
|
+
return UNCHANGED;
|
|
4763
|
+
const before = readFileSync5(filePath, "utf-8");
|
|
4764
|
+
const normalized = normalizeTextEdits(before, edits, 0);
|
|
4765
|
+
if (normalized.text === before)
|
|
4766
|
+
return UNCHANGED;
|
|
4767
|
+
writeAtomically(filePath, normalized.text);
|
|
4768
|
+
await client.openFile(filePath);
|
|
4769
|
+
return {
|
|
4770
|
+
status: "formatted",
|
|
4771
|
+
...lineDelta(normalized.edits)
|
|
4772
|
+
};
|
|
4773
|
+
}
|
|
4774
|
+
function lineDelta(edits) {
|
|
4775
|
+
let linesAdded = 0;
|
|
4776
|
+
let linesRemoved = 0;
|
|
4777
|
+
for (const edit of edits) {
|
|
4778
|
+
linesRemoved += edit.range.end.line - edit.range.start.line + 1;
|
|
4779
|
+
linesAdded += edit.newText.split(`
|
|
4780
|
+
`).length;
|
|
4781
|
+
}
|
|
4782
|
+
return { linesAdded, linesRemoved };
|
|
4783
|
+
}
|
|
4784
|
+
function writeAtomically(filePath, content) {
|
|
4785
|
+
const tempPath = `${filePath}.omo-format.tmp`;
|
|
4786
|
+
writeFileSync3(tempPath, content, "utf-8");
|
|
4787
|
+
try {
|
|
4788
|
+
renameSync3(tempPath, filePath);
|
|
4789
|
+
} catch (error) {
|
|
4790
|
+
try {
|
|
4791
|
+
unlinkSync(tempPath);
|
|
4792
|
+
} catch {}
|
|
4793
|
+
throw error;
|
|
4794
|
+
}
|
|
4795
|
+
}
|
|
4796
|
+
|
|
4797
|
+
// ../lsp-core/src/tools/format.ts
|
|
4798
|
+
async function executeLspFormat(params, signal) {
|
|
4799
|
+
const filePath = requireString(params, "filePath");
|
|
4800
|
+
try {
|
|
4801
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
|
|
4802
|
+
return text(describeResult(filePath, result), formatDetails(filePath, result));
|
|
4803
|
+
} catch (error) {
|
|
4804
|
+
const missingDependency = missingDependencyResult(error, {
|
|
4805
|
+
filePath,
|
|
4806
|
+
status: "unavailable",
|
|
4807
|
+
reason: "server_unavailable",
|
|
4808
|
+
linesAdded: 0,
|
|
4809
|
+
linesRemoved: 0
|
|
4810
|
+
});
|
|
4811
|
+
if (missingDependency)
|
|
4812
|
+
return missingDependency;
|
|
4813
|
+
throw error;
|
|
4814
|
+
}
|
|
4815
|
+
}
|
|
4816
|
+
function formatDetails(filePath, result) {
|
|
4817
|
+
if (result.status === "unavailable") {
|
|
4818
|
+
return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
|
|
4819
|
+
}
|
|
4820
|
+
return {
|
|
4821
|
+
filePath,
|
|
4822
|
+
status: result.status,
|
|
4823
|
+
linesAdded: result.linesAdded,
|
|
4824
|
+
linesRemoved: result.linesRemoved
|
|
4825
|
+
};
|
|
4826
|
+
}
|
|
4827
|
+
function describeResult(filePath, result) {
|
|
4828
|
+
if (result.status === "unavailable") {
|
|
4829
|
+
return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
|
|
4830
|
+
}
|
|
4831
|
+
if (result.status === "unchanged") {
|
|
4832
|
+
return `Already formatted: ${filePath}`;
|
|
4833
|
+
}
|
|
4834
|
+
return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
|
|
4835
|
+
}
|
|
4836
|
+
|
|
4433
4837
|
// ../lsp-core/src/tools/install-decision.ts
|
|
4434
4838
|
async function executeLspInstallDecision(params) {
|
|
4435
4839
|
const serverId = requireString(params, "server_id");
|
|
@@ -4623,8 +5027,8 @@ async function executeLspSymbols(params, signal) {
|
|
|
4623
5027
|
errorKind: "missing_query"
|
|
4624
5028
|
});
|
|
4625
5029
|
}
|
|
4626
|
-
const
|
|
4627
|
-
return formatSymbolsResult(filePath, scope,
|
|
5030
|
+
const symbols = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
|
|
5031
|
+
return formatSymbolsResult(filePath, scope, symbols, limit, query);
|
|
4628
5032
|
}
|
|
4629
5033
|
const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
|
|
4630
5034
|
return formatSymbolsResult(filePath, scope, symbols, limit);
|
|
@@ -4762,6 +5166,16 @@ var LSP_MCP_TOOLS = [
|
|
|
4762
5166
|
}, ["filePath", "line", "character", "newName"]),
|
|
4763
5167
|
execute: executeLspRename
|
|
4764
5168
|
},
|
|
5169
|
+
{
|
|
5170
|
+
name: "format",
|
|
5171
|
+
aliases: ["lsp_format"],
|
|
5172
|
+
title: "LSP Format",
|
|
5173
|
+
description: "Format a source file with its language server and write the returned edits to disk.",
|
|
5174
|
+
inputSchema: objectSchema({
|
|
5175
|
+
filePath: { type: "string", description: "Source file path to format." }
|
|
5176
|
+
}, ["filePath"]),
|
|
5177
|
+
execute: executeLspFormat
|
|
5178
|
+
},
|
|
4765
5179
|
{
|
|
4766
5180
|
name: "install_decision",
|
|
4767
5181
|
aliases: ["lsp_install_decision"],
|
|
@@ -4795,16 +5209,17 @@ function coerceToolArguments(value) {
|
|
|
4795
5209
|
return isRecord7(value) ? value : {};
|
|
4796
5210
|
}
|
|
4797
5211
|
export {
|
|
4798
|
-
|
|
4799
|
-
executeLspTool,
|
|
4800
|
-
executeLspSymbols,
|
|
4801
|
-
executeLspStatus,
|
|
4802
|
-
executeLspRename,
|
|
4803
|
-
executeLspPrepareRename,
|
|
4804
|
-
executeLspInstallDecision,
|
|
4805
|
-
executeLspGotoDefinition,
|
|
4806
|
-
executeLspFindReferences,
|
|
4807
|
-
executeLspDiagnostics,
|
|
5212
|
+
LSP_MCP_TOOLS,
|
|
4808
5213
|
coerceToolArguments,
|
|
4809
|
-
|
|
5214
|
+
executeLspDiagnostics,
|
|
5215
|
+
executeLspFindReferences,
|
|
5216
|
+
executeLspFormat,
|
|
5217
|
+
executeLspGotoDefinition,
|
|
5218
|
+
executeLspInstallDecision,
|
|
5219
|
+
executeLspPrepareRename,
|
|
5220
|
+
executeLspRename,
|
|
5221
|
+
executeLspStatus,
|
|
5222
|
+
executeLspSymbols,
|
|
5223
|
+
executeLspTool,
|
|
5224
|
+
isRecord7 as isRecord
|
|
4810
5225
|
};
|