oh-my-opencode 5.0.0-beta.8 → 5.0.0-beta.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/command/publish.md +59 -23
- package/.agents/command/remove-deadcode.md +1 -1
- package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +1 -3
- package/.agents/skills/hyperplan/SKILL.md +5 -5
- package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +1 -1
- package/.agents/skills/pre-publish-review/SKILL.md +9 -12
- package/.agents/skills/publish/SKILL.md +59 -23
- package/.agents/skills/remove-deadcode/SKILL.md +1 -1
- package/.agents/skills/security-research/SKILL.md +4 -4
- 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/.opencode/command/publish.md +59 -23
- package/.opencode/skills/pre-publish-review/SKILL.md +9 -12
- package/README.ja.md +66 -61
- package/README.ko.md +67 -62
- package/README.md +108 -182
- package/README.ru.md +63 -61
- package/README.zh-cn.md +62 -61
- package/THIRD-PARTY-NOTICES.md +35 -105
- package/dist/agents/atlas/agent.d.ts +0 -1
- package/dist/agents/gpt-prompt-identity.d.ts +1 -1
- package/dist/agents/sisyphus-runtime-prompt-reconciler.d.ts +15 -4
- package/dist/agents/types.d.ts +4 -2
- package/dist/cli/config-manager/parse-opencode-config-file.d.ts +2 -1
- package/dist/cli/doctor/checks/browser-provider.d.ts +2 -0
- package/dist/cli/doctor/checks/index.d.ts +2 -0
- package/dist/cli/doctor/checks/latest-version.d.ts +11 -0
- package/dist/cli/doctor/checks/system-plugin.d.ts +4 -3
- package/dist/cli/doctor/framework/constants.d.ts +5 -0
- package/dist/cli/doctor/framework/types.d.ts +2 -0
- package/dist/cli/fallback-lane-policy.d.ts +1 -0
- package/dist/cli/index.js +50191 -58043
- 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 +51708 -59537
- package/dist/config/index.d.ts +1 -1
- package/dist/config/schema/agent-names.d.ts +0 -1
- package/dist/config/schema/background-task.d.ts +1 -0
- package/dist/config/schema/browser-automation.d.ts +0 -2
- 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 -12
- 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/config-migration/category-deep-split.d.ts +3 -0
- package/dist/config-migration/migration-plans.d.ts +1 -0
- package/dist/create-hooks.d.ts +3 -2
- package/dist/features/background-agent/compaction-aware-message-resolver.d.ts +1 -0
- package/dist/features/background-agent/constants.d.ts +0 -7
- package/dist/features/background-agent/error-classifier.d.ts +1 -0
- package/dist/features/background-agent/manager.d.ts +9 -1
- package/dist/features/background-agent/parent-wake-dispatched-tracker.d.ts +0 -1
- package/dist/features/background-agent/parent-wake-notifier-types.d.ts +1 -1
- package/dist/features/background-agent/parent-wake-prompt-dispatch.d.ts +1 -1
- package/dist/features/background-agent/parent-wake-session-inspector.d.ts +1 -1
- package/dist/features/background-agent/subagent-spawn-limits.d.ts +8 -0
- package/dist/features/background-agent/types.d.ts +4 -0
- package/dist/features/boulder-state/storage.d.ts +1 -1
- 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/hyperplan.d.ts +1 -1
- package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -1
- package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +1 -1
- package/dist/features/builtin-commands/templates/ulw-execute.d.ts +1 -0
- package/dist/features/builtin-commands/types.d.ts +1 -1
- package/dist/features/claude-tasks/storage.d.ts +7 -2
- package/dist/features/hook-message-injector/index.d.ts +1 -0
- package/dist/features/hook-message-injector/sdk-message-lookup.d.ts +1 -0
- package/dist/features/monitor/manager-internals.d.ts +1 -1
- package/dist/features/monitor/output-injector-types.d.ts +1 -1
- package/dist/features/opengateway-provider/index.d.ts +13 -0
- package/dist/features/task-toast-manager/manager.d.ts +0 -24
- package/dist/features/team-mode/tools/messaging-fallback-wake.d.ts +17 -0
- package/dist/features/team-mode/tools/messaging-live-delivery-recipient.d.ts +3 -0
- package/dist/features/team-mode/tools/messaging-runtime.d.ts +7 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/message-storage-directory.d.ts +0 -3
- package/dist/hooks/anthropic-context-window-limit-recovery/state.d.ts +1 -0
- package/dist/hooks/anthropic-context-window-limit-recovery/storage/empty-messages.d.ts +0 -1
- package/dist/hooks/anthropic-context-window-limit-recovery/tool-result-storage.d.ts +11 -0
- package/dist/hooks/atlas/atlas-hook.d.ts +1 -0
- package/dist/hooks/atlas/atlas-lifecycle-store.d.ts +50 -0
- package/dist/hooks/atlas/event-handler.d.ts +1 -0
- package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
- package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
- package/dist/hooks/atlas/tool-execute-before.d.ts +3 -0
- package/dist/hooks/atlas/types.d.ts +1 -0
- package/dist/hooks/claude-code-hooks/session-hook-state.d.ts +1 -0
- package/dist/hooks/claude-code-hooks/stop.d.ts +2 -0
- package/dist/hooks/claude-code-hooks/todo.d.ts +0 -1
- package/dist/hooks/claude-code-hooks/transcript.d.ts +2 -0
- package/dist/hooks/comment-checker/__fixtures__/download-probe.fixture.d.ts +1 -0
- package/dist/hooks/compaction-context-injector/validated-model.d.ts +2 -0
- package/dist/hooks/fsync-skip-warning/index.d.ts +4 -0
- package/dist/hooks/hashline-edit-diff-enhancer/hook.d.ts +1 -0
- package/dist/hooks/hashline-edit-diff-enhancer/pending-captures.d.ts +13 -0
- package/dist/hooks/index.d.ts +1 -2
- package/dist/hooks/keyword-detector/hook.d.ts +9 -0
- package/dist/hooks/keyword-detector/ultrawork/index.d.ts +2 -0
- package/dist/hooks/keyword-detector/ultrawork/source-detector.d.ts +0 -1
- package/dist/hooks/model-fallback/hook.d.ts +1 -1
- package/dist/hooks/plan-format-validator/hook.d.ts +19 -0
- package/dist/hooks/prometheus-md-only/agent-resolution.d.ts +2 -2
- package/dist/hooks/runtime-fallback/chat-message-handler.d.ts +2 -0
- package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +1 -0
- package/dist/hooks/runtime-fallback/runtime-model-settings.d.ts +6 -0
- package/dist/hooks/runtime-fallback/session-status-handler.d.ts +1 -1
- package/dist/hooks/runtime-fallback/types.d.ts +3 -1
- package/dist/hooks/sisyphus-junior-notepad/constants.d.ts +1 -1
- package/dist/hooks/todo-continuation-enforcer/types.d.ts +1 -0
- package/dist/hooks/{start-work → ulw-execute}/context-info-builder.d.ts +1 -1
- package/dist/hooks/{start-work → ulw-execute}/index.d.ts +1 -1
- package/dist/hooks/ulw-execute/ulw-execute-hook.d.ts +23 -0
- package/dist/hooks/unstable-agent-babysitter/task-message-analyzer.d.ts +1 -0
- package/dist/index.js +30870 -27341
- package/dist/mcp/index.d.ts +0 -4
- package/dist/mcp/types.d.ts +0 -1
- package/dist/oh-my-opencode.schema.json +25 -52
- package/dist/plugin/chat-message/types.d.ts +6 -4
- package/dist/plugin/chat-message/ulw-execute-message.d.ts +5 -0
- package/dist/plugin/event-session-lifecycle.d.ts +1 -0
- package/dist/plugin/hooks/create-core-hooks.d.ts +2 -2
- package/dist/plugin/hooks/create-session-hooks.d.ts +2 -3
- package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -0
- package/dist/plugin/messages-transform.d.ts +1 -0
- package/dist/plugin/stop-continuation.d.ts +3 -0
- package/dist/plugin/system-transform.d.ts +5 -1
- package/dist/plugin-config/omo-config-chain.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/omo-process-sweep.d.ts +2 -4
- package/dist/shared/plugin-entry-migrator.d.ts +4 -3
- package/dist/shared/plugin-entry-shape.d.ts +6 -0
- package/dist/shared/runtime-fallback-retry-marker.d.ts +16 -0
- package/dist/shared/shell-env.d.ts +1 -1
- package/dist/skills/ast-grep/AGENTS.md +51 -0
- package/dist/skills/ast-grep/SKILL.md +13 -1
- package/dist/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/dist/skills/coding-agent-sessions/SKILL.md +1 -1
- package/dist/skills/data-scientist/SKILL.md +99 -239
- package/dist/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/dist/skills/data-scientist/references/placement.md +74 -0
- package/dist/skills/data-scientist/references/polars-lane.md +95 -0
- package/dist/skills/data-scientist/references/uv-setup.md +1 -1
- package/dist/skills/data-scientist/references/visualization.md +64 -0
- package/dist/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/dist/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/dist/skills/debugging/SKILL.md +3 -1
- package/dist/skills/debugging/references/methodology/00-setup.md +12 -0
- package/dist/skills/debugging/references/methodology/02-investigate.md +26 -5
- 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/debugging/references/tools/playwright-cli.md +79 -161
- package/dist/skills/frontend/ATTRIBUTION.md +10 -0
- package/dist/skills/frontend/SKILL.md +7 -3
- package/dist/skills/frontend/references/design/README.md +10 -2
- package/dist/skills/frontend/references/design/_INDEX.md +1 -0
- package/dist/skills/frontend/references/design/ambience-skill.md +145 -0
- package/dist/skills/frontend/references/design/aside.md +1 -1
- package/dist/skills/frontend/references/design/clone-from-url.md +1 -1
- package/dist/skills/frontend/references/design/interaction-skill.md +2 -0
- package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
- package/dist/skills/frontend/references/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/frontend/scripts/perfection/lighthouse-audit.py +2 -2
- package/dist/skills/git-master/SKILL.md +1 -1
- package/dist/skills/init-deep/SKILL.md +14 -14
- package/dist/skills/lsp-setup/SKILL.md +1 -1
- package/dist/skills/programming/SKILL.md +1 -1
- package/dist/skills/refactor/SKILL.md +5 -5
- package/dist/skills/remove-ai-slops/SKILL.md +5 -5
- package/dist/skills/review-work/SKILL.md +101 -419
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
- package/dist/skills/ultimate-browsing/SKILL.md +32 -27
- package/dist/skills/ultimate-browsing/engine/AGENTS.md +111 -0
- package/dist/skills/ultimate-browsing/engine/templates/package.json +2 -2
- package/dist/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
- package/dist/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
- package/dist/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
- package/dist/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
- package/dist/skills/ultimate-browsing/references/insane-search/README.md +18 -5
- package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
- package/dist/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
- package/dist/skills/{start-work → ulw-execute}/SKILL.md +24 -22
- package/dist/skills/ulw-plan/SKILL.md +5 -6
- package/dist/skills/ulw-plan/references/full-workflow.md +6 -5
- package/dist/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -1
- package/dist/skills/ulw-research/SKILL.md +10 -5
- package/dist/skills/visual-qa/AGENTS.md +58 -0
- package/dist/skills/visual-qa/SKILL.md +4 -3
- package/dist/skills/visual-qa/references/browser-setup.md +75 -0
- package/dist/tools/delegate-task/builtin-categories.d.ts +3 -1
- package/dist/tools/delegate-task/builtin-category-definition.d.ts +2 -1
- package/dist/tools/delegate-task/constants.d.ts +2 -2
- package/dist/tools/delegate-task/openai-categories.d.ts +10 -3
- 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 +37073 -46672
- package/package.json +44 -45
- 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 +9 -1
- package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +100 -28
- package/packages/lsp-core/src/lsp/client-diagnostics-pull-timeout.test.ts +64 -0
- package/packages/lsp-core/src/lsp/client-wrapper-outside-cwd.test.ts +78 -0
- package/packages/lsp-core/src/lsp/client-wrapper.test.ts +103 -6
- package/packages/lsp-core/src/lsp/client-wrapper.ts +50 -16
- package/packages/lsp-core/src/lsp/client.ts +32 -3
- package/packages/lsp-core/src/lsp/connection.ts +16 -0
- package/packages/lsp-core/src/lsp/constants.ts +6 -0
- package/packages/lsp-core/src/lsp/controlled-clock-test-support.ts +90 -0
- package/packages/lsp-core/src/lsp/errors.ts +15 -0
- package/packages/lsp-core/src/lsp/fixtures/workspace-edit-server.mjs +10 -3
- package/packages/lsp-core/src/lsp/format-document.test.ts +143 -0
- package/packages/lsp-core/src/lsp/format-document.ts +90 -0
- package/packages/lsp-core/src/lsp/json-rpc-connection.ts +11 -6
- package/packages/lsp-core/src/lsp/manager-lifecycle.test.ts +262 -0
- package/packages/lsp-core/src/lsp/manager-max-clients.test.ts +151 -0
- package/packages/lsp-core/src/lsp/manager.ts +138 -12
- package/packages/lsp-core/src/lsp/outside-context-workspace.ts +33 -0
- package/packages/lsp-core/src/lsp/server-definitions.ts +29 -0
- package/packages/lsp-core/src/lsp/server-installation.test.ts +376 -0
- package/packages/lsp-core/src/lsp/server-installation.ts +200 -27
- package/packages/lsp-core/src/lsp/server-resolution-local-binary.test.ts +170 -0
- package/packages/lsp-core/src/lsp/server-resolution.ts +18 -5
- package/packages/lsp-core/src/lsp/timer-provider.ts +13 -0
- package/packages/lsp-core/src/lsp/transport-request-timeout.test.ts +73 -0
- package/packages/lsp-core/src/lsp/transport.ts +16 -2
- package/packages/lsp-core/src/lsp/types.ts +8 -0
- package/packages/lsp-core/src/lsp/workspace-apply-edit-test-support.ts +29 -1
- package/packages/lsp-core/src/lsp/workspace-document-state.test.ts +84 -1
- package/packages/lsp-core/src/lsp/workspace-document-state.ts +35 -11
- package/packages/lsp-core/src/lsp/workspace-markers.ts +18 -0
- package/packages/lsp-core/src/mcp.ts +3 -0
- package/packages/lsp-core/src/request-context.test.ts +29 -0
- package/packages/lsp-core/src/request-context.ts +1 -1
- package/packages/lsp-core/src/tool-surface.test.ts +13 -1
- package/packages/lsp-core/src/tools/definitions.ts +14 -0
- package/packages/lsp-core/src/tools/format.test.ts +56 -0
- package/packages/lsp-core/src/tools/format.ts +56 -0
- package/packages/lsp-core/src/tools/index.ts +1 -0
- package/packages/lsp-core/src/tools/parameters.test.ts +51 -0
- package/packages/lsp-core/src/tools/types.ts +10 -0
- package/packages/lsp-daemon/dist/cli.js +904 -479
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +922 -493
- package/packages/lsp-daemon/dist/daemon-client.d.ts +1 -0
- package/packages/lsp-daemon/dist/daemon-client.js +3 -0
- package/packages/lsp-daemon/dist/ensure-daemon.d.ts +6 -1
- package/packages/lsp-daemon/dist/ensure-daemon.js +10 -2
- package/packages/lsp-daemon/dist/index.js +826 -402
- package/packages/lsp-daemon/dist/ownership.js +2 -2
- package/packages/lsp-daemon/dist/proxy.js +3 -0
- package/packages/lsp-daemon/dist/version-reap.js +1 -1
- package/packages/lsp-daemon/package.json +1 -1
- package/packages/lsp-tools-mcp/dist/cli.js +764 -341
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +274 -138
- package/packages/lsp-tools-mcp/dist/mcp.js +789 -368
- package/packages/lsp-tools-mcp/dist/request-context.js +12 -13
- package/packages/lsp-tools-mcp/dist/tools.js +719 -302
- package/packages/lsp-tools-mcp/package.json +1 -1
- package/packages/omo-codex/THIRD-PARTY-NOTICES.md +4 -21
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +4 -6
- package/packages/omo-codex/plugin/.mcp.json +0 -6
- package/packages/omo-codex/plugin/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/README.md +6 -2
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +7175 -408
- 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/bootstrap/src/setup.ts +7 -1
- package/packages/omo-codex/plugin/components/comment-checker/AGENTS.md +9 -0
- package/packages/omo-codex/plugin/components/comment-checker/biome.json +2 -2
- package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
- package/packages/omo-codex/plugin/components/comment-checker/src/apply-patch.ts +2 -8
- package/packages/omo-codex/plugin/components/comment-checker/src/core.ts +1 -2
- package/packages/omo-codex/plugin/components/comment-checker/src/request-extractor.ts +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
- package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/git-bash/dist/cli.js +1 -1
- package/packages/omo-codex/plugin/components/git-bash/dist/codex-hook.js +2 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
- package/packages/omo-codex/plugin/components/git-bash/src/codex-hook.ts +2 -1
- package/packages/omo-codex/plugin/components/git-bash/test/codex-hook.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/directive.md +2 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +36 -29
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +32 -26
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/types.d.ts +3 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +32 -28
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/types.ts +3 -0
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +137 -28
- package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +4 -2
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +30 -15
- package/packages/omo-codex/plugin/components/lsp/biome.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +4 -4
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +943 -540
- package/packages/omo-codex/plugin/components/lsp/dist/daemon-cli-path.js +1 -1
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
- package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/lsp/src/daemon-cli-path.ts +1 -5
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook-unavailable.test.ts +6 -7
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook.test.ts +1 -2
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +11 -1
- package/packages/omo-codex/plugin/components/rules/AGENTS.md +12 -0
- package/packages/omo-codex/plugin/components/rules/README.md +2 -0
- package/packages/omo-codex/plugin/components/rules/biome.json +2 -2
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +123 -0
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +91 -68
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +7 -7
- package/packages/omo-codex/plugin/components/rules/src/config.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/persistent-cache.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/src/post-compact-budget.ts +15 -5
- package/packages/omo-codex/plugin/components/rules/src/rules-engine-factory.ts +1 -4
- package/packages/omo-codex/plugin/components/rules/src/static-injection.ts +4 -9
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
- package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +17 -25
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
- package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
- package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
- package/packages/omo-codex/plugin/components/rules/test/dynamic-target-fingerprints.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/engine.test.ts +7 -4
- package/packages/omo-codex/plugin/components/rules/test/finder.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +39 -72
- package/packages/omo-codex/plugin/components/rules/test/hephaestus-model-variant.test.ts +38 -3
- package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/matcher.test.ts +2 -3
- package/packages/omo-codex/plugin/components/rules/test/package-smoke.test.ts +1 -1
- package/packages/omo-codex/plugin/components/rules/test/parser.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/post-compact-budget.test.ts +29 -6
- package/packages/omo-codex/plugin/components/rules/test/rules-engine-consumption.test.ts +3 -6
- package/packages/omo-codex/plugin/components/rules/test/scanner.test.ts +1 -2
- package/packages/omo-codex/plugin/components/rules/test/sources.test.ts +2 -5
- package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +2 -17
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +4 -10
- package/packages/omo-codex/plugin/components/telemetry/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/telemetry/biome.json +2 -2
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2470 -701
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2488 -720
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
- package/packages/omo-codex/plugin/components/telemetry/src/codex-hook.ts +1 -4
- package/packages/omo-codex/plugin/components/telemetry/src/posthog.ts +4 -14
- package/packages/omo-codex/plugin/components/telemetry/src/product-identity.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/test/diagnostics.test.ts +2 -5
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -4
- package/packages/omo-codex/plugin/components/ultrawork/README.md +2 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-clone-fidelity-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-low.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/metis.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/biome.json +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +500 -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 +4 -5
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
- package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +4 -0
- package/packages/omo-codex/plugin/components/ultrawork/src/directive.ts +5 -2
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +9 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
- package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +14 -8
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +12 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/AGENTS.md +4 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/NOTICE +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/README.md +6 -6
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/biome.json +2 -2
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/directive.md +11 -11
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/dist/cli.js +16 -16
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +16 -0
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/package.json +12 -12
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/boulder-reader.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/codex-hook.ts +4 -4
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/directive.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/index.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/types.ts +1 -1
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/boulder-reader.test.ts +3 -3
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/cli.test.ts +4 -11
- package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/codex-hook.test.ts +24 -22
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +17 -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 +44 -27
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +30 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-continuation.js +10 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +2 -5
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -78
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +114 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.d.ts +7 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +57 -46
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-arg-parser.js +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-commands.js +21 -8
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.d.ts +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-output.js +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +40 -37
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +2191 -737
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +28 -8
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.d.ts +8 -5
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-snapshot.js +35 -23
- package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/constants.js +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +25 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.d.ts +4 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/driver-objective-ack.js +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence-artifacts.js +37 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/evidence.js +24 -12
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.d.ts +4 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ledger.js +39 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +19 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.d.ts +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-commit.js +108 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.d.ts +6 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +54 -25
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.d.ts +10 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-goal-factory.js +38 -31
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.d.ts +10 -7
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-io.js +121 -100
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.d.ts +16 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-log.js +115 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.d.ts +18 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-missing-recovery.js +41 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +104 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +65 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +72 -117
- package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/review-blockers.js +25 -13
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/factory.js +157 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.d.ts +381 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/manifest.js +127 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.d.ts +130 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk/types.js +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.d.ts +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/sdk.js +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.d.ts +5 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-budget-io.js +67 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +7 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +188 -59
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.js +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.d.ts +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/state-lock.js +259 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/status-next-actions.js +41 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-batch.js +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.d.ts +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-mutations.js +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering-types.d.ts +9 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.d.ts +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/steering.js +11 -11
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +28 -23
- package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.d.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/success-criteria-input.js +41 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +19 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +83 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +18 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +6 -6
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +7 -2
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +33 -10
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +52 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-continuation.ts +8 -6
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +5 -98
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +134 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +59 -77
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-arg-parser.ts +10 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-commands.ts +24 -8
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-output.ts +14 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +52 -46
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +8 -6
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +35 -7
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-snapshot.ts +51 -33
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/constants.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +27 -9
- package/packages/omo-codex/plugin/components/ulw-loop/src/driver-objective-ack.ts +20 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/evidence-artifacts.ts +45 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/evidence.ts +23 -16
- package/packages/omo-codex/plugin/components/ulw-loop/src/ledger.ts +38 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +32 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-commit.ts +132 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +67 -54
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-goal-factory.ts +63 -31
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-io.ts +140 -119
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-log.ts +112 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-missing-recovery.ts +61 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +11 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +123 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +71 -15
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +92 -136
- package/packages/omo-codex/plugin/components/ulw-loop/src/review-blockers.ts +38 -13
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/factory.ts +218 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/manifest.ts +156 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk/types.ts +143 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/sdk.ts +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-budget-io.ts +59 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +196 -52
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-role-guard.ts +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/state-lock.ts +257 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/status-next-actions.ts +45 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-batch.ts +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-mutations.ts +5 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering-types.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/steering.ts +12 -10
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +27 -22
- package/packages/omo-codex/plugin/components/ulw-loop/src/success-criteria-input.ts +56 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +115 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +131 -82
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +147 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint.test.ts +16 -22
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint-continuation.test.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-checkpoint.test.ts +31 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-commands.test.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-complete-goals.test.ts +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +35 -8
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +38 -4
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-json-errors.test.ts +27 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-scope-required.test.ts +144 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-status-next-actions.test.ts +185 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-batch.test.ts +8 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-validation-batch.test.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +37 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-snapshot.test.ts +88 -11
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/barrier.ts +13 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/cli-session.ts +4 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-child.ts +65 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-cli-qa.mjs +76 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-crash.ts +23 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-mutations.mjs +58 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-writer.ts +65 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/lease-clock.ts +23 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +9 -4
- package/packages/omo-codex/plugin/components/ulw-loop/test/guided-recovery.test.ts +67 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -37
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-log.test.ts +252 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-commit-recovery.test.ts +190 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io-cross-process.test.ts +106 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-io.test.ts +74 -25
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-legacy-projection.test.ts +228 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/plan-log-newest.test.ts +72 -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-fields-messages.test.ts +98 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-lazycodex-surface.test.ts +93 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-roles.test.ts +51 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-senpi-surface.test.ts +131 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +58 -3
- package/packages/omo-codex/plugin/components/ulw-loop/test/review-blockers.test.ts +9 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-completed-plan.test.ts +43 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +137 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-driver-states.test.ts +174 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-dx.test.ts +219 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-session-context.test.ts +169 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +450 -7
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-role-matrix.test.ts +113 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/state-lock.test.ts +310 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/status-next-actions-surface.test.ts +133 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering-batch.test.ts +12 -12
- package/packages/omo-codex/plugin/components/ulw-loop/test/steering.test.ts +12 -6
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +74 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +13 -8
- package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +18 -0
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +17 -0
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/model-catalog.json +16 -7
- package/packages/omo-codex/plugin/package-lock.json +676 -524
- package/packages/omo-codex/plugin/package.json +2 -3
- package/packages/omo-codex/plugin/scripts/AGENTS.md +39 -0
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +1 -2
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
- package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/catalog.mjs +16 -7
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +8 -4
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +19 -90
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +1 -1
- package/packages/omo-codex/plugin/scripts/sync-skills.d.mts +4 -0
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +111 -64
- package/packages/omo-codex/plugin/shared/package.json +3 -4
- package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
- package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
- package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +51 -0
- package/packages/omo-codex/plugin/skills/ast-grep/SKILL.md +13 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/SKILL.md +99 -239
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/placement.md +74 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/omo-codex/plugin/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/omo-codex/plugin/skills/data-scientist/references/visualization.md +64 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/omo-codex/plugin/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +3 -1
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +26 -5
- 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/debugging/references/tools/playwright-cli.md +79 -161
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +10 -0
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +7 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +10 -2
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/ambience-skill.md +145 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/aside.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +2 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/omo-codex/plugin/skills/frontend/references/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/frontend/scripts/perfection/lighthouse-audit.py +2 -2
- package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +20 -18
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +4 -2
- package/packages/omo-codex/plugin/skills/lsp-setup/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +11 -9
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +11 -9
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +116 -424
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +32 -27
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +111 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +2 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +18 -5
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +44 -27
- package/packages/omo-codex/plugin/skills/{start-work → ulw-execute}/SKILL.md +35 -36
- package/packages/omo-codex/plugin/skills/ulw-execute/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +31 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +33 -10
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +4 -5
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +5 -5
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +1 -0
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +16 -9
- package/packages/omo-codex/plugin/skills/visual-qa/AGENTS.md +58 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +10 -7
- package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +75 -0
- package/packages/omo-codex/plugin/test/AGENTS.md +47 -0
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +16 -51
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +2 -3
- package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +14 -4
- package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
- package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -29
- package/packages/omo-codex/plugin/test/bootstrap-default-role.test.mjs +66 -0
- 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 +100 -2
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +5 -6
- package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
- package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +35 -35
- package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
- package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +107 -15
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +168 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +54 -24
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +18 -119
- package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
- package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
- package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
- package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +5 -5
- package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
- package/packages/omo-codex/scripts/AGENTS.md +36 -0
- package/packages/omo-codex/scripts/check-model-catalog-parity.mjs +42 -0
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +27 -1
- package/packages/omo-codex/scripts/install-config-autonomous-features.test.mjs +1 -1
- package/packages/omo-codex/scripts/install-config-autonomous.test.mjs +2 -1
- package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
- package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
- package/packages/omo-codex/scripts/install-config.test.mjs +15 -17
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +9832 -1445
- package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +3 -4
- package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
- package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
- package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
- package/packages/omo-codex/scripts/install-packaged-local.test.mjs +1 -6
- package/packages/{omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md → prompts-core/prompts/ultrawork/codex.md} +44 -34
- package/packages/shared-skills/package.json +7 -1
- package/packages/shared-skills/skill-source-filter.d.ts +16 -0
- package/packages/shared-skills/skill-source-filter.mjs +44 -0
- package/packages/shared-skills/skills/ast-grep/AGENTS.md +51 -0
- package/packages/shared-skills/skills/ast-grep/SKILL.md +13 -1
- package/packages/shared-skills/skills/coding-agent-sessions/AGENTS.md +62 -0
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
- package/packages/shared-skills/skills/data-scientist/SKILL.md +99 -239
- package/packages/shared-skills/skills/data-scientist/references/execution-surfaces.md +91 -0
- package/packages/shared-skills/skills/data-scientist/references/placement.md +74 -0
- package/packages/shared-skills/skills/data-scientist/references/polars-lane.md +95 -0
- package/packages/shared-skills/skills/data-scientist/references/uv-setup.md +1 -1
- package/packages/shared-skills/skills/data-scientist/references/visualization.md +64 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-js-deps.sh +28 -0
- package/packages/shared-skills/skills/data-scientist/scripts/ensure-py-deps.sh +37 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +3 -1
- package/packages/shared-skills/skills/debugging/references/methodology/00-setup.md +12 -0
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +26 -5
- 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/debugging/references/tools/playwright-cli.md +79 -161
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +10 -0
- package/packages/shared-skills/skills/frontend/SKILL.md +7 -3
- package/packages/shared-skills/skills/frontend/references/design/README.md +10 -2
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +1 -0
- package/packages/shared-skills/skills/frontend/references/design/ambience-skill.md +145 -0
- package/packages/shared-skills/skills/frontend/references/design/aside.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +2 -0
- package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/shared-skills/skills/frontend/references/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/frontend/scripts/perfection/lighthouse-audit.py +2 -2
- package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
- package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
- package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +1 -1
- package/packages/shared-skills/skills/refactor/SKILL.md +5 -5
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +5 -5
- package/packages/shared-skills/skills/review-work/SKILL.md +101 -419
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +32 -27
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +111 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +2 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +18 -5
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
- package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
- package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +24 -22
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -6
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +6 -5
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -1
- package/packages/shared-skills/skills/ulw-research/SKILL.md +10 -5
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
- package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +75 -0
- package/postinstall.mjs +2 -0
- package/script/qa/web-terminal-visual-qa.mjs +2 -0
- package/script/qa/xterm-live-terminal.mjs +18 -2
- package/.agents/skills/work-with-pr-workspace/evals/evals.json +0 -76
- package/.agents/skills/work-with-pr-workspace/iteration-1/benchmark.json +0 -138
- package/.agents/skills/work-with-pr-workspace/iteration-1/benchmark.md +0 -42
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/eval_metadata.json +0 -57
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/grading.json +0 -15
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/code-changes.md +0 -454
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/execution-plan.md +0 -136
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/pr-description.md +0 -47
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/verification-strategy.md +0 -163
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/grading.json +0 -15
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/code-changes.md +0 -615
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/execution-plan.md +0 -99
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/pr-description.md +0 -50
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/verification-strategy.md +0 -111
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/eval_metadata.json +0 -37
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/grading.json +0 -11
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/code-changes.md +0 -205
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/execution-plan.md +0 -78
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/pr-description.md +0 -42
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/verification-strategy.md +0 -87
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/grading.json +0 -11
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/code-changes.md +0 -334
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/execution-plan.md +0 -86
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/pr-description.md +0 -23
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/verification-strategy.md +0 -119
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/eval_metadata.json +0 -32
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +0 -221
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/execution-plan.md +0 -104
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/pr-description.md +0 -41
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/verification-strategy.md +0 -84
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +0 -342
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/execution-plan.md +0 -131
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/pr-description.md +0 -39
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/verification-strategy.md +0 -128
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/eval_metadata.json +0 -32
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/code-changes.md +0 -143
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/execution-plan.md +0 -82
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/pr-description.md +0 -51
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/verification-strategy.md +0 -69
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/code-changes.md +0 -252
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/execution-plan.md +0 -83
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/pr-description.md +0 -33
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/verification-strategy.md +0 -101
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/eval_metadata.json +0 -32
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/code-changes.md +0 -387
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/execution-plan.md +0 -112
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/pr-description.md +0 -51
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/verification-strategy.md +0 -75
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/code-changes.md +0 -529
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/execution-plan.md +0 -127
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/pr-description.md +0 -42
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/verification-strategy.md +0 -120
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/review.html +0 -1326
- package/.opencode/skills/work-with-pr-workspace/evals/evals.json +0 -76
- package/.opencode/skills/work-with-pr-workspace/iteration-1/benchmark.json +0 -138
- package/.opencode/skills/work-with-pr-workspace/iteration-1/benchmark.md +0 -42
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/eval_metadata.json +0 -57
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/grading.json +0 -15
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/code-changes.md +0 -454
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/execution-plan.md +0 -136
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/pr-description.md +0 -47
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/verification-strategy.md +0 -163
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/grading.json +0 -15
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/code-changes.md +0 -615
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/execution-plan.md +0 -99
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/pr-description.md +0 -50
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/verification-strategy.md +0 -111
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/eval_metadata.json +0 -37
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/grading.json +0 -11
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/code-changes.md +0 -205
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/execution-plan.md +0 -78
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/pr-description.md +0 -42
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/verification-strategy.md +0 -87
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/grading.json +0 -11
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/code-changes.md +0 -334
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/execution-plan.md +0 -86
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/pr-description.md +0 -23
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/verification-strategy.md +0 -119
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/eval_metadata.json +0 -32
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +0 -221
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/execution-plan.md +0 -104
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/pr-description.md +0 -41
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/verification-strategy.md +0 -84
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +0 -342
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/execution-plan.md +0 -131
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/pr-description.md +0 -39
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/verification-strategy.md +0 -128
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/eval_metadata.json +0 -32
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/code-changes.md +0 -143
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/execution-plan.md +0 -82
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/pr-description.md +0 -51
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/verification-strategy.md +0 -69
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/code-changes.md +0 -252
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/execution-plan.md +0 -83
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/pr-description.md +0 -33
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/verification-strategy.md +0 -101
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/eval_metadata.json +0 -32
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/code-changes.md +0 -387
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/execution-plan.md +0 -112
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/pr-description.md +0 -51
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/verification-strategy.md +0 -75
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/code-changes.md +0 -529
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/execution-plan.md +0 -127
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/pr-description.md +0 -42
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/verification-strategy.md +0 -120
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/review.html +0 -1326
- 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/skills/visual-qa/references/agent-browser-setup.md +0 -45
- package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
- package/dist/tools/call-omo-agent/message-storage-directory.d.ts +0 -1
- package/dist/tools/delegate-task/anthropic-categories.d.ts +0 -2
- package/dist/tools/delegate-task/model-string-parser.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
- package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
- package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12244
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9842
- 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 -477
- 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/skills/visual-qa/references/agent-browser-setup.md +0 -45
- 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/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +0 -45
- /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
- /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
|
@@ -15,6 +15,13 @@ import { pathToFileURL as pathToFileURL3 } from "node:url";
|
|
|
15
15
|
// ../lsp-core/src/lsp/connection.ts
|
|
16
16
|
import { pathToFileURL } from "node:url";
|
|
17
17
|
|
|
18
|
+
// ../lsp-core/src/lsp/timer-provider.ts
|
|
19
|
+
var realTimerProvider = {
|
|
20
|
+
now: () => Date.now(),
|
|
21
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
22
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
23
|
+
};
|
|
24
|
+
|
|
18
25
|
// ../lsp-core/src/lsp/constants.ts
|
|
19
26
|
var DEFAULT_MAX_REFERENCES = 200;
|
|
20
27
|
var DEFAULT_MAX_SYMBOLS = 200;
|
|
@@ -23,28 +30,24 @@ var DEFAULT_MAX_DIRECTORY_FILES = 50;
|
|
|
23
30
|
var REQUEST_TIMEOUT_MS = 15000;
|
|
24
31
|
var INIT_TIMEOUT_MS = 60000;
|
|
25
32
|
var IDLE_TIMEOUT_MS = 5 * 60000;
|
|
33
|
+
var MAX_RESIDENT_CLIENTS = 6;
|
|
26
34
|
var REAPER_INTERVAL_MS = 60000;
|
|
27
35
|
var STOP_HARD_KILL_TIMEOUT_MS = 5000;
|
|
28
36
|
var STOP_SIGKILL_GRACE_MS = 1000;
|
|
37
|
+
var CLIENT_RESPAWN_RETRY_LIMIT = 2;
|
|
38
|
+
var CLIENT_RESPAWN_COOLDOWN_MS = 60000;
|
|
29
39
|
|
|
30
40
|
// ../lsp-core/src/lsp/errors.ts
|
|
31
41
|
class LspConnectionClosedError extends Error {
|
|
32
|
-
serverId;
|
|
33
|
-
root;
|
|
34
|
-
name = "LspConnectionClosedError";
|
|
35
42
|
constructor(serverId, root, message) {
|
|
36
43
|
super(message ?? `LSP connection closed for ${serverId} at ${root}`);
|
|
37
44
|
this.serverId = serverId;
|
|
38
45
|
this.root = root;
|
|
46
|
+
this.name = "LspConnectionClosedError";
|
|
39
47
|
}
|
|
40
48
|
}
|
|
41
49
|
|
|
42
50
|
class LspProcessExitedError extends Error {
|
|
43
|
-
serverId;
|
|
44
|
-
root;
|
|
45
|
-
exitCode;
|
|
46
|
-
stderrTail;
|
|
47
|
-
name = "LspProcessExitedError";
|
|
48
51
|
constructor(serverId, root, exitCode, stderrTail) {
|
|
49
52
|
const stderrSuffix = stderrTail ? `
|
|
50
53
|
stderr tail: ${stderrTail}` : "";
|
|
@@ -53,46 +56,59 @@ stderr tail: ${stderrTail}` : "";
|
|
|
53
56
|
this.root = root;
|
|
54
57
|
this.exitCode = exitCode;
|
|
55
58
|
this.stderrTail = stderrTail;
|
|
59
|
+
this.name = "LspProcessExitedError";
|
|
56
60
|
}
|
|
57
61
|
}
|
|
58
62
|
|
|
59
63
|
class LspRequestTimeoutError extends Error {
|
|
60
|
-
method;
|
|
61
|
-
stderrTail;
|
|
62
|
-
name = "LspRequestTimeoutError";
|
|
63
64
|
constructor(method, stderrTail) {
|
|
64
65
|
const stderrSuffix = stderrTail ? `
|
|
65
66
|
recent stderr: ${stderrTail}` : "";
|
|
66
67
|
super(`LSP request timeout (method: ${method})${stderrSuffix}`);
|
|
67
68
|
this.method = method;
|
|
68
69
|
this.stderrTail = stderrTail;
|
|
70
|
+
this.name = "LspRequestTimeoutError";
|
|
69
71
|
}
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
class LspInvalidPathError extends Error {
|
|
73
|
-
|
|
75
|
+
constructor() {
|
|
76
|
+
super(...arguments);
|
|
77
|
+
this.name = "LspInvalidPathError";
|
|
78
|
+
}
|
|
74
79
|
}
|
|
75
80
|
|
|
76
81
|
class LspServerLookupError extends Error {
|
|
77
|
-
lookup;
|
|
78
|
-
name = "LspServerLookupError";
|
|
79
82
|
constructor(message, lookup) {
|
|
80
83
|
super(message);
|
|
81
84
|
this.lookup = lookup;
|
|
85
|
+
this.name = "LspServerLookupError";
|
|
82
86
|
}
|
|
83
87
|
}
|
|
84
88
|
|
|
85
89
|
class LspServerInitializingError extends Error {
|
|
86
|
-
originalError;
|
|
87
|
-
name = "LspServerInitializingError";
|
|
88
90
|
constructor(originalError) {
|
|
89
91
|
super(`LSP server is still initializing. Please retry in a few seconds. Original error: ${originalError.message}`);
|
|
90
92
|
this.originalError = originalError;
|
|
93
|
+
this.name = "LspServerInitializingError";
|
|
91
94
|
}
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
class LspProcessSpawnError extends Error {
|
|
95
|
-
|
|
98
|
+
constructor() {
|
|
99
|
+
super(...arguments);
|
|
100
|
+
this.name = "LspProcessSpawnError";
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
class LspClientRespawnBudgetExceededError extends Error {
|
|
105
|
+
constructor(serverId, root, retryLimit) {
|
|
106
|
+
super(`LSP server ${serverId} at ${root} failed to stay alive; respawn budget exhausted ` + `(${retryLimit} consecutive dead generations). Retrying after the cooldown may succeed.`);
|
|
107
|
+
this.serverId = serverId;
|
|
108
|
+
this.root = root;
|
|
109
|
+
this.retryLimit = retryLimit;
|
|
110
|
+
this.name = "LspClientRespawnBudgetExceededError";
|
|
111
|
+
}
|
|
96
112
|
}
|
|
97
113
|
function isLspDeadConnectionError(err) {
|
|
98
114
|
return err instanceof LspConnectionClosedError || err instanceof LspProcessExitedError;
|
|
@@ -108,20 +124,31 @@ var METHOD_NOT_FOUND = -32601;
|
|
|
108
124
|
var INTERNAL_ERROR = -32603;
|
|
109
125
|
|
|
110
126
|
class JsonRpcConnection {
|
|
111
|
-
reader;
|
|
112
|
-
writer;
|
|
113
|
-
pendingRequests = new Map;
|
|
114
|
-
notificationHandlers = new Map;
|
|
115
|
-
requestHandlers = new Map;
|
|
116
|
-
closeHandlers = [];
|
|
117
|
-
errorHandlers = [];
|
|
118
|
-
inputBuffer = Buffer.alloc(0);
|
|
119
|
-
nextRequestId = 1;
|
|
120
|
-
listening = false;
|
|
121
|
-
disposed = false;
|
|
122
127
|
constructor(reader, writer) {
|
|
123
128
|
this.reader = reader;
|
|
124
129
|
this.writer = writer;
|
|
130
|
+
this.pendingRequests = new Map;
|
|
131
|
+
this.notificationHandlers = new Map;
|
|
132
|
+
this.requestHandlers = new Map;
|
|
133
|
+
this.closeHandlers = [];
|
|
134
|
+
this.errorHandlers = [];
|
|
135
|
+
this.inputBuffer = Buffer.alloc(0);
|
|
136
|
+
this.nextRequestId = 1;
|
|
137
|
+
this.listening = false;
|
|
138
|
+
this.disposed = false;
|
|
139
|
+
this.handleData = (chunk) => {
|
|
140
|
+
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
141
|
+
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
142
|
+
this.drainInputBuffer();
|
|
143
|
+
};
|
|
144
|
+
this.handleClose = () => {
|
|
145
|
+
for (const handler of this.closeHandlers) {
|
|
146
|
+
handler();
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
this.handleStreamError = (error) => {
|
|
150
|
+
this.emitError(error);
|
|
151
|
+
};
|
|
125
152
|
}
|
|
126
153
|
listen() {
|
|
127
154
|
if (this.listening)
|
|
@@ -156,6 +183,7 @@ class JsonRpcConnection {
|
|
|
156
183
|
let cancelAfterWrite = false;
|
|
157
184
|
let settled = false;
|
|
158
185
|
const writeCancel = () => this.writeMessage({ jsonrpc: "2.0", method: "$/cancelRequest", params: { id } });
|
|
186
|
+
let rejectAfterCancelWrite;
|
|
159
187
|
const responsePromise = new Promise((resolve, reject) => {
|
|
160
188
|
const cleanup = () => {
|
|
161
189
|
options.signal?.removeEventListener("abort", onAbort);
|
|
@@ -167,15 +195,19 @@ class JsonRpcConnection {
|
|
|
167
195
|
this.pendingRequests.delete(key);
|
|
168
196
|
cleanup();
|
|
169
197
|
const rejectCancelled = () => reject(abortError(options.signal));
|
|
198
|
+
rejectAfterCancelWrite = async () => {
|
|
199
|
+
try {
|
|
200
|
+
await writeCancel();
|
|
201
|
+
} catch (error) {
|
|
202
|
+
this.emitError(toError(error));
|
|
203
|
+
}
|
|
204
|
+
rejectCancelled();
|
|
205
|
+
};
|
|
170
206
|
if (!requestWritten) {
|
|
171
207
|
cancelAfterWrite = true;
|
|
172
|
-
rejectCancelled();
|
|
173
208
|
return;
|
|
174
209
|
}
|
|
175
|
-
|
|
176
|
-
this.emitError(toError(error));
|
|
177
|
-
rejectCancelled();
|
|
178
|
-
});
|
|
210
|
+
rejectAfterCancelWrite();
|
|
179
211
|
};
|
|
180
212
|
const onAbort = () => settleCancel();
|
|
181
213
|
this.pendingRequests.set(key, {
|
|
@@ -203,7 +235,7 @@ class JsonRpcConnection {
|
|
|
203
235
|
await this.writeMessage(message);
|
|
204
236
|
requestWritten = true;
|
|
205
237
|
if (cancelAfterWrite)
|
|
206
|
-
await
|
|
238
|
+
await rejectAfterCancelWrite?.();
|
|
207
239
|
} catch (error) {
|
|
208
240
|
if (settled)
|
|
209
241
|
return responsePromise;
|
|
@@ -242,19 +274,6 @@ class JsonRpcConnection {
|
|
|
242
274
|
this.notificationHandlers.clear();
|
|
243
275
|
this.requestHandlers.clear();
|
|
244
276
|
}
|
|
245
|
-
handleData = (chunk) => {
|
|
246
|
-
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
247
|
-
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
248
|
-
this.drainInputBuffer();
|
|
249
|
-
};
|
|
250
|
-
handleClose = () => {
|
|
251
|
-
for (const handler of this.closeHandlers) {
|
|
252
|
-
handler();
|
|
253
|
-
}
|
|
254
|
-
};
|
|
255
|
-
handleStreamError = (error) => {
|
|
256
|
-
this.emitError(error);
|
|
257
|
-
};
|
|
258
277
|
drainInputBuffer() {
|
|
259
278
|
while (true) {
|
|
260
279
|
const headerEnd = this.inputBuffer.indexOf(HEADER_SEPARATOR);
|
|
@@ -602,33 +621,29 @@ function isPosition(value) {
|
|
|
602
621
|
|
|
603
622
|
// ../lsp-core/src/lsp/transport.ts
|
|
604
623
|
class LspClientNotStartedError extends Error {
|
|
605
|
-
serverId;
|
|
606
|
-
root;
|
|
607
|
-
name = "LspClientNotStartedError";
|
|
608
624
|
constructor(serverId, root) {
|
|
609
625
|
super("LSP client not started");
|
|
610
626
|
this.serverId = serverId;
|
|
611
627
|
this.root = root;
|
|
628
|
+
this.name = "LspClientNotStartedError";
|
|
612
629
|
}
|
|
613
630
|
}
|
|
614
631
|
|
|
615
632
|
class LspClientTransport {
|
|
616
|
-
root;
|
|
617
|
-
server;
|
|
618
|
-
proc = null;
|
|
619
|
-
connection = null;
|
|
620
|
-
stderrBuffer = [];
|
|
621
|
-
processExited = false;
|
|
622
|
-
diagnosticsStore = new Map;
|
|
623
|
-
requestTimeoutMs;
|
|
624
|
-
initializeTimeoutMs;
|
|
625
|
-
workspaceApplyEditHandler = null;
|
|
626
|
-
diagnosticPullSupported = false;
|
|
627
633
|
constructor(root, server, timeouts = {}) {
|
|
628
634
|
this.root = root;
|
|
629
635
|
this.server = server;
|
|
636
|
+
this.proc = null;
|
|
637
|
+
this.connection = null;
|
|
638
|
+
this.stderrBuffer = [];
|
|
639
|
+
this.processExited = false;
|
|
640
|
+
this.diagnosticsStore = new Map;
|
|
641
|
+
this.workspaceApplyEditHandler = null;
|
|
642
|
+
this.diagnosticPullSupported = false;
|
|
643
|
+
this.documentFormattingSupported = false;
|
|
630
644
|
this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
|
|
631
645
|
this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
646
|
+
this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
|
|
632
647
|
}
|
|
633
648
|
pid() {
|
|
634
649
|
return this.proc?.pid;
|
|
@@ -648,6 +663,12 @@ class LspClientTransport {
|
|
|
648
663
|
isDiagnosticPullSupported() {
|
|
649
664
|
return this.diagnosticPullSupported;
|
|
650
665
|
}
|
|
666
|
+
setDocumentFormattingSupported(supported) {
|
|
667
|
+
this.documentFormattingSupported = supported;
|
|
668
|
+
}
|
|
669
|
+
isDocumentFormattingSupported() {
|
|
670
|
+
return this.documentFormattingSupported;
|
|
671
|
+
}
|
|
651
672
|
handlePublishDiagnostics(params) {
|
|
652
673
|
this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
|
|
653
674
|
}
|
|
@@ -723,7 +744,7 @@ class LspClientTransport {
|
|
|
723
744
|
const options = args[1];
|
|
724
745
|
const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
|
|
725
746
|
const timeoutController = new AbortController;
|
|
726
|
-
const timeoutHandle = setTimeout(() => {
|
|
747
|
+
const timeoutHandle = this.timerProvider.setTimeout(() => {
|
|
727
748
|
const stderrTail = this.stderrBuffer.slice(-5).join(`
|
|
728
749
|
`);
|
|
729
750
|
timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
|
|
@@ -742,7 +763,7 @@ class LspClientTransport {
|
|
|
742
763
|
}
|
|
743
764
|
throw error;
|
|
744
765
|
} finally {
|
|
745
|
-
clearTimeout(timeoutHandle);
|
|
766
|
+
this.timerProvider.clearTimeout(timeoutHandle);
|
|
746
767
|
combinedSignal.dispose();
|
|
747
768
|
}
|
|
748
769
|
}
|
|
@@ -861,6 +882,14 @@ function supportsDiagnosticPull(capabilities) {
|
|
|
861
882
|
return false;
|
|
862
883
|
return Object.hasOwn(capabilities, "diagnosticProvider");
|
|
863
884
|
}
|
|
885
|
+
function supportsDocumentFormatting(capabilities) {
|
|
886
|
+
if (capabilities === undefined)
|
|
887
|
+
return false;
|
|
888
|
+
const provider = capabilities.documentFormattingProvider;
|
|
889
|
+
if (provider === undefined || provider === null || provider === false)
|
|
890
|
+
return false;
|
|
891
|
+
return provider === true || typeof provider === "object";
|
|
892
|
+
}
|
|
864
893
|
|
|
865
894
|
class LspClientConnection extends LspClientTransport {
|
|
866
895
|
async initialize() {
|
|
@@ -877,6 +906,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
877
906
|
references: {},
|
|
878
907
|
documentSymbol: { hierarchicalDocumentSymbolSupport: true },
|
|
879
908
|
publishDiagnostics: {},
|
|
909
|
+
formatting: { dynamicRegistration: false },
|
|
880
910
|
rename: {
|
|
881
911
|
prepareSupport: true,
|
|
882
912
|
prepareSupportDefaultBehavior: 1
|
|
@@ -918,6 +948,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
918
948
|
initializationOptions: this.server.initialization
|
|
919
949
|
}, { timeoutMs: this.initializeTimeoutMs });
|
|
920
950
|
this.setDiagnosticPullSupported(supportsDiagnosticPull(result?.capabilities));
|
|
951
|
+
this.setDocumentFormattingSupported(supportsDocumentFormatting(result?.capabilities));
|
|
921
952
|
await this.sendNotification("initialized", {});
|
|
922
953
|
await this.sendNotification("workspace/didChangeConfiguration", {
|
|
923
954
|
settings: { json: { validate: { enable: true } } }
|
|
@@ -1123,6 +1154,17 @@ function canonicalPath(filePath) {
|
|
|
1123
1154
|
return absolute;
|
|
1124
1155
|
}
|
|
1125
1156
|
}
|
|
1157
|
+
function normalizeDocumentUri(uri) {
|
|
1158
|
+
let decoded = uri;
|
|
1159
|
+
try {
|
|
1160
|
+
decoded = decodeURIComponent(uri);
|
|
1161
|
+
} catch {
|
|
1162
|
+
decoded = uri;
|
|
1163
|
+
}
|
|
1164
|
+
if (process.platform !== "win32")
|
|
1165
|
+
return decoded;
|
|
1166
|
+
return decoded.replace(/^(file:\/\/\/)([a-z]):/, (_match, prefix, drive) => `${prefix}${drive.toUpperCase()}:`);
|
|
1167
|
+
}
|
|
1126
1168
|
function isSameOrDescendant(candidate, parent) {
|
|
1127
1169
|
const suffix = relative(parent, candidate);
|
|
1128
1170
|
return suffix === "" || !suffix.startsWith("..") && suffix !== "..";
|
|
@@ -1133,17 +1175,18 @@ function movedPath(candidate, oldPath, newPath) {
|
|
|
1133
1175
|
}
|
|
1134
1176
|
|
|
1135
1177
|
class WorkspaceDocumentState {
|
|
1136
|
-
sendNotification;
|
|
1137
|
-
clearDiagnostics;
|
|
1138
|
-
openDocuments = new Map;
|
|
1139
|
-
openByUri = new Map;
|
|
1140
|
-
openPromises = new Map;
|
|
1141
|
-
now;
|
|
1142
|
-
versionlessPublishQuiescenceMs;
|
|
1143
1178
|
constructor(sendNotification, clearDiagnostics, options = {}) {
|
|
1144
1179
|
this.sendNotification = sendNotification;
|
|
1145
1180
|
this.clearDiagnostics = clearDiagnostics;
|
|
1146
|
-
this.
|
|
1181
|
+
this.openDocuments = new Map;
|
|
1182
|
+
this.openByUri = new Map;
|
|
1183
|
+
this.openPromises = new Map;
|
|
1184
|
+
this.timerProvider = options.timerProvider ?? {
|
|
1185
|
+
now: options.now ?? (() => Date.now()),
|
|
1186
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
1187
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
1188
|
+
};
|
|
1189
|
+
this.now = () => this.timerProvider.now();
|
|
1147
1190
|
this.versionlessPublishQuiescenceMs = options.versionlessPublishQuiescenceMs ?? DEFAULT_VERSIONLESS_PUBLISH_QUIESCENCE_MS;
|
|
1148
1191
|
}
|
|
1149
1192
|
async openFile(filePath) {
|
|
@@ -1165,7 +1208,7 @@ class WorkspaceDocumentState {
|
|
|
1165
1208
|
return this.openDocuments.get(canonicalPath(filePath))?.version;
|
|
1166
1209
|
}
|
|
1167
1210
|
getStoredDiagnostics(uri) {
|
|
1168
|
-
const state = this.openByUri.get(uri);
|
|
1211
|
+
const state = this.openByUri.get(normalizeDocumentUri(uri));
|
|
1169
1212
|
if (!state)
|
|
1170
1213
|
return [];
|
|
1171
1214
|
return state.lastPublish?.diagnostics ?? state.pullCache?.diagnostics ?? [];
|
|
@@ -1187,13 +1230,13 @@ class WorkspaceDocumentState {
|
|
|
1187
1230
|
return state !== undefined && state.uri === snapshot.uri && state.version === snapshot.version && state.generation === snapshot.documentGeneration;
|
|
1188
1231
|
}
|
|
1189
1232
|
getPullCache(snapshot) {
|
|
1190
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1233
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1191
1234
|
if (!state?.pullCache || state.pullCache.documentVersion !== snapshot.version)
|
|
1192
1235
|
return null;
|
|
1193
1236
|
return state.pullCache;
|
|
1194
1237
|
}
|
|
1195
1238
|
recordPullDiagnostics(snapshot, report) {
|
|
1196
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1239
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1197
1240
|
if (!state)
|
|
1198
1241
|
return;
|
|
1199
1242
|
state.pullCache = {
|
|
@@ -1203,7 +1246,7 @@ class WorkspaceDocumentState {
|
|
|
1203
1246
|
};
|
|
1204
1247
|
}
|
|
1205
1248
|
recordPublishedDiagnostics(params) {
|
|
1206
|
-
const state = this.openByUri.get(params.uri);
|
|
1249
|
+
const state = this.openByUri.get(normalizeDocumentUri(params.uri));
|
|
1207
1250
|
if (!state)
|
|
1208
1251
|
return;
|
|
1209
1252
|
state.publishGeneration += 1;
|
|
@@ -1217,7 +1260,7 @@ class WorkspaceDocumentState {
|
|
|
1217
1260
|
this.notifyWaiters(state);
|
|
1218
1261
|
}
|
|
1219
1262
|
resolvePushDiagnostics(snapshot) {
|
|
1220
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1263
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1221
1264
|
if (!state?.lastPublish)
|
|
1222
1265
|
return { status: "missing" };
|
|
1223
1266
|
const publish = state.lastPublish;
|
|
@@ -1231,20 +1274,22 @@ class WorkspaceDocumentState {
|
|
|
1231
1274
|
return waitMs === 0 ? { status: "ready", diagnostics: publish.diagnostics } : { status: "wait", waitMs };
|
|
1232
1275
|
}
|
|
1233
1276
|
waitForDiagnosticsActivity(snapshot, timeoutMs) {
|
|
1234
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1277
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1235
1278
|
if (!state || timeoutMs <= 0)
|
|
1236
1279
|
return Promise.resolve();
|
|
1280
|
+
if (state.publishGeneration !== snapshot.publishGeneration)
|
|
1281
|
+
return Promise.resolve();
|
|
1237
1282
|
return new Promise((resolveActivity) => {
|
|
1238
1283
|
let settled = false;
|
|
1239
1284
|
const finish = () => {
|
|
1240
1285
|
if (settled)
|
|
1241
1286
|
return;
|
|
1242
1287
|
settled = true;
|
|
1243
|
-
clearTimeout(timer);
|
|
1288
|
+
this.timerProvider.clearTimeout(timer);
|
|
1244
1289
|
state.waiters.delete(finish);
|
|
1245
1290
|
resolveActivity();
|
|
1246
1291
|
};
|
|
1247
|
-
const timer = setTimeout(finish, timeoutMs);
|
|
1292
|
+
const timer = this.timerProvider.setTimeout(finish, timeoutMs);
|
|
1248
1293
|
if (typeof timer.unref === "function")
|
|
1249
1294
|
timer.unref();
|
|
1250
1295
|
state.waiters.add(finish);
|
|
@@ -1352,7 +1397,7 @@ class WorkspaceDocumentState {
|
|
|
1352
1397
|
waiters: new Set
|
|
1353
1398
|
};
|
|
1354
1399
|
this.openDocuments.set(path, state);
|
|
1355
|
-
this.openByUri.set(state.uri, state);
|
|
1400
|
+
this.openByUri.set(normalizeDocumentUri(state.uri), state);
|
|
1356
1401
|
this.notifyWaiters(state);
|
|
1357
1402
|
await this.sendNotification("textDocument/didOpen", {
|
|
1358
1403
|
textDocument: { uri: state.uri, languageId: state.languageId, version: state.version, text }
|
|
@@ -1377,7 +1422,7 @@ class WorkspaceDocumentState {
|
|
|
1377
1422
|
}
|
|
1378
1423
|
async closeDocument(state) {
|
|
1379
1424
|
this.openDocuments.delete(state.path);
|
|
1380
|
-
this.openByUri.delete(state.uri);
|
|
1425
|
+
this.openByUri.delete(normalizeDocumentUri(state.uri));
|
|
1381
1426
|
this.clearDiagnostics(state.uri);
|
|
1382
1427
|
this.notifyWaiters(state);
|
|
1383
1428
|
await this.sendNotification("textDocument/didClose", { textDocument: { uri: state.uri } });
|
|
@@ -1406,13 +1451,11 @@ import { dirname, isAbsolute, relative as relative2, resolve as resolve2 } from
|
|
|
1406
1451
|
import { fileURLToPath } from "node:url";
|
|
1407
1452
|
|
|
1408
1453
|
class WorkspaceEditPathError extends Error {
|
|
1409
|
-
path;
|
|
1410
|
-
detail;
|
|
1411
|
-
name = "WorkspaceEditPathError";
|
|
1412
1454
|
constructor(path, detail) {
|
|
1413
1455
|
super(`${detail}: ${path}`);
|
|
1414
1456
|
this.path = path;
|
|
1415
1457
|
this.detail = detail;
|
|
1458
|
+
this.name = "WorkspaceEditPathError";
|
|
1416
1459
|
}
|
|
1417
1460
|
}
|
|
1418
1461
|
function isPathInsideWorkspace(filePath, workspaceRoot) {
|
|
@@ -1704,13 +1747,11 @@ function canonicalFingerprint(operations) {
|
|
|
1704
1747
|
|
|
1705
1748
|
// ../lsp-core/src/lsp/workspace-edit-types.ts
|
|
1706
1749
|
class WorkspaceEditValidationError extends Error {
|
|
1707
|
-
changeIndex;
|
|
1708
|
-
detail;
|
|
1709
|
-
name = "WorkspaceEditValidationError";
|
|
1710
1750
|
constructor(changeIndex, detail) {
|
|
1711
1751
|
super(`change ${changeIndex}: ${detail}`);
|
|
1712
1752
|
this.changeIndex = changeIndex;
|
|
1713
1753
|
this.detail = detail;
|
|
1754
|
+
this.name = "WorkspaceEditValidationError";
|
|
1714
1755
|
}
|
|
1715
1756
|
}
|
|
1716
1757
|
|
|
@@ -1796,14 +1837,14 @@ function parseSinglePathResource(input, kind) {
|
|
|
1796
1837
|
return;
|
|
1797
1838
|
}
|
|
1798
1839
|
if (kind === "create") {
|
|
1799
|
-
const
|
|
1840
|
+
const options = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
|
|
1800
1841
|
target.operations.push({
|
|
1801
1842
|
kind,
|
|
1802
1843
|
changeIndex,
|
|
1803
1844
|
path: resolvedPath.path,
|
|
1804
1845
|
reportedPath: resolvedPath.requestedPath,
|
|
1805
|
-
overwrite:
|
|
1806
|
-
ignoreIfExists:
|
|
1846
|
+
overwrite: options["overwrite"] ?? false,
|
|
1847
|
+
ignoreIfExists: options["ignoreIfExists"] ?? false,
|
|
1807
1848
|
followedSymbolicLink: resolvedPath.followedSymbolicLink
|
|
1808
1849
|
});
|
|
1809
1850
|
return;
|
|
@@ -2208,10 +2249,9 @@ function simulateDelete(operation, virtual) {
|
|
|
2208
2249
|
import { existsSync as existsSync4, lstatSync as lstatSync3, readdirSync as readdirSync2 } from "node:fs";
|
|
2209
2250
|
import { dirname as dirname3, resolve as resolve4 } from "node:path";
|
|
2210
2251
|
class WorkspaceSnapshotBuilder {
|
|
2211
|
-
workspaceRoot;
|
|
2212
|
-
snapshots = new Map;
|
|
2213
2252
|
constructor(workspaceRoot) {
|
|
2214
2253
|
this.workspaceRoot = workspaceRoot;
|
|
2254
|
+
this.snapshots = new Map;
|
|
2215
2255
|
}
|
|
2216
2256
|
build(operations) {
|
|
2217
2257
|
this.add(this.workspaceRoot, false);
|
|
@@ -2255,8 +2295,10 @@ function snapshotOperations(operations, workspaceRoot) {
|
|
|
2255
2295
|
|
|
2256
2296
|
// ../lsp-core/src/lsp/workspace-edit-plan.ts
|
|
2257
2297
|
class PlanPathIndex {
|
|
2258
|
-
|
|
2259
|
-
|
|
2298
|
+
constructor() {
|
|
2299
|
+
this.firstChangeByPath = new Map;
|
|
2300
|
+
this.reportedPathByCanonical = new Map;
|
|
2301
|
+
}
|
|
2260
2302
|
build(operations) {
|
|
2261
2303
|
for (const operation of operations) {
|
|
2262
2304
|
switch (operation.kind) {
|
|
@@ -2272,11 +2314,11 @@ class PlanPathIndex {
|
|
|
2272
2314
|
}
|
|
2273
2315
|
}
|
|
2274
2316
|
}
|
|
2275
|
-
add(path,
|
|
2317
|
+
add(path, reportedPath, changeIndex) {
|
|
2276
2318
|
if (!this.firstChangeByPath.has(path))
|
|
2277
2319
|
this.firstChangeByPath.set(path, changeIndex);
|
|
2278
2320
|
if (!this.reportedPathByCanonical.has(path))
|
|
2279
|
-
this.reportedPathByCanonical.set(path,
|
|
2321
|
+
this.reportedPathByCanonical.set(path, reportedPath);
|
|
2280
2322
|
}
|
|
2281
2323
|
}
|
|
2282
2324
|
function fingerprintWorkspaceEdit(edit, workspaceRoot) {
|
|
@@ -2345,14 +2387,11 @@ function isRecord3(value) {
|
|
|
2345
2387
|
}
|
|
2346
2388
|
|
|
2347
2389
|
class WorkspaceMutationController {
|
|
2348
|
-
workspaceRoot;
|
|
2349
|
-
documents;
|
|
2350
|
-
activeLease = null;
|
|
2351
|
-
nextLeaseId = 1;
|
|
2352
|
-
io;
|
|
2353
2390
|
constructor(workspaceRoot, documents) {
|
|
2354
2391
|
this.workspaceRoot = workspaceRoot;
|
|
2355
2392
|
this.documents = documents;
|
|
2393
|
+
this.activeLease = null;
|
|
2394
|
+
this.nextLeaseId = 1;
|
|
2356
2395
|
}
|
|
2357
2396
|
setIo(io) {
|
|
2358
2397
|
this.io = io;
|
|
@@ -2391,8 +2430,8 @@ class WorkspaceMutationController {
|
|
|
2391
2430
|
};
|
|
2392
2431
|
}
|
|
2393
2432
|
lease.phase = "applying";
|
|
2394
|
-
lease.applyCompletion = new Promise((
|
|
2395
|
-
lease.resolveApply =
|
|
2433
|
+
lease.applyCompletion = new Promise((resolve) => {
|
|
2434
|
+
lease.resolveApply = resolve;
|
|
2396
2435
|
});
|
|
2397
2436
|
const edit = isRecord3(params) ? params["edit"] : undefined;
|
|
2398
2437
|
const record = edit === undefined ? { fingerprint: null, result: failure("workspace/applyEdit params.edit is required", 0) } : await this.applyEdit(edit, lease);
|
|
@@ -2465,14 +2504,12 @@ var DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3000;
|
|
|
2465
2504
|
var VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
|
|
2466
2505
|
|
|
2467
2506
|
class LspClient extends LspClientConnection {
|
|
2468
|
-
diagnosticPullErrors = [];
|
|
2469
|
-
documents;
|
|
2470
|
-
workspaceMutations;
|
|
2471
|
-
diagnosticsFreshnessTimeoutMs;
|
|
2472
2507
|
constructor(root, server, options = {}) {
|
|
2473
2508
|
super(root, server, options);
|
|
2509
|
+
this.diagnosticPullErrors = [];
|
|
2474
2510
|
this.diagnosticsFreshnessTimeoutMs = options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
|
|
2475
2511
|
this.documents = new WorkspaceDocumentState((method, params) => this.sendNotification(method, params), (uri) => this.diagnosticsStore.delete(uri), {
|
|
2512
|
+
timerProvider: this.timerProvider,
|
|
2476
2513
|
versionlessPublishQuiescenceMs: options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS
|
|
2477
2514
|
});
|
|
2478
2515
|
this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
|
|
@@ -2525,6 +2562,18 @@ class LspClient extends LspClientConnection {
|
|
|
2525
2562
|
textDocument: { uri: pathToFileURL3(absPath).href }
|
|
2526
2563
|
}, options);
|
|
2527
2564
|
}
|
|
2565
|
+
async formatDocument(filePath, options, signal) {
|
|
2566
|
+
if (!this.isDocumentFormattingSupported())
|
|
2567
|
+
return null;
|
|
2568
|
+
const absPath = this.resolveWorkspacePath(filePath);
|
|
2569
|
+
await this.openFile(absPath);
|
|
2570
|
+
const requestOptions = signal === undefined ? {} : { signal };
|
|
2571
|
+
const edits = await this.sendRequest("textDocument/formatting", {
|
|
2572
|
+
textDocument: { uri: pathToFileURL3(absPath).href },
|
|
2573
|
+
options
|
|
2574
|
+
}, requestOptions);
|
|
2575
|
+
return edits ?? [];
|
|
2576
|
+
}
|
|
2528
2577
|
async workspaceSymbols(query, signal) {
|
|
2529
2578
|
const options = signal === undefined ? {} : { signal };
|
|
2530
2579
|
return this.sendRequest("workspace/symbol", { query }, options);
|
|
@@ -2564,7 +2613,7 @@ class LspClient extends LspClientConnection {
|
|
|
2564
2613
|
const absPath = this.resolveWorkspacePath(filePath);
|
|
2565
2614
|
const uri = pathToFileURL3(absPath).href;
|
|
2566
2615
|
await this.openFile(absPath);
|
|
2567
|
-
const deadlineAt =
|
|
2616
|
+
const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
|
|
2568
2617
|
for (;; ) {
|
|
2569
2618
|
signal?.throwIfAborted();
|
|
2570
2619
|
const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
|
|
@@ -2577,13 +2626,13 @@ class LspClient extends LspClientConnection {
|
|
|
2577
2626
|
if (!pushFallbackOnly) {
|
|
2578
2627
|
const cached = this.documents.getPullCache(snapshot);
|
|
2579
2628
|
try {
|
|
2580
|
-
const
|
|
2581
|
-
if (
|
|
2629
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
2630
|
+
if (remainingMs <= 0)
|
|
2582
2631
|
return this.freshnessTimeout(absPath);
|
|
2583
2632
|
const result = await this.sendRequest("textDocument/diagnostic", {
|
|
2584
2633
|
textDocument: { uri },
|
|
2585
2634
|
...cached?.resultId === undefined ? {} : { previousResultId: cached.resultId }
|
|
2586
|
-
}, { timeoutMs:
|
|
2635
|
+
}, { timeoutMs: remainingMs, ...signal === undefined ? {} : { signal } });
|
|
2587
2636
|
if (!this.documents.isCurrentSnapshot(snapshot))
|
|
2588
2637
|
continue;
|
|
2589
2638
|
const report = this.parseDiagnosticPullReport(result);
|
|
@@ -2612,7 +2661,7 @@ class LspClient extends LspClientConnection {
|
|
|
2612
2661
|
}
|
|
2613
2662
|
if (!pushFallbackOnly)
|
|
2614
2663
|
continue;
|
|
2615
|
-
const remainingMs = deadlineAt -
|
|
2664
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
2616
2665
|
if (remainingMs <= 0) {
|
|
2617
2666
|
if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
|
|
2618
2667
|
const cached = this.documents.getPullCache(snapshot);
|
|
@@ -2664,7 +2713,7 @@ function waitForDiagnosticsActivity(wait, signal) {
|
|
|
2664
2713
|
return wait;
|
|
2665
2714
|
if (signal.aborted)
|
|
2666
2715
|
return Promise.reject(abortError2(signal));
|
|
2667
|
-
return new Promise((
|
|
2716
|
+
return new Promise((resolve, reject) => {
|
|
2668
2717
|
const onAbort = () => {
|
|
2669
2718
|
signal.removeEventListener("abort", onAbort);
|
|
2670
2719
|
reject(abortError2(signal));
|
|
@@ -2672,7 +2721,7 @@ function waitForDiagnosticsActivity(wait, signal) {
|
|
|
2672
2721
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
2673
2722
|
wait.then(() => {
|
|
2674
2723
|
signal.removeEventListener("abort", onAbort);
|
|
2675
|
-
|
|
2724
|
+
resolve();
|
|
2676
2725
|
}, (error) => {
|
|
2677
2726
|
signal.removeEventListener("abort", onAbort);
|
|
2678
2727
|
reject(error);
|
|
@@ -2740,7 +2789,7 @@ async function stopClientBestEffort(client) {
|
|
|
2740
2789
|
function awaitWithSignal(promise, signal) {
|
|
2741
2790
|
if (!signal)
|
|
2742
2791
|
return promise;
|
|
2743
|
-
return new Promise((
|
|
2792
|
+
return new Promise((resolve, reject) => {
|
|
2744
2793
|
let settled = false;
|
|
2745
2794
|
const onAbort = () => {
|
|
2746
2795
|
if (settled)
|
|
@@ -2758,7 +2807,7 @@ function awaitWithSignal(promise, signal) {
|
|
|
2758
2807
|
return;
|
|
2759
2808
|
settled = true;
|
|
2760
2809
|
signal.removeEventListener("abort", onAbort);
|
|
2761
|
-
|
|
2810
|
+
resolve(value);
|
|
2762
2811
|
}, (err) => {
|
|
2763
2812
|
if (settled)
|
|
2764
2813
|
return;
|
|
@@ -2770,18 +2819,16 @@ function awaitWithSignal(promise, signal) {
|
|
|
2770
2819
|
}
|
|
2771
2820
|
|
|
2772
2821
|
class LspManager {
|
|
2773
|
-
clients = new Map;
|
|
2774
|
-
reaperHandle = null;
|
|
2775
|
-
signalDisposer = null;
|
|
2776
|
-
disposed = false;
|
|
2777
|
-
idleTimeoutMs;
|
|
2778
|
-
initTimeoutMs;
|
|
2779
|
-
reaperIntervalMs;
|
|
2780
|
-
clientFactory;
|
|
2781
|
-
now;
|
|
2782
2822
|
constructor(options = {}) {
|
|
2823
|
+
this.clients = new Map;
|
|
2824
|
+
this.pendingStops = new Map;
|
|
2825
|
+
this.respawnBudgets = new Map;
|
|
2826
|
+
this.reaperHandle = null;
|
|
2827
|
+
this.signalDisposer = null;
|
|
2828
|
+
this.disposed = false;
|
|
2783
2829
|
this.idleTimeoutMs = options.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
|
|
2784
2830
|
this.initTimeoutMs = options.initTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
2831
|
+
this.maxResidentClients = options.maxResidentClients ?? MAX_RESIDENT_CLIENTS;
|
|
2785
2832
|
this.reaperIntervalMs = options.reaperIntervalMs ?? REAPER_INTERVAL_MS;
|
|
2786
2833
|
this.clientFactory = options.clientFactory ?? ((root, server) => new LspClient(root, server));
|
|
2787
2834
|
this.now = options.now ?? (() => Date.now());
|
|
@@ -2801,24 +2848,79 @@ class LspManager {
|
|
|
2801
2848
|
getKey(root, serverId) {
|
|
2802
2849
|
return `${root}::${serverId}`;
|
|
2803
2850
|
}
|
|
2851
|
+
tombstoneStop(key, client) {
|
|
2852
|
+
const stop = stopClientBestEffort(client);
|
|
2853
|
+
this.pendingStops.set(key, stop);
|
|
2854
|
+
stop.finally(() => {
|
|
2855
|
+
if (this.pendingStops.get(key) === stop) {
|
|
2856
|
+
this.pendingStops.delete(key);
|
|
2857
|
+
}
|
|
2858
|
+
});
|
|
2859
|
+
return stop;
|
|
2860
|
+
}
|
|
2861
|
+
recordDeadGeneration(key) {
|
|
2862
|
+
let budget = this.respawnBudgets.get(key);
|
|
2863
|
+
if (budget === undefined) {
|
|
2864
|
+
budget = { deadGenerations: 0, exhaustedAt: null };
|
|
2865
|
+
this.respawnBudgets.set(key, budget);
|
|
2866
|
+
}
|
|
2867
|
+
budget.deadGenerations += 1;
|
|
2868
|
+
}
|
|
2869
|
+
markHealthyGeneration(key) {
|
|
2870
|
+
this.respawnBudgets.delete(key);
|
|
2871
|
+
}
|
|
2872
|
+
ensureRespawnAllowed(key, root, serverId) {
|
|
2873
|
+
const budget = this.respawnBudgets.get(key);
|
|
2874
|
+
if (budget === undefined || budget.deadGenerations < CLIENT_RESPAWN_RETRY_LIMIT)
|
|
2875
|
+
return;
|
|
2876
|
+
if (budget.exhaustedAt === null) {
|
|
2877
|
+
budget.exhaustedAt = this.now();
|
|
2878
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
2879
|
+
}
|
|
2880
|
+
if (this.now() - budget.exhaustedAt < CLIENT_RESPAWN_COOLDOWN_MS) {
|
|
2881
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
2882
|
+
}
|
|
2883
|
+
budget.deadGenerations = 0;
|
|
2884
|
+
budget.exhaustedAt = null;
|
|
2885
|
+
}
|
|
2804
2886
|
reapStale() {
|
|
2805
2887
|
const t = this.now();
|
|
2806
2888
|
for (const [key, managed] of this.clients) {
|
|
2807
2889
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
2808
|
-
stopClientBestEffort(managed.client);
|
|
2809
2890
|
this.clients.delete(key);
|
|
2891
|
+
this.tombstoneStop(key, managed.client);
|
|
2810
2892
|
continue;
|
|
2811
2893
|
}
|
|
2812
2894
|
if (!managed.isInitializing && managed.refCount === 0 && managed.pendingWaiters === 0 && t - managed.lastUsedAt > this.idleTimeoutMs) {
|
|
2813
|
-
stopClientBestEffort(managed.client);
|
|
2814
2895
|
this.clients.delete(key);
|
|
2896
|
+
this.tombstoneStop(key, managed.client);
|
|
2897
|
+
}
|
|
2898
|
+
}
|
|
2899
|
+
}
|
|
2900
|
+
evictForAdmission() {
|
|
2901
|
+
while (this.clients.size >= this.maxResidentClients) {
|
|
2902
|
+
const victim = this.leastRecentlyUsedIdleClient();
|
|
2903
|
+
if (!victim)
|
|
2904
|
+
return;
|
|
2905
|
+
this.clients.delete(victim.key);
|
|
2906
|
+
this.tombstoneStop(victim.key, victim.managed.client);
|
|
2907
|
+
}
|
|
2908
|
+
}
|
|
2909
|
+
leastRecentlyUsedIdleClient() {
|
|
2910
|
+
let candidate = null;
|
|
2911
|
+
for (const [key, managed] of this.clients) {
|
|
2912
|
+
if (managed.refCount > 0 || managed.pendingWaiters > 0 || managed.isInitializing)
|
|
2913
|
+
continue;
|
|
2914
|
+
if (candidate === null || managed.lastUsedAt < candidate.managed.lastUsedAt) {
|
|
2915
|
+
candidate = { key, managed };
|
|
2815
2916
|
}
|
|
2816
2917
|
}
|
|
2918
|
+
return candidate;
|
|
2817
2919
|
}
|
|
2818
2920
|
async tryDeleteIfOrphaned(key, managed) {
|
|
2819
2921
|
if (managed.refCount === 0 && managed.pendingWaiters === 0 && !managed.isInitializing && this.clients.get(key) === managed) {
|
|
2820
2922
|
this.clients.delete(key);
|
|
2821
|
-
await
|
|
2923
|
+
await this.tombstoneStop(key, managed.client);
|
|
2822
2924
|
}
|
|
2823
2925
|
}
|
|
2824
2926
|
async getClient(root, server, signal) {
|
|
@@ -2827,12 +2929,22 @@ class LspManager {
|
|
|
2827
2929
|
}
|
|
2828
2930
|
signal?.throwIfAborted();
|
|
2829
2931
|
const key = this.getKey(root, server.id);
|
|
2932
|
+
for (;; ) {
|
|
2933
|
+
const pendingStop = this.pendingStops.get(key);
|
|
2934
|
+
if (pendingStop === undefined)
|
|
2935
|
+
break;
|
|
2936
|
+
await awaitWithSignal(pendingStop, signal);
|
|
2937
|
+
signal?.throwIfAborted();
|
|
2938
|
+
}
|
|
2939
|
+
if (this.disposed) {
|
|
2940
|
+
throw new Error("LspManager has been disposed");
|
|
2941
|
+
}
|
|
2830
2942
|
let managed = this.clients.get(key);
|
|
2831
2943
|
if (managed) {
|
|
2832
2944
|
const t = this.now();
|
|
2833
2945
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
2834
|
-
await stopClientBestEffort(managed.client);
|
|
2835
2946
|
this.clients.delete(key);
|
|
2947
|
+
await this.tombstoneStop(key, managed.client);
|
|
2836
2948
|
managed = undefined;
|
|
2837
2949
|
}
|
|
2838
2950
|
}
|
|
@@ -2853,14 +2965,20 @@ class LspManager {
|
|
|
2853
2965
|
signal.throwIfAborted();
|
|
2854
2966
|
}
|
|
2855
2967
|
if (!managed.client.isAlive()) {
|
|
2856
|
-
|
|
2857
|
-
this.clients.
|
|
2968
|
+
this.recordDeadGeneration(key);
|
|
2969
|
+
if (this.clients.get(key) === managed) {
|
|
2970
|
+
this.clients.delete(key);
|
|
2971
|
+
}
|
|
2972
|
+
await this.tombstoneStop(key, managed.client);
|
|
2858
2973
|
return this.getClient(root, server, signal);
|
|
2859
2974
|
}
|
|
2975
|
+
this.markHealthyGeneration(key);
|
|
2860
2976
|
managed.refCount++;
|
|
2861
2977
|
managed.lastUsedAt = this.now();
|
|
2862
2978
|
return managed.client;
|
|
2863
2979
|
}
|
|
2980
|
+
this.evictForAdmission();
|
|
2981
|
+
this.ensureRespawnAllowed(key, root, server.id);
|
|
2864
2982
|
const client = this.clientFactory(root, server);
|
|
2865
2983
|
const initStartedAt = this.now();
|
|
2866
2984
|
const initPromise = (async () => {
|
|
@@ -2884,7 +3002,7 @@ class LspManager {
|
|
|
2884
3002
|
if (this.clients.get(key) === newManaged) {
|
|
2885
3003
|
this.clients.delete(key);
|
|
2886
3004
|
}
|
|
2887
|
-
await
|
|
3005
|
+
await this.tombstoneStop(key, client);
|
|
2888
3006
|
throw err;
|
|
2889
3007
|
}
|
|
2890
3008
|
newManaged.pendingWaiters--;
|
|
@@ -2895,6 +3013,15 @@ class LspManager {
|
|
|
2895
3013
|
await this.tryDeleteIfOrphaned(key, newManaged);
|
|
2896
3014
|
signal.throwIfAborted();
|
|
2897
3015
|
}
|
|
3016
|
+
if (!client.isAlive()) {
|
|
3017
|
+
this.recordDeadGeneration(key);
|
|
3018
|
+
if (this.clients.get(key) === newManaged) {
|
|
3019
|
+
this.clients.delete(key);
|
|
3020
|
+
}
|
|
3021
|
+
await this.tombstoneStop(key, client);
|
|
3022
|
+
return this.getClient(root, server, signal);
|
|
3023
|
+
}
|
|
3024
|
+
this.markHealthyGeneration(key);
|
|
2898
3025
|
newManaged.refCount++;
|
|
2899
3026
|
newManaged.lastUsedAt = this.now();
|
|
2900
3027
|
return client;
|
|
@@ -2915,14 +3042,20 @@ class LspManager {
|
|
|
2915
3042
|
if (client && managed.client !== client)
|
|
2916
3043
|
return;
|
|
2917
3044
|
this.clients.delete(key);
|
|
2918
|
-
|
|
3045
|
+
this.tombstoneStop(key, managed.client);
|
|
2919
3046
|
}
|
|
2920
3047
|
warmupClient(root, server) {
|
|
2921
3048
|
if (this.disposed)
|
|
2922
3049
|
return;
|
|
2923
3050
|
const key = this.getKey(root, server.id);
|
|
2924
|
-
if (this.clients.has(key))
|
|
3051
|
+
if (this.clients.has(key) || this.pendingStops.has(key))
|
|
2925
3052
|
return;
|
|
3053
|
+
this.evictForAdmission();
|
|
3054
|
+
try {
|
|
3055
|
+
this.ensureRespawnAllowed(key, root, server.id);
|
|
3056
|
+
} catch {
|
|
3057
|
+
return;
|
|
3058
|
+
}
|
|
2926
3059
|
const client = this.clientFactory(root, server);
|
|
2927
3060
|
const initStartedAt = this.now();
|
|
2928
3061
|
const initPromise = (async () => {
|
|
@@ -2948,7 +3081,7 @@ class LspManager {
|
|
|
2948
3081
|
if (this.clients.get(key) === managed) {
|
|
2949
3082
|
this.clients.delete(key);
|
|
2950
3083
|
}
|
|
2951
|
-
|
|
3084
|
+
this.tombstoneStop(key, client);
|
|
2952
3085
|
});
|
|
2953
3086
|
}
|
|
2954
3087
|
isServerInitializing(root, serverId) {
|
|
@@ -2992,8 +3125,11 @@ class LspManager {
|
|
|
2992
3125
|
for (const managed of this.clients.values()) {
|
|
2993
3126
|
stopPromises.push(stopClientBestEffort(managed.client));
|
|
2994
3127
|
}
|
|
3128
|
+
const tombstonedStops = [...this.pendingStops.values()];
|
|
2995
3129
|
this.clients.clear();
|
|
2996
|
-
|
|
3130
|
+
this.respawnBudgets.clear();
|
|
3131
|
+
await Promise.allSettled([...stopPromises, ...tombstonedStops]);
|
|
3132
|
+
this.pendingStops.clear();
|
|
2997
3133
|
}
|
|
2998
3134
|
}
|
|
2999
3135
|
var _defaultInstance = null;
|
|
@@ -3013,7 +3149,7 @@ async function disposeDefaultLspManager() {
|
|
|
3013
3149
|
// src/daemon-client.ts
|
|
3014
3150
|
import { connect } from "node:net";
|
|
3015
3151
|
import { homedir as homedir3 } from "node:os";
|
|
3016
|
-
import { join as
|
|
3152
|
+
import { join as join8 } from "node:path";
|
|
3017
3153
|
|
|
3018
3154
|
// ../lsp-core/src/request-context.ts
|
|
3019
3155
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
@@ -3022,18 +3158,17 @@ import { homedir } from "node:os";
|
|
|
3022
3158
|
import { basename as basename2, delimiter as delimiter2, dirname as dirname4, isAbsolute as isAbsolute2, join as join2, relative as relative4, resolve as resolve6 } from "node:path";
|
|
3023
3159
|
|
|
3024
3160
|
class LspRequestContextParseError extends Error {
|
|
3025
|
-
code;
|
|
3026
|
-
name = "LspRequestContextParseError";
|
|
3027
3161
|
constructor(code, message) {
|
|
3028
3162
|
super(message);
|
|
3029
3163
|
this.code = code;
|
|
3164
|
+
this.name = "LspRequestContextParseError";
|
|
3030
3165
|
}
|
|
3031
3166
|
}
|
|
3032
3167
|
|
|
3033
3168
|
class LspRequestContextUnavailableError extends Error {
|
|
3034
|
-
name = "LspRequestContextUnavailableError";
|
|
3035
3169
|
constructor() {
|
|
3036
3170
|
super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
|
|
3171
|
+
this.name = "LspRequestContextUnavailableError";
|
|
3037
3172
|
}
|
|
3038
3173
|
}
|
|
3039
3174
|
var storage = new AsyncLocalStorage;
|
|
@@ -3053,7 +3188,7 @@ function contextCwd() {
|
|
|
3053
3188
|
}
|
|
3054
3189
|
function createStandaloneMcpRequestContext(input = {}) {
|
|
3055
3190
|
const env = input.env ?? process.env;
|
|
3056
|
-
const cwd = canonicalCwd(input.cwd ?? process.cwd());
|
|
3191
|
+
const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
|
|
3057
3192
|
const home = input.homeDir ?? homedir();
|
|
3058
3193
|
const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
|
|
3059
3194
|
const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
|
|
@@ -3191,7 +3326,6 @@ function isPlainRecord(value) {
|
|
|
3191
3326
|
|
|
3192
3327
|
// src/daemon-request-error.ts
|
|
3193
3328
|
class DaemonRequestError extends Error {
|
|
3194
|
-
requestWritten;
|
|
3195
3329
|
constructor(message, requestWritten) {
|
|
3196
3330
|
super(message);
|
|
3197
3331
|
this.name = "DaemonRequestError";
|
|
@@ -3214,7 +3348,6 @@ class DaemonRequestCancelledError extends DaemonRequestError {
|
|
|
3214
3348
|
}
|
|
3215
3349
|
|
|
3216
3350
|
class DaemonRequestTimedOutError extends DaemonRequestError {
|
|
3217
|
-
timeoutMs;
|
|
3218
3351
|
constructor(requestWritten, timeoutMs) {
|
|
3219
3352
|
super("daemon request timed out", requestWritten);
|
|
3220
3353
|
this.name = "DaemonRequestTimedOutError";
|
|
@@ -3293,14 +3426,12 @@ var PROTOCOL_ERROR_CODE = -32002;
|
|
|
3293
3426
|
var AUTH_TOKEN_BYTES = 32;
|
|
3294
3427
|
|
|
3295
3428
|
class UnsafePrivateDirectoryError extends Error {
|
|
3296
|
-
path;
|
|
3297
|
-
reason;
|
|
3298
|
-
name = "UnsafePrivateDirectoryError";
|
|
3299
|
-
code = "unsafe_private_directory";
|
|
3300
3429
|
constructor(path, reason) {
|
|
3301
3430
|
super(`unsafe private directory ${path}: ${reason}`);
|
|
3302
3431
|
this.path = path;
|
|
3303
3432
|
this.reason = reason;
|
|
3433
|
+
this.name = "UnsafePrivateDirectoryError";
|
|
3434
|
+
this.code = "unsafe_private_directory";
|
|
3304
3435
|
}
|
|
3305
3436
|
}
|
|
3306
3437
|
function authEnvelope(token) {
|
|
@@ -3484,20 +3615,18 @@ var OMO_LSP_DAEMON_VERSION = "OMO_LSP_DAEMON_VERSION";
|
|
|
3484
3615
|
var DAEMON_VERSION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$/;
|
|
3485
3616
|
|
|
3486
3617
|
class InvalidRuntimeOverrideError extends Error {
|
|
3487
|
-
code = "invalid_runtime_override";
|
|
3488
|
-
reason;
|
|
3489
3618
|
constructor(reason, message) {
|
|
3490
3619
|
super(message);
|
|
3620
|
+
this.code = "invalid_runtime_override";
|
|
3491
3621
|
this.name = "InvalidRuntimeOverrideError";
|
|
3492
3622
|
this.reason = reason;
|
|
3493
3623
|
}
|
|
3494
3624
|
}
|
|
3495
3625
|
|
|
3496
3626
|
class InvalidDaemonVersionError extends Error {
|
|
3497
|
-
code = "invalid_daemon_version";
|
|
3498
|
-
version;
|
|
3499
3627
|
constructor(version) {
|
|
3500
3628
|
super("LSP daemon version must match [A-Za-z0-9][A-Za-z0-9._+-]{0,127}");
|
|
3629
|
+
this.code = "invalid_daemon_version";
|
|
3501
3630
|
this.name = "InvalidDaemonVersionError";
|
|
3502
3631
|
this.version = version;
|
|
3503
3632
|
}
|
|
@@ -3543,10 +3672,9 @@ var requireFromHere = createRequire(import.meta.url);
|
|
|
3543
3672
|
var MAX_SOCKET_PATH_LENGTH = 100;
|
|
3544
3673
|
|
|
3545
3674
|
class InvalidDaemonDirectoryError extends Error {
|
|
3546
|
-
code = "invalid_daemon_directory";
|
|
3547
|
-
directory;
|
|
3548
3675
|
constructor(directory) {
|
|
3549
3676
|
super(`${OMO_LSP_DAEMON_DIR} must be an absolute path`);
|
|
3677
|
+
this.code = "invalid_daemon_directory";
|
|
3550
3678
|
this.name = "InvalidDaemonDirectoryError";
|
|
3551
3679
|
this.directory = directory;
|
|
3552
3680
|
}
|
|
@@ -3700,7 +3828,7 @@ async function probeDaemon(paths, timeoutMs = PROBE_TIMEOUT_MS, signal) {
|
|
|
3700
3828
|
return await pingDaemon(paths, token, timeoutMs, signal) !== null;
|
|
3701
3829
|
}
|
|
3702
3830
|
function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
|
|
3703
|
-
return new Promise((
|
|
3831
|
+
return new Promise((resolve) => {
|
|
3704
3832
|
const socket = new Socket;
|
|
3705
3833
|
let settled = false;
|
|
3706
3834
|
let timer;
|
|
@@ -3712,7 +3840,7 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
|
|
|
3712
3840
|
clearTimeout(timer);
|
|
3713
3841
|
signal?.removeEventListener("abort", onAbort);
|
|
3714
3842
|
socket.destroy();
|
|
3715
|
-
|
|
3843
|
+
resolve(value);
|
|
3716
3844
|
};
|
|
3717
3845
|
const onAbort = () => finish(null);
|
|
3718
3846
|
const decoder = createLineDecoder((message) => {
|
|
@@ -3735,13 +3863,17 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
|
|
|
3735
3863
|
socket.connect(paths.socket);
|
|
3736
3864
|
});
|
|
3737
3865
|
}
|
|
3738
|
-
function spawnDaemonProcess(paths) {
|
|
3866
|
+
function spawnDaemonProcess(paths, deps = {}) {
|
|
3739
3867
|
mkdirSync2(dirname6(paths.log), { recursive: true });
|
|
3740
3868
|
const logFd = openSync2(paths.log, "a");
|
|
3741
3869
|
try {
|
|
3742
|
-
const
|
|
3870
|
+
const spawnDaemonChild = deps.spawn ?? spawn2;
|
|
3871
|
+
const executable = deps.resolveExecutable?.() ?? resolveDaemonNodeExecutable();
|
|
3872
|
+
const child = spawnDaemonChild(executable, [paths.cliPath, "daemon"], {
|
|
3743
3873
|
detached: true,
|
|
3744
|
-
stdio: ["ignore", logFd, logFd]
|
|
3874
|
+
stdio: ["ignore", logFd, logFd],
|
|
3875
|
+
windowsHide: true,
|
|
3876
|
+
env: { ...process.env, BUN_BE_BUN: "1" }
|
|
3745
3877
|
});
|
|
3746
3878
|
child.once("spawn", () => closeSync2(logFd));
|
|
3747
3879
|
child.once("error", (error) => {
|
|
@@ -3771,7 +3903,7 @@ function defaultEnsureDaemonDeps() {
|
|
|
3771
3903
|
};
|
|
3772
3904
|
}
|
|
3773
3905
|
function sleepWithSignal(ms, signal) {
|
|
3774
|
-
return new Promise((
|
|
3906
|
+
return new Promise((resolve) => {
|
|
3775
3907
|
let settled = false;
|
|
3776
3908
|
const finish = () => {
|
|
3777
3909
|
if (settled)
|
|
@@ -3779,7 +3911,7 @@ function sleepWithSignal(ms, signal) {
|
|
|
3779
3911
|
settled = true;
|
|
3780
3912
|
clearTimeout(timer);
|
|
3781
3913
|
signal?.removeEventListener("abort", finish);
|
|
3782
|
-
|
|
3914
|
+
resolve();
|
|
3783
3915
|
};
|
|
3784
3916
|
const timer = setTimeout(finish, ms);
|
|
3785
3917
|
if (signal?.aborted) {
|
|
@@ -3794,7 +3926,7 @@ function awaitWithSignal2(promise, signal) {
|
|
|
3794
3926
|
return promise;
|
|
3795
3927
|
if (signal.aborted)
|
|
3796
3928
|
return Promise.reject(abortError3(signal));
|
|
3797
|
-
return new Promise((
|
|
3929
|
+
return new Promise((resolve, reject) => {
|
|
3798
3930
|
let settled = false;
|
|
3799
3931
|
const finish = (run) => {
|
|
3800
3932
|
if (settled)
|
|
@@ -3805,7 +3937,7 @@ function awaitWithSignal2(promise, signal) {
|
|
|
3805
3937
|
};
|
|
3806
3938
|
const onAbort = () => finish(() => reject(abortError3(signal)));
|
|
3807
3939
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
3808
|
-
promise.then((value) => finish(() =>
|
|
3940
|
+
promise.then((value) => finish(() => resolve(value)), (error) => finish(() => reject(error)));
|
|
3809
3941
|
});
|
|
3810
3942
|
}
|
|
3811
3943
|
function throwIfAborted(signal) {
|
|
@@ -3834,18 +3966,18 @@ function parsePingResponse(message) {
|
|
|
3834
3966
|
return null;
|
|
3835
3967
|
if (!endpoint || typeof endpoint !== "object" || Array.isArray(endpoint))
|
|
3836
3968
|
return null;
|
|
3837
|
-
const
|
|
3969
|
+
const path = Reflect.get(endpoint, "path");
|
|
3838
3970
|
const kind = Reflect.get(endpoint, "kind");
|
|
3839
|
-
if (typeof
|
|
3971
|
+
if (typeof path !== "string")
|
|
3840
3972
|
return null;
|
|
3841
3973
|
if (kind === "windows")
|
|
3842
|
-
return { pid, nonce, startedAt, endpoint: { kind, path
|
|
3974
|
+
return { pid, nonce, startedAt, endpoint: { kind, path } };
|
|
3843
3975
|
if (kind === "missing")
|
|
3844
|
-
return { pid, nonce, startedAt, endpoint: { kind, path
|
|
3976
|
+
return { pid, nonce, startedAt, endpoint: { kind, path } };
|
|
3845
3977
|
const dev = Reflect.get(endpoint, "dev");
|
|
3846
3978
|
const ino = Reflect.get(endpoint, "ino");
|
|
3847
3979
|
if (kind === "unix" && typeof dev === "number" && typeof ino === "number") {
|
|
3848
|
-
return { pid, nonce, startedAt, endpoint: { kind, path
|
|
3980
|
+
return { pid, nonce, startedAt, endpoint: { kind, path, dev, ino } };
|
|
3849
3981
|
}
|
|
3850
3982
|
return null;
|
|
3851
3983
|
}
|
|
@@ -3893,7 +4025,7 @@ ${body}` : `${body}
|
|
|
3893
4025
|
await writeChunk(output, payload);
|
|
3894
4026
|
}
|
|
3895
4027
|
function writeChunk(output, chunk) {
|
|
3896
|
-
return new Promise((
|
|
4028
|
+
return new Promise((resolve, reject) => {
|
|
3897
4029
|
let settled = false;
|
|
3898
4030
|
const onError = (error) => {
|
|
3899
4031
|
if (settled)
|
|
@@ -3913,7 +4045,7 @@ function writeChunk(output, chunk) {
|
|
|
3913
4045
|
return;
|
|
3914
4046
|
}
|
|
3915
4047
|
output.removeListener("error", onError);
|
|
3916
|
-
|
|
4048
|
+
resolve();
|
|
3917
4049
|
});
|
|
3918
4050
|
} catch (error) {
|
|
3919
4051
|
output.removeListener("error", onError);
|
|
@@ -4022,6 +4154,7 @@ async function runJsonRpcStdioServer(config) {
|
|
|
4022
4154
|
const idleTimer = createIdleTimer(idleTimeoutMs, log, () => {
|
|
4023
4155
|
isClosed = true;
|
|
4024
4156
|
config.onIdleTimeout?.();
|
|
4157
|
+
config.input.destroy();
|
|
4025
4158
|
});
|
|
4026
4159
|
const watchdog = createParentWatchdog(config.parentWatchdog, (parentPid, pollIntervalMs) => {
|
|
4027
4160
|
isClosed = true;
|
|
@@ -4118,7 +4251,11 @@ function createParentWatchdog(config, onDeadParent) {
|
|
|
4118
4251
|
const probeAlive = config.probeAlive ?? isProcessAlive;
|
|
4119
4252
|
let fired = false;
|
|
4120
4253
|
const timer = setInterval(() => {
|
|
4121
|
-
if (fired
|
|
4254
|
+
if (fired)
|
|
4255
|
+
return;
|
|
4256
|
+
const alive = probeAlive(parentPid);
|
|
4257
|
+
config.onPoll?.(alive);
|
|
4258
|
+
if (alive)
|
|
4122
4259
|
return;
|
|
4123
4260
|
fired = true;
|
|
4124
4261
|
onDeadParent(parentPid, pollIntervalMs);
|
|
@@ -4153,60 +4290,55 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
|
|
|
4153
4290
|
};
|
|
4154
4291
|
}
|
|
4155
4292
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
4156
|
-
import { existsSync as
|
|
4157
|
-
import { basename as basename3, dirname as
|
|
4293
|
+
import { existsSync as existsSync11, realpathSync as realpathSync5, statSync as statSync4 } from "node:fs";
|
|
4294
|
+
import { basename as basename3, dirname as dirname10, join as join5, resolve as resolve8 } from "node:path";
|
|
4158
4295
|
|
|
4159
|
-
// ../lsp-core/src/lsp/
|
|
4160
|
-
import { existsSync as existsSync7,
|
|
4161
|
-
import { dirname as dirname7 } from "node:path";
|
|
4162
|
-
|
|
4163
|
-
|
|
4164
|
-
|
|
4165
|
-
|
|
4166
|
-
|
|
4167
|
-
|
|
4168
|
-
|
|
4169
|
-
|
|
4170
|
-
|
|
4171
|
-
|
|
4172
|
-
|
|
4173
|
-
|
|
4296
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
4297
|
+
import { existsSync as existsSync7, realpathSync as realpathSync4 } from "node:fs";
|
|
4298
|
+
import { dirname as dirname7, join as join3 } from "node:path";
|
|
4299
|
+
|
|
4300
|
+
// ../lsp-core/src/lsp/workspace-markers.ts
|
|
4301
|
+
var GIT_WORKSPACE_MARKER = ".git";
|
|
4302
|
+
var PROJECT_WORKSPACE_MARKERS = [
|
|
4303
|
+
"package.json",
|
|
4304
|
+
"pyproject.toml",
|
|
4305
|
+
"Cargo.toml",
|
|
4306
|
+
"go.mod",
|
|
4307
|
+
"pom.xml",
|
|
4308
|
+
"build.gradle"
|
|
4309
|
+
];
|
|
4310
|
+
var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
|
|
4311
|
+
|
|
4312
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
4313
|
+
function findWorkspaceRootOutsideContext(directory) {
|
|
4314
|
+
const marked = nearestMarkedAncestor(directory);
|
|
4315
|
+
if (marked !== undefined)
|
|
4316
|
+
return marked;
|
|
4317
|
+
return realpathSync4(nearestExistingAncestor(directory));
|
|
4318
|
+
}
|
|
4319
|
+
function nearestMarkedAncestor(directory) {
|
|
4320
|
+
let current = directory;
|
|
4321
|
+
for (;; ) {
|
|
4322
|
+
if (existsSync7(current) && WORKSPACE_MARKERS.some((marker) => existsSync7(join3(current, marker)))) {
|
|
4323
|
+
return realpathSync4(current);
|
|
4324
|
+
}
|
|
4325
|
+
const parent = dirname7(current);
|
|
4326
|
+
if (parent === current)
|
|
4327
|
+
return;
|
|
4328
|
+
current = parent;
|
|
4174
4329
|
}
|
|
4175
4330
|
}
|
|
4176
|
-
function
|
|
4177
|
-
|
|
4178
|
-
|
|
4179
|
-
|
|
4180
|
-
|
|
4181
|
-
|
|
4182
|
-
|
|
4183
|
-
}
|
|
4184
|
-
|
|
4185
|
-
return value === "declined" || value === "allowed";
|
|
4186
|
-
}
|
|
4187
|
-
function writeInstallDecisions(decisions) {
|
|
4188
|
-
const path2 = getInstallDecisionsPath();
|
|
4189
|
-
mkdirSync3(dirname7(path2), { recursive: true });
|
|
4190
|
-
const tmpPath = `${path2}.tmp`;
|
|
4191
|
-
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
4192
|
-
`, "utf8");
|
|
4193
|
-
renameSync2(tmpPath, path2);
|
|
4194
|
-
}
|
|
4195
|
-
function isInstallDecisions(value) {
|
|
4196
|
-
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
4197
|
-
}
|
|
4198
|
-
function isInstallDecisionRecord(value) {
|
|
4199
|
-
if (!isRecord5(value))
|
|
4200
|
-
return false;
|
|
4201
|
-
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
4202
|
-
}
|
|
4203
|
-
function isRecord5(value) {
|
|
4204
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4331
|
+
function nearestExistingAncestor(directory) {
|
|
4332
|
+
let current = directory;
|
|
4333
|
+
while (!existsSync7(current)) {
|
|
4334
|
+
const parent = dirname7(current);
|
|
4335
|
+
if (parent === current)
|
|
4336
|
+
return current;
|
|
4337
|
+
current = parent;
|
|
4338
|
+
}
|
|
4339
|
+
return current;
|
|
4205
4340
|
}
|
|
4206
4341
|
|
|
4207
|
-
// ../lsp-core/src/lsp/config-loader.ts
|
|
4208
|
-
import { existsSync as existsSync8, readFileSync as readFileSync5 } from "node:fs";
|
|
4209
|
-
|
|
4210
4342
|
// ../lsp-core/src/lsp/server-definitions.ts
|
|
4211
4343
|
var LSP_INSTALL_HINTS = {
|
|
4212
4344
|
typescript: "npm install -g typescript-language-server typescript",
|
|
@@ -4252,6 +4384,26 @@ var LSP_INSTALL_HINTS = {
|
|
|
4252
4384
|
julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
|
|
4253
4385
|
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"
|
|
4254
4386
|
};
|
|
4387
|
+
var LSP_LOCAL_INSTALL_HINTS = {
|
|
4388
|
+
typescript: "bun add -d typescript-language-server typescript",
|
|
4389
|
+
vue: "bun add -d @vue/language-server",
|
|
4390
|
+
eslint: "bun add -d vscode-langservers-extracted",
|
|
4391
|
+
oxlint: "bun add -d oxlint",
|
|
4392
|
+
biome: "bun add -d @biomejs/biome",
|
|
4393
|
+
svelte: "bun add -d svelte-language-server",
|
|
4394
|
+
astro: "bun add -d @astrojs/language-server",
|
|
4395
|
+
bash: "bun add -d bash-language-server",
|
|
4396
|
+
"bash-ls": "bun add -d bash-language-server",
|
|
4397
|
+
"yaml-ls": "bun add -d yaml-language-server",
|
|
4398
|
+
php: "bun add -d intelephense",
|
|
4399
|
+
prisma: "bun add -d prisma",
|
|
4400
|
+
dockerfile: "bun add -d dockerfile-language-server-nodejs",
|
|
4401
|
+
pyright: "uv add --dev pyright",
|
|
4402
|
+
basedpyright: "uv add --dev basedpyright",
|
|
4403
|
+
ruff: "uv add --dev ruff",
|
|
4404
|
+
ty: "uv add --dev ty",
|
|
4405
|
+
"ruby-lsp": "bundle add ruby-lsp --group development"
|
|
4406
|
+
};
|
|
4255
4407
|
var BUILTIN_SERVERS = {
|
|
4256
4408
|
typescript: {
|
|
4257
4409
|
command: ["typescript-language-server", "--stdio"],
|
|
@@ -4354,18 +4506,67 @@ var BUILTIN_SERVERS = {
|
|
|
4354
4506
|
}
|
|
4355
4507
|
};
|
|
4356
4508
|
|
|
4509
|
+
// ../lsp-core/src/lsp/server-install-state.ts
|
|
4510
|
+
import { existsSync as existsSync8, mkdirSync as mkdirSync3, readFileSync as readFileSync4, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
4511
|
+
import { dirname as dirname8 } from "node:path";
|
|
4512
|
+
function getInstallDecisionsPath() {
|
|
4513
|
+
return lspRequestContext().installDecisionsPath;
|
|
4514
|
+
}
|
|
4515
|
+
function loadInstallDecisions() {
|
|
4516
|
+
const path = getInstallDecisionsPath();
|
|
4517
|
+
if (!existsSync8(path))
|
|
4518
|
+
return {};
|
|
4519
|
+
try {
|
|
4520
|
+
const parsed = JSON.parse(readFileSync4(path, "utf8"));
|
|
4521
|
+
return isInstallDecisions(parsed) ? parsed : {};
|
|
4522
|
+
} catch {
|
|
4523
|
+
return {};
|
|
4524
|
+
}
|
|
4525
|
+
}
|
|
4526
|
+
function loadInstallDecision(serverId) {
|
|
4527
|
+
return loadInstallDecisions()[serverId];
|
|
4528
|
+
}
|
|
4529
|
+
function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
|
|
4530
|
+
const decisions = loadInstallDecisions();
|
|
4531
|
+
decisions[serverId] = { decision, decidedAt };
|
|
4532
|
+
writeInstallDecisions(decisions);
|
|
4533
|
+
}
|
|
4534
|
+
function isInstallDecision(value) {
|
|
4535
|
+
return value === "declined" || value === "allowed";
|
|
4536
|
+
}
|
|
4537
|
+
function writeInstallDecisions(decisions) {
|
|
4538
|
+
const path = getInstallDecisionsPath();
|
|
4539
|
+
mkdirSync3(dirname8(path), { recursive: true });
|
|
4540
|
+
const tmpPath = `${path}.tmp`;
|
|
4541
|
+
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
4542
|
+
`, "utf8");
|
|
4543
|
+
renameSync2(tmpPath, path);
|
|
4544
|
+
}
|
|
4545
|
+
function isInstallDecisions(value) {
|
|
4546
|
+
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
4547
|
+
}
|
|
4548
|
+
function isInstallDecisionRecord(value) {
|
|
4549
|
+
if (!isRecord5(value))
|
|
4550
|
+
return false;
|
|
4551
|
+
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
4552
|
+
}
|
|
4553
|
+
function isRecord5(value) {
|
|
4554
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4555
|
+
}
|
|
4556
|
+
|
|
4357
4557
|
// ../lsp-core/src/lsp/config-loader.ts
|
|
4558
|
+
import { existsSync as existsSync9, readFileSync as readFileSync5 } from "node:fs";
|
|
4358
4559
|
function getProjectConfigPaths() {
|
|
4359
4560
|
return lspRequestContext().projectConfigPaths;
|
|
4360
4561
|
}
|
|
4361
4562
|
function getUserConfigPath() {
|
|
4362
4563
|
return lspRequestContext().userConfigPath;
|
|
4363
4564
|
}
|
|
4364
|
-
function loadJsonFile(
|
|
4365
|
-
if (!
|
|
4565
|
+
function loadJsonFile(path) {
|
|
4566
|
+
if (!existsSync9(path))
|
|
4366
4567
|
return null;
|
|
4367
4568
|
try {
|
|
4368
|
-
const parsed = JSON.parse(readFileSync5(
|
|
4569
|
+
const parsed = JSON.parse(readFileSync5(path, "utf-8"));
|
|
4369
4570
|
return isConfigJson(parsed) ? parsed : null;
|
|
4370
4571
|
} catch {
|
|
4371
4572
|
return null;
|
|
@@ -4382,8 +4583,8 @@ function loadAllConfigs() {
|
|
|
4382
4583
|
return configs;
|
|
4383
4584
|
}
|
|
4384
4585
|
function loadFirstJsonFile(paths) {
|
|
4385
|
-
for (const
|
|
4386
|
-
const config = loadJsonFile(
|
|
4586
|
+
for (const path of paths) {
|
|
4587
|
+
const config = loadJsonFile(path);
|
|
4387
4588
|
if (config)
|
|
4388
4589
|
return config;
|
|
4389
4590
|
}
|
|
@@ -4409,10 +4610,10 @@ function getMergedServers() {
|
|
|
4409
4610
|
}
|
|
4410
4611
|
if (seen.has(id))
|
|
4411
4612
|
continue;
|
|
4412
|
-
const
|
|
4413
|
-
if (!
|
|
4613
|
+
const server = createServerFromEntry(id, entry, source);
|
|
4614
|
+
if (!server)
|
|
4414
4615
|
continue;
|
|
4415
|
-
servers.push(
|
|
4616
|
+
servers.push(server);
|
|
4416
4617
|
seen.add(id);
|
|
4417
4618
|
}
|
|
4418
4619
|
}
|
|
@@ -4444,7 +4645,7 @@ function createServerFromEntry(id, entry, source) {
|
|
|
4444
4645
|
if (source === "project") {
|
|
4445
4646
|
if (!builtin)
|
|
4446
4647
|
return null;
|
|
4447
|
-
const
|
|
4648
|
+
const server = createServer({
|
|
4448
4649
|
id,
|
|
4449
4650
|
command: builtin.command,
|
|
4450
4651
|
extensions: entry.extensions ?? builtin.extensions,
|
|
@@ -4452,35 +4653,35 @@ function createServerFromEntry(id, entry, source) {
|
|
|
4452
4653
|
source
|
|
4453
4654
|
});
|
|
4454
4655
|
if (entry.initialization !== undefined) {
|
|
4455
|
-
|
|
4656
|
+
server.initialization = entry.initialization;
|
|
4456
4657
|
}
|
|
4457
|
-
return
|
|
4658
|
+
return server;
|
|
4458
4659
|
}
|
|
4459
4660
|
if (entry.command && entry.extensions) {
|
|
4460
|
-
const
|
|
4661
|
+
const server = createServer({
|
|
4461
4662
|
id,
|
|
4462
4663
|
command: entry.command,
|
|
4463
4664
|
extensions: entry.extensions,
|
|
4464
4665
|
priority: entry.priority ?? 0,
|
|
4465
4666
|
source
|
|
4466
4667
|
});
|
|
4467
|
-
applyOptionalServerFields(
|
|
4468
|
-
return
|
|
4668
|
+
applyOptionalServerFields(server, entry);
|
|
4669
|
+
return server;
|
|
4469
4670
|
}
|
|
4470
4671
|
if (!builtin)
|
|
4471
4672
|
return null;
|
|
4472
|
-
const
|
|
4673
|
+
const server = createServer({
|
|
4473
4674
|
id,
|
|
4474
4675
|
command: entry.command ?? builtin.command,
|
|
4475
4676
|
extensions: entry.extensions ?? builtin.extensions,
|
|
4476
4677
|
priority: entry.priority ?? 0,
|
|
4477
4678
|
source
|
|
4478
4679
|
});
|
|
4479
|
-
applyOptionalServerFields(
|
|
4480
|
-
return
|
|
4680
|
+
applyOptionalServerFields(server, entry);
|
|
4681
|
+
return server;
|
|
4481
4682
|
}
|
|
4482
4683
|
function createServer(input) {
|
|
4483
|
-
const
|
|
4684
|
+
const server = {
|
|
4484
4685
|
id: input.id,
|
|
4485
4686
|
command: input.command,
|
|
4486
4687
|
extensions: input.extensions,
|
|
@@ -4488,19 +4689,19 @@ function createServer(input) {
|
|
|
4488
4689
|
source: input.source
|
|
4489
4690
|
};
|
|
4490
4691
|
if (input.env !== undefined) {
|
|
4491
|
-
|
|
4692
|
+
server.env = input.env;
|
|
4492
4693
|
}
|
|
4493
4694
|
if (input.initialization !== undefined) {
|
|
4494
|
-
|
|
4695
|
+
server.initialization = input.initialization;
|
|
4495
4696
|
}
|
|
4496
|
-
return
|
|
4697
|
+
return server;
|
|
4497
4698
|
}
|
|
4498
|
-
function applyOptionalServerFields(
|
|
4699
|
+
function applyOptionalServerFields(server, entry) {
|
|
4499
4700
|
if (entry.env !== undefined) {
|
|
4500
|
-
|
|
4701
|
+
server.env = entry.env;
|
|
4501
4702
|
}
|
|
4502
4703
|
if (entry.initialization !== undefined) {
|
|
4503
|
-
|
|
4704
|
+
server.initialization = entry.initialization;
|
|
4504
4705
|
}
|
|
4505
4706
|
}
|
|
4506
4707
|
function isConfigJson(value) {
|
|
@@ -4550,64 +4751,165 @@ function getDisabledServerIds() {
|
|
|
4550
4751
|
}
|
|
4551
4752
|
|
|
4552
4753
|
// ../lsp-core/src/lsp/server-installation.ts
|
|
4553
|
-
import { existsSync as
|
|
4554
|
-
import { delimiter as delimiter3, join as
|
|
4555
|
-
|
|
4556
|
-
|
|
4557
|
-
|
|
4558
|
-
|
|
4559
|
-
|
|
4560
|
-
|
|
4561
|
-
|
|
4562
|
-
|
|
4563
|
-
|
|
4754
|
+
import { existsSync as existsSync10 } from "node:fs";
|
|
4755
|
+
import { delimiter as delimiter3, dirname as dirname9, isAbsolute as isAbsolute5, join as join4, resolve as resolve7 } from "node:path";
|
|
4756
|
+
var LOCAL_BIN_RULES = [
|
|
4757
|
+
{
|
|
4758
|
+
markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
|
|
4759
|
+
binDirs: [join4("node_modules", ".bin")]
|
|
4760
|
+
},
|
|
4761
|
+
{
|
|
4762
|
+
markers: [
|
|
4763
|
+
"pyproject.toml",
|
|
4764
|
+
"ty.toml",
|
|
4765
|
+
"requirements.txt",
|
|
4766
|
+
"setup.py",
|
|
4767
|
+
"setup.cfg",
|
|
4768
|
+
"Pipfile",
|
|
4769
|
+
"pyrightconfig.json",
|
|
4770
|
+
"ruff.toml",
|
|
4771
|
+
".ruff.toml"
|
|
4772
|
+
],
|
|
4773
|
+
binDirs: [
|
|
4774
|
+
join4(".venv", "bin"),
|
|
4775
|
+
join4(".venv", "Scripts"),
|
|
4776
|
+
join4("venv", "bin"),
|
|
4777
|
+
join4("venv", "Scripts"),
|
|
4778
|
+
join4(".env", "bin"),
|
|
4779
|
+
join4(".env", "Scripts")
|
|
4780
|
+
]
|
|
4781
|
+
},
|
|
4782
|
+
{
|
|
4783
|
+
markers: ["Gemfile", "Gemfile.lock"],
|
|
4784
|
+
binDirs: [join4("vendor", "bundle", "bin"), "bin"]
|
|
4785
|
+
},
|
|
4786
|
+
{
|
|
4787
|
+
markers: ["go.mod", "go.sum", "go.work"],
|
|
4788
|
+
binDirs: ["bin"]
|
|
4564
4789
|
}
|
|
4565
|
-
|
|
4566
|
-
|
|
4567
|
-
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
|
|
4571
|
-
|
|
4572
|
-
|
|
4573
|
-
|
|
4790
|
+
];
|
|
4791
|
+
var resolutionCache = new Map;
|
|
4792
|
+
var probeCount = 0;
|
|
4793
|
+
function probe(path) {
|
|
4794
|
+
probeCount += 1;
|
|
4795
|
+
return existsSync10(path);
|
|
4796
|
+
}
|
|
4797
|
+
function executableSuffixes(platform, pathExt) {
|
|
4798
|
+
if (platform !== "win32")
|
|
4799
|
+
return [""];
|
|
4800
|
+
const configured = pathExt ?? process.env["PATHEXT"] ?? "";
|
|
4801
|
+
const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
|
|
4802
|
+
return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
|
|
4803
|
+
}
|
|
4804
|
+
function probeWithSuffixes(directory, command, suffixes) {
|
|
4805
|
+
for (const suffix of suffixes) {
|
|
4806
|
+
const candidate = join4(directory, command + suffix);
|
|
4807
|
+
if (probe(candidate))
|
|
4808
|
+
return candidate;
|
|
4809
|
+
}
|
|
4810
|
+
return null;
|
|
4811
|
+
}
|
|
4812
|
+
function resolveLocal(command, workingDirectory, suffixes, stopAt) {
|
|
4813
|
+
const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
|
|
4814
|
+
let current = resolve7(workingDirectory);
|
|
4815
|
+
while (true) {
|
|
4816
|
+
for (const rule of LOCAL_BIN_RULES) {
|
|
4817
|
+
if (!rule.markers.some((marker) => probe(join4(current, marker))))
|
|
4818
|
+
continue;
|
|
4819
|
+
for (const binDir of rule.binDirs) {
|
|
4820
|
+
const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
|
|
4821
|
+
if (found !== null)
|
|
4822
|
+
return found;
|
|
4823
|
+
}
|
|
4574
4824
|
}
|
|
4825
|
+
if (probe(join4(current, ".git")))
|
|
4826
|
+
return null;
|
|
4827
|
+
if (boundary !== undefined && current === boundary)
|
|
4828
|
+
return null;
|
|
4829
|
+
const parent = dirname9(current);
|
|
4830
|
+
if (parent === current)
|
|
4831
|
+
return null;
|
|
4832
|
+
current = parent;
|
|
4575
4833
|
}
|
|
4576
|
-
|
|
4577
|
-
|
|
4834
|
+
}
|
|
4835
|
+
function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
|
|
4836
|
+
let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
|
|
4837
|
+
if (platform === "win32" && !pathEnv) {
|
|
4578
4838
|
pathEnv = process.env["Path"] ?? "";
|
|
4579
4839
|
}
|
|
4580
|
-
const
|
|
4581
|
-
|
|
4582
|
-
|
|
4583
|
-
|
|
4584
|
-
|
|
4585
|
-
|
|
4586
|
-
}
|
|
4840
|
+
for (const entry of pathEnv.split(delimiter3)) {
|
|
4841
|
+
if (entry.length === 0)
|
|
4842
|
+
continue;
|
|
4843
|
+
const found = probeWithSuffixes(entry, command, suffixes);
|
|
4844
|
+
if (found !== null)
|
|
4845
|
+
return found;
|
|
4587
4846
|
}
|
|
4588
|
-
|
|
4589
|
-
|
|
4590
|
-
|
|
4847
|
+
return null;
|
|
4848
|
+
}
|
|
4849
|
+
function resolveServerBinary(command, workingDirectory, options = {}) {
|
|
4850
|
+
if (command.length === 0)
|
|
4851
|
+
return null;
|
|
4852
|
+
const [cmd] = command;
|
|
4853
|
+
if (cmd === undefined || cmd.length === 0)
|
|
4854
|
+
return null;
|
|
4855
|
+
const platform = options.platform ?? process.platform;
|
|
4856
|
+
const suffixes = executableSuffixes(platform, options.pathExt);
|
|
4857
|
+
if (cmd.includes("/") || cmd.includes("\\")) {
|
|
4858
|
+
const explicit = isAbsolute5(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
|
|
4859
|
+
return probe(explicit) ? explicit : null;
|
|
4860
|
+
}
|
|
4861
|
+
const cacheKey = JSON.stringify([
|
|
4862
|
+
workingDirectory ?? "",
|
|
4863
|
+
cmd,
|
|
4864
|
+
platform,
|
|
4865
|
+
options.stopAt ?? "",
|
|
4866
|
+
options.pathExt ?? "",
|
|
4867
|
+
options.pathEnv ?? process.env["PATH"] ?? ""
|
|
4868
|
+
]);
|
|
4869
|
+
const cached = resolutionCache.get(cacheKey);
|
|
4870
|
+
if (cached !== undefined)
|
|
4871
|
+
return cached;
|
|
4872
|
+
let resolved = null;
|
|
4873
|
+
if (workingDirectory !== undefined && workingDirectory.length > 0) {
|
|
4874
|
+
resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
|
|
4875
|
+
}
|
|
4876
|
+
resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
|
|
4877
|
+
if (resolved === null && cmd === "node")
|
|
4878
|
+
resolved = cmd;
|
|
4879
|
+
resolutionCache.set(cacheKey, resolved);
|
|
4880
|
+
return resolved;
|
|
4881
|
+
}
|
|
4882
|
+
function isServerInstalled(command, workingDirectory, options = {}) {
|
|
4883
|
+
if (command.length === 0)
|
|
4884
|
+
return false;
|
|
4885
|
+
return resolveServerBinary(command, workingDirectory, options) !== null;
|
|
4591
4886
|
}
|
|
4592
4887
|
|
|
4593
4888
|
// ../lsp-core/src/lsp/server-resolution.ts
|
|
4889
|
+
function withResolvedCommand(command, binaryPath) {
|
|
4890
|
+
return [binaryPath, ...command.slice(1)];
|
|
4891
|
+
}
|
|
4594
4892
|
function findServerForExtension(ext) {
|
|
4595
4893
|
const servers = getMergedServers();
|
|
4596
|
-
|
|
4597
|
-
|
|
4894
|
+
const workingDirectory = contextCwd();
|
|
4895
|
+
for (const server of servers) {
|
|
4896
|
+
if (!server.extensions.includes(ext))
|
|
4897
|
+
continue;
|
|
4898
|
+
const binaryPath = resolveServerBinary(server.command, workingDirectory);
|
|
4899
|
+
if (binaryPath !== null) {
|
|
4598
4900
|
const resolvedServer = {
|
|
4599
|
-
id:
|
|
4600
|
-
command:
|
|
4601
|
-
extensions:
|
|
4602
|
-
priority:
|
|
4901
|
+
id: server.id,
|
|
4902
|
+
command: withResolvedCommand(server.command, binaryPath),
|
|
4903
|
+
extensions: server.extensions,
|
|
4904
|
+
priority: server.priority
|
|
4603
4905
|
};
|
|
4604
|
-
if (
|
|
4906
|
+
if (server.env !== undefined) {
|
|
4605
4907
|
return {
|
|
4606
4908
|
status: "found",
|
|
4607
4909
|
server: {
|
|
4608
4910
|
...resolvedServer,
|
|
4609
|
-
env:
|
|
4610
|
-
...
|
|
4911
|
+
env: server.env,
|
|
4912
|
+
...server.initialization === undefined ? {} : { initialization: server.initialization }
|
|
4611
4913
|
}
|
|
4612
4914
|
};
|
|
4613
4915
|
}
|
|
@@ -4615,20 +4917,20 @@ function findServerForExtension(ext) {
|
|
|
4615
4917
|
status: "found",
|
|
4616
4918
|
server: {
|
|
4617
4919
|
...resolvedServer,
|
|
4618
|
-
...
|
|
4920
|
+
...server.initialization === undefined ? {} : { initialization: server.initialization }
|
|
4619
4921
|
}
|
|
4620
4922
|
};
|
|
4621
4923
|
}
|
|
4622
4924
|
}
|
|
4623
|
-
for (const
|
|
4624
|
-
if (
|
|
4625
|
-
const installHint = LSP_INSTALL_HINTS[
|
|
4925
|
+
for (const server of servers) {
|
|
4926
|
+
if (server.extensions.includes(ext)) {
|
|
4927
|
+
const installHint = LSP_INSTALL_HINTS[server.id] ?? `Install '${server.command[0]}' and ensure it's in your PATH`;
|
|
4626
4928
|
return {
|
|
4627
4929
|
status: "not_installed",
|
|
4628
4930
|
server: {
|
|
4629
|
-
id:
|
|
4630
|
-
command:
|
|
4631
|
-
extensions:
|
|
4931
|
+
id: server.id,
|
|
4932
|
+
command: server.command,
|
|
4933
|
+
extensions: server.extensions
|
|
4632
4934
|
},
|
|
4633
4935
|
installHint
|
|
4634
4936
|
};
|
|
@@ -4644,20 +4946,21 @@ function findServerForExtension(ext) {
|
|
|
4644
4946
|
function getAllServers() {
|
|
4645
4947
|
const servers = getMergedServers();
|
|
4646
4948
|
const disabled = getDisabledServerIds();
|
|
4949
|
+
const workingDirectory = contextCwd();
|
|
4647
4950
|
const result = [];
|
|
4648
4951
|
const seen = new Set;
|
|
4649
|
-
for (const
|
|
4650
|
-
if (seen.has(
|
|
4952
|
+
for (const server of servers) {
|
|
4953
|
+
if (seen.has(server.id))
|
|
4651
4954
|
continue;
|
|
4652
4955
|
result.push({
|
|
4653
|
-
id:
|
|
4654
|
-
installed: isServerInstalled(
|
|
4655
|
-
extensions:
|
|
4956
|
+
id: server.id,
|
|
4957
|
+
installed: isServerInstalled(server.command, workingDirectory),
|
|
4958
|
+
extensions: server.extensions,
|
|
4656
4959
|
disabled: false,
|
|
4657
|
-
source:
|
|
4658
|
-
priority:
|
|
4960
|
+
source: server.source,
|
|
4961
|
+
priority: server.priority
|
|
4659
4962
|
});
|
|
4660
|
-
seen.add(
|
|
4963
|
+
seen.add(server.id);
|
|
4661
4964
|
}
|
|
4662
4965
|
for (const id of disabled) {
|
|
4663
4966
|
if (seen.has(id))
|
|
@@ -4665,7 +4968,7 @@ function getAllServers() {
|
|
|
4665
4968
|
const builtin = BUILTIN_SERVERS[id];
|
|
4666
4969
|
result.push({
|
|
4667
4970
|
id,
|
|
4668
|
-
installed: builtin ? isServerInstalled(builtin.command) : false,
|
|
4971
|
+
installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
|
|
4669
4972
|
extensions: builtin?.extensions ?? [],
|
|
4670
4973
|
disabled: true,
|
|
4671
4974
|
source: "disabled",
|
|
@@ -4676,7 +4979,6 @@ function getAllServers() {
|
|
|
4676
4979
|
}
|
|
4677
4980
|
|
|
4678
4981
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
4679
|
-
var WORKSPACE_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle"];
|
|
4680
4982
|
function isDirectoryPath(filePath) {
|
|
4681
4983
|
try {
|
|
4682
4984
|
return statSync4(filePath).isDirectory();
|
|
@@ -4689,36 +4991,40 @@ function findWorkspaceRoot(filePath) {
|
|
|
4689
4991
|
const abs = resolveReadablePathInsideContext(filePath);
|
|
4690
4992
|
let dir = abs;
|
|
4691
4993
|
if (!isDirectoryPath(dir)) {
|
|
4692
|
-
dir =
|
|
4994
|
+
dir = dirname10(dir);
|
|
4693
4995
|
}
|
|
4996
|
+
if (!isPathInside(cwd, abs))
|
|
4997
|
+
return findWorkspaceRootOutsideContext(dir);
|
|
4694
4998
|
const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
|
|
4999
|
+
let nearestPackageRoot;
|
|
4695
5000
|
while (isPathInside(cwd, dir)) {
|
|
4696
5001
|
const canonicalDir = existingDirectoryInsideContext(dir, cwd);
|
|
4697
5002
|
if (canonicalDir !== undefined) {
|
|
4698
|
-
|
|
4699
|
-
|
|
4700
|
-
|
|
4701
|
-
|
|
5003
|
+
if (existsSync11(join5(dir, GIT_WORKSPACE_MARKER))) {
|
|
5004
|
+
return canonicalDir;
|
|
5005
|
+
}
|
|
5006
|
+
if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
|
|
5007
|
+
nearestPackageRoot = canonicalDir;
|
|
4702
5008
|
}
|
|
4703
5009
|
}
|
|
4704
5010
|
if (dir === cwd)
|
|
4705
5011
|
break;
|
|
4706
|
-
dir =
|
|
5012
|
+
dir = dirname10(dir);
|
|
4707
5013
|
}
|
|
4708
|
-
return fallbackRoot;
|
|
5014
|
+
return nearestPackageRoot ?? fallbackRoot;
|
|
5015
|
+
}
|
|
5016
|
+
function hasProjectWorkspaceMarker(directory) {
|
|
5017
|
+
return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync11(join5(directory, marker)));
|
|
4709
5018
|
}
|
|
4710
5019
|
function resolveReadablePathInsideContext(filePath) {
|
|
4711
5020
|
const cwd = contextCwd();
|
|
4712
|
-
const abs =
|
|
5021
|
+
const abs = resolve8(cwd, filePath);
|
|
4713
5022
|
if (isPathInside(cwd, abs))
|
|
4714
5023
|
return abs;
|
|
4715
5024
|
const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
|
|
4716
5025
|
if (rebased !== undefined)
|
|
4717
5026
|
return rebased;
|
|
4718
|
-
|
|
4719
|
-
if (isPathInside(cwd, canonical))
|
|
4720
|
-
return canonical;
|
|
4721
|
-
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
5027
|
+
return canonicalizeExistingOrNearestAncestor(abs);
|
|
4722
5028
|
}
|
|
4723
5029
|
function resolvePathInsideContext(filePath) {
|
|
4724
5030
|
const cwd = contextCwd();
|
|
@@ -4729,16 +5035,16 @@ function resolvePathInsideContext(filePath) {
|
|
|
4729
5035
|
}
|
|
4730
5036
|
return canonical;
|
|
4731
5037
|
}
|
|
4732
|
-
function rebaseThroughCanonicalAncestor(
|
|
4733
|
-
let current =
|
|
5038
|
+
function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
5039
|
+
let current = path;
|
|
4734
5040
|
const suffix = [];
|
|
4735
5041
|
while (true) {
|
|
4736
|
-
if (
|
|
4737
|
-
const canonical =
|
|
5042
|
+
if (existsSync11(current)) {
|
|
5043
|
+
const canonical = realpathSync5(current);
|
|
4738
5044
|
if (isPathInside(cwd, canonical))
|
|
4739
|
-
return suffix.length === 0 ? canonical :
|
|
5045
|
+
return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
|
|
4740
5046
|
}
|
|
4741
|
-
const parent =
|
|
5047
|
+
const parent = dirname10(current);
|
|
4742
5048
|
if (parent === current)
|
|
4743
5049
|
return;
|
|
4744
5050
|
suffix.unshift(basename3(current));
|
|
@@ -4746,9 +5052,9 @@ function rebaseThroughCanonicalAncestor(path2, cwd) {
|
|
|
4746
5052
|
}
|
|
4747
5053
|
}
|
|
4748
5054
|
function existingDirectoryInsideContext(directory, cwd) {
|
|
4749
|
-
if (!
|
|
5055
|
+
if (!existsSync11(directory))
|
|
4750
5056
|
return;
|
|
4751
|
-
const canonical =
|
|
5057
|
+
const canonical = realpathSync5(directory);
|
|
4752
5058
|
if (!statSync4(canonical).isDirectory())
|
|
4753
5059
|
return;
|
|
4754
5060
|
return isPathInside(cwd, canonical) ? canonical : undefined;
|
|
@@ -4761,7 +5067,7 @@ function nearestExistingDirectoryInsideContext(directory, cwd) {
|
|
|
4761
5067
|
return canonical;
|
|
4762
5068
|
if (current === cwd)
|
|
4763
5069
|
return;
|
|
4764
|
-
current =
|
|
5070
|
+
current = dirname10(current);
|
|
4765
5071
|
}
|
|
4766
5072
|
return;
|
|
4767
5073
|
}
|
|
@@ -4788,33 +5094,46 @@ function formatServerLookupError(result) {
|
|
|
4788
5094
|
].join(`
|
|
4789
5095
|
`);
|
|
4790
5096
|
}
|
|
5097
|
+
function formatInstallOptions(serverId, installHint) {
|
|
5098
|
+
const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
|
|
5099
|
+
if (localHint === undefined) {
|
|
5100
|
+
return ["To install, run:", ` ${installHint}`];
|
|
5101
|
+
}
|
|
5102
|
+
return [
|
|
5103
|
+
"To install in THIS repository (preferred — no global install needed):",
|
|
5104
|
+
` ${localHint}`,
|
|
5105
|
+
"",
|
|
5106
|
+
"Or install it globally:",
|
|
5107
|
+
` ${installHint}`
|
|
5108
|
+
];
|
|
5109
|
+
}
|
|
4791
5110
|
function formatNotInstalled(result) {
|
|
4792
|
-
const { server
|
|
4793
|
-
const extensions =
|
|
4794
|
-
const decision = loadInstallDecision(
|
|
5111
|
+
const { server, installHint } = result;
|
|
5112
|
+
const extensions = server.extensions.join(", ");
|
|
5113
|
+
const decision = loadInstallDecision(server.id)?.decision;
|
|
4795
5114
|
const context = lspRequestContext();
|
|
4796
5115
|
if (decision === "declined") {
|
|
4797
|
-
return `LSP server '${
|
|
5116
|
+
return `LSP server '${server.id}' (${extensions}) is NOT INSTALLED; user previously declined installation — proceed without LSP.`;
|
|
4798
5117
|
}
|
|
4799
5118
|
const header = [
|
|
4800
|
-
`LSP server '${
|
|
5119
|
+
`LSP server '${server.id}' for ${extensions} is NOT INSTALLED.`,
|
|
4801
5120
|
"",
|
|
4802
|
-
`Command not found: ${
|
|
5121
|
+
`Command not found: ${server.command[0]}`,
|
|
4803
5122
|
""
|
|
4804
5123
|
];
|
|
5124
|
+
const installOptions = formatInstallOptions(server.id, installHint);
|
|
4805
5125
|
if (decision === "allowed") {
|
|
4806
5126
|
return [
|
|
4807
5127
|
...header,
|
|
4808
5128
|
"The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
|
|
4809
|
-
|
|
5129
|
+
...installOptions.slice(1)
|
|
4810
5130
|
].join(`
|
|
4811
5131
|
`);
|
|
4812
5132
|
}
|
|
4813
5133
|
if (!context.capabilities.installDecisionTool) {
|
|
4814
5134
|
return [
|
|
4815
5135
|
...header,
|
|
4816
|
-
|
|
4817
|
-
` ${installHint}`,
|
|
5136
|
+
...installOptions,
|
|
4818
5137
|
"",
|
|
4819
5138
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
4820
5139
|
"Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
|
|
@@ -4823,13 +5142,12 @@ function formatNotInstalled(result) {
|
|
|
4823
5142
|
}
|
|
4824
5143
|
return [
|
|
4825
5144
|
...header,
|
|
4826
|
-
|
|
4827
|
-
` ${installHint}`,
|
|
5145
|
+
...installOptions,
|
|
4828
5146
|
"",
|
|
4829
5147
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
4830
5148
|
"- If the user agrees: run the install command above, then retry this tool.",
|
|
4831
5149
|
"- If the user declines, OR has NOT explicitly asked for LSP installation:",
|
|
4832
|
-
` call lsp_install_decision { server_id: "${
|
|
5150
|
+
` call lsp_install_decision { server_id: "${server.id}", decision: "declined" },`,
|
|
4833
5151
|
` which writes to ${context.installDecisionsPath},`,
|
|
4834
5152
|
" then ignore this message and proceed WITHOUT LSP."
|
|
4835
5153
|
].join(`
|
|
@@ -4853,34 +5171,34 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
|
4853
5171
|
if (result.status !== "found") {
|
|
4854
5172
|
throw new LspServerLookupError(formatServerLookupError(result), result);
|
|
4855
5173
|
}
|
|
4856
|
-
const
|
|
5174
|
+
const server = result.server;
|
|
4857
5175
|
const root = findWorkspaceRoot(absPath);
|
|
4858
5176
|
const manager = options.manager ?? getLspManager();
|
|
4859
5177
|
const acquireAndCall = async (allowRetry) => {
|
|
4860
|
-
const client = await manager.getClient(root,
|
|
5178
|
+
const client = await manager.getClient(root, server, options.signal);
|
|
4861
5179
|
try {
|
|
4862
5180
|
return await fn(client, root, absPath);
|
|
4863
5181
|
} catch (err) {
|
|
4864
5182
|
if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
|
|
4865
|
-
manager.invalidateClient(root,
|
|
5183
|
+
manager.invalidateClient(root, server.id, client);
|
|
4866
5184
|
return acquireAndCall(false);
|
|
4867
5185
|
}
|
|
4868
5186
|
if (err instanceof LspRequestTimeoutError) {
|
|
4869
|
-
if (manager.isServerInitializing(root,
|
|
5187
|
+
if (manager.isServerInitializing(root, server.id)) {
|
|
4870
5188
|
throw new LspServerInitializingError(err);
|
|
4871
5189
|
}
|
|
4872
5190
|
}
|
|
4873
5191
|
throw err;
|
|
4874
5192
|
} finally {
|
|
4875
|
-
manager.releaseClient(root,
|
|
5193
|
+
manager.releaseClient(root, server.id);
|
|
4876
5194
|
}
|
|
4877
5195
|
};
|
|
4878
5196
|
return acquireAndCall(true);
|
|
4879
5197
|
}
|
|
4880
5198
|
|
|
4881
5199
|
// ../lsp-core/src/lsp/directory-diagnostics.ts
|
|
4882
|
-
import { existsSync as
|
|
4883
|
-
import { join as
|
|
5200
|
+
import { existsSync as existsSync12, lstatSync as lstatSync5, readdirSync as readdirSync3 } from "node:fs";
|
|
5201
|
+
import { join as join6, resolve as resolve9 } from "node:path";
|
|
4884
5202
|
|
|
4885
5203
|
// ../lsp-core/src/lsp/formatters.ts
|
|
4886
5204
|
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
@@ -4895,10 +5213,10 @@ function uriToPath(uri) {
|
|
|
4895
5213
|
}
|
|
4896
5214
|
function formatLocation(loc) {
|
|
4897
5215
|
if ("targetUri" in loc) {
|
|
4898
|
-
const
|
|
4899
|
-
const
|
|
4900
|
-
const
|
|
4901
|
-
return `${
|
|
5216
|
+
const uri = uriToPath(loc.targetUri);
|
|
5217
|
+
const line = loc.targetRange.start.line + 1;
|
|
5218
|
+
const char = loc.targetRange.start.character;
|
|
5219
|
+
return `${uri}:${line}:${char}`;
|
|
4902
5220
|
}
|
|
4903
5221
|
const uri = uriToPath(loc.uri);
|
|
4904
5222
|
const line = loc.range.start.line + 1;
|
|
@@ -5010,7 +5328,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
|
|
|
5010
5328
|
for (const entry of entries) {
|
|
5011
5329
|
if (files.length >= maxFiles)
|
|
5012
5330
|
return;
|
|
5013
|
-
const fullPath =
|
|
5331
|
+
const fullPath = join6(currentDir, entry);
|
|
5014
5332
|
let stat;
|
|
5015
5333
|
try {
|
|
5016
5334
|
stat = lstatSync5(fullPath);
|
|
@@ -5035,15 +5353,15 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
5035
5353
|
if (!extension.startsWith(".")) {
|
|
5036
5354
|
throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
|
|
5037
5355
|
}
|
|
5038
|
-
const absDir =
|
|
5039
|
-
if (!
|
|
5356
|
+
const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
|
|
5357
|
+
if (!existsSync12(absDir)) {
|
|
5040
5358
|
throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
|
|
5041
5359
|
}
|
|
5042
5360
|
const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
|
|
5043
5361
|
if (serverResult.status !== "found") {
|
|
5044
5362
|
throw new LspServerLookupError(formatServerLookupError(serverResult));
|
|
5045
5363
|
}
|
|
5046
|
-
const
|
|
5364
|
+
const server = serverResult.server;
|
|
5047
5365
|
const allFiles = (options.listFiles ?? collectFilesWithExtension)(absDir, extension, maxFiles + 1);
|
|
5048
5366
|
const wasCapped = allFiles.length > maxFiles;
|
|
5049
5367
|
const filesToProcess = allFiles.slice(0, maxFiles);
|
|
@@ -5063,7 +5381,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
5063
5381
|
const fileErrors = [];
|
|
5064
5382
|
const maxConcurrency = Math.max(1, options.maxConcurrency ?? DIRECTORY_DIAGNOSTICS_MAX_CONCURRENCY);
|
|
5065
5383
|
options.signal?.throwIfAborted();
|
|
5066
|
-
const client = await manager.getClient(root,
|
|
5384
|
+
const client = await manager.getClient(root, server, options.signal);
|
|
5067
5385
|
try {
|
|
5068
5386
|
let nextIndex = 0;
|
|
5069
5387
|
const workers = Array.from({ length: Math.min(maxConcurrency, filesToProcess.length) }, async () => {
|
|
@@ -5091,7 +5409,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
5091
5409
|
});
|
|
5092
5410
|
await Promise.all(workers);
|
|
5093
5411
|
} finally {
|
|
5094
|
-
manager.releaseClient(root,
|
|
5412
|
+
manager.releaseClient(root, server.id);
|
|
5095
5413
|
}
|
|
5096
5414
|
const displayDiagnostics = allDiagnostics.slice(0, DEFAULT_MAX_DIAGNOSTICS);
|
|
5097
5415
|
const wasDiagCapped = allDiagnostics.length > DEFAULT_MAX_DIAGNOSTICS;
|
|
@@ -5123,7 +5441,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
5123
5441
|
|
|
5124
5442
|
// ../lsp-core/src/lsp/infer-extension.ts
|
|
5125
5443
|
import { lstatSync as lstatSync6, readdirSync as readdirSync4 } from "node:fs";
|
|
5126
|
-
import { join as
|
|
5444
|
+
import { join as join7 } from "node:path";
|
|
5127
5445
|
var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
|
|
5128
5446
|
var MAX_SCAN_ENTRIES = 500;
|
|
5129
5447
|
function inferExtensionFromDirectory(directory) {
|
|
@@ -5141,7 +5459,7 @@ function inferExtensionFromDirectory(directory) {
|
|
|
5141
5459
|
for (const entry of entries) {
|
|
5142
5460
|
if (scanned >= MAX_SCAN_ENTRIES)
|
|
5143
5461
|
return;
|
|
5144
|
-
const fullPath =
|
|
5462
|
+
const fullPath = join7(dir, entry);
|
|
5145
5463
|
let stat;
|
|
5146
5464
|
try {
|
|
5147
5465
|
stat = lstatSync6(fullPath);
|
|
@@ -5300,8 +5618,8 @@ function clientOptions(signal) {
|
|
|
5300
5618
|
}
|
|
5301
5619
|
|
|
5302
5620
|
// ../lsp-core/src/tools/result.ts
|
|
5303
|
-
function text(
|
|
5304
|
-
return { content: [{ type: "text", text
|
|
5621
|
+
function text(text, details, isError = false) {
|
|
5622
|
+
return { content: [{ type: "text", text }], details, isError };
|
|
5305
5623
|
}
|
|
5306
5624
|
|
|
5307
5625
|
// ../lsp-core/src/tools/diagnostics.ts
|
|
@@ -5321,7 +5639,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
5321
5639
|
const extension = inferExtensionFromDirectory(absPath);
|
|
5322
5640
|
if (!extension) {
|
|
5323
5641
|
const message = `No supported source files found in directory: ${absPath}`;
|
|
5324
|
-
const
|
|
5642
|
+
const details = {
|
|
5325
5643
|
filePath,
|
|
5326
5644
|
severity,
|
|
5327
5645
|
mode: "directory",
|
|
@@ -5331,24 +5649,24 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
5331
5649
|
error: message,
|
|
5332
5650
|
errorKind: "no_files"
|
|
5333
5651
|
};
|
|
5334
|
-
return text(message,
|
|
5652
|
+
return text(message, details);
|
|
5335
5653
|
}
|
|
5336
|
-
const
|
|
5337
|
-
const
|
|
5654
|
+
const output = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
|
|
5655
|
+
const details = {
|
|
5338
5656
|
filePath,
|
|
5339
5657
|
severity,
|
|
5340
5658
|
mode: "directory",
|
|
5341
5659
|
diagnostics: [],
|
|
5342
|
-
totalDiagnostics:
|
|
5660
|
+
totalDiagnostics: output.totalDiagnostics,
|
|
5343
5661
|
truncated: false,
|
|
5344
|
-
fileFailures: [...
|
|
5662
|
+
fileFailures: [...output.fileFailures]
|
|
5345
5663
|
};
|
|
5346
|
-
return text(
|
|
5664
|
+
return text(output.output, details);
|
|
5347
5665
|
}
|
|
5348
5666
|
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
|
|
5349
5667
|
if (result.transientError) {
|
|
5350
5668
|
const message = result.transientError.message;
|
|
5351
|
-
const
|
|
5669
|
+
const details = {
|
|
5352
5670
|
filePath,
|
|
5353
5671
|
severity,
|
|
5354
5672
|
mode: "file",
|
|
@@ -5358,7 +5676,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
5358
5676
|
error: message,
|
|
5359
5677
|
errorKind: result.transientError.kind
|
|
5360
5678
|
};
|
|
5361
|
-
return text(message,
|
|
5679
|
+
return text(message, details, true);
|
|
5362
5680
|
}
|
|
5363
5681
|
const diagnostics = filterDiagnosticsBySeverity(asDiagnosticArray(result), severity);
|
|
5364
5682
|
const total = diagnostics.length;
|
|
@@ -5392,6 +5710,96 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
5392
5710
|
throw error;
|
|
5393
5711
|
}
|
|
5394
5712
|
}
|
|
5713
|
+
// ../lsp-core/src/lsp/format-document.ts
|
|
5714
|
+
import { readFileSync as readFileSync6, renameSync as renameSync3, unlinkSync as unlinkSync2, writeFileSync as writeFileSync3 } from "node:fs";
|
|
5715
|
+
var DEFAULT_FORMATTING_OPTIONS = {
|
|
5716
|
+
tabSize: 4,
|
|
5717
|
+
insertSpaces: false,
|
|
5718
|
+
trimTrailingWhitespace: true,
|
|
5719
|
+
insertFinalNewline: true,
|
|
5720
|
+
trimFinalNewlines: true
|
|
5721
|
+
};
|
|
5722
|
+
var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
|
|
5723
|
+
async function formatDocumentWithClient(client, filePath, options = {}) {
|
|
5724
|
+
const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
|
|
5725
|
+
if (edits === null)
|
|
5726
|
+
return { status: "unavailable", reason: "capability_not_advertised" };
|
|
5727
|
+
if (edits.length === 0)
|
|
5728
|
+
return UNCHANGED;
|
|
5729
|
+
const before = readFileSync6(filePath, "utf-8");
|
|
5730
|
+
const normalized = normalizeTextEdits(before, edits, 0);
|
|
5731
|
+
if (normalized.text === before)
|
|
5732
|
+
return UNCHANGED;
|
|
5733
|
+
writeAtomically(filePath, normalized.text);
|
|
5734
|
+
await client.openFile(filePath);
|
|
5735
|
+
return {
|
|
5736
|
+
status: "formatted",
|
|
5737
|
+
...lineDelta(normalized.edits)
|
|
5738
|
+
};
|
|
5739
|
+
}
|
|
5740
|
+
function lineDelta(edits) {
|
|
5741
|
+
let linesAdded = 0;
|
|
5742
|
+
let linesRemoved = 0;
|
|
5743
|
+
for (const edit of edits) {
|
|
5744
|
+
linesRemoved += edit.range.end.line - edit.range.start.line + 1;
|
|
5745
|
+
linesAdded += edit.newText.split(`
|
|
5746
|
+
`).length;
|
|
5747
|
+
}
|
|
5748
|
+
return { linesAdded, linesRemoved };
|
|
5749
|
+
}
|
|
5750
|
+
function writeAtomically(filePath, content) {
|
|
5751
|
+
const tempPath = `${filePath}.omo-format.tmp`;
|
|
5752
|
+
writeFileSync3(tempPath, content, "utf-8");
|
|
5753
|
+
try {
|
|
5754
|
+
renameSync3(tempPath, filePath);
|
|
5755
|
+
} catch (error) {
|
|
5756
|
+
try {
|
|
5757
|
+
unlinkSync2(tempPath);
|
|
5758
|
+
} catch {}
|
|
5759
|
+
throw error;
|
|
5760
|
+
}
|
|
5761
|
+
}
|
|
5762
|
+
|
|
5763
|
+
// ../lsp-core/src/tools/format.ts
|
|
5764
|
+
async function executeLspFormat(params, signal) {
|
|
5765
|
+
const filePath = requireString(params, "filePath");
|
|
5766
|
+
try {
|
|
5767
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
|
|
5768
|
+
return text(describeResult(filePath, result), formatDetails(filePath, result));
|
|
5769
|
+
} catch (error) {
|
|
5770
|
+
const missingDependency = missingDependencyResult(error, {
|
|
5771
|
+
filePath,
|
|
5772
|
+
status: "unavailable",
|
|
5773
|
+
reason: "server_unavailable",
|
|
5774
|
+
linesAdded: 0,
|
|
5775
|
+
linesRemoved: 0
|
|
5776
|
+
});
|
|
5777
|
+
if (missingDependency)
|
|
5778
|
+
return missingDependency;
|
|
5779
|
+
throw error;
|
|
5780
|
+
}
|
|
5781
|
+
}
|
|
5782
|
+
function formatDetails(filePath, result) {
|
|
5783
|
+
if (result.status === "unavailable") {
|
|
5784
|
+
return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
|
|
5785
|
+
}
|
|
5786
|
+
return {
|
|
5787
|
+
filePath,
|
|
5788
|
+
status: result.status,
|
|
5789
|
+
linesAdded: result.linesAdded,
|
|
5790
|
+
linesRemoved: result.linesRemoved
|
|
5791
|
+
};
|
|
5792
|
+
}
|
|
5793
|
+
function describeResult(filePath, result) {
|
|
5794
|
+
if (result.status === "unavailable") {
|
|
5795
|
+
return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
|
|
5796
|
+
}
|
|
5797
|
+
if (result.status === "unchanged") {
|
|
5798
|
+
return `Already formatted: ${filePath}`;
|
|
5799
|
+
}
|
|
5800
|
+
return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
|
|
5801
|
+
}
|
|
5802
|
+
|
|
5395
5803
|
// ../lsp-core/src/tools/install-decision.ts
|
|
5396
5804
|
async function executeLspInstallDecision(params) {
|
|
5397
5805
|
const serverId = requireString(params, "server_id");
|
|
@@ -5399,7 +5807,7 @@ async function executeLspInstallDecision(params) {
|
|
|
5399
5807
|
if (!isInstallDecision(decision)) {
|
|
5400
5808
|
return text(`Invalid decision '${String(decision)}'. Expected "declined" or "allowed".`, { serverId, errorKind: "invalid_decision" }, true);
|
|
5401
5809
|
}
|
|
5402
|
-
const serverIds = [...new Set(getMergedServers().map((
|
|
5810
|
+
const serverIds = [...new Set(getMergedServers().map((server) => server.id))];
|
|
5403
5811
|
if (!serverIds.includes(serverId)) {
|
|
5404
5812
|
const preview = serverIds.slice(0, 20).join(", ");
|
|
5405
5813
|
return text(`Unknown LSP server '${serverId}'. Known servers: ${preview}${serverIds.length > 20 ? "..." : ""}`, { serverId, errorKind: "unknown_server" }, true);
|
|
@@ -5539,10 +5947,10 @@ function objectSchema(properties, required = []) {
|
|
|
5539
5947
|
async function executeLspStatus() {
|
|
5540
5948
|
const servers = getAllServers();
|
|
5541
5949
|
const snapshots = getLspManager().getSnapshot();
|
|
5542
|
-
const installed = servers.filter((
|
|
5543
|
-
const configuredLines = servers.map((
|
|
5544
|
-
const state =
|
|
5545
|
-
return `- ${
|
|
5950
|
+
const installed = servers.filter((server) => server.installed && !server.disabled);
|
|
5951
|
+
const configuredLines = servers.map((server) => {
|
|
5952
|
+
const state = server.disabled ? "disabled" : server.installed ? "installed" : "missing";
|
|
5953
|
+
return `- ${server.id}: ${state}; source=${server.source}; extensions=${server.extensions.join(", ")}`;
|
|
5546
5954
|
});
|
|
5547
5955
|
const activeLines = snapshots.map((snapshot) => {
|
|
5548
5956
|
const state = snapshot.alive ? snapshot.isInitializing ? "initializing" : "alive" : "dead";
|
|
@@ -5585,8 +5993,8 @@ async function executeLspSymbols(params, signal) {
|
|
|
5585
5993
|
errorKind: "missing_query"
|
|
5586
5994
|
});
|
|
5587
5995
|
}
|
|
5588
|
-
const
|
|
5589
|
-
return formatSymbolsResult(filePath, scope,
|
|
5996
|
+
const symbols = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
|
|
5997
|
+
return formatSymbolsResult(filePath, scope, symbols, limit, query);
|
|
5590
5998
|
}
|
|
5591
5999
|
const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
|
|
5592
6000
|
return formatSymbolsResult(filePath, scope, symbols, limit);
|
|
@@ -5724,6 +6132,16 @@ var LSP_MCP_TOOLS = [
|
|
|
5724
6132
|
}, ["filePath", "line", "character", "newName"]),
|
|
5725
6133
|
execute: executeLspRename
|
|
5726
6134
|
},
|
|
6135
|
+
{
|
|
6136
|
+
name: "format",
|
|
6137
|
+
aliases: ["lsp_format"],
|
|
6138
|
+
title: "LSP Format",
|
|
6139
|
+
description: "Format a source file with its language server and write the returned edits to disk.",
|
|
6140
|
+
inputSchema: objectSchema({
|
|
6141
|
+
filePath: { type: "string", description: "Source file path to format." }
|
|
6142
|
+
}, ["filePath"]),
|
|
6143
|
+
execute: executeLspFormat
|
|
6144
|
+
},
|
|
5727
6145
|
{
|
|
5728
6146
|
name: "install_decision",
|
|
5729
6147
|
aliases: ["lsp_install_decision"],
|
|
@@ -5824,7 +6242,10 @@ function requestedProtocolVersion(params) {
|
|
|
5824
6242
|
var CONTEXT_KEY = "_context";
|
|
5825
6243
|
|
|
5826
6244
|
class InvalidDaemonRequestError extends Error {
|
|
5827
|
-
|
|
6245
|
+
constructor() {
|
|
6246
|
+
super(...arguments);
|
|
6247
|
+
this.name = "InvalidDaemonRequestError";
|
|
6248
|
+
}
|
|
5828
6249
|
}
|
|
5829
6250
|
function extractRequestContext(raw) {
|
|
5830
6251
|
if (!isPlainRecord(raw) || raw["method"] !== "tools/call")
|
|
@@ -5940,14 +6361,17 @@ async function callToolViaDaemon(name, args, options) {
|
|
|
5940
6361
|
function callDiagnosticsViaDaemon(filePath, options) {
|
|
5941
6362
|
return callToolViaDaemon("diagnostics", { filePath, severity: "error" }, options);
|
|
5942
6363
|
}
|
|
6364
|
+
function callFormatViaDaemon(filePath, options) {
|
|
6365
|
+
return callToolViaDaemon("format", { filePath }, options);
|
|
6366
|
+
}
|
|
5943
6367
|
function currentRequestContext(env = process.env) {
|
|
5944
6368
|
const cwd = process.cwd();
|
|
5945
6369
|
const home = env["HOME"] ?? homedir3();
|
|
5946
6370
|
return parseLspRequestContext({
|
|
5947
6371
|
cwd,
|
|
5948
|
-
projectConfigPaths: [
|
|
5949
|
-
userConfigPath:
|
|
5950
|
-
installDecisionsPath:
|
|
6372
|
+
projectConfigPaths: [join8(cwd, ".codex", "lsp-client.json")],
|
|
6373
|
+
userConfigPath: join8(home, ".codex", "lsp-client.json"),
|
|
6374
|
+
installDecisionsPath: join8(home, ".codex", "lsp-install-decisions.json"),
|
|
5951
6375
|
capabilities: { installDecisionTool: true }
|
|
5952
6376
|
});
|
|
5953
6377
|
}
|
|
@@ -5962,7 +6386,7 @@ function withContext(args, context) {
|
|
|
5962
6386
|
function ensureDaemonAvailable(paths, ensure, signal) {
|
|
5963
6387
|
if (!signal)
|
|
5964
6388
|
return ensure(paths);
|
|
5965
|
-
return new Promise((
|
|
6389
|
+
return new Promise((resolve, reject) => {
|
|
5966
6390
|
let settled = false;
|
|
5967
6391
|
const finish = (run) => {
|
|
5968
6392
|
if (settled)
|
|
@@ -5977,11 +6401,11 @@ function ensureDaemonAvailable(paths, ensure, signal) {
|
|
|
5977
6401
|
return;
|
|
5978
6402
|
}
|
|
5979
6403
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
5980
|
-
Promise.resolve().then(() => ensure(paths, signal)).then(() => finish(() =>
|
|
6404
|
+
Promise.resolve().then(() => ensure(paths, signal)).then(() => finish(() => resolve()), (error) => finish(() => reject(signal.aborted ? new DaemonRequestCancelledError(false) : error)));
|
|
5981
6405
|
});
|
|
5982
6406
|
}
|
|
5983
6407
|
function sendToolCall(paths, token, name, args, options) {
|
|
5984
|
-
return new Promise((
|
|
6408
|
+
return new Promise((resolve, reject) => {
|
|
5985
6409
|
const socket = connect(paths.socket);
|
|
5986
6410
|
const requestId = allocateProxyRequestId();
|
|
5987
6411
|
let settled = false;
|
|
@@ -6034,7 +6458,7 @@ function sendToolCall(paths, token, name, args, options) {
|
|
|
6034
6458
|
}
|
|
6035
6459
|
const result = toToolResult(message, requestId);
|
|
6036
6460
|
if (result)
|
|
6037
|
-
finish(() =>
|
|
6461
|
+
finish(() => resolve(result));
|
|
6038
6462
|
else
|
|
6039
6463
|
finish(() => reject(new DaemonRequestError("invalid daemon response", requestWritten)));
|
|
6040
6464
|
});
|
|
@@ -6079,8 +6503,8 @@ function isRetryableTool(name) {
|
|
|
6079
6503
|
return name !== "rename" && name !== "lsp_rename";
|
|
6080
6504
|
}
|
|
6081
6505
|
// src/proxy.ts
|
|
6082
|
-
import { existsSync as
|
|
6083
|
-
import { basename as basename4, delimiter as delimiter4, dirname as
|
|
6506
|
+
import { existsSync as existsSync13, realpathSync as realpathSync6 } from "node:fs";
|
|
6507
|
+
import { basename as basename4, delimiter as delimiter4, dirname as dirname11, isAbsolute as isAbsolute6 } from "node:path";
|
|
6084
6508
|
var DEFAULT_STARTUP_TIMEOUT_MS = 1e4;
|
|
6085
6509
|
async function runMcpStdioProxy(options = {}) {
|
|
6086
6510
|
const input = options.input ?? process.stdin;
|
|
@@ -6203,34 +6627,34 @@ function canonicalizePathList(value) {
|
|
|
6203
6627
|
return value.split(delimiter4).map((entry) => canonicalizePath(entry) ?? entry).join(delimiter4);
|
|
6204
6628
|
}
|
|
6205
6629
|
function canonicalizePath(value) {
|
|
6206
|
-
if (value === undefined || !
|
|
6630
|
+
if (value === undefined || !isAbsolute6(value) || !existsSync13(value))
|
|
6207
6631
|
return value;
|
|
6208
|
-
return
|
|
6632
|
+
return realpathSync6(value);
|
|
6209
6633
|
}
|
|
6210
|
-
function projectRootFromOpenCodeConfigPath(
|
|
6211
|
-
if (basename4(
|
|
6634
|
+
function projectRootFromOpenCodeConfigPath(path) {
|
|
6635
|
+
if (basename4(path) !== "lsp.json" && basename4(path) !== "lsp-client.json")
|
|
6212
6636
|
return;
|
|
6213
|
-
const configDir =
|
|
6637
|
+
const configDir = dirname11(path);
|
|
6214
6638
|
const configDirName = basename4(configDir);
|
|
6215
6639
|
if (configDirName !== ".opencode" && configDirName !== ".omo")
|
|
6216
6640
|
return;
|
|
6217
|
-
return
|
|
6641
|
+
return dirname11(configDir);
|
|
6218
6642
|
}
|
|
6219
6643
|
export {
|
|
6220
|
-
|
|
6221
|
-
runMcpStdioProxy,
|
|
6222
|
-
resolveDaemonRuntime,
|
|
6223
|
-
probeDaemon,
|
|
6224
|
-
ensureDaemonRunning,
|
|
6225
|
-
disposeDefaultLspManager,
|
|
6226
|
-
daemonPaths,
|
|
6227
|
-
currentRequestContext,
|
|
6228
|
-
callToolViaDaemon,
|
|
6229
|
-
callDiagnosticsViaDaemon,
|
|
6230
|
-
OMO_LSP_DAEMON_VERSION,
|
|
6231
|
-
OMO_LSP_DAEMON_DIR,
|
|
6232
|
-
OMO_LSP_DAEMON_CLI,
|
|
6233
|
-
InvalidRuntimeOverrideError,
|
|
6644
|
+
InvalidDaemonDirectoryError,
|
|
6234
6645
|
InvalidDaemonVersionError,
|
|
6235
|
-
|
|
6646
|
+
InvalidRuntimeOverrideError,
|
|
6647
|
+
OMO_LSP_DAEMON_CLI,
|
|
6648
|
+
OMO_LSP_DAEMON_DIR,
|
|
6649
|
+
OMO_LSP_DAEMON_VERSION,
|
|
6650
|
+
callDiagnosticsViaDaemon,
|
|
6651
|
+
callToolViaDaemon,
|
|
6652
|
+
currentRequestContext,
|
|
6653
|
+
daemonPaths,
|
|
6654
|
+
disposeDefaultLspManager,
|
|
6655
|
+
ensureDaemonRunning,
|
|
6656
|
+
probeDaemon,
|
|
6657
|
+
resolveDaemonRuntime,
|
|
6658
|
+
runMcpStdioProxy,
|
|
6659
|
+
validateDaemonVersion
|
|
6236
6660
|
};
|