oh-my-opencode 5.0.0-beta.4 → 5.0.0-beta.40
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 +44 -16
- 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/publish/SKILL.md +44 -16
- 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 +44 -16
- package/.opencode/skills/work-with-pr/SKILL.md +37 -23
- package/README.ja.md +25 -21
- package/README.ko.md +25 -21
- package/README.md +38 -23
- package/README.ru.md +24 -20
- package/README.zh-cn.md +25 -21
- package/THIRD-PARTY-NOTICES.md +27 -99
- package/dist/agents/atlas/agent.d.ts +0 -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 +2 -2
- package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
- package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
- package/dist/cli/fallback-lane-policy.d.ts +1 -0
- package/dist/cli/index.js +66932 -64746
- 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 +66795 -64586
- 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/manager.d.ts +2 -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/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/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 +15 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +1 -0
- package/dist/features/team-mode/tools/messaging-runtime.d.ts +1 -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 +7 -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/index.js +24669 -20705
- 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 +3 -3
- 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-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/coding-agent-sessions/AGENTS.md +62 -0
- package/dist/skills/coding-agent-sessions/SKILL.md +3 -2
- package/dist/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/dist/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +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 +2 -0
- 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/SKILL.md +11 -7
- package/dist/skills/frontend/references/design/_INDEX.md +1 -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/init-deep/SKILL.md +13 -13
- package/dist/skills/review-work/SKILL.md +3 -3
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/dist/skills/ultimate-browsing/SKILL.md +2 -0
- 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 +13 -11
- package/dist/skills/ultimate-browsing/references/insane-search/README.md +9 -2
- package/dist/skills/{start-work → ulw-execute}/SKILL.md +17 -16
- package/dist/skills/ulw-plan/SKILL.md +6 -7
- 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-research/SKILL.md +4 -2
- package/dist/skills/visual-qa/AGENTS.md +58 -0
- package/dist/skills/visual-qa/SKILL.md +3 -2
- package/dist/tools/delegate-task/builtin-categories.d.ts +1 -0
- package/dist/tools/delegate-task/builtin-category-definition.d.ts +1 -0
- 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 +49320 -49316
- package/package.json +41 -39
- 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 +47 -47
- 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 +163 -13
- package/packages/lsp-core/src/lsp/client-wrapper.ts +110 -23
- 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/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-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-edit-adversarial.test.ts +20 -1
- 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/diagnostics.ts +3 -3
- 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/navigation.ts +4 -2
- package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
- package/packages/lsp-core/src/tools/rename.ts +4 -2
- package/packages/lsp-core/src/tools/symbols.ts +1 -1
- package/packages/lsp-core/src/tools/types.ts +10 -0
- package/packages/lsp-daemon/dist/cli.js +793 -323
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +753 -280
- 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.js +1 -0
- package/packages/lsp-daemon/dist/index.js +757 -289
- 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 +712 -244
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +248 -119
- package/packages/lsp-tools-mcp/dist/mcp.js +714 -246
- package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
- package/packages/lsp-tools-mcp/dist/tools.js +718 -254
- 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 +2 -2
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +45 -49
- 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/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +1 -5
- 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 +1 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +4 -21
- package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +1 -1
- 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 +741 -294
- 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/biome.json +2 -2
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +60 -45
- 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 +9 -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 +1 -2
- 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 +5 -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 +2463 -437
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2467 -441
- 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/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +489 -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 +2 -2
- 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 +5 -5
- 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 +6 -6
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +12 -12
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +28 -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 +3 -3
- 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}/test/boulder-reader.test.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +1 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +8 -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 +15 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +45 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +15 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +15 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +8 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +120 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +40 -39
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +7 -2
- 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.js +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +958 -342
- 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 +27 -6
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +13 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +15 -1
- 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.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +17 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +13 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +19 -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 +69 -111
- package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +185 -14
- 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 +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +65 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -2
- 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 +22 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +81 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +31 -1
- 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 +38 -71
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +7 -2
- 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 +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +3 -5
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +34 -5
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +26 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
- 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 +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +18 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +27 -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 +68 -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 +82 -131
- package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +187 -12
- 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 +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +95 -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 +133 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +137 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +25 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +26 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +183 -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 +18 -0
- 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/quality-gate-builder.ts +7 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +105 -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/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-poisoning-cascades.test.ts +97 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +46 -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 +48 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +318 -1
- 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/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-checking-ulw-execute-continuation.json +17 -0
- 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 +3 -3
- 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 +3 -3
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +36 -13
- 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/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +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 +2 -0
- 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/SKILL.md +11 -7
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -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/init-deep/SKILL.md +13 -13
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +2 -0
- 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 +13 -11
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +9 -2
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +15 -3
- package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +19 -26
- package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -2
- 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 +22 -1
- 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 +4 -2
- package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +3 -2
- 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 +9 -48
- 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 +1 -1
- 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 +2 -27
- 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 +2 -2
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +4 -5
- 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 +8 -8
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +23 -13
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +14 -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/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 +2 -2
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +2817 -913
- 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/shared-skills/skills/ast-grep/AGENTS.md +51 -0
- package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +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 +2 -0
- 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/SKILL.md +11 -7
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -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/init-deep/SKILL.md +13 -13
- package/packages/shared-skills/skills/review-work/SKILL.md +3 -3
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +37 -10
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +2 -0
- 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 +13 -11
- 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 +17 -16
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +6 -7
- 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-research/SKILL.md +4 -2
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +3 -2
- 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/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 -12136
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9734
- 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/components/ultrawork/skills/ultrawork/SKILL.md +0 -478
- 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}/src/types.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
|
@@ -175,6 +175,7 @@ async function runJsonRpcStdioServer(config) {
|
|
|
175
175
|
const idleTimer = createIdleTimer(idleTimeoutMs, log, () => {
|
|
176
176
|
isClosed = true;
|
|
177
177
|
config.onIdleTimeout?.();
|
|
178
|
+
config.input.destroy();
|
|
178
179
|
});
|
|
179
180
|
const watchdog = createParentWatchdog(config.parentWatchdog, (parentPid, pollIntervalMs) => {
|
|
180
181
|
isClosed = true;
|
|
@@ -271,7 +272,11 @@ function createParentWatchdog(config, onDeadParent) {
|
|
|
271
272
|
const probeAlive = config.probeAlive ?? isProcessAlive;
|
|
272
273
|
let fired = false;
|
|
273
274
|
const timer = setInterval(() => {
|
|
274
|
-
if (fired
|
|
275
|
+
if (fired)
|
|
276
|
+
return;
|
|
277
|
+
const alive = probeAlive(parentPid);
|
|
278
|
+
config.onPoll?.(alive);
|
|
279
|
+
if (alive)
|
|
275
280
|
return;
|
|
276
281
|
fired = true;
|
|
277
282
|
onDeadParent(parentPid, pollIntervalMs);
|
|
@@ -306,8 +311,8 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
|
|
|
306
311
|
};
|
|
307
312
|
}
|
|
308
313
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
309
|
-
import { existsSync as
|
|
310
|
-
import { dirname as
|
|
314
|
+
import { existsSync as existsSync10, realpathSync as realpathSync5, statSync as statSync3 } from "node:fs";
|
|
315
|
+
import { basename as basename3, dirname as dirname8, join as join5, resolve as resolve8 } from "node:path";
|
|
311
316
|
|
|
312
317
|
// ../lsp-core/src/request-context.ts
|
|
313
318
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
@@ -316,18 +321,17 @@ import { homedir } from "node:os";
|
|
|
316
321
|
import { basename, delimiter, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
317
322
|
|
|
318
323
|
class LspRequestContextParseError extends Error {
|
|
319
|
-
code;
|
|
320
|
-
name = "LspRequestContextParseError";
|
|
321
324
|
constructor(code, message) {
|
|
322
325
|
super(message);
|
|
323
326
|
this.code = code;
|
|
327
|
+
this.name = "LspRequestContextParseError";
|
|
324
328
|
}
|
|
325
329
|
}
|
|
326
330
|
|
|
327
331
|
class LspRequestContextUnavailableError extends Error {
|
|
328
|
-
name = "LspRequestContextUnavailableError";
|
|
329
332
|
constructor() {
|
|
330
333
|
super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
|
|
334
|
+
this.name = "LspRequestContextUnavailableError";
|
|
331
335
|
}
|
|
332
336
|
}
|
|
333
337
|
var storage = new AsyncLocalStorage;
|
|
@@ -357,7 +361,7 @@ function contextEnv(key) {
|
|
|
357
361
|
}
|
|
358
362
|
function createStandaloneMcpRequestContext(input = {}) {
|
|
359
363
|
const env = input.env ?? process.env;
|
|
360
|
-
const cwd = canonicalCwd(input.cwd ?? process.cwd());
|
|
364
|
+
const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
|
|
361
365
|
const home = input.homeDir ?? homedir();
|
|
362
366
|
const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
|
|
363
367
|
const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
|
|
@@ -500,22 +504,15 @@ function effectiveExtension(filePath) {
|
|
|
500
504
|
|
|
501
505
|
// ../lsp-core/src/lsp/errors.ts
|
|
502
506
|
class LspConnectionClosedError extends Error {
|
|
503
|
-
serverId;
|
|
504
|
-
root;
|
|
505
|
-
name = "LspConnectionClosedError";
|
|
506
507
|
constructor(serverId, root, message) {
|
|
507
508
|
super(message ?? `LSP connection closed for ${serverId} at ${root}`);
|
|
508
509
|
this.serverId = serverId;
|
|
509
510
|
this.root = root;
|
|
511
|
+
this.name = "LspConnectionClosedError";
|
|
510
512
|
}
|
|
511
513
|
}
|
|
512
514
|
|
|
513
515
|
class LspProcessExitedError extends Error {
|
|
514
|
-
serverId;
|
|
515
|
-
root;
|
|
516
|
-
exitCode;
|
|
517
|
-
stderrTail;
|
|
518
|
-
name = "LspProcessExitedError";
|
|
519
516
|
constructor(serverId, root, exitCode, stderrTail) {
|
|
520
517
|
const stderrSuffix = stderrTail ? `
|
|
521
518
|
stderr tail: ${stderrTail}` : "";
|
|
@@ -524,46 +521,59 @@ stderr tail: ${stderrTail}` : "";
|
|
|
524
521
|
this.root = root;
|
|
525
522
|
this.exitCode = exitCode;
|
|
526
523
|
this.stderrTail = stderrTail;
|
|
524
|
+
this.name = "LspProcessExitedError";
|
|
527
525
|
}
|
|
528
526
|
}
|
|
529
527
|
|
|
530
528
|
class LspRequestTimeoutError extends Error {
|
|
531
|
-
method;
|
|
532
|
-
stderrTail;
|
|
533
|
-
name = "LspRequestTimeoutError";
|
|
534
529
|
constructor(method, stderrTail) {
|
|
535
530
|
const stderrSuffix = stderrTail ? `
|
|
536
531
|
recent stderr: ${stderrTail}` : "";
|
|
537
532
|
super(`LSP request timeout (method: ${method})${stderrSuffix}`);
|
|
538
533
|
this.method = method;
|
|
539
534
|
this.stderrTail = stderrTail;
|
|
535
|
+
this.name = "LspRequestTimeoutError";
|
|
540
536
|
}
|
|
541
537
|
}
|
|
542
538
|
|
|
543
539
|
class LspInvalidPathError extends Error {
|
|
544
|
-
|
|
540
|
+
constructor() {
|
|
541
|
+
super(...arguments);
|
|
542
|
+
this.name = "LspInvalidPathError";
|
|
543
|
+
}
|
|
545
544
|
}
|
|
546
545
|
|
|
547
546
|
class LspServerLookupError extends Error {
|
|
548
|
-
lookup;
|
|
549
|
-
name = "LspServerLookupError";
|
|
550
547
|
constructor(message, lookup) {
|
|
551
548
|
super(message);
|
|
552
549
|
this.lookup = lookup;
|
|
550
|
+
this.name = "LspServerLookupError";
|
|
553
551
|
}
|
|
554
552
|
}
|
|
555
553
|
|
|
556
554
|
class LspServerInitializingError extends Error {
|
|
557
|
-
originalError;
|
|
558
|
-
name = "LspServerInitializingError";
|
|
559
555
|
constructor(originalError) {
|
|
560
556
|
super(`LSP server is still initializing. Please retry in a few seconds. Original error: ${originalError.message}`);
|
|
561
557
|
this.originalError = originalError;
|
|
558
|
+
this.name = "LspServerInitializingError";
|
|
562
559
|
}
|
|
563
560
|
}
|
|
564
561
|
|
|
565
562
|
class LspProcessSpawnError extends Error {
|
|
566
|
-
|
|
563
|
+
constructor() {
|
|
564
|
+
super(...arguments);
|
|
565
|
+
this.name = "LspProcessSpawnError";
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
class LspClientRespawnBudgetExceededError extends Error {
|
|
570
|
+
constructor(serverId, root, retryLimit) {
|
|
571
|
+
super(`LSP server ${serverId} at ${root} failed to stay alive; respawn budget exhausted ` + `(${retryLimit} consecutive dead generations). Retrying after the cooldown may succeed.`);
|
|
572
|
+
this.serverId = serverId;
|
|
573
|
+
this.root = root;
|
|
574
|
+
this.retryLimit = retryLimit;
|
|
575
|
+
this.name = "LspClientRespawnBudgetExceededError";
|
|
576
|
+
}
|
|
567
577
|
}
|
|
568
578
|
function isLspDeadConnectionError(err) {
|
|
569
579
|
return err instanceof LspConnectionClosedError || err instanceof LspProcessExitedError;
|
|
@@ -586,6 +596,13 @@ import { pathToFileURL as pathToFileURL3 } from "node:url";
|
|
|
586
596
|
// ../lsp-core/src/lsp/connection.ts
|
|
587
597
|
import { pathToFileURL } from "node:url";
|
|
588
598
|
|
|
599
|
+
// ../lsp-core/src/lsp/timer-provider.ts
|
|
600
|
+
var realTimerProvider = {
|
|
601
|
+
now: () => Date.now(),
|
|
602
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
603
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
604
|
+
};
|
|
605
|
+
|
|
589
606
|
// ../lsp-core/src/lsp/constants.ts
|
|
590
607
|
var DEFAULT_MAX_REFERENCES = 200;
|
|
591
608
|
var DEFAULT_MAX_SYMBOLS = 200;
|
|
@@ -594,9 +611,12 @@ var DEFAULT_MAX_DIRECTORY_FILES = 50;
|
|
|
594
611
|
var REQUEST_TIMEOUT_MS = 15000;
|
|
595
612
|
var INIT_TIMEOUT_MS = 60000;
|
|
596
613
|
var IDLE_TIMEOUT_MS = 5 * 60000;
|
|
614
|
+
var MAX_RESIDENT_CLIENTS = 6;
|
|
597
615
|
var REAPER_INTERVAL_MS = 60000;
|
|
598
616
|
var STOP_HARD_KILL_TIMEOUT_MS = 5000;
|
|
599
617
|
var STOP_SIGKILL_GRACE_MS = 1000;
|
|
618
|
+
var CLIENT_RESPAWN_RETRY_LIMIT = 2;
|
|
619
|
+
var CLIENT_RESPAWN_COOLDOWN_MS = 60000;
|
|
600
620
|
|
|
601
621
|
// ../lsp-core/src/lsp/json-rpc-connection.ts
|
|
602
622
|
var HEADER_SEPARATOR2 = `\r
|
|
@@ -608,20 +628,31 @@ var METHOD_NOT_FOUND = -32601;
|
|
|
608
628
|
var INTERNAL_ERROR = -32603;
|
|
609
629
|
|
|
610
630
|
class JsonRpcConnection {
|
|
611
|
-
reader;
|
|
612
|
-
writer;
|
|
613
|
-
pendingRequests = new Map;
|
|
614
|
-
notificationHandlers = new Map;
|
|
615
|
-
requestHandlers = new Map;
|
|
616
|
-
closeHandlers = [];
|
|
617
|
-
errorHandlers = [];
|
|
618
|
-
inputBuffer = Buffer.alloc(0);
|
|
619
|
-
nextRequestId = 1;
|
|
620
|
-
listening = false;
|
|
621
|
-
disposed = false;
|
|
622
631
|
constructor(reader, writer) {
|
|
623
632
|
this.reader = reader;
|
|
624
633
|
this.writer = writer;
|
|
634
|
+
this.pendingRequests = new Map;
|
|
635
|
+
this.notificationHandlers = new Map;
|
|
636
|
+
this.requestHandlers = new Map;
|
|
637
|
+
this.closeHandlers = [];
|
|
638
|
+
this.errorHandlers = [];
|
|
639
|
+
this.inputBuffer = Buffer.alloc(0);
|
|
640
|
+
this.nextRequestId = 1;
|
|
641
|
+
this.listening = false;
|
|
642
|
+
this.disposed = false;
|
|
643
|
+
this.handleData = (chunk) => {
|
|
644
|
+
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
645
|
+
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
646
|
+
this.drainInputBuffer();
|
|
647
|
+
};
|
|
648
|
+
this.handleClose = () => {
|
|
649
|
+
for (const handler of this.closeHandlers) {
|
|
650
|
+
handler();
|
|
651
|
+
}
|
|
652
|
+
};
|
|
653
|
+
this.handleStreamError = (error) => {
|
|
654
|
+
this.emitError(error);
|
|
655
|
+
};
|
|
625
656
|
}
|
|
626
657
|
listen() {
|
|
627
658
|
if (this.listening)
|
|
@@ -742,19 +773,6 @@ class JsonRpcConnection {
|
|
|
742
773
|
this.notificationHandlers.clear();
|
|
743
774
|
this.requestHandlers.clear();
|
|
744
775
|
}
|
|
745
|
-
handleData = (chunk) => {
|
|
746
|
-
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
747
|
-
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
748
|
-
this.drainInputBuffer();
|
|
749
|
-
};
|
|
750
|
-
handleClose = () => {
|
|
751
|
-
for (const handler of this.closeHandlers) {
|
|
752
|
-
handler();
|
|
753
|
-
}
|
|
754
|
-
};
|
|
755
|
-
handleStreamError = (error) => {
|
|
756
|
-
this.emitError(error);
|
|
757
|
-
};
|
|
758
776
|
drainInputBuffer() {
|
|
759
777
|
while (true) {
|
|
760
778
|
const headerEnd = this.inputBuffer.indexOf(HEADER_SEPARATOR2);
|
|
@@ -1102,33 +1120,29 @@ function isPosition(value) {
|
|
|
1102
1120
|
|
|
1103
1121
|
// ../lsp-core/src/lsp/transport.ts
|
|
1104
1122
|
class LspClientNotStartedError extends Error {
|
|
1105
|
-
serverId;
|
|
1106
|
-
root;
|
|
1107
|
-
name = "LspClientNotStartedError";
|
|
1108
1123
|
constructor(serverId, root) {
|
|
1109
1124
|
super("LSP client not started");
|
|
1110
1125
|
this.serverId = serverId;
|
|
1111
1126
|
this.root = root;
|
|
1127
|
+
this.name = "LspClientNotStartedError";
|
|
1112
1128
|
}
|
|
1113
1129
|
}
|
|
1114
1130
|
|
|
1115
1131
|
class LspClientTransport {
|
|
1116
|
-
root;
|
|
1117
|
-
server;
|
|
1118
|
-
proc = null;
|
|
1119
|
-
connection = null;
|
|
1120
|
-
stderrBuffer = [];
|
|
1121
|
-
processExited = false;
|
|
1122
|
-
diagnosticsStore = new Map;
|
|
1123
|
-
requestTimeoutMs;
|
|
1124
|
-
initializeTimeoutMs;
|
|
1125
|
-
workspaceApplyEditHandler = null;
|
|
1126
|
-
diagnosticPullSupported = false;
|
|
1127
1132
|
constructor(root, server2, timeouts = {}) {
|
|
1128
1133
|
this.root = root;
|
|
1129
1134
|
this.server = server2;
|
|
1135
|
+
this.proc = null;
|
|
1136
|
+
this.connection = null;
|
|
1137
|
+
this.stderrBuffer = [];
|
|
1138
|
+
this.processExited = false;
|
|
1139
|
+
this.diagnosticsStore = new Map;
|
|
1140
|
+
this.workspaceApplyEditHandler = null;
|
|
1141
|
+
this.diagnosticPullSupported = false;
|
|
1142
|
+
this.documentFormattingSupported = false;
|
|
1130
1143
|
this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
|
|
1131
1144
|
this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
1145
|
+
this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
|
|
1132
1146
|
}
|
|
1133
1147
|
pid() {
|
|
1134
1148
|
return this.proc?.pid;
|
|
@@ -1148,6 +1162,12 @@ class LspClientTransport {
|
|
|
1148
1162
|
isDiagnosticPullSupported() {
|
|
1149
1163
|
return this.diagnosticPullSupported;
|
|
1150
1164
|
}
|
|
1165
|
+
setDocumentFormattingSupported(supported) {
|
|
1166
|
+
this.documentFormattingSupported = supported;
|
|
1167
|
+
}
|
|
1168
|
+
isDocumentFormattingSupported() {
|
|
1169
|
+
return this.documentFormattingSupported;
|
|
1170
|
+
}
|
|
1151
1171
|
handlePublishDiagnostics(params) {
|
|
1152
1172
|
this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
|
|
1153
1173
|
}
|
|
@@ -1223,7 +1243,7 @@ class LspClientTransport {
|
|
|
1223
1243
|
const options = args[1];
|
|
1224
1244
|
const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
|
|
1225
1245
|
const timeoutController = new AbortController;
|
|
1226
|
-
const timeoutHandle = setTimeout(() => {
|
|
1246
|
+
const timeoutHandle = this.timerProvider.setTimeout(() => {
|
|
1227
1247
|
const stderrTail = this.stderrBuffer.slice(-5).join(`
|
|
1228
1248
|
`);
|
|
1229
1249
|
timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
|
|
@@ -1242,7 +1262,7 @@ class LspClientTransport {
|
|
|
1242
1262
|
}
|
|
1243
1263
|
throw error;
|
|
1244
1264
|
} finally {
|
|
1245
|
-
clearTimeout(timeoutHandle);
|
|
1265
|
+
this.timerProvider.clearTimeout(timeoutHandle);
|
|
1246
1266
|
combinedSignal.dispose();
|
|
1247
1267
|
}
|
|
1248
1268
|
}
|
|
@@ -1361,6 +1381,14 @@ function supportsDiagnosticPull(capabilities) {
|
|
|
1361
1381
|
return false;
|
|
1362
1382
|
return Object.hasOwn(capabilities, "diagnosticProvider");
|
|
1363
1383
|
}
|
|
1384
|
+
function supportsDocumentFormatting(capabilities) {
|
|
1385
|
+
if (capabilities === undefined)
|
|
1386
|
+
return false;
|
|
1387
|
+
const provider = capabilities.documentFormattingProvider;
|
|
1388
|
+
if (provider === undefined || provider === null || provider === false)
|
|
1389
|
+
return false;
|
|
1390
|
+
return provider === true || typeof provider === "object";
|
|
1391
|
+
}
|
|
1364
1392
|
|
|
1365
1393
|
class LspClientConnection extends LspClientTransport {
|
|
1366
1394
|
async initialize() {
|
|
@@ -1377,6 +1405,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
1377
1405
|
references: {},
|
|
1378
1406
|
documentSymbol: { hierarchicalDocumentSymbolSupport: true },
|
|
1379
1407
|
publishDiagnostics: {},
|
|
1408
|
+
formatting: { dynamicRegistration: false },
|
|
1380
1409
|
rename: {
|
|
1381
1410
|
prepareSupport: true,
|
|
1382
1411
|
prepareSupportDefaultBehavior: 1
|
|
@@ -1418,6 +1447,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
1418
1447
|
initializationOptions: this.server.initialization
|
|
1419
1448
|
}, { timeoutMs: this.initializeTimeoutMs });
|
|
1420
1449
|
this.setDiagnosticPullSupported(supportsDiagnosticPull(result?.capabilities));
|
|
1450
|
+
this.setDocumentFormattingSupported(supportsDocumentFormatting(result?.capabilities));
|
|
1421
1451
|
await this.sendNotification("initialized", {});
|
|
1422
1452
|
await this.sendNotification("workspace/didChangeConfiguration", {
|
|
1423
1453
|
settings: { json: { validate: { enable: true } } }
|
|
@@ -1613,6 +1643,17 @@ function canonicalPath(filePath) {
|
|
|
1613
1643
|
return absolute;
|
|
1614
1644
|
}
|
|
1615
1645
|
}
|
|
1646
|
+
function normalizeDocumentUri(uri) {
|
|
1647
|
+
let decoded = uri;
|
|
1648
|
+
try {
|
|
1649
|
+
decoded = decodeURIComponent(uri);
|
|
1650
|
+
} catch {
|
|
1651
|
+
decoded = uri;
|
|
1652
|
+
}
|
|
1653
|
+
if (process.platform !== "win32")
|
|
1654
|
+
return decoded;
|
|
1655
|
+
return decoded.replace(/^(file:\/\/\/)([a-z]):/, (_match, prefix, drive) => `${prefix}${drive.toUpperCase()}:`);
|
|
1656
|
+
}
|
|
1616
1657
|
function isSameOrDescendant(candidate, parent) {
|
|
1617
1658
|
const suffix = relative2(parent, candidate);
|
|
1618
1659
|
return suffix === "" || !suffix.startsWith("..") && suffix !== "..";
|
|
@@ -1623,17 +1664,18 @@ function movedPath(candidate, oldPath, newPath) {
|
|
|
1623
1664
|
}
|
|
1624
1665
|
|
|
1625
1666
|
class WorkspaceDocumentState {
|
|
1626
|
-
sendNotification;
|
|
1627
|
-
clearDiagnostics;
|
|
1628
|
-
openDocuments = new Map;
|
|
1629
|
-
openByUri = new Map;
|
|
1630
|
-
openPromises = new Map;
|
|
1631
|
-
now;
|
|
1632
|
-
versionlessPublishQuiescenceMs;
|
|
1633
1667
|
constructor(sendNotification, clearDiagnostics, options = {}) {
|
|
1634
1668
|
this.sendNotification = sendNotification;
|
|
1635
1669
|
this.clearDiagnostics = clearDiagnostics;
|
|
1636
|
-
this.
|
|
1670
|
+
this.openDocuments = new Map;
|
|
1671
|
+
this.openByUri = new Map;
|
|
1672
|
+
this.openPromises = new Map;
|
|
1673
|
+
this.timerProvider = options.timerProvider ?? {
|
|
1674
|
+
now: options.now ?? (() => Date.now()),
|
|
1675
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
1676
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
1677
|
+
};
|
|
1678
|
+
this.now = () => this.timerProvider.now();
|
|
1637
1679
|
this.versionlessPublishQuiescenceMs = options.versionlessPublishQuiescenceMs ?? DEFAULT_VERSIONLESS_PUBLISH_QUIESCENCE_MS;
|
|
1638
1680
|
}
|
|
1639
1681
|
async openFile(filePath) {
|
|
@@ -1655,7 +1697,7 @@ class WorkspaceDocumentState {
|
|
|
1655
1697
|
return this.openDocuments.get(canonicalPath(filePath))?.version;
|
|
1656
1698
|
}
|
|
1657
1699
|
getStoredDiagnostics(uri) {
|
|
1658
|
-
const state = this.openByUri.get(uri);
|
|
1700
|
+
const state = this.openByUri.get(normalizeDocumentUri(uri));
|
|
1659
1701
|
if (!state)
|
|
1660
1702
|
return [];
|
|
1661
1703
|
return state.lastPublish?.diagnostics ?? state.pullCache?.diagnostics ?? [];
|
|
@@ -1677,13 +1719,13 @@ class WorkspaceDocumentState {
|
|
|
1677
1719
|
return state !== undefined && state.uri === snapshot.uri && state.version === snapshot.version && state.generation === snapshot.documentGeneration;
|
|
1678
1720
|
}
|
|
1679
1721
|
getPullCache(snapshot) {
|
|
1680
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1722
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1681
1723
|
if (!state?.pullCache || state.pullCache.documentVersion !== snapshot.version)
|
|
1682
1724
|
return null;
|
|
1683
1725
|
return state.pullCache;
|
|
1684
1726
|
}
|
|
1685
1727
|
recordPullDiagnostics(snapshot, report) {
|
|
1686
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1728
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1687
1729
|
if (!state)
|
|
1688
1730
|
return;
|
|
1689
1731
|
state.pullCache = {
|
|
@@ -1693,7 +1735,7 @@ class WorkspaceDocumentState {
|
|
|
1693
1735
|
};
|
|
1694
1736
|
}
|
|
1695
1737
|
recordPublishedDiagnostics(params) {
|
|
1696
|
-
const state = this.openByUri.get(params.uri);
|
|
1738
|
+
const state = this.openByUri.get(normalizeDocumentUri(params.uri));
|
|
1697
1739
|
if (!state)
|
|
1698
1740
|
return;
|
|
1699
1741
|
state.publishGeneration += 1;
|
|
@@ -1707,7 +1749,7 @@ class WorkspaceDocumentState {
|
|
|
1707
1749
|
this.notifyWaiters(state);
|
|
1708
1750
|
}
|
|
1709
1751
|
resolvePushDiagnostics(snapshot) {
|
|
1710
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1752
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1711
1753
|
if (!state?.lastPublish)
|
|
1712
1754
|
return { status: "missing" };
|
|
1713
1755
|
const publish = state.lastPublish;
|
|
@@ -1721,7 +1763,7 @@ class WorkspaceDocumentState {
|
|
|
1721
1763
|
return waitMs === 0 ? { status: "ready", diagnostics: publish.diagnostics } : { status: "wait", waitMs };
|
|
1722
1764
|
}
|
|
1723
1765
|
waitForDiagnosticsActivity(snapshot, timeoutMs) {
|
|
1724
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1766
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1725
1767
|
if (!state || timeoutMs <= 0)
|
|
1726
1768
|
return Promise.resolve();
|
|
1727
1769
|
return new Promise((resolveActivity) => {
|
|
@@ -1730,11 +1772,11 @@ class WorkspaceDocumentState {
|
|
|
1730
1772
|
if (settled)
|
|
1731
1773
|
return;
|
|
1732
1774
|
settled = true;
|
|
1733
|
-
clearTimeout(timer);
|
|
1775
|
+
this.timerProvider.clearTimeout(timer);
|
|
1734
1776
|
state.waiters.delete(finish);
|
|
1735
1777
|
resolveActivity();
|
|
1736
1778
|
};
|
|
1737
|
-
const timer = setTimeout(finish, timeoutMs);
|
|
1779
|
+
const timer = this.timerProvider.setTimeout(finish, timeoutMs);
|
|
1738
1780
|
if (typeof timer.unref === "function")
|
|
1739
1781
|
timer.unref();
|
|
1740
1782
|
state.waiters.add(finish);
|
|
@@ -1842,7 +1884,7 @@ class WorkspaceDocumentState {
|
|
|
1842
1884
|
waiters: new Set
|
|
1843
1885
|
};
|
|
1844
1886
|
this.openDocuments.set(path, state);
|
|
1845
|
-
this.openByUri.set(state.uri, state);
|
|
1887
|
+
this.openByUri.set(normalizeDocumentUri(state.uri), state);
|
|
1846
1888
|
this.notifyWaiters(state);
|
|
1847
1889
|
await this.sendNotification("textDocument/didOpen", {
|
|
1848
1890
|
textDocument: { uri: state.uri, languageId: state.languageId, version: state.version, text }
|
|
@@ -1867,7 +1909,7 @@ class WorkspaceDocumentState {
|
|
|
1867
1909
|
}
|
|
1868
1910
|
async closeDocument(state) {
|
|
1869
1911
|
this.openDocuments.delete(state.path);
|
|
1870
|
-
this.openByUri.delete(state.uri);
|
|
1912
|
+
this.openByUri.delete(normalizeDocumentUri(state.uri));
|
|
1871
1913
|
this.clearDiagnostics(state.uri);
|
|
1872
1914
|
this.notifyWaiters(state);
|
|
1873
1915
|
await this.sendNotification("textDocument/didClose", { textDocument: { uri: state.uri } });
|
|
@@ -1896,13 +1938,11 @@ import { dirname as dirname2, isAbsolute as isAbsolute2, relative as relative3,
|
|
|
1896
1938
|
import { fileURLToPath } from "node:url";
|
|
1897
1939
|
|
|
1898
1940
|
class WorkspaceEditPathError extends Error {
|
|
1899
|
-
path;
|
|
1900
|
-
detail;
|
|
1901
|
-
name = "WorkspaceEditPathError";
|
|
1902
1941
|
constructor(path, detail) {
|
|
1903
1942
|
super(`${detail}: ${path}`);
|
|
1904
1943
|
this.path = path;
|
|
1905
1944
|
this.detail = detail;
|
|
1945
|
+
this.name = "WorkspaceEditPathError";
|
|
1906
1946
|
}
|
|
1907
1947
|
}
|
|
1908
1948
|
function isPathInsideWorkspace(filePath, workspaceRoot) {
|
|
@@ -2194,13 +2234,11 @@ function canonicalFingerprint(operations) {
|
|
|
2194
2234
|
|
|
2195
2235
|
// ../lsp-core/src/lsp/workspace-edit-types.ts
|
|
2196
2236
|
class WorkspaceEditValidationError extends Error {
|
|
2197
|
-
changeIndex;
|
|
2198
|
-
detail;
|
|
2199
|
-
name = "WorkspaceEditValidationError";
|
|
2200
2237
|
constructor(changeIndex, detail) {
|
|
2201
2238
|
super(`change ${changeIndex}: ${detail}`);
|
|
2202
2239
|
this.changeIndex = changeIndex;
|
|
2203
2240
|
this.detail = detail;
|
|
2241
|
+
this.name = "WorkspaceEditValidationError";
|
|
2204
2242
|
}
|
|
2205
2243
|
}
|
|
2206
2244
|
|
|
@@ -2698,10 +2736,9 @@ function simulateDelete(operation, virtual) {
|
|
|
2698
2736
|
import { existsSync as existsSync5, lstatSync as lstatSync3, readdirSync as readdirSync2 } from "node:fs";
|
|
2699
2737
|
import { dirname as dirname4, resolve as resolve5 } from "node:path";
|
|
2700
2738
|
class WorkspaceSnapshotBuilder {
|
|
2701
|
-
workspaceRoot;
|
|
2702
|
-
snapshots = new Map;
|
|
2703
2739
|
constructor(workspaceRoot) {
|
|
2704
2740
|
this.workspaceRoot = workspaceRoot;
|
|
2741
|
+
this.snapshots = new Map;
|
|
2705
2742
|
}
|
|
2706
2743
|
build(operations) {
|
|
2707
2744
|
this.add(this.workspaceRoot, false);
|
|
@@ -2745,8 +2782,10 @@ function snapshotOperations(operations, workspaceRoot) {
|
|
|
2745
2782
|
|
|
2746
2783
|
// ../lsp-core/src/lsp/workspace-edit-plan.ts
|
|
2747
2784
|
class PlanPathIndex {
|
|
2748
|
-
|
|
2749
|
-
|
|
2785
|
+
constructor() {
|
|
2786
|
+
this.firstChangeByPath = new Map;
|
|
2787
|
+
this.reportedPathByCanonical = new Map;
|
|
2788
|
+
}
|
|
2750
2789
|
build(operations) {
|
|
2751
2790
|
for (const operation of operations) {
|
|
2752
2791
|
switch (operation.kind) {
|
|
@@ -2835,14 +2874,11 @@ function isRecord4(value) {
|
|
|
2835
2874
|
}
|
|
2836
2875
|
|
|
2837
2876
|
class WorkspaceMutationController {
|
|
2838
|
-
workspaceRoot;
|
|
2839
|
-
documents;
|
|
2840
|
-
activeLease = null;
|
|
2841
|
-
nextLeaseId = 1;
|
|
2842
|
-
io;
|
|
2843
2877
|
constructor(workspaceRoot, documents) {
|
|
2844
2878
|
this.workspaceRoot = workspaceRoot;
|
|
2845
2879
|
this.documents = documents;
|
|
2880
|
+
this.activeLease = null;
|
|
2881
|
+
this.nextLeaseId = 1;
|
|
2846
2882
|
}
|
|
2847
2883
|
setIo(io) {
|
|
2848
2884
|
this.io = io;
|
|
@@ -2955,14 +2991,12 @@ var DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3000;
|
|
|
2955
2991
|
var VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
|
|
2956
2992
|
|
|
2957
2993
|
class LspClient extends LspClientConnection {
|
|
2958
|
-
diagnosticPullErrors = [];
|
|
2959
|
-
documents;
|
|
2960
|
-
workspaceMutations;
|
|
2961
|
-
diagnosticsFreshnessTimeoutMs;
|
|
2962
2994
|
constructor(root, server2, options = {}) {
|
|
2963
2995
|
super(root, server2, options);
|
|
2996
|
+
this.diagnosticPullErrors = [];
|
|
2964
2997
|
this.diagnosticsFreshnessTimeoutMs = options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
|
|
2965
2998
|
this.documents = new WorkspaceDocumentState((method, params) => this.sendNotification(method, params), (uri) => this.diagnosticsStore.delete(uri), {
|
|
2999
|
+
timerProvider: this.timerProvider,
|
|
2966
3000
|
versionlessPublishQuiescenceMs: options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS
|
|
2967
3001
|
});
|
|
2968
3002
|
this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
|
|
@@ -3015,6 +3049,18 @@ class LspClient extends LspClientConnection {
|
|
|
3015
3049
|
textDocument: { uri: pathToFileURL3(absPath).href }
|
|
3016
3050
|
}, options);
|
|
3017
3051
|
}
|
|
3052
|
+
async formatDocument(filePath, options, signal) {
|
|
3053
|
+
if (!this.isDocumentFormattingSupported())
|
|
3054
|
+
return null;
|
|
3055
|
+
const absPath = this.resolveWorkspacePath(filePath);
|
|
3056
|
+
await this.openFile(absPath);
|
|
3057
|
+
const requestOptions = signal === undefined ? {} : { signal };
|
|
3058
|
+
const edits = await this.sendRequest("textDocument/formatting", {
|
|
3059
|
+
textDocument: { uri: pathToFileURL3(absPath).href },
|
|
3060
|
+
options
|
|
3061
|
+
}, requestOptions);
|
|
3062
|
+
return edits ?? [];
|
|
3063
|
+
}
|
|
3018
3064
|
async workspaceSymbols(query, signal) {
|
|
3019
3065
|
const options = signal === undefined ? {} : { signal };
|
|
3020
3066
|
return this.sendRequest("workspace/symbol", { query }, options);
|
|
@@ -3054,7 +3100,7 @@ class LspClient extends LspClientConnection {
|
|
|
3054
3100
|
const absPath = this.resolveWorkspacePath(filePath);
|
|
3055
3101
|
const uri = pathToFileURL3(absPath).href;
|
|
3056
3102
|
await this.openFile(absPath);
|
|
3057
|
-
const deadlineAt =
|
|
3103
|
+
const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
|
|
3058
3104
|
for (;; ) {
|
|
3059
3105
|
signal?.throwIfAborted();
|
|
3060
3106
|
const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
|
|
@@ -3067,7 +3113,7 @@ class LspClient extends LspClientConnection {
|
|
|
3067
3113
|
if (!pushFallbackOnly) {
|
|
3068
3114
|
const cached = this.documents.getPullCache(snapshot);
|
|
3069
3115
|
try {
|
|
3070
|
-
const remainingMs2 = deadlineAt -
|
|
3116
|
+
const remainingMs2 = deadlineAt - this.timerProvider.now();
|
|
3071
3117
|
if (remainingMs2 <= 0)
|
|
3072
3118
|
return this.freshnessTimeout(absPath);
|
|
3073
3119
|
const result = await this.sendRequest("textDocument/diagnostic", {
|
|
@@ -3102,7 +3148,7 @@ class LspClient extends LspClientConnection {
|
|
|
3102
3148
|
}
|
|
3103
3149
|
if (!pushFallbackOnly)
|
|
3104
3150
|
continue;
|
|
3105
|
-
const remainingMs = deadlineAt -
|
|
3151
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
3106
3152
|
if (remainingMs <= 0) {
|
|
3107
3153
|
if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
|
|
3108
3154
|
const cached = this.documents.getPullCache(snapshot);
|
|
@@ -3260,18 +3306,16 @@ function awaitWithSignal(promise, signal) {
|
|
|
3260
3306
|
}
|
|
3261
3307
|
|
|
3262
3308
|
class LspManager {
|
|
3263
|
-
clients = new Map;
|
|
3264
|
-
reaperHandle = null;
|
|
3265
|
-
signalDisposer = null;
|
|
3266
|
-
disposed = false;
|
|
3267
|
-
idleTimeoutMs;
|
|
3268
|
-
initTimeoutMs;
|
|
3269
|
-
reaperIntervalMs;
|
|
3270
|
-
clientFactory;
|
|
3271
|
-
now;
|
|
3272
3309
|
constructor(options = {}) {
|
|
3310
|
+
this.clients = new Map;
|
|
3311
|
+
this.pendingStops = new Map;
|
|
3312
|
+
this.respawnBudgets = new Map;
|
|
3313
|
+
this.reaperHandle = null;
|
|
3314
|
+
this.signalDisposer = null;
|
|
3315
|
+
this.disposed = false;
|
|
3273
3316
|
this.idleTimeoutMs = options.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
|
|
3274
3317
|
this.initTimeoutMs = options.initTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
3318
|
+
this.maxResidentClients = options.maxResidentClients ?? MAX_RESIDENT_CLIENTS;
|
|
3275
3319
|
this.reaperIntervalMs = options.reaperIntervalMs ?? REAPER_INTERVAL_MS;
|
|
3276
3320
|
this.clientFactory = options.clientFactory ?? ((root, server2) => new LspClient(root, server2));
|
|
3277
3321
|
this.now = options.now ?? (() => Date.now());
|
|
@@ -3291,24 +3335,79 @@ class LspManager {
|
|
|
3291
3335
|
getKey(root, serverId) {
|
|
3292
3336
|
return `${root}::${serverId}`;
|
|
3293
3337
|
}
|
|
3338
|
+
tombstoneStop(key, client) {
|
|
3339
|
+
const stop = stopClientBestEffort(client);
|
|
3340
|
+
this.pendingStops.set(key, stop);
|
|
3341
|
+
stop.finally(() => {
|
|
3342
|
+
if (this.pendingStops.get(key) === stop) {
|
|
3343
|
+
this.pendingStops.delete(key);
|
|
3344
|
+
}
|
|
3345
|
+
});
|
|
3346
|
+
return stop;
|
|
3347
|
+
}
|
|
3348
|
+
recordDeadGeneration(key) {
|
|
3349
|
+
let budget = this.respawnBudgets.get(key);
|
|
3350
|
+
if (budget === undefined) {
|
|
3351
|
+
budget = { deadGenerations: 0, exhaustedAt: null };
|
|
3352
|
+
this.respawnBudgets.set(key, budget);
|
|
3353
|
+
}
|
|
3354
|
+
budget.deadGenerations += 1;
|
|
3355
|
+
}
|
|
3356
|
+
markHealthyGeneration(key) {
|
|
3357
|
+
this.respawnBudgets.delete(key);
|
|
3358
|
+
}
|
|
3359
|
+
ensureRespawnAllowed(key, root, serverId) {
|
|
3360
|
+
const budget = this.respawnBudgets.get(key);
|
|
3361
|
+
if (budget === undefined || budget.deadGenerations < CLIENT_RESPAWN_RETRY_LIMIT)
|
|
3362
|
+
return;
|
|
3363
|
+
if (budget.exhaustedAt === null) {
|
|
3364
|
+
budget.exhaustedAt = this.now();
|
|
3365
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
3366
|
+
}
|
|
3367
|
+
if (this.now() - budget.exhaustedAt < CLIENT_RESPAWN_COOLDOWN_MS) {
|
|
3368
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
3369
|
+
}
|
|
3370
|
+
budget.deadGenerations = 0;
|
|
3371
|
+
budget.exhaustedAt = null;
|
|
3372
|
+
}
|
|
3294
3373
|
reapStale() {
|
|
3295
3374
|
const t = this.now();
|
|
3296
3375
|
for (const [key, managed] of this.clients) {
|
|
3297
3376
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
3298
|
-
stopClientBestEffort(managed.client);
|
|
3299
3377
|
this.clients.delete(key);
|
|
3378
|
+
this.tombstoneStop(key, managed.client);
|
|
3300
3379
|
continue;
|
|
3301
3380
|
}
|
|
3302
3381
|
if (!managed.isInitializing && managed.refCount === 0 && managed.pendingWaiters === 0 && t - managed.lastUsedAt > this.idleTimeoutMs) {
|
|
3303
|
-
stopClientBestEffort(managed.client);
|
|
3304
3382
|
this.clients.delete(key);
|
|
3383
|
+
this.tombstoneStop(key, managed.client);
|
|
3305
3384
|
}
|
|
3306
3385
|
}
|
|
3307
3386
|
}
|
|
3387
|
+
evictForAdmission() {
|
|
3388
|
+
while (this.clients.size >= this.maxResidentClients) {
|
|
3389
|
+
const victim = this.leastRecentlyUsedIdleClient();
|
|
3390
|
+
if (!victim)
|
|
3391
|
+
return;
|
|
3392
|
+
this.clients.delete(victim.key);
|
|
3393
|
+
this.tombstoneStop(victim.key, victim.managed.client);
|
|
3394
|
+
}
|
|
3395
|
+
}
|
|
3396
|
+
leastRecentlyUsedIdleClient() {
|
|
3397
|
+
let candidate = null;
|
|
3398
|
+
for (const [key, managed] of this.clients) {
|
|
3399
|
+
if (managed.refCount > 0 || managed.pendingWaiters > 0 || managed.isInitializing)
|
|
3400
|
+
continue;
|
|
3401
|
+
if (candidate === null || managed.lastUsedAt < candidate.managed.lastUsedAt) {
|
|
3402
|
+
candidate = { key, managed };
|
|
3403
|
+
}
|
|
3404
|
+
}
|
|
3405
|
+
return candidate;
|
|
3406
|
+
}
|
|
3308
3407
|
async tryDeleteIfOrphaned(key, managed) {
|
|
3309
3408
|
if (managed.refCount === 0 && managed.pendingWaiters === 0 && !managed.isInitializing && this.clients.get(key) === managed) {
|
|
3310
3409
|
this.clients.delete(key);
|
|
3311
|
-
await
|
|
3410
|
+
await this.tombstoneStop(key, managed.client);
|
|
3312
3411
|
}
|
|
3313
3412
|
}
|
|
3314
3413
|
async getClient(root, server2, signal) {
|
|
@@ -3317,12 +3416,22 @@ class LspManager {
|
|
|
3317
3416
|
}
|
|
3318
3417
|
signal?.throwIfAborted();
|
|
3319
3418
|
const key = this.getKey(root, server2.id);
|
|
3419
|
+
for (;; ) {
|
|
3420
|
+
const pendingStop = this.pendingStops.get(key);
|
|
3421
|
+
if (pendingStop === undefined)
|
|
3422
|
+
break;
|
|
3423
|
+
await awaitWithSignal(pendingStop, signal);
|
|
3424
|
+
signal?.throwIfAborted();
|
|
3425
|
+
}
|
|
3426
|
+
if (this.disposed) {
|
|
3427
|
+
throw new Error("LspManager has been disposed");
|
|
3428
|
+
}
|
|
3320
3429
|
let managed = this.clients.get(key);
|
|
3321
3430
|
if (managed) {
|
|
3322
3431
|
const t = this.now();
|
|
3323
3432
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
3324
|
-
await stopClientBestEffort(managed.client);
|
|
3325
3433
|
this.clients.delete(key);
|
|
3434
|
+
await this.tombstoneStop(key, managed.client);
|
|
3326
3435
|
managed = undefined;
|
|
3327
3436
|
}
|
|
3328
3437
|
}
|
|
@@ -3343,14 +3452,20 @@ class LspManager {
|
|
|
3343
3452
|
signal.throwIfAborted();
|
|
3344
3453
|
}
|
|
3345
3454
|
if (!managed.client.isAlive()) {
|
|
3346
|
-
|
|
3347
|
-
this.clients.
|
|
3455
|
+
this.recordDeadGeneration(key);
|
|
3456
|
+
if (this.clients.get(key) === managed) {
|
|
3457
|
+
this.clients.delete(key);
|
|
3458
|
+
}
|
|
3459
|
+
await this.tombstoneStop(key, managed.client);
|
|
3348
3460
|
return this.getClient(root, server2, signal);
|
|
3349
3461
|
}
|
|
3462
|
+
this.markHealthyGeneration(key);
|
|
3350
3463
|
managed.refCount++;
|
|
3351
3464
|
managed.lastUsedAt = this.now();
|
|
3352
3465
|
return managed.client;
|
|
3353
3466
|
}
|
|
3467
|
+
this.evictForAdmission();
|
|
3468
|
+
this.ensureRespawnAllowed(key, root, server2.id);
|
|
3354
3469
|
const client = this.clientFactory(root, server2);
|
|
3355
3470
|
const initStartedAt = this.now();
|
|
3356
3471
|
const initPromise = (async () => {
|
|
@@ -3374,7 +3489,7 @@ class LspManager {
|
|
|
3374
3489
|
if (this.clients.get(key) === newManaged) {
|
|
3375
3490
|
this.clients.delete(key);
|
|
3376
3491
|
}
|
|
3377
|
-
await
|
|
3492
|
+
await this.tombstoneStop(key, client);
|
|
3378
3493
|
throw err;
|
|
3379
3494
|
}
|
|
3380
3495
|
newManaged.pendingWaiters--;
|
|
@@ -3385,6 +3500,15 @@ class LspManager {
|
|
|
3385
3500
|
await this.tryDeleteIfOrphaned(key, newManaged);
|
|
3386
3501
|
signal.throwIfAborted();
|
|
3387
3502
|
}
|
|
3503
|
+
if (!client.isAlive()) {
|
|
3504
|
+
this.recordDeadGeneration(key);
|
|
3505
|
+
if (this.clients.get(key) === newManaged) {
|
|
3506
|
+
this.clients.delete(key);
|
|
3507
|
+
}
|
|
3508
|
+
await this.tombstoneStop(key, client);
|
|
3509
|
+
return this.getClient(root, server2, signal);
|
|
3510
|
+
}
|
|
3511
|
+
this.markHealthyGeneration(key);
|
|
3388
3512
|
newManaged.refCount++;
|
|
3389
3513
|
newManaged.lastUsedAt = this.now();
|
|
3390
3514
|
return client;
|
|
@@ -3405,14 +3529,20 @@ class LspManager {
|
|
|
3405
3529
|
if (client && managed.client !== client)
|
|
3406
3530
|
return;
|
|
3407
3531
|
this.clients.delete(key);
|
|
3408
|
-
|
|
3532
|
+
this.tombstoneStop(key, managed.client);
|
|
3409
3533
|
}
|
|
3410
3534
|
warmupClient(root, server2) {
|
|
3411
3535
|
if (this.disposed)
|
|
3412
3536
|
return;
|
|
3413
3537
|
const key = this.getKey(root, server2.id);
|
|
3414
|
-
if (this.clients.has(key))
|
|
3538
|
+
if (this.clients.has(key) || this.pendingStops.has(key))
|
|
3415
3539
|
return;
|
|
3540
|
+
this.evictForAdmission();
|
|
3541
|
+
try {
|
|
3542
|
+
this.ensureRespawnAllowed(key, root, server2.id);
|
|
3543
|
+
} catch {
|
|
3544
|
+
return;
|
|
3545
|
+
}
|
|
3416
3546
|
const client = this.clientFactory(root, server2);
|
|
3417
3547
|
const initStartedAt = this.now();
|
|
3418
3548
|
const initPromise = (async () => {
|
|
@@ -3438,7 +3568,7 @@ class LspManager {
|
|
|
3438
3568
|
if (this.clients.get(key) === managed) {
|
|
3439
3569
|
this.clients.delete(key);
|
|
3440
3570
|
}
|
|
3441
|
-
|
|
3571
|
+
this.tombstoneStop(key, client);
|
|
3442
3572
|
});
|
|
3443
3573
|
}
|
|
3444
3574
|
isServerInitializing(root, serverId) {
|
|
@@ -3482,8 +3612,11 @@ class LspManager {
|
|
|
3482
3612
|
for (const managed of this.clients.values()) {
|
|
3483
3613
|
stopPromises.push(stopClientBestEffort(managed.client));
|
|
3484
3614
|
}
|
|
3615
|
+
const tombstonedStops = [...this.pendingStops.values()];
|
|
3485
3616
|
this.clients.clear();
|
|
3486
|
-
|
|
3617
|
+
this.respawnBudgets.clear();
|
|
3618
|
+
await Promise.allSettled([...stopPromises, ...tombstonedStops]);
|
|
3619
|
+
this.pendingStops.clear();
|
|
3487
3620
|
}
|
|
3488
3621
|
}
|
|
3489
3622
|
var _defaultInstance = null;
|
|
@@ -3501,57 +3634,52 @@ async function disposeDefaultLspManager() {
|
|
|
3501
3634
|
}
|
|
3502
3635
|
}
|
|
3503
3636
|
|
|
3504
|
-
// ../lsp-core/src/lsp/
|
|
3505
|
-
import { existsSync as existsSync6,
|
|
3506
|
-
import { dirname as dirname5 } from "node:path";
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
|
|
3515
|
-
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
3637
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
3638
|
+
import { existsSync as existsSync6, realpathSync as realpathSync4 } from "node:fs";
|
|
3639
|
+
import { dirname as dirname5, join as join3 } from "node:path";
|
|
3640
|
+
|
|
3641
|
+
// ../lsp-core/src/lsp/workspace-markers.ts
|
|
3642
|
+
var GIT_WORKSPACE_MARKER = ".git";
|
|
3643
|
+
var PROJECT_WORKSPACE_MARKERS = [
|
|
3644
|
+
"package.json",
|
|
3645
|
+
"pyproject.toml",
|
|
3646
|
+
"Cargo.toml",
|
|
3647
|
+
"go.mod",
|
|
3648
|
+
"pom.xml",
|
|
3649
|
+
"build.gradle"
|
|
3650
|
+
];
|
|
3651
|
+
var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
|
|
3652
|
+
|
|
3653
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
3654
|
+
function findWorkspaceRootOutsideContext(directory) {
|
|
3655
|
+
const marked = nearestMarkedAncestor(directory);
|
|
3656
|
+
if (marked !== undefined)
|
|
3657
|
+
return marked;
|
|
3658
|
+
return realpathSync4(nearestExistingAncestor(directory));
|
|
3659
|
+
}
|
|
3660
|
+
function nearestMarkedAncestor(directory) {
|
|
3661
|
+
let current = directory;
|
|
3662
|
+
for (;; ) {
|
|
3663
|
+
if (existsSync6(current) && WORKSPACE_MARKERS.some((marker) => existsSync6(join3(current, marker)))) {
|
|
3664
|
+
return realpathSync4(current);
|
|
3665
|
+
}
|
|
3666
|
+
const parent = dirname5(current);
|
|
3667
|
+
if (parent === current)
|
|
3668
|
+
return;
|
|
3669
|
+
current = parent;
|
|
3519
3670
|
}
|
|
3520
3671
|
}
|
|
3521
|
-
function
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
}
|
|
3529
|
-
|
|
3530
|
-
return value === "declined" || value === "allowed";
|
|
3531
|
-
}
|
|
3532
|
-
function writeInstallDecisions(decisions) {
|
|
3533
|
-
const path = getInstallDecisionsPath();
|
|
3534
|
-
mkdirSync(dirname5(path), { recursive: true });
|
|
3535
|
-
const tmpPath = `${path}.tmp`;
|
|
3536
|
-
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
3537
|
-
`, "utf8");
|
|
3538
|
-
renameSync2(tmpPath, path);
|
|
3539
|
-
}
|
|
3540
|
-
function isInstallDecisions(value) {
|
|
3541
|
-
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
3542
|
-
}
|
|
3543
|
-
function isInstallDecisionRecord(value) {
|
|
3544
|
-
if (!isRecord5(value))
|
|
3545
|
-
return false;
|
|
3546
|
-
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
3547
|
-
}
|
|
3548
|
-
function isRecord5(value) {
|
|
3549
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3672
|
+
function nearestExistingAncestor(directory) {
|
|
3673
|
+
let current = directory;
|
|
3674
|
+
while (!existsSync6(current)) {
|
|
3675
|
+
const parent = dirname5(current);
|
|
3676
|
+
if (parent === current)
|
|
3677
|
+
return current;
|
|
3678
|
+
current = parent;
|
|
3679
|
+
}
|
|
3680
|
+
return current;
|
|
3550
3681
|
}
|
|
3551
3682
|
|
|
3552
|
-
// ../lsp-core/src/lsp/config-loader.ts
|
|
3553
|
-
import { existsSync as existsSync7, readFileSync as readFileSync4 } from "node:fs";
|
|
3554
|
-
|
|
3555
3683
|
// ../lsp-core/src/lsp/server-definitions.ts
|
|
3556
3684
|
var LSP_INSTALL_HINTS = {
|
|
3557
3685
|
typescript: "npm install -g typescript-language-server typescript",
|
|
@@ -3597,6 +3725,26 @@ var LSP_INSTALL_HINTS = {
|
|
|
3597
3725
|
julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
|
|
3598
3726
|
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"
|
|
3599
3727
|
};
|
|
3728
|
+
var LSP_LOCAL_INSTALL_HINTS = {
|
|
3729
|
+
typescript: "bun add -d typescript-language-server typescript",
|
|
3730
|
+
vue: "bun add -d @vue/language-server",
|
|
3731
|
+
eslint: "bun add -d vscode-langservers-extracted",
|
|
3732
|
+
oxlint: "bun add -d oxlint",
|
|
3733
|
+
biome: "bun add -d @biomejs/biome",
|
|
3734
|
+
svelte: "bun add -d svelte-language-server",
|
|
3735
|
+
astro: "bun add -d @astrojs/language-server",
|
|
3736
|
+
bash: "bun add -d bash-language-server",
|
|
3737
|
+
"bash-ls": "bun add -d bash-language-server",
|
|
3738
|
+
"yaml-ls": "bun add -d yaml-language-server",
|
|
3739
|
+
php: "bun add -d intelephense",
|
|
3740
|
+
prisma: "bun add -d prisma",
|
|
3741
|
+
dockerfile: "bun add -d dockerfile-language-server-nodejs",
|
|
3742
|
+
pyright: "uv add --dev pyright",
|
|
3743
|
+
basedpyright: "uv add --dev basedpyright",
|
|
3744
|
+
ruff: "uv add --dev ruff",
|
|
3745
|
+
ty: "uv add --dev ty",
|
|
3746
|
+
"ruby-lsp": "bundle add ruby-lsp --group development"
|
|
3747
|
+
};
|
|
3600
3748
|
var BUILTIN_SERVERS = {
|
|
3601
3749
|
typescript: {
|
|
3602
3750
|
command: ["typescript-language-server", "--stdio"],
|
|
@@ -3699,7 +3847,56 @@ var BUILTIN_SERVERS = {
|
|
|
3699
3847
|
}
|
|
3700
3848
|
};
|
|
3701
3849
|
|
|
3850
|
+
// ../lsp-core/src/lsp/server-install-state.ts
|
|
3851
|
+
import { existsSync as existsSync7, mkdirSync, readFileSync as readFileSync3, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
3852
|
+
import { dirname as dirname6 } from "node:path";
|
|
3853
|
+
function getInstallDecisionsPath() {
|
|
3854
|
+
return lspRequestContext().installDecisionsPath;
|
|
3855
|
+
}
|
|
3856
|
+
function loadInstallDecisions() {
|
|
3857
|
+
const path = getInstallDecisionsPath();
|
|
3858
|
+
if (!existsSync7(path))
|
|
3859
|
+
return {};
|
|
3860
|
+
try {
|
|
3861
|
+
const parsed = JSON.parse(readFileSync3(path, "utf8"));
|
|
3862
|
+
return isInstallDecisions(parsed) ? parsed : {};
|
|
3863
|
+
} catch {
|
|
3864
|
+
return {};
|
|
3865
|
+
}
|
|
3866
|
+
}
|
|
3867
|
+
function loadInstallDecision(serverId) {
|
|
3868
|
+
return loadInstallDecisions()[serverId];
|
|
3869
|
+
}
|
|
3870
|
+
function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
|
|
3871
|
+
const decisions = loadInstallDecisions();
|
|
3872
|
+
decisions[serverId] = { decision, decidedAt };
|
|
3873
|
+
writeInstallDecisions(decisions);
|
|
3874
|
+
}
|
|
3875
|
+
function isInstallDecision(value) {
|
|
3876
|
+
return value === "declined" || value === "allowed";
|
|
3877
|
+
}
|
|
3878
|
+
function writeInstallDecisions(decisions) {
|
|
3879
|
+
const path = getInstallDecisionsPath();
|
|
3880
|
+
mkdirSync(dirname6(path), { recursive: true });
|
|
3881
|
+
const tmpPath = `${path}.tmp`;
|
|
3882
|
+
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
3883
|
+
`, "utf8");
|
|
3884
|
+
renameSync2(tmpPath, path);
|
|
3885
|
+
}
|
|
3886
|
+
function isInstallDecisions(value) {
|
|
3887
|
+
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
3888
|
+
}
|
|
3889
|
+
function isInstallDecisionRecord(value) {
|
|
3890
|
+
if (!isRecord5(value))
|
|
3891
|
+
return false;
|
|
3892
|
+
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
3893
|
+
}
|
|
3894
|
+
function isRecord5(value) {
|
|
3895
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3896
|
+
}
|
|
3897
|
+
|
|
3702
3898
|
// ../lsp-core/src/lsp/config-loader.ts
|
|
3899
|
+
import { existsSync as existsSync8, readFileSync as readFileSync4 } from "node:fs";
|
|
3703
3900
|
function getProjectConfigPaths() {
|
|
3704
3901
|
return lspRequestContext().projectConfigPaths;
|
|
3705
3902
|
}
|
|
@@ -3707,7 +3904,7 @@ function getUserConfigPath() {
|
|
|
3707
3904
|
return lspRequestContext().userConfigPath;
|
|
3708
3905
|
}
|
|
3709
3906
|
function loadJsonFile(path) {
|
|
3710
|
-
if (!
|
|
3907
|
+
if (!existsSync8(path))
|
|
3711
3908
|
return null;
|
|
3712
3909
|
try {
|
|
3713
3910
|
const parsed = JSON.parse(readFileSync4(path, "utf-8"));
|
|
@@ -3895,54 +4092,155 @@ function getDisabledServerIds() {
|
|
|
3895
4092
|
}
|
|
3896
4093
|
|
|
3897
4094
|
// ../lsp-core/src/lsp/server-installation.ts
|
|
3898
|
-
import { existsSync as
|
|
3899
|
-
import { delimiter as delimiter3, join as
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3906
|
-
|
|
3907
|
-
|
|
3908
|
-
|
|
4095
|
+
import { existsSync as existsSync9 } from "node:fs";
|
|
4096
|
+
import { delimiter as delimiter3, dirname as dirname7, isAbsolute as isAbsolute3, join as join4, resolve as resolve7 } from "node:path";
|
|
4097
|
+
var LOCAL_BIN_RULES = [
|
|
4098
|
+
{
|
|
4099
|
+
markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
|
|
4100
|
+
binDirs: [join4("node_modules", ".bin")]
|
|
4101
|
+
},
|
|
4102
|
+
{
|
|
4103
|
+
markers: [
|
|
4104
|
+
"pyproject.toml",
|
|
4105
|
+
"ty.toml",
|
|
4106
|
+
"requirements.txt",
|
|
4107
|
+
"setup.py",
|
|
4108
|
+
"setup.cfg",
|
|
4109
|
+
"Pipfile",
|
|
4110
|
+
"pyrightconfig.json",
|
|
4111
|
+
"ruff.toml",
|
|
4112
|
+
".ruff.toml"
|
|
4113
|
+
],
|
|
4114
|
+
binDirs: [
|
|
4115
|
+
join4(".venv", "bin"),
|
|
4116
|
+
join4(".venv", "Scripts"),
|
|
4117
|
+
join4("venv", "bin"),
|
|
4118
|
+
join4("venv", "Scripts"),
|
|
4119
|
+
join4(".env", "bin"),
|
|
4120
|
+
join4(".env", "Scripts")
|
|
4121
|
+
]
|
|
4122
|
+
},
|
|
4123
|
+
{
|
|
4124
|
+
markers: ["Gemfile", "Gemfile.lock"],
|
|
4125
|
+
binDirs: [join4("vendor", "bundle", "bin"), "bin"]
|
|
4126
|
+
},
|
|
4127
|
+
{
|
|
4128
|
+
markers: ["go.mod", "go.sum", "go.work"],
|
|
4129
|
+
binDirs: ["bin"]
|
|
4130
|
+
}
|
|
4131
|
+
];
|
|
4132
|
+
var resolutionCache = new Map;
|
|
4133
|
+
var probeCount = 0;
|
|
4134
|
+
function probe(path) {
|
|
4135
|
+
probeCount += 1;
|
|
4136
|
+
return existsSync9(path);
|
|
4137
|
+
}
|
|
4138
|
+
function executableSuffixes(platform, pathExt) {
|
|
4139
|
+
if (platform !== "win32")
|
|
4140
|
+
return [""];
|
|
4141
|
+
const configured = pathExt ?? process.env["PATHEXT"] ?? "";
|
|
4142
|
+
const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
|
|
4143
|
+
return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
|
|
4144
|
+
}
|
|
4145
|
+
function probeWithSuffixes(directory, command, suffixes) {
|
|
4146
|
+
for (const suffix of suffixes) {
|
|
4147
|
+
const candidate = join4(directory, command + suffix);
|
|
4148
|
+
if (probe(candidate))
|
|
4149
|
+
return candidate;
|
|
3909
4150
|
}
|
|
3910
|
-
|
|
3911
|
-
|
|
3912
|
-
|
|
3913
|
-
|
|
3914
|
-
|
|
3915
|
-
|
|
3916
|
-
|
|
3917
|
-
|
|
3918
|
-
|
|
4151
|
+
return null;
|
|
4152
|
+
}
|
|
4153
|
+
function resolveLocal(command, workingDirectory, suffixes, stopAt) {
|
|
4154
|
+
const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
|
|
4155
|
+
let current = resolve7(workingDirectory);
|
|
4156
|
+
while (true) {
|
|
4157
|
+
for (const rule of LOCAL_BIN_RULES) {
|
|
4158
|
+
if (!rule.markers.some((marker) => probe(join4(current, marker))))
|
|
4159
|
+
continue;
|
|
4160
|
+
for (const binDir of rule.binDirs) {
|
|
4161
|
+
const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
|
|
4162
|
+
if (found !== null)
|
|
4163
|
+
return found;
|
|
4164
|
+
}
|
|
3919
4165
|
}
|
|
4166
|
+
if (probe(join4(current, ".git")))
|
|
4167
|
+
return null;
|
|
4168
|
+
if (boundary !== undefined && current === boundary)
|
|
4169
|
+
return null;
|
|
4170
|
+
const parent = dirname7(current);
|
|
4171
|
+
if (parent === current)
|
|
4172
|
+
return null;
|
|
4173
|
+
current = parent;
|
|
3920
4174
|
}
|
|
3921
|
-
|
|
3922
|
-
|
|
4175
|
+
}
|
|
4176
|
+
function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
|
|
4177
|
+
let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
|
|
4178
|
+
if (platform === "win32" && !pathEnv) {
|
|
3923
4179
|
pathEnv = process.env["Path"] ?? "";
|
|
3924
4180
|
}
|
|
3925
|
-
const
|
|
3926
|
-
|
|
3927
|
-
|
|
3928
|
-
|
|
3929
|
-
|
|
3930
|
-
|
|
3931
|
-
}
|
|
4181
|
+
for (const entry of pathEnv.split(delimiter3)) {
|
|
4182
|
+
if (entry.length === 0)
|
|
4183
|
+
continue;
|
|
4184
|
+
const found = probeWithSuffixes(entry, command, suffixes);
|
|
4185
|
+
if (found !== null)
|
|
4186
|
+
return found;
|
|
3932
4187
|
}
|
|
3933
|
-
|
|
3934
|
-
|
|
3935
|
-
|
|
4188
|
+
return null;
|
|
4189
|
+
}
|
|
4190
|
+
function resolveServerBinary(command, workingDirectory, options = {}) {
|
|
4191
|
+
if (command.length === 0)
|
|
4192
|
+
return null;
|
|
4193
|
+
const [cmd] = command;
|
|
4194
|
+
if (cmd === undefined || cmd.length === 0)
|
|
4195
|
+
return null;
|
|
4196
|
+
const platform = options.platform ?? process.platform;
|
|
4197
|
+
const suffixes = executableSuffixes(platform, options.pathExt);
|
|
4198
|
+
if (cmd.includes("/") || cmd.includes("\\")) {
|
|
4199
|
+
const explicit = isAbsolute3(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
|
|
4200
|
+
return probe(explicit) ? explicit : null;
|
|
4201
|
+
}
|
|
4202
|
+
const cacheKey = JSON.stringify([
|
|
4203
|
+
workingDirectory ?? "",
|
|
4204
|
+
cmd,
|
|
4205
|
+
platform,
|
|
4206
|
+
options.stopAt ?? "",
|
|
4207
|
+
options.pathExt ?? "",
|
|
4208
|
+
options.pathEnv ?? process.env["PATH"] ?? ""
|
|
4209
|
+
]);
|
|
4210
|
+
const cached = resolutionCache.get(cacheKey);
|
|
4211
|
+
if (cached !== undefined)
|
|
4212
|
+
return cached;
|
|
4213
|
+
let resolved = null;
|
|
4214
|
+
if (workingDirectory !== undefined && workingDirectory.length > 0) {
|
|
4215
|
+
resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
|
|
4216
|
+
}
|
|
4217
|
+
resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
|
|
4218
|
+
if (resolved === null && cmd === "node")
|
|
4219
|
+
resolved = cmd;
|
|
4220
|
+
resolutionCache.set(cacheKey, resolved);
|
|
4221
|
+
return resolved;
|
|
4222
|
+
}
|
|
4223
|
+
function isServerInstalled(command, workingDirectory, options = {}) {
|
|
4224
|
+
if (command.length === 0)
|
|
4225
|
+
return false;
|
|
4226
|
+
return resolveServerBinary(command, workingDirectory, options) !== null;
|
|
3936
4227
|
}
|
|
3937
4228
|
|
|
3938
4229
|
// ../lsp-core/src/lsp/server-resolution.ts
|
|
4230
|
+
function withResolvedCommand(command, binaryPath) {
|
|
4231
|
+
return [binaryPath, ...command.slice(1)];
|
|
4232
|
+
}
|
|
3939
4233
|
function findServerForExtension(ext) {
|
|
3940
4234
|
const servers = getMergedServers();
|
|
4235
|
+
const workingDirectory = contextCwd();
|
|
3941
4236
|
for (const server2 of servers) {
|
|
3942
|
-
if (server2.extensions.includes(ext)
|
|
4237
|
+
if (!server2.extensions.includes(ext))
|
|
4238
|
+
continue;
|
|
4239
|
+
const binaryPath = resolveServerBinary(server2.command, workingDirectory);
|
|
4240
|
+
if (binaryPath !== null) {
|
|
3943
4241
|
const resolvedServer = {
|
|
3944
4242
|
id: server2.id,
|
|
3945
|
-
command: server2.command,
|
|
4243
|
+
command: withResolvedCommand(server2.command, binaryPath),
|
|
3946
4244
|
extensions: server2.extensions,
|
|
3947
4245
|
priority: server2.priority
|
|
3948
4246
|
};
|
|
@@ -3989,6 +4287,7 @@ function findServerForExtension(ext) {
|
|
|
3989
4287
|
function getAllServers() {
|
|
3990
4288
|
const servers = getMergedServers();
|
|
3991
4289
|
const disabled = getDisabledServerIds();
|
|
4290
|
+
const workingDirectory = contextCwd();
|
|
3992
4291
|
const result = [];
|
|
3993
4292
|
const seen = new Set;
|
|
3994
4293
|
for (const server2 of servers) {
|
|
@@ -3996,7 +4295,7 @@ function getAllServers() {
|
|
|
3996
4295
|
continue;
|
|
3997
4296
|
result.push({
|
|
3998
4297
|
id: server2.id,
|
|
3999
|
-
installed: isServerInstalled(server2.command),
|
|
4298
|
+
installed: isServerInstalled(server2.command, workingDirectory),
|
|
4000
4299
|
extensions: server2.extensions,
|
|
4001
4300
|
disabled: false,
|
|
4002
4301
|
source: server2.source,
|
|
@@ -4010,7 +4309,7 @@ function getAllServers() {
|
|
|
4010
4309
|
const builtin = BUILTIN_SERVERS[id];
|
|
4011
4310
|
result.push({
|
|
4012
4311
|
id,
|
|
4013
|
-
installed: builtin ? isServerInstalled(builtin.command) : false,
|
|
4312
|
+
installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
|
|
4014
4313
|
extensions: builtin?.extensions ?? [],
|
|
4015
4314
|
disabled: true,
|
|
4016
4315
|
source: "disabled",
|
|
@@ -4021,7 +4320,6 @@ function getAllServers() {
|
|
|
4021
4320
|
}
|
|
4022
4321
|
|
|
4023
4322
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
4024
|
-
var WORKSPACE_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle"];
|
|
4025
4323
|
function isDirectoryPath(filePath) {
|
|
4026
4324
|
try {
|
|
4027
4325
|
return statSync3(filePath).isDirectory();
|
|
@@ -4030,32 +4328,90 @@ function isDirectoryPath(filePath) {
|
|
|
4030
4328
|
}
|
|
4031
4329
|
}
|
|
4032
4330
|
function findWorkspaceRoot(filePath) {
|
|
4033
|
-
const
|
|
4331
|
+
const cwd = contextCwd();
|
|
4332
|
+
const abs = resolveReadablePathInsideContext(filePath);
|
|
4034
4333
|
let dir = abs;
|
|
4035
4334
|
if (!isDirectoryPath(dir)) {
|
|
4036
|
-
dir =
|
|
4037
|
-
}
|
|
4038
|
-
|
|
4039
|
-
|
|
4040
|
-
|
|
4041
|
-
|
|
4042
|
-
|
|
4335
|
+
dir = dirname8(dir);
|
|
4336
|
+
}
|
|
4337
|
+
if (!isPathInside(cwd, abs))
|
|
4338
|
+
return findWorkspaceRootOutsideContext(dir);
|
|
4339
|
+
const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
|
|
4340
|
+
let nearestPackageRoot;
|
|
4341
|
+
while (isPathInside(cwd, dir)) {
|
|
4342
|
+
const canonicalDir = existingDirectoryInsideContext(dir, cwd);
|
|
4343
|
+
if (canonicalDir !== undefined) {
|
|
4344
|
+
if (existsSync10(join5(dir, GIT_WORKSPACE_MARKER))) {
|
|
4345
|
+
return canonicalDir;
|
|
4346
|
+
}
|
|
4347
|
+
if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
|
|
4348
|
+
nearestPackageRoot = canonicalDir;
|
|
4043
4349
|
}
|
|
4044
4350
|
}
|
|
4045
|
-
|
|
4046
|
-
|
|
4351
|
+
if (dir === cwd)
|
|
4352
|
+
break;
|
|
4353
|
+
dir = dirname8(dir);
|
|
4047
4354
|
}
|
|
4048
|
-
return
|
|
4355
|
+
return nearestPackageRoot ?? fallbackRoot;
|
|
4356
|
+
}
|
|
4357
|
+
function hasProjectWorkspaceMarker(directory) {
|
|
4358
|
+
return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync10(join5(directory, marker)));
|
|
4359
|
+
}
|
|
4360
|
+
function resolveReadablePathInsideContext(filePath) {
|
|
4361
|
+
const cwd = contextCwd();
|
|
4362
|
+
const abs = resolve8(cwd, filePath);
|
|
4363
|
+
if (isPathInside(cwd, abs))
|
|
4364
|
+
return abs;
|
|
4365
|
+
const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
|
|
4366
|
+
if (rebased !== undefined)
|
|
4367
|
+
return rebased;
|
|
4368
|
+
return canonicalizeExistingOrNearestAncestor(abs);
|
|
4049
4369
|
}
|
|
4050
4370
|
function resolvePathInsideContext(filePath) {
|
|
4051
4371
|
const cwd = contextCwd();
|
|
4052
|
-
const abs =
|
|
4372
|
+
const abs = resolveReadablePathInsideContext(filePath);
|
|
4053
4373
|
const canonical = canonicalizeExistingOrNearestAncestor(abs);
|
|
4054
4374
|
if (!isPathInside(cwd, canonical)) {
|
|
4055
4375
|
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
4056
4376
|
}
|
|
4057
4377
|
return canonical;
|
|
4058
4378
|
}
|
|
4379
|
+
function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
4380
|
+
let current = path;
|
|
4381
|
+
const suffix = [];
|
|
4382
|
+
while (true) {
|
|
4383
|
+
if (existsSync10(current)) {
|
|
4384
|
+
const canonical = realpathSync5(current);
|
|
4385
|
+
if (isPathInside(cwd, canonical))
|
|
4386
|
+
return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
|
|
4387
|
+
}
|
|
4388
|
+
const parent = dirname8(current);
|
|
4389
|
+
if (parent === current)
|
|
4390
|
+
return;
|
|
4391
|
+
suffix.unshift(basename3(current));
|
|
4392
|
+
current = parent;
|
|
4393
|
+
}
|
|
4394
|
+
}
|
|
4395
|
+
function existingDirectoryInsideContext(directory, cwd) {
|
|
4396
|
+
if (!existsSync10(directory))
|
|
4397
|
+
return;
|
|
4398
|
+
const canonical = realpathSync5(directory);
|
|
4399
|
+
if (!statSync3(canonical).isDirectory())
|
|
4400
|
+
return;
|
|
4401
|
+
return isPathInside(cwd, canonical) ? canonical : undefined;
|
|
4402
|
+
}
|
|
4403
|
+
function nearestExistingDirectoryInsideContext(directory, cwd) {
|
|
4404
|
+
let current = directory;
|
|
4405
|
+
while (isPathInside(cwd, current)) {
|
|
4406
|
+
const canonical = existingDirectoryInsideContext(current, cwd);
|
|
4407
|
+
if (canonical !== undefined)
|
|
4408
|
+
return canonical;
|
|
4409
|
+
if (current === cwd)
|
|
4410
|
+
return;
|
|
4411
|
+
current = dirname8(current);
|
|
4412
|
+
}
|
|
4413
|
+
return;
|
|
4414
|
+
}
|
|
4059
4415
|
function formatServerLookupError(result) {
|
|
4060
4416
|
if (result.status === "not_installed") {
|
|
4061
4417
|
return formatNotInstalled(result);
|
|
@@ -4079,6 +4435,19 @@ function formatServerLookupError(result) {
|
|
|
4079
4435
|
].join(`
|
|
4080
4436
|
`);
|
|
4081
4437
|
}
|
|
4438
|
+
function formatInstallOptions(serverId, installHint) {
|
|
4439
|
+
const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
|
|
4440
|
+
if (localHint === undefined) {
|
|
4441
|
+
return ["To install, run:", ` ${installHint}`];
|
|
4442
|
+
}
|
|
4443
|
+
return [
|
|
4444
|
+
"To install in THIS repository (preferred — no global install needed):",
|
|
4445
|
+
` ${localHint}`,
|
|
4446
|
+
"",
|
|
4447
|
+
"Or install it globally:",
|
|
4448
|
+
` ${installHint}`
|
|
4449
|
+
];
|
|
4450
|
+
}
|
|
4082
4451
|
function formatNotInstalled(result) {
|
|
4083
4452
|
const { server: server2, installHint } = result;
|
|
4084
4453
|
const extensions = server2.extensions.join(", ");
|
|
@@ -4093,19 +4462,19 @@ function formatNotInstalled(result) {
|
|
|
4093
4462
|
`Command not found: ${server2.command[0]}`,
|
|
4094
4463
|
""
|
|
4095
4464
|
];
|
|
4465
|
+
const installOptions = formatInstallOptions(server2.id, installHint);
|
|
4096
4466
|
if (decision === "allowed") {
|
|
4097
4467
|
return [
|
|
4098
4468
|
...header,
|
|
4099
4469
|
"The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
|
|
4100
|
-
|
|
4470
|
+
...installOptions.slice(1)
|
|
4101
4471
|
].join(`
|
|
4102
4472
|
`);
|
|
4103
4473
|
}
|
|
4104
4474
|
if (!context.capabilities.installDecisionTool) {
|
|
4105
4475
|
return [
|
|
4106
4476
|
...header,
|
|
4107
|
-
|
|
4108
|
-
` ${installHint}`,
|
|
4477
|
+
...installOptions,
|
|
4109
4478
|
"",
|
|
4110
4479
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
4111
4480
|
"Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
|
|
@@ -4114,8 +4483,7 @@ function formatNotInstalled(result) {
|
|
|
4114
4483
|
}
|
|
4115
4484
|
return [
|
|
4116
4485
|
...header,
|
|
4117
|
-
|
|
4118
|
-
` ${installHint}`,
|
|
4486
|
+
...installOptions,
|
|
4119
4487
|
"",
|
|
4120
4488
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
4121
4489
|
"- If the user agrees: run the install command above, then retry this tool.",
|
|
@@ -4126,7 +4494,7 @@ function formatNotInstalled(result) {
|
|
|
4126
4494
|
].join(`
|
|
4127
4495
|
`);
|
|
4128
4496
|
}
|
|
4129
|
-
var
|
|
4497
|
+
var READ_ONLY_TOOLS = new Set([
|
|
4130
4498
|
"diagnostics",
|
|
4131
4499
|
"definition",
|
|
4132
4500
|
"references",
|
|
@@ -4135,7 +4503,7 @@ var READ_ONLY_RETRY_TOOLS = new Set([
|
|
|
4135
4503
|
"prepareRename"
|
|
4136
4504
|
]);
|
|
4137
4505
|
async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
4138
|
-
const absPath = resolvePathInsideContext(filePath);
|
|
4506
|
+
const absPath = READ_ONLY_TOOLS.has(toolName) ? resolveReadablePathInsideContext(filePath) : resolvePathInsideContext(filePath);
|
|
4139
4507
|
if (isDirectoryPath(absPath)) {
|
|
4140
4508
|
throw new LspInvalidPathError("Directory paths are not supported by this LSP tool. " + "Use lsp.diagnostics with a directory path for directory diagnostics.");
|
|
4141
4509
|
}
|
|
@@ -4150,9 +4518,9 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
|
4150
4518
|
const acquireAndCall = async (allowRetry) => {
|
|
4151
4519
|
const client = await manager.getClient(root, server2, options.signal);
|
|
4152
4520
|
try {
|
|
4153
|
-
return await fn(client, root);
|
|
4521
|
+
return await fn(client, root, absPath);
|
|
4154
4522
|
} catch (err) {
|
|
4155
|
-
if (allowRetry &&
|
|
4523
|
+
if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
|
|
4156
4524
|
manager.invalidateClient(root, server2.id, client);
|
|
4157
4525
|
return acquireAndCall(false);
|
|
4158
4526
|
}
|
|
@@ -4170,8 +4538,8 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
|
4170
4538
|
}
|
|
4171
4539
|
|
|
4172
4540
|
// ../lsp-core/src/lsp/directory-diagnostics.ts
|
|
4173
|
-
import { existsSync as
|
|
4174
|
-
import { join as
|
|
4541
|
+
import { existsSync as existsSync11, lstatSync as lstatSync4, readdirSync as readdirSync3 } from "node:fs";
|
|
4542
|
+
import { join as join6, resolve as resolve9 } from "node:path";
|
|
4175
4543
|
|
|
4176
4544
|
// ../lsp-core/src/lsp/formatters.ts
|
|
4177
4545
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
@@ -4301,7 +4669,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
|
|
|
4301
4669
|
for (const entry of entries) {
|
|
4302
4670
|
if (files.length >= maxFiles)
|
|
4303
4671
|
return;
|
|
4304
|
-
const fullPath =
|
|
4672
|
+
const fullPath = join6(currentDir, entry);
|
|
4305
4673
|
let stat;
|
|
4306
4674
|
try {
|
|
4307
4675
|
stat = lstatSync4(fullPath);
|
|
@@ -4326,8 +4694,8 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
4326
4694
|
if (!extension.startsWith(".")) {
|
|
4327
4695
|
throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
|
|
4328
4696
|
}
|
|
4329
|
-
const absDir =
|
|
4330
|
-
if (!
|
|
4697
|
+
const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
|
|
4698
|
+
if (!existsSync11(absDir)) {
|
|
4331
4699
|
throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
|
|
4332
4700
|
}
|
|
4333
4701
|
const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
|
|
@@ -4414,7 +4782,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
4414
4782
|
|
|
4415
4783
|
// ../lsp-core/src/lsp/infer-extension.ts
|
|
4416
4784
|
import { lstatSync as lstatSync5, readdirSync as readdirSync4 } from "node:fs";
|
|
4417
|
-
import { join as
|
|
4785
|
+
import { join as join7 } from "node:path";
|
|
4418
4786
|
var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
|
|
4419
4787
|
var MAX_SCAN_ENTRIES = 500;
|
|
4420
4788
|
function inferExtensionFromDirectory(directory) {
|
|
@@ -4432,7 +4800,7 @@ function inferExtensionFromDirectory(directory) {
|
|
|
4432
4800
|
for (const entry of entries) {
|
|
4433
4801
|
if (scanned >= MAX_SCAN_ENTRIES)
|
|
4434
4802
|
return;
|
|
4435
|
-
const fullPath =
|
|
4803
|
+
const fullPath = join7(dir, entry);
|
|
4436
4804
|
let stat;
|
|
4437
4805
|
try {
|
|
4438
4806
|
stat = lstatSync5(fullPath);
|
|
@@ -4607,7 +4975,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4607
4975
|
const filePath = requireString(params, "filePath");
|
|
4608
4976
|
const severity = severityFilter(params);
|
|
4609
4977
|
try {
|
|
4610
|
-
const absPath =
|
|
4978
|
+
const absPath = resolveReadablePathInsideContext(filePath);
|
|
4611
4979
|
if (isDirectoryPath(absPath)) {
|
|
4612
4980
|
const extension = inferExtensionFromDirectory(absPath);
|
|
4613
4981
|
if (!extension) {
|
|
@@ -4636,7 +5004,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4636
5004
|
};
|
|
4637
5005
|
return text(output2.output, details2);
|
|
4638
5006
|
}
|
|
4639
|
-
const result = await withLspClient(filePath, async (client) => client.diagnostics(
|
|
5007
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
|
|
4640
5008
|
if (result.transientError) {
|
|
4641
5009
|
const message = result.transientError.message;
|
|
4642
5010
|
const details2 = {
|
|
@@ -4683,6 +5051,96 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4683
5051
|
throw error;
|
|
4684
5052
|
}
|
|
4685
5053
|
}
|
|
5054
|
+
// ../lsp-core/src/lsp/format-document.ts
|
|
5055
|
+
import { readFileSync as readFileSync5, renameSync as renameSync3, unlinkSync, writeFileSync as writeFileSync3 } from "node:fs";
|
|
5056
|
+
var DEFAULT_FORMATTING_OPTIONS = {
|
|
5057
|
+
tabSize: 4,
|
|
5058
|
+
insertSpaces: false,
|
|
5059
|
+
trimTrailingWhitespace: true,
|
|
5060
|
+
insertFinalNewline: true,
|
|
5061
|
+
trimFinalNewlines: true
|
|
5062
|
+
};
|
|
5063
|
+
var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
|
|
5064
|
+
async function formatDocumentWithClient(client, filePath, options = {}) {
|
|
5065
|
+
const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
|
|
5066
|
+
if (edits === null)
|
|
5067
|
+
return { status: "unavailable", reason: "capability_not_advertised" };
|
|
5068
|
+
if (edits.length === 0)
|
|
5069
|
+
return UNCHANGED;
|
|
5070
|
+
const before = readFileSync5(filePath, "utf-8");
|
|
5071
|
+
const normalized = normalizeTextEdits(before, edits, 0);
|
|
5072
|
+
if (normalized.text === before)
|
|
5073
|
+
return UNCHANGED;
|
|
5074
|
+
writeAtomically(filePath, normalized.text);
|
|
5075
|
+
await client.openFile(filePath);
|
|
5076
|
+
return {
|
|
5077
|
+
status: "formatted",
|
|
5078
|
+
...lineDelta(normalized.edits)
|
|
5079
|
+
};
|
|
5080
|
+
}
|
|
5081
|
+
function lineDelta(edits) {
|
|
5082
|
+
let linesAdded = 0;
|
|
5083
|
+
let linesRemoved = 0;
|
|
5084
|
+
for (const edit of edits) {
|
|
5085
|
+
linesRemoved += edit.range.end.line - edit.range.start.line + 1;
|
|
5086
|
+
linesAdded += edit.newText.split(`
|
|
5087
|
+
`).length;
|
|
5088
|
+
}
|
|
5089
|
+
return { linesAdded, linesRemoved };
|
|
5090
|
+
}
|
|
5091
|
+
function writeAtomically(filePath, content) {
|
|
5092
|
+
const tempPath = `${filePath}.omo-format.tmp`;
|
|
5093
|
+
writeFileSync3(tempPath, content, "utf-8");
|
|
5094
|
+
try {
|
|
5095
|
+
renameSync3(tempPath, filePath);
|
|
5096
|
+
} catch (error) {
|
|
5097
|
+
try {
|
|
5098
|
+
unlinkSync(tempPath);
|
|
5099
|
+
} catch {}
|
|
5100
|
+
throw error;
|
|
5101
|
+
}
|
|
5102
|
+
}
|
|
5103
|
+
|
|
5104
|
+
// ../lsp-core/src/tools/format.ts
|
|
5105
|
+
async function executeLspFormat(params, signal) {
|
|
5106
|
+
const filePath = requireString(params, "filePath");
|
|
5107
|
+
try {
|
|
5108
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
|
|
5109
|
+
return text(describeResult(filePath, result), formatDetails(filePath, result));
|
|
5110
|
+
} catch (error) {
|
|
5111
|
+
const missingDependency = missingDependencyResult(error, {
|
|
5112
|
+
filePath,
|
|
5113
|
+
status: "unavailable",
|
|
5114
|
+
reason: "server_unavailable",
|
|
5115
|
+
linesAdded: 0,
|
|
5116
|
+
linesRemoved: 0
|
|
5117
|
+
});
|
|
5118
|
+
if (missingDependency)
|
|
5119
|
+
return missingDependency;
|
|
5120
|
+
throw error;
|
|
5121
|
+
}
|
|
5122
|
+
}
|
|
5123
|
+
function formatDetails(filePath, result) {
|
|
5124
|
+
if (result.status === "unavailable") {
|
|
5125
|
+
return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
|
|
5126
|
+
}
|
|
5127
|
+
return {
|
|
5128
|
+
filePath,
|
|
5129
|
+
status: result.status,
|
|
5130
|
+
linesAdded: result.linesAdded,
|
|
5131
|
+
linesRemoved: result.linesRemoved
|
|
5132
|
+
};
|
|
5133
|
+
}
|
|
5134
|
+
function describeResult(filePath, result) {
|
|
5135
|
+
if (result.status === "unavailable") {
|
|
5136
|
+
return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
|
|
5137
|
+
}
|
|
5138
|
+
if (result.status === "unchanged") {
|
|
5139
|
+
return `Already formatted: ${filePath}`;
|
|
5140
|
+
}
|
|
5141
|
+
return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
|
|
5142
|
+
}
|
|
5143
|
+
|
|
4686
5144
|
// ../lsp-core/src/tools/install-decision.ts
|
|
4687
5145
|
async function executeLspInstallDecision(params) {
|
|
4688
5146
|
const serverId = requireString(params, "server_id");
|
|
@@ -4711,7 +5169,7 @@ async function executeLspGotoDefinition(params, signal) {
|
|
|
4711
5169
|
const line = requireNumber(params, "line");
|
|
4712
5170
|
const character = requireNumber(params, "character");
|
|
4713
5171
|
try {
|
|
4714
|
-
const result = await withLspClient(filePath, async (client) => client.definition(
|
|
5172
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.definition(resolvedFilePath, line, character, signal), "definition", clientOptions(signal));
|
|
4715
5173
|
const locations = !result ? [] : Array.isArray(result) ? result : [result];
|
|
4716
5174
|
const details = { filePath, line, character, locations };
|
|
4717
5175
|
if (locations.length === 0)
|
|
@@ -4736,7 +5194,7 @@ async function executeLspFindReferences(params, signal) {
|
|
|
4736
5194
|
const character = requireNumber(params, "character");
|
|
4737
5195
|
const includeDeclaration = optionalBoolean(params, "includeDeclaration") ?? true;
|
|
4738
5196
|
try {
|
|
4739
|
-
const result = await withLspClient(filePath, async (client) => client.references(
|
|
5197
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.references(resolvedFilePath, line, character, includeDeclaration, signal), "references", clientOptions(signal));
|
|
4740
5198
|
const references = Array.isArray(result) ? result : [];
|
|
4741
5199
|
const total = references.length;
|
|
4742
5200
|
const truncated = total > DEFAULT_MAX_REFERENCES;
|
|
@@ -4778,7 +5236,7 @@ async function executeLspPrepareRename(params, signal) {
|
|
|
4778
5236
|
const line = requireNumber(params, "line");
|
|
4779
5237
|
const character = requireNumber(params, "character");
|
|
4780
5238
|
try {
|
|
4781
|
-
const result = await withLspClient(filePath, async (client) => client.prepareRename(
|
|
5239
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.prepareRename(resolvedFilePath, line, character, signal), "prepareRename", clientOptions(signal));
|
|
4782
5240
|
const details = { filePath, line, character, result };
|
|
4783
5241
|
return text(formatPrepareRenameResult(result), details);
|
|
4784
5242
|
} catch (error) {
|
|
@@ -4799,7 +5257,7 @@ async function executeLspRename(params, signal) {
|
|
|
4799
5257
|
const character = requireNumber(params, "character");
|
|
4800
5258
|
const newName = requireString(params, "newName");
|
|
4801
5259
|
try {
|
|
4802
|
-
const result = await withLspClient(filePath, async (client) => client.rename(
|
|
5260
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.rename(resolvedFilePath, line, character, newName, signal), "rename", clientOptions(signal));
|
|
4803
5261
|
const details = { filePath, line, character, newName, apply: result.apply, edit: result.edit };
|
|
4804
5262
|
return text(formatApplyResult(result.apply), details, !result.apply.success);
|
|
4805
5263
|
} catch (error) {
|
|
@@ -4879,7 +5337,7 @@ async function executeLspSymbols(params, signal) {
|
|
|
4879
5337
|
const symbols2 = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
|
|
4880
5338
|
return formatSymbolsResult(filePath, scope, symbols2, limit, query);
|
|
4881
5339
|
}
|
|
4882
|
-
const symbols = await withLspClient(filePath, async (client) => client.documentSymbols(
|
|
5340
|
+
const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
|
|
4883
5341
|
return formatSymbolsResult(filePath, scope, symbols, limit);
|
|
4884
5342
|
} catch (error) {
|
|
4885
5343
|
const query = optionalString(params, "query");
|
|
@@ -5015,6 +5473,16 @@ var LSP_MCP_TOOLS = [
|
|
|
5015
5473
|
}, ["filePath", "line", "character", "newName"]),
|
|
5016
5474
|
execute: executeLspRename
|
|
5017
5475
|
},
|
|
5476
|
+
{
|
|
5477
|
+
name: "format",
|
|
5478
|
+
aliases: ["lsp_format"],
|
|
5479
|
+
title: "LSP Format",
|
|
5480
|
+
description: "Format a source file with its language server and write the returned edits to disk.",
|
|
5481
|
+
inputSchema: objectSchema({
|
|
5482
|
+
filePath: { type: "string", description: "Source file path to format." }
|
|
5483
|
+
}, ["filePath"]),
|
|
5484
|
+
execute: executeLspFormat
|
|
5485
|
+
},
|
|
5018
5486
|
{
|
|
5019
5487
|
name: "install_decision",
|
|
5020
5488
|
aliases: ["lsp_install_decision"],
|
|
@@ -5122,6 +5590,6 @@ function requestedProtocolVersion(params) {
|
|
|
5122
5590
|
return params["protocolVersion"];
|
|
5123
5591
|
}
|
|
5124
5592
|
export {
|
|
5125
|
-
|
|
5126
|
-
|
|
5593
|
+
handleLspMcpRequest,
|
|
5594
|
+
runMcpStdioServer
|
|
5127
5595
|
};
|