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
|
@@ -175,6 +175,7 @@ async function runJsonRpcStdioServer(config) {
|
|
|
175
175
|
const idleTimer = createIdleTimer(idleTimeoutMs, log, () => {
|
|
176
176
|
isClosed = true;
|
|
177
177
|
config.onIdleTimeout?.();
|
|
178
|
+
config.input.destroy();
|
|
178
179
|
});
|
|
179
180
|
const watchdog = createParentWatchdog(config.parentWatchdog, (parentPid, pollIntervalMs) => {
|
|
180
181
|
isClosed = true;
|
|
@@ -271,7 +272,11 @@ function createParentWatchdog(config, onDeadParent) {
|
|
|
271
272
|
const probeAlive = config.probeAlive ?? isProcessAlive;
|
|
272
273
|
let fired = false;
|
|
273
274
|
const timer = setInterval(() => {
|
|
274
|
-
if (fired
|
|
275
|
+
if (fired)
|
|
276
|
+
return;
|
|
277
|
+
const alive = probeAlive(parentPid);
|
|
278
|
+
config.onPoll?.(alive);
|
|
279
|
+
if (alive)
|
|
275
280
|
return;
|
|
276
281
|
fired = true;
|
|
277
282
|
onDeadParent(parentPid, pollIntervalMs);
|
|
@@ -306,8 +311,8 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
|
|
|
306
311
|
};
|
|
307
312
|
}
|
|
308
313
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
309
|
-
import { existsSync as
|
|
310
|
-
import { basename as basename3, dirname as
|
|
314
|
+
import { existsSync as existsSync10, realpathSync as realpathSync5, statSync as statSync3 } from "node:fs";
|
|
315
|
+
import { basename as basename3, dirname as dirname8, join as join5, resolve as resolve8 } from "node:path";
|
|
311
316
|
|
|
312
317
|
// ../lsp-core/src/request-context.ts
|
|
313
318
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
@@ -316,18 +321,17 @@ import { homedir } from "node:os";
|
|
|
316
321
|
import { basename, delimiter, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
317
322
|
|
|
318
323
|
class LspRequestContextParseError extends Error {
|
|
319
|
-
code;
|
|
320
|
-
name = "LspRequestContextParseError";
|
|
321
324
|
constructor(code, message) {
|
|
322
325
|
super(message);
|
|
323
326
|
this.code = code;
|
|
327
|
+
this.name = "LspRequestContextParseError";
|
|
324
328
|
}
|
|
325
329
|
}
|
|
326
330
|
|
|
327
331
|
class LspRequestContextUnavailableError extends Error {
|
|
328
|
-
name = "LspRequestContextUnavailableError";
|
|
329
332
|
constructor() {
|
|
330
333
|
super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
|
|
334
|
+
this.name = "LspRequestContextUnavailableError";
|
|
331
335
|
}
|
|
332
336
|
}
|
|
333
337
|
var storage = new AsyncLocalStorage;
|
|
@@ -357,7 +361,7 @@ function contextEnv(key) {
|
|
|
357
361
|
}
|
|
358
362
|
function createStandaloneMcpRequestContext(input = {}) {
|
|
359
363
|
const env = input.env ?? process.env;
|
|
360
|
-
const cwd = canonicalCwd(input.cwd ?? process.cwd());
|
|
364
|
+
const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
|
|
361
365
|
const home = input.homeDir ?? homedir();
|
|
362
366
|
const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
|
|
363
367
|
const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
|
|
@@ -500,22 +504,15 @@ function effectiveExtension(filePath) {
|
|
|
500
504
|
|
|
501
505
|
// ../lsp-core/src/lsp/errors.ts
|
|
502
506
|
class LspConnectionClosedError extends Error {
|
|
503
|
-
serverId;
|
|
504
|
-
root;
|
|
505
|
-
name = "LspConnectionClosedError";
|
|
506
507
|
constructor(serverId, root, message) {
|
|
507
508
|
super(message ?? `LSP connection closed for ${serverId} at ${root}`);
|
|
508
509
|
this.serverId = serverId;
|
|
509
510
|
this.root = root;
|
|
511
|
+
this.name = "LspConnectionClosedError";
|
|
510
512
|
}
|
|
511
513
|
}
|
|
512
514
|
|
|
513
515
|
class LspProcessExitedError extends Error {
|
|
514
|
-
serverId;
|
|
515
|
-
root;
|
|
516
|
-
exitCode;
|
|
517
|
-
stderrTail;
|
|
518
|
-
name = "LspProcessExitedError";
|
|
519
516
|
constructor(serverId, root, exitCode, stderrTail) {
|
|
520
517
|
const stderrSuffix = stderrTail ? `
|
|
521
518
|
stderr tail: ${stderrTail}` : "";
|
|
@@ -524,46 +521,59 @@ stderr tail: ${stderrTail}` : "";
|
|
|
524
521
|
this.root = root;
|
|
525
522
|
this.exitCode = exitCode;
|
|
526
523
|
this.stderrTail = stderrTail;
|
|
524
|
+
this.name = "LspProcessExitedError";
|
|
527
525
|
}
|
|
528
526
|
}
|
|
529
527
|
|
|
530
528
|
class LspRequestTimeoutError extends Error {
|
|
531
|
-
method;
|
|
532
|
-
stderrTail;
|
|
533
|
-
name = "LspRequestTimeoutError";
|
|
534
529
|
constructor(method, stderrTail) {
|
|
535
530
|
const stderrSuffix = stderrTail ? `
|
|
536
531
|
recent stderr: ${stderrTail}` : "";
|
|
537
532
|
super(`LSP request timeout (method: ${method})${stderrSuffix}`);
|
|
538
533
|
this.method = method;
|
|
539
534
|
this.stderrTail = stderrTail;
|
|
535
|
+
this.name = "LspRequestTimeoutError";
|
|
540
536
|
}
|
|
541
537
|
}
|
|
542
538
|
|
|
543
539
|
class LspInvalidPathError extends Error {
|
|
544
|
-
|
|
540
|
+
constructor() {
|
|
541
|
+
super(...arguments);
|
|
542
|
+
this.name = "LspInvalidPathError";
|
|
543
|
+
}
|
|
545
544
|
}
|
|
546
545
|
|
|
547
546
|
class LspServerLookupError extends Error {
|
|
548
|
-
lookup;
|
|
549
|
-
name = "LspServerLookupError";
|
|
550
547
|
constructor(message, lookup) {
|
|
551
548
|
super(message);
|
|
552
549
|
this.lookup = lookup;
|
|
550
|
+
this.name = "LspServerLookupError";
|
|
553
551
|
}
|
|
554
552
|
}
|
|
555
553
|
|
|
556
554
|
class LspServerInitializingError extends Error {
|
|
557
|
-
originalError;
|
|
558
|
-
name = "LspServerInitializingError";
|
|
559
555
|
constructor(originalError) {
|
|
560
556
|
super(`LSP server is still initializing. Please retry in a few seconds. Original error: ${originalError.message}`);
|
|
561
557
|
this.originalError = originalError;
|
|
558
|
+
this.name = "LspServerInitializingError";
|
|
562
559
|
}
|
|
563
560
|
}
|
|
564
561
|
|
|
565
562
|
class LspProcessSpawnError extends Error {
|
|
566
|
-
|
|
563
|
+
constructor() {
|
|
564
|
+
super(...arguments);
|
|
565
|
+
this.name = "LspProcessSpawnError";
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
class LspClientRespawnBudgetExceededError extends Error {
|
|
570
|
+
constructor(serverId, root, retryLimit) {
|
|
571
|
+
super(`LSP server ${serverId} at ${root} failed to stay alive; respawn budget exhausted ` + `(${retryLimit} consecutive dead generations). Retrying after the cooldown may succeed.`);
|
|
572
|
+
this.serverId = serverId;
|
|
573
|
+
this.root = root;
|
|
574
|
+
this.retryLimit = retryLimit;
|
|
575
|
+
this.name = "LspClientRespawnBudgetExceededError";
|
|
576
|
+
}
|
|
567
577
|
}
|
|
568
578
|
function isLspDeadConnectionError(err) {
|
|
569
579
|
return err instanceof LspConnectionClosedError || err instanceof LspProcessExitedError;
|
|
@@ -586,6 +596,13 @@ import { pathToFileURL as pathToFileURL3 } from "node:url";
|
|
|
586
596
|
// ../lsp-core/src/lsp/connection.ts
|
|
587
597
|
import { pathToFileURL } from "node:url";
|
|
588
598
|
|
|
599
|
+
// ../lsp-core/src/lsp/timer-provider.ts
|
|
600
|
+
var realTimerProvider = {
|
|
601
|
+
now: () => Date.now(),
|
|
602
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
603
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
604
|
+
};
|
|
605
|
+
|
|
589
606
|
// ../lsp-core/src/lsp/constants.ts
|
|
590
607
|
var DEFAULT_MAX_REFERENCES = 200;
|
|
591
608
|
var DEFAULT_MAX_SYMBOLS = 200;
|
|
@@ -594,9 +611,12 @@ var DEFAULT_MAX_DIRECTORY_FILES = 50;
|
|
|
594
611
|
var REQUEST_TIMEOUT_MS = 15000;
|
|
595
612
|
var INIT_TIMEOUT_MS = 60000;
|
|
596
613
|
var IDLE_TIMEOUT_MS = 5 * 60000;
|
|
614
|
+
var MAX_RESIDENT_CLIENTS = 6;
|
|
597
615
|
var REAPER_INTERVAL_MS = 60000;
|
|
598
616
|
var STOP_HARD_KILL_TIMEOUT_MS = 5000;
|
|
599
617
|
var STOP_SIGKILL_GRACE_MS = 1000;
|
|
618
|
+
var CLIENT_RESPAWN_RETRY_LIMIT = 2;
|
|
619
|
+
var CLIENT_RESPAWN_COOLDOWN_MS = 60000;
|
|
600
620
|
|
|
601
621
|
// ../lsp-core/src/lsp/json-rpc-connection.ts
|
|
602
622
|
var HEADER_SEPARATOR2 = `\r
|
|
@@ -608,20 +628,31 @@ var METHOD_NOT_FOUND = -32601;
|
|
|
608
628
|
var INTERNAL_ERROR = -32603;
|
|
609
629
|
|
|
610
630
|
class JsonRpcConnection {
|
|
611
|
-
reader;
|
|
612
|
-
writer;
|
|
613
|
-
pendingRequests = new Map;
|
|
614
|
-
notificationHandlers = new Map;
|
|
615
|
-
requestHandlers = new Map;
|
|
616
|
-
closeHandlers = [];
|
|
617
|
-
errorHandlers = [];
|
|
618
|
-
inputBuffer = Buffer.alloc(0);
|
|
619
|
-
nextRequestId = 1;
|
|
620
|
-
listening = false;
|
|
621
|
-
disposed = false;
|
|
622
631
|
constructor(reader, writer) {
|
|
623
632
|
this.reader = reader;
|
|
624
633
|
this.writer = writer;
|
|
634
|
+
this.pendingRequests = new Map;
|
|
635
|
+
this.notificationHandlers = new Map;
|
|
636
|
+
this.requestHandlers = new Map;
|
|
637
|
+
this.closeHandlers = [];
|
|
638
|
+
this.errorHandlers = [];
|
|
639
|
+
this.inputBuffer = Buffer.alloc(0);
|
|
640
|
+
this.nextRequestId = 1;
|
|
641
|
+
this.listening = false;
|
|
642
|
+
this.disposed = false;
|
|
643
|
+
this.handleData = (chunk) => {
|
|
644
|
+
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
645
|
+
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
646
|
+
this.drainInputBuffer();
|
|
647
|
+
};
|
|
648
|
+
this.handleClose = () => {
|
|
649
|
+
for (const handler of this.closeHandlers) {
|
|
650
|
+
handler();
|
|
651
|
+
}
|
|
652
|
+
};
|
|
653
|
+
this.handleStreamError = (error) => {
|
|
654
|
+
this.emitError(error);
|
|
655
|
+
};
|
|
625
656
|
}
|
|
626
657
|
listen() {
|
|
627
658
|
if (this.listening)
|
|
@@ -656,7 +687,8 @@ class JsonRpcConnection {
|
|
|
656
687
|
let cancelAfterWrite = false;
|
|
657
688
|
let settled = false;
|
|
658
689
|
const writeCancel = () => this.writeMessage({ jsonrpc: "2.0", method: "$/cancelRequest", params: { id } });
|
|
659
|
-
|
|
690
|
+
let rejectAfterCancelWrite;
|
|
691
|
+
const responsePromise = new Promise((resolve, reject) => {
|
|
660
692
|
const cleanup = () => {
|
|
661
693
|
options.signal?.removeEventListener("abort", onAbort);
|
|
662
694
|
};
|
|
@@ -667,22 +699,26 @@ class JsonRpcConnection {
|
|
|
667
699
|
this.pendingRequests.delete(key);
|
|
668
700
|
cleanup();
|
|
669
701
|
const rejectCancelled = () => reject(abortError(options.signal));
|
|
702
|
+
rejectAfterCancelWrite = async () => {
|
|
703
|
+
try {
|
|
704
|
+
await writeCancel();
|
|
705
|
+
} catch (error) {
|
|
706
|
+
this.emitError(toError(error));
|
|
707
|
+
}
|
|
708
|
+
rejectCancelled();
|
|
709
|
+
};
|
|
670
710
|
if (!requestWritten) {
|
|
671
711
|
cancelAfterWrite = true;
|
|
672
|
-
rejectCancelled();
|
|
673
712
|
return;
|
|
674
713
|
}
|
|
675
|
-
|
|
676
|
-
this.emitError(toError(error));
|
|
677
|
-
rejectCancelled();
|
|
678
|
-
});
|
|
714
|
+
rejectAfterCancelWrite();
|
|
679
715
|
};
|
|
680
716
|
const onAbort = () => settleCancel();
|
|
681
717
|
this.pendingRequests.set(key, {
|
|
682
718
|
resolve(result) {
|
|
683
719
|
settled = true;
|
|
684
720
|
cleanup();
|
|
685
|
-
|
|
721
|
+
resolve(result);
|
|
686
722
|
},
|
|
687
723
|
reject(error) {
|
|
688
724
|
settled = true;
|
|
@@ -703,7 +739,7 @@ class JsonRpcConnection {
|
|
|
703
739
|
await this.writeMessage(message);
|
|
704
740
|
requestWritten = true;
|
|
705
741
|
if (cancelAfterWrite)
|
|
706
|
-
await
|
|
742
|
+
await rejectAfterCancelWrite?.();
|
|
707
743
|
} catch (error) {
|
|
708
744
|
if (settled)
|
|
709
745
|
return responsePromise;
|
|
@@ -742,19 +778,6 @@ class JsonRpcConnection {
|
|
|
742
778
|
this.notificationHandlers.clear();
|
|
743
779
|
this.requestHandlers.clear();
|
|
744
780
|
}
|
|
745
|
-
handleData = (chunk) => {
|
|
746
|
-
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
747
|
-
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
748
|
-
this.drainInputBuffer();
|
|
749
|
-
};
|
|
750
|
-
handleClose = () => {
|
|
751
|
-
for (const handler of this.closeHandlers) {
|
|
752
|
-
handler();
|
|
753
|
-
}
|
|
754
|
-
};
|
|
755
|
-
handleStreamError = (error) => {
|
|
756
|
-
this.emitError(error);
|
|
757
|
-
};
|
|
758
781
|
drainInputBuffer() {
|
|
759
782
|
while (true) {
|
|
760
783
|
const headerEnd = this.inputBuffer.indexOf(HEADER_SEPARATOR2);
|
|
@@ -854,13 +877,13 @@ class JsonRpcConnection {
|
|
|
854
877
|
const payload = `Content-Length: ${Buffer.byteLength(body, "utf8")}\r
|
|
855
878
|
\r
|
|
856
879
|
${body}`;
|
|
857
|
-
return new Promise((
|
|
880
|
+
return new Promise((resolve, reject) => {
|
|
858
881
|
this.writer.write(payload, (error) => {
|
|
859
882
|
if (error) {
|
|
860
883
|
reject(error);
|
|
861
884
|
return;
|
|
862
885
|
}
|
|
863
|
-
|
|
886
|
+
resolve();
|
|
864
887
|
});
|
|
865
888
|
});
|
|
866
889
|
}
|
|
@@ -947,9 +970,9 @@ function validateCwd(cwd) {
|
|
|
947
970
|
}
|
|
948
971
|
}
|
|
949
972
|
function wrap(proc) {
|
|
950
|
-
const exitedPromise = new Promise((
|
|
951
|
-
proc.once("close", (code) =>
|
|
952
|
-
proc.once("error", () =>
|
|
973
|
+
const exitedPromise = new Promise((resolve) => {
|
|
974
|
+
proc.once("close", (code) => resolve(code ?? 0));
|
|
975
|
+
proc.once("error", () => resolve(1));
|
|
953
976
|
});
|
|
954
977
|
if (!proc.stdin || !proc.stdout || !proc.stderr) {
|
|
955
978
|
throw new LspProcessSpawnError("Spawned process is missing one of stdin/stdout/stderr pipes");
|
|
@@ -1102,33 +1125,29 @@ function isPosition(value) {
|
|
|
1102
1125
|
|
|
1103
1126
|
// ../lsp-core/src/lsp/transport.ts
|
|
1104
1127
|
class LspClientNotStartedError extends Error {
|
|
1105
|
-
serverId;
|
|
1106
|
-
root;
|
|
1107
|
-
name = "LspClientNotStartedError";
|
|
1108
1128
|
constructor(serverId, root) {
|
|
1109
1129
|
super("LSP client not started");
|
|
1110
1130
|
this.serverId = serverId;
|
|
1111
1131
|
this.root = root;
|
|
1132
|
+
this.name = "LspClientNotStartedError";
|
|
1112
1133
|
}
|
|
1113
1134
|
}
|
|
1114
1135
|
|
|
1115
1136
|
class LspClientTransport {
|
|
1116
|
-
root
|
|
1117
|
-
server;
|
|
1118
|
-
proc = null;
|
|
1119
|
-
connection = null;
|
|
1120
|
-
stderrBuffer = [];
|
|
1121
|
-
processExited = false;
|
|
1122
|
-
diagnosticsStore = new Map;
|
|
1123
|
-
requestTimeoutMs;
|
|
1124
|
-
initializeTimeoutMs;
|
|
1125
|
-
workspaceApplyEditHandler = null;
|
|
1126
|
-
diagnosticPullSupported = false;
|
|
1127
|
-
constructor(root, server2, timeouts = {}) {
|
|
1137
|
+
constructor(root, server, timeouts = {}) {
|
|
1128
1138
|
this.root = root;
|
|
1129
|
-
this.server =
|
|
1139
|
+
this.server = server;
|
|
1140
|
+
this.proc = null;
|
|
1141
|
+
this.connection = null;
|
|
1142
|
+
this.stderrBuffer = [];
|
|
1143
|
+
this.processExited = false;
|
|
1144
|
+
this.diagnosticsStore = new Map;
|
|
1145
|
+
this.workspaceApplyEditHandler = null;
|
|
1146
|
+
this.diagnosticPullSupported = false;
|
|
1147
|
+
this.documentFormattingSupported = false;
|
|
1130
1148
|
this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
|
|
1131
1149
|
this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
1150
|
+
this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
|
|
1132
1151
|
}
|
|
1133
1152
|
pid() {
|
|
1134
1153
|
return this.proc?.pid;
|
|
@@ -1148,6 +1167,12 @@ class LspClientTransport {
|
|
|
1148
1167
|
isDiagnosticPullSupported() {
|
|
1149
1168
|
return this.diagnosticPullSupported;
|
|
1150
1169
|
}
|
|
1170
|
+
setDocumentFormattingSupported(supported) {
|
|
1171
|
+
this.documentFormattingSupported = supported;
|
|
1172
|
+
}
|
|
1173
|
+
isDocumentFormattingSupported() {
|
|
1174
|
+
return this.documentFormattingSupported;
|
|
1175
|
+
}
|
|
1151
1176
|
handlePublishDiagnostics(params) {
|
|
1152
1177
|
this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
|
|
1153
1178
|
}
|
|
@@ -1223,7 +1248,7 @@ class LspClientTransport {
|
|
|
1223
1248
|
const options = args[1];
|
|
1224
1249
|
const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
|
|
1225
1250
|
const timeoutController = new AbortController;
|
|
1226
|
-
const timeoutHandle = setTimeout(() => {
|
|
1251
|
+
const timeoutHandle = this.timerProvider.setTimeout(() => {
|
|
1227
1252
|
const stderrTail = this.stderrBuffer.slice(-5).join(`
|
|
1228
1253
|
`);
|
|
1229
1254
|
timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
|
|
@@ -1242,7 +1267,7 @@ class LspClientTransport {
|
|
|
1242
1267
|
}
|
|
1243
1268
|
throw error;
|
|
1244
1269
|
} finally {
|
|
1245
|
-
clearTimeout(timeoutHandle);
|
|
1270
|
+
this.timerProvider.clearTimeout(timeoutHandle);
|
|
1246
1271
|
combinedSignal.dispose();
|
|
1247
1272
|
}
|
|
1248
1273
|
}
|
|
@@ -1293,8 +1318,8 @@ class LspClientTransport {
|
|
|
1293
1318
|
try {
|
|
1294
1319
|
proc.kill();
|
|
1295
1320
|
let timeoutId;
|
|
1296
|
-
const timeoutPromise = new Promise((
|
|
1297
|
-
timeoutId = setTimeout(
|
|
1321
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
1322
|
+
timeoutId = setTimeout(resolve, STOP_HARD_KILL_TIMEOUT_MS);
|
|
1298
1323
|
});
|
|
1299
1324
|
await Promise.race([
|
|
1300
1325
|
proc.exited.then(() => {
|
|
@@ -1310,7 +1335,7 @@ class LspClientTransport {
|
|
|
1310
1335
|
proc.kill("SIGKILL");
|
|
1311
1336
|
await Promise.race([
|
|
1312
1337
|
proc.exited,
|
|
1313
|
-
new Promise((
|
|
1338
|
+
new Promise((resolve) => setTimeout(resolve, STOP_SIGKILL_GRACE_MS))
|
|
1314
1339
|
]);
|
|
1315
1340
|
} catch (error) {
|
|
1316
1341
|
reportBestEffortCleanupError("hard process kill", error instanceof Error ? error : String(error));
|
|
@@ -1361,6 +1386,14 @@ function supportsDiagnosticPull(capabilities) {
|
|
|
1361
1386
|
return false;
|
|
1362
1387
|
return Object.hasOwn(capabilities, "diagnosticProvider");
|
|
1363
1388
|
}
|
|
1389
|
+
function supportsDocumentFormatting(capabilities) {
|
|
1390
|
+
if (capabilities === undefined)
|
|
1391
|
+
return false;
|
|
1392
|
+
const provider = capabilities.documentFormattingProvider;
|
|
1393
|
+
if (provider === undefined || provider === null || provider === false)
|
|
1394
|
+
return false;
|
|
1395
|
+
return provider === true || typeof provider === "object";
|
|
1396
|
+
}
|
|
1364
1397
|
|
|
1365
1398
|
class LspClientConnection extends LspClientTransport {
|
|
1366
1399
|
async initialize() {
|
|
@@ -1377,6 +1410,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
1377
1410
|
references: {},
|
|
1378
1411
|
documentSymbol: { hierarchicalDocumentSymbolSupport: true },
|
|
1379
1412
|
publishDiagnostics: {},
|
|
1413
|
+
formatting: { dynamicRegistration: false },
|
|
1380
1414
|
rename: {
|
|
1381
1415
|
prepareSupport: true,
|
|
1382
1416
|
prepareSupportDefaultBehavior: 1
|
|
@@ -1418,6 +1452,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
1418
1452
|
initializationOptions: this.server.initialization
|
|
1419
1453
|
}, { timeoutMs: this.initializeTimeoutMs });
|
|
1420
1454
|
this.setDiagnosticPullSupported(supportsDiagnosticPull(result?.capabilities));
|
|
1455
|
+
this.setDocumentFormattingSupported(supportsDocumentFormatting(result?.capabilities));
|
|
1421
1456
|
await this.sendNotification("initialized", {});
|
|
1422
1457
|
await this.sendNotification("workspace/didChangeConfiguration", {
|
|
1423
1458
|
settings: { json: { validate: { enable: true } } }
|
|
@@ -1613,6 +1648,17 @@ function canonicalPath(filePath) {
|
|
|
1613
1648
|
return absolute;
|
|
1614
1649
|
}
|
|
1615
1650
|
}
|
|
1651
|
+
function normalizeDocumentUri(uri) {
|
|
1652
|
+
let decoded = uri;
|
|
1653
|
+
try {
|
|
1654
|
+
decoded = decodeURIComponent(uri);
|
|
1655
|
+
} catch {
|
|
1656
|
+
decoded = uri;
|
|
1657
|
+
}
|
|
1658
|
+
if (process.platform !== "win32")
|
|
1659
|
+
return decoded;
|
|
1660
|
+
return decoded.replace(/^(file:\/\/\/)([a-z]):/, (_match, prefix, drive) => `${prefix}${drive.toUpperCase()}:`);
|
|
1661
|
+
}
|
|
1616
1662
|
function isSameOrDescendant(candidate, parent) {
|
|
1617
1663
|
const suffix = relative2(parent, candidate);
|
|
1618
1664
|
return suffix === "" || !suffix.startsWith("..") && suffix !== "..";
|
|
@@ -1623,17 +1669,18 @@ function movedPath(candidate, oldPath, newPath) {
|
|
|
1623
1669
|
}
|
|
1624
1670
|
|
|
1625
1671
|
class WorkspaceDocumentState {
|
|
1626
|
-
sendNotification;
|
|
1627
|
-
clearDiagnostics;
|
|
1628
|
-
openDocuments = new Map;
|
|
1629
|
-
openByUri = new Map;
|
|
1630
|
-
openPromises = new Map;
|
|
1631
|
-
now;
|
|
1632
|
-
versionlessPublishQuiescenceMs;
|
|
1633
1672
|
constructor(sendNotification, clearDiagnostics, options = {}) {
|
|
1634
1673
|
this.sendNotification = sendNotification;
|
|
1635
1674
|
this.clearDiagnostics = clearDiagnostics;
|
|
1636
|
-
this.
|
|
1675
|
+
this.openDocuments = new Map;
|
|
1676
|
+
this.openByUri = new Map;
|
|
1677
|
+
this.openPromises = new Map;
|
|
1678
|
+
this.timerProvider = options.timerProvider ?? {
|
|
1679
|
+
now: options.now ?? (() => Date.now()),
|
|
1680
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
1681
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
1682
|
+
};
|
|
1683
|
+
this.now = () => this.timerProvider.now();
|
|
1637
1684
|
this.versionlessPublishQuiescenceMs = options.versionlessPublishQuiescenceMs ?? DEFAULT_VERSIONLESS_PUBLISH_QUIESCENCE_MS;
|
|
1638
1685
|
}
|
|
1639
1686
|
async openFile(filePath) {
|
|
@@ -1655,7 +1702,7 @@ class WorkspaceDocumentState {
|
|
|
1655
1702
|
return this.openDocuments.get(canonicalPath(filePath))?.version;
|
|
1656
1703
|
}
|
|
1657
1704
|
getStoredDiagnostics(uri) {
|
|
1658
|
-
const state = this.openByUri.get(uri);
|
|
1705
|
+
const state = this.openByUri.get(normalizeDocumentUri(uri));
|
|
1659
1706
|
if (!state)
|
|
1660
1707
|
return [];
|
|
1661
1708
|
return state.lastPublish?.diagnostics ?? state.pullCache?.diagnostics ?? [];
|
|
@@ -1677,13 +1724,13 @@ class WorkspaceDocumentState {
|
|
|
1677
1724
|
return state !== undefined && state.uri === snapshot.uri && state.version === snapshot.version && state.generation === snapshot.documentGeneration;
|
|
1678
1725
|
}
|
|
1679
1726
|
getPullCache(snapshot) {
|
|
1680
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1727
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1681
1728
|
if (!state?.pullCache || state.pullCache.documentVersion !== snapshot.version)
|
|
1682
1729
|
return null;
|
|
1683
1730
|
return state.pullCache;
|
|
1684
1731
|
}
|
|
1685
1732
|
recordPullDiagnostics(snapshot, report) {
|
|
1686
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1733
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1687
1734
|
if (!state)
|
|
1688
1735
|
return;
|
|
1689
1736
|
state.pullCache = {
|
|
@@ -1693,7 +1740,7 @@ class WorkspaceDocumentState {
|
|
|
1693
1740
|
};
|
|
1694
1741
|
}
|
|
1695
1742
|
recordPublishedDiagnostics(params) {
|
|
1696
|
-
const state = this.openByUri.get(params.uri);
|
|
1743
|
+
const state = this.openByUri.get(normalizeDocumentUri(params.uri));
|
|
1697
1744
|
if (!state)
|
|
1698
1745
|
return;
|
|
1699
1746
|
state.publishGeneration += 1;
|
|
@@ -1707,7 +1754,7 @@ class WorkspaceDocumentState {
|
|
|
1707
1754
|
this.notifyWaiters(state);
|
|
1708
1755
|
}
|
|
1709
1756
|
resolvePushDiagnostics(snapshot) {
|
|
1710
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1757
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1711
1758
|
if (!state?.lastPublish)
|
|
1712
1759
|
return { status: "missing" };
|
|
1713
1760
|
const publish = state.lastPublish;
|
|
@@ -1721,20 +1768,22 @@ class WorkspaceDocumentState {
|
|
|
1721
1768
|
return waitMs === 0 ? { status: "ready", diagnostics: publish.diagnostics } : { status: "wait", waitMs };
|
|
1722
1769
|
}
|
|
1723
1770
|
waitForDiagnosticsActivity(snapshot, timeoutMs) {
|
|
1724
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1771
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1725
1772
|
if (!state || timeoutMs <= 0)
|
|
1726
1773
|
return Promise.resolve();
|
|
1774
|
+
if (state.publishGeneration !== snapshot.publishGeneration)
|
|
1775
|
+
return Promise.resolve();
|
|
1727
1776
|
return new Promise((resolveActivity) => {
|
|
1728
1777
|
let settled = false;
|
|
1729
1778
|
const finish = () => {
|
|
1730
1779
|
if (settled)
|
|
1731
1780
|
return;
|
|
1732
1781
|
settled = true;
|
|
1733
|
-
clearTimeout(timer);
|
|
1782
|
+
this.timerProvider.clearTimeout(timer);
|
|
1734
1783
|
state.waiters.delete(finish);
|
|
1735
1784
|
resolveActivity();
|
|
1736
1785
|
};
|
|
1737
|
-
const timer = setTimeout(finish, timeoutMs);
|
|
1786
|
+
const timer = this.timerProvider.setTimeout(finish, timeoutMs);
|
|
1738
1787
|
if (typeof timer.unref === "function")
|
|
1739
1788
|
timer.unref();
|
|
1740
1789
|
state.waiters.add(finish);
|
|
@@ -1842,7 +1891,7 @@ class WorkspaceDocumentState {
|
|
|
1842
1891
|
waiters: new Set
|
|
1843
1892
|
};
|
|
1844
1893
|
this.openDocuments.set(path, state);
|
|
1845
|
-
this.openByUri.set(state.uri, state);
|
|
1894
|
+
this.openByUri.set(normalizeDocumentUri(state.uri), state);
|
|
1846
1895
|
this.notifyWaiters(state);
|
|
1847
1896
|
await this.sendNotification("textDocument/didOpen", {
|
|
1848
1897
|
textDocument: { uri: state.uri, languageId: state.languageId, version: state.version, text }
|
|
@@ -1867,7 +1916,7 @@ class WorkspaceDocumentState {
|
|
|
1867
1916
|
}
|
|
1868
1917
|
async closeDocument(state) {
|
|
1869
1918
|
this.openDocuments.delete(state.path);
|
|
1870
|
-
this.openByUri.delete(state.uri);
|
|
1919
|
+
this.openByUri.delete(normalizeDocumentUri(state.uri));
|
|
1871
1920
|
this.clearDiagnostics(state.uri);
|
|
1872
1921
|
this.notifyWaiters(state);
|
|
1873
1922
|
await this.sendNotification("textDocument/didClose", { textDocument: { uri: state.uri } });
|
|
@@ -1896,13 +1945,11 @@ import { dirname as dirname2, isAbsolute as isAbsolute2, relative as relative3,
|
|
|
1896
1945
|
import { fileURLToPath } from "node:url";
|
|
1897
1946
|
|
|
1898
1947
|
class WorkspaceEditPathError extends Error {
|
|
1899
|
-
path;
|
|
1900
|
-
detail;
|
|
1901
|
-
name = "WorkspaceEditPathError";
|
|
1902
1948
|
constructor(path, detail) {
|
|
1903
1949
|
super(`${detail}: ${path}`);
|
|
1904
1950
|
this.path = path;
|
|
1905
1951
|
this.detail = detail;
|
|
1952
|
+
this.name = "WorkspaceEditPathError";
|
|
1906
1953
|
}
|
|
1907
1954
|
}
|
|
1908
1955
|
function isPathInsideWorkspace(filePath, workspaceRoot) {
|
|
@@ -2194,13 +2241,11 @@ function canonicalFingerprint(operations) {
|
|
|
2194
2241
|
|
|
2195
2242
|
// ../lsp-core/src/lsp/workspace-edit-types.ts
|
|
2196
2243
|
class WorkspaceEditValidationError extends Error {
|
|
2197
|
-
changeIndex;
|
|
2198
|
-
detail;
|
|
2199
|
-
name = "WorkspaceEditValidationError";
|
|
2200
2244
|
constructor(changeIndex, detail) {
|
|
2201
2245
|
super(`change ${changeIndex}: ${detail}`);
|
|
2202
2246
|
this.changeIndex = changeIndex;
|
|
2203
2247
|
this.detail = detail;
|
|
2248
|
+
this.name = "WorkspaceEditValidationError";
|
|
2204
2249
|
}
|
|
2205
2250
|
}
|
|
2206
2251
|
|
|
@@ -2286,14 +2331,14 @@ function parseSinglePathResource(input, kind) {
|
|
|
2286
2331
|
return;
|
|
2287
2332
|
}
|
|
2288
2333
|
if (kind === "create") {
|
|
2289
|
-
const
|
|
2334
|
+
const options = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
|
|
2290
2335
|
target.operations.push({
|
|
2291
2336
|
kind,
|
|
2292
2337
|
changeIndex,
|
|
2293
2338
|
path: resolvedPath.path,
|
|
2294
2339
|
reportedPath: resolvedPath.requestedPath,
|
|
2295
|
-
overwrite:
|
|
2296
|
-
ignoreIfExists:
|
|
2340
|
+
overwrite: options["overwrite"] ?? false,
|
|
2341
|
+
ignoreIfExists: options["ignoreIfExists"] ?? false,
|
|
2297
2342
|
followedSymbolicLink: resolvedPath.followedSymbolicLink
|
|
2298
2343
|
});
|
|
2299
2344
|
return;
|
|
@@ -2698,10 +2743,9 @@ function simulateDelete(operation, virtual) {
|
|
|
2698
2743
|
import { existsSync as existsSync5, lstatSync as lstatSync3, readdirSync as readdirSync2 } from "node:fs";
|
|
2699
2744
|
import { dirname as dirname4, resolve as resolve5 } from "node:path";
|
|
2700
2745
|
class WorkspaceSnapshotBuilder {
|
|
2701
|
-
workspaceRoot;
|
|
2702
|
-
snapshots = new Map;
|
|
2703
2746
|
constructor(workspaceRoot) {
|
|
2704
2747
|
this.workspaceRoot = workspaceRoot;
|
|
2748
|
+
this.snapshots = new Map;
|
|
2705
2749
|
}
|
|
2706
2750
|
build(operations) {
|
|
2707
2751
|
this.add(this.workspaceRoot, false);
|
|
@@ -2745,8 +2789,10 @@ function snapshotOperations(operations, workspaceRoot) {
|
|
|
2745
2789
|
|
|
2746
2790
|
// ../lsp-core/src/lsp/workspace-edit-plan.ts
|
|
2747
2791
|
class PlanPathIndex {
|
|
2748
|
-
|
|
2749
|
-
|
|
2792
|
+
constructor() {
|
|
2793
|
+
this.firstChangeByPath = new Map;
|
|
2794
|
+
this.reportedPathByCanonical = new Map;
|
|
2795
|
+
}
|
|
2750
2796
|
build(operations) {
|
|
2751
2797
|
for (const operation of operations) {
|
|
2752
2798
|
switch (operation.kind) {
|
|
@@ -2762,11 +2808,11 @@ class PlanPathIndex {
|
|
|
2762
2808
|
}
|
|
2763
2809
|
}
|
|
2764
2810
|
}
|
|
2765
|
-
add(path,
|
|
2811
|
+
add(path, reportedPath, changeIndex) {
|
|
2766
2812
|
if (!this.firstChangeByPath.has(path))
|
|
2767
2813
|
this.firstChangeByPath.set(path, changeIndex);
|
|
2768
2814
|
if (!this.reportedPathByCanonical.has(path))
|
|
2769
|
-
this.reportedPathByCanonical.set(path,
|
|
2815
|
+
this.reportedPathByCanonical.set(path, reportedPath);
|
|
2770
2816
|
}
|
|
2771
2817
|
}
|
|
2772
2818
|
function fingerprintWorkspaceEdit(edit, workspaceRoot) {
|
|
@@ -2835,14 +2881,11 @@ function isRecord4(value) {
|
|
|
2835
2881
|
}
|
|
2836
2882
|
|
|
2837
2883
|
class WorkspaceMutationController {
|
|
2838
|
-
workspaceRoot;
|
|
2839
|
-
documents;
|
|
2840
|
-
activeLease = null;
|
|
2841
|
-
nextLeaseId = 1;
|
|
2842
|
-
io;
|
|
2843
2884
|
constructor(workspaceRoot, documents) {
|
|
2844
2885
|
this.workspaceRoot = workspaceRoot;
|
|
2845
2886
|
this.documents = documents;
|
|
2887
|
+
this.activeLease = null;
|
|
2888
|
+
this.nextLeaseId = 1;
|
|
2846
2889
|
}
|
|
2847
2890
|
setIo(io) {
|
|
2848
2891
|
this.io = io;
|
|
@@ -2881,15 +2924,15 @@ class WorkspaceMutationController {
|
|
|
2881
2924
|
};
|
|
2882
2925
|
}
|
|
2883
2926
|
lease.phase = "applying";
|
|
2884
|
-
lease.applyCompletion = new Promise((
|
|
2885
|
-
lease.resolveApply =
|
|
2927
|
+
lease.applyCompletion = new Promise((resolve) => {
|
|
2928
|
+
lease.resolveApply = resolve;
|
|
2886
2929
|
});
|
|
2887
2930
|
const edit = isRecord4(params) ? params["edit"] : undefined;
|
|
2888
|
-
const
|
|
2889
|
-
lease.serverApply =
|
|
2931
|
+
const record = edit === undefined ? { fingerprint: null, result: failure("workspace/applyEdit params.edit is required", 0) } : await this.applyEdit(edit, lease);
|
|
2932
|
+
lease.serverApply = record;
|
|
2890
2933
|
lease.phase = "settled";
|
|
2891
2934
|
lease.resolveApply?.();
|
|
2892
|
-
return responseFor(
|
|
2935
|
+
return responseFor(record.result);
|
|
2893
2936
|
}
|
|
2894
2937
|
async reconcileRename(leaseToken, edit) {
|
|
2895
2938
|
const lease = this.requireActiveLease(leaseToken);
|
|
@@ -2905,16 +2948,16 @@ class WorkspaceMutationController {
|
|
|
2905
2948
|
const applied = await this.applyEdit(edit, lease);
|
|
2906
2949
|
return { edit, apply: applied.result };
|
|
2907
2950
|
}
|
|
2908
|
-
reconcileServerApply(
|
|
2951
|
+
reconcileServerApply(record, edit) {
|
|
2909
2952
|
if (!edit)
|
|
2910
|
-
return { edit, apply:
|
|
2953
|
+
return { edit, apply: record.result };
|
|
2911
2954
|
const fingerprint = fingerprintWorkspaceEdit(edit, this.workspaceRoot);
|
|
2912
|
-
if (fingerprint.success &&
|
|
2913
|
-
return { edit, apply:
|
|
2955
|
+
if (fingerprint.success && record.fingerprint !== null && fingerprint.fingerprint === record.fingerprint) {
|
|
2956
|
+
return { edit, apply: record.result };
|
|
2914
2957
|
}
|
|
2915
2958
|
return {
|
|
2916
2959
|
edit,
|
|
2917
|
-
apply: failure("rename result conflicts with server-applied workspace edit", 0,
|
|
2960
|
+
apply: failure("rename result conflicts with server-applied workspace edit", 0, record.result)
|
|
2918
2961
|
};
|
|
2919
2962
|
}
|
|
2920
2963
|
async applyEdit(edit, lease) {
|
|
@@ -2955,14 +2998,12 @@ var DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3000;
|
|
|
2955
2998
|
var VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
|
|
2956
2999
|
|
|
2957
3000
|
class LspClient extends LspClientConnection {
|
|
2958
|
-
|
|
2959
|
-
|
|
2960
|
-
|
|
2961
|
-
diagnosticsFreshnessTimeoutMs;
|
|
2962
|
-
constructor(root, server2, options = {}) {
|
|
2963
|
-
super(root, server2, options);
|
|
3001
|
+
constructor(root, server, options = {}) {
|
|
3002
|
+
super(root, server, options);
|
|
3003
|
+
this.diagnosticPullErrors = [];
|
|
2964
3004
|
this.diagnosticsFreshnessTimeoutMs = options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
|
|
2965
3005
|
this.documents = new WorkspaceDocumentState((method, params) => this.sendNotification(method, params), (uri) => this.diagnosticsStore.delete(uri), {
|
|
3006
|
+
timerProvider: this.timerProvider,
|
|
2966
3007
|
versionlessPublishQuiescenceMs: options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS
|
|
2967
3008
|
});
|
|
2968
3009
|
this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
|
|
@@ -3015,6 +3056,18 @@ class LspClient extends LspClientConnection {
|
|
|
3015
3056
|
textDocument: { uri: pathToFileURL3(absPath).href }
|
|
3016
3057
|
}, options);
|
|
3017
3058
|
}
|
|
3059
|
+
async formatDocument(filePath, options, signal) {
|
|
3060
|
+
if (!this.isDocumentFormattingSupported())
|
|
3061
|
+
return null;
|
|
3062
|
+
const absPath = this.resolveWorkspacePath(filePath);
|
|
3063
|
+
await this.openFile(absPath);
|
|
3064
|
+
const requestOptions = signal === undefined ? {} : { signal };
|
|
3065
|
+
const edits = await this.sendRequest("textDocument/formatting", {
|
|
3066
|
+
textDocument: { uri: pathToFileURL3(absPath).href },
|
|
3067
|
+
options
|
|
3068
|
+
}, requestOptions);
|
|
3069
|
+
return edits ?? [];
|
|
3070
|
+
}
|
|
3018
3071
|
async workspaceSymbols(query, signal) {
|
|
3019
3072
|
const options = signal === undefined ? {} : { signal };
|
|
3020
3073
|
return this.sendRequest("workspace/symbol", { query }, options);
|
|
@@ -3054,7 +3107,7 @@ class LspClient extends LspClientConnection {
|
|
|
3054
3107
|
const absPath = this.resolveWorkspacePath(filePath);
|
|
3055
3108
|
const uri = pathToFileURL3(absPath).href;
|
|
3056
3109
|
await this.openFile(absPath);
|
|
3057
|
-
const deadlineAt =
|
|
3110
|
+
const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
|
|
3058
3111
|
for (;; ) {
|
|
3059
3112
|
signal?.throwIfAborted();
|
|
3060
3113
|
const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
|
|
@@ -3067,13 +3120,13 @@ class LspClient extends LspClientConnection {
|
|
|
3067
3120
|
if (!pushFallbackOnly) {
|
|
3068
3121
|
const cached = this.documents.getPullCache(snapshot);
|
|
3069
3122
|
try {
|
|
3070
|
-
const
|
|
3071
|
-
if (
|
|
3123
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
3124
|
+
if (remainingMs <= 0)
|
|
3072
3125
|
return this.freshnessTimeout(absPath);
|
|
3073
3126
|
const result = await this.sendRequest("textDocument/diagnostic", {
|
|
3074
3127
|
textDocument: { uri },
|
|
3075
3128
|
...cached?.resultId === undefined ? {} : { previousResultId: cached.resultId }
|
|
3076
|
-
}, { timeoutMs:
|
|
3129
|
+
}, { timeoutMs: remainingMs, ...signal === undefined ? {} : { signal } });
|
|
3077
3130
|
if (!this.documents.isCurrentSnapshot(snapshot))
|
|
3078
3131
|
continue;
|
|
3079
3132
|
const report = this.parseDiagnosticPullReport(result);
|
|
@@ -3102,7 +3155,7 @@ class LspClient extends LspClientConnection {
|
|
|
3102
3155
|
}
|
|
3103
3156
|
if (!pushFallbackOnly)
|
|
3104
3157
|
continue;
|
|
3105
|
-
const remainingMs = deadlineAt -
|
|
3158
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
3106
3159
|
if (remainingMs <= 0) {
|
|
3107
3160
|
if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
|
|
3108
3161
|
const cached = this.documents.getPullCache(snapshot);
|
|
@@ -3154,7 +3207,7 @@ function waitForDiagnosticsActivity(wait, signal) {
|
|
|
3154
3207
|
return wait;
|
|
3155
3208
|
if (signal.aborted)
|
|
3156
3209
|
return Promise.reject(abortError2(signal));
|
|
3157
|
-
return new Promise((
|
|
3210
|
+
return new Promise((resolve, reject) => {
|
|
3158
3211
|
const onAbort = () => {
|
|
3159
3212
|
signal.removeEventListener("abort", onAbort);
|
|
3160
3213
|
reject(abortError2(signal));
|
|
@@ -3162,7 +3215,7 @@ function waitForDiagnosticsActivity(wait, signal) {
|
|
|
3162
3215
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
3163
3216
|
wait.then(() => {
|
|
3164
3217
|
signal.removeEventListener("abort", onAbort);
|
|
3165
|
-
|
|
3218
|
+
resolve();
|
|
3166
3219
|
}, (error) => {
|
|
3167
3220
|
signal.removeEventListener("abort", onAbort);
|
|
3168
3221
|
reject(error);
|
|
@@ -3230,7 +3283,7 @@ async function stopClientBestEffort(client) {
|
|
|
3230
3283
|
function awaitWithSignal(promise, signal) {
|
|
3231
3284
|
if (!signal)
|
|
3232
3285
|
return promise;
|
|
3233
|
-
return new Promise((
|
|
3286
|
+
return new Promise((resolve, reject) => {
|
|
3234
3287
|
let settled = false;
|
|
3235
3288
|
const onAbort = () => {
|
|
3236
3289
|
if (settled)
|
|
@@ -3248,7 +3301,7 @@ function awaitWithSignal(promise, signal) {
|
|
|
3248
3301
|
return;
|
|
3249
3302
|
settled = true;
|
|
3250
3303
|
signal.removeEventListener("abort", onAbort);
|
|
3251
|
-
|
|
3304
|
+
resolve(value);
|
|
3252
3305
|
}, (err) => {
|
|
3253
3306
|
if (settled)
|
|
3254
3307
|
return;
|
|
@@ -3260,20 +3313,18 @@ function awaitWithSignal(promise, signal) {
|
|
|
3260
3313
|
}
|
|
3261
3314
|
|
|
3262
3315
|
class LspManager {
|
|
3263
|
-
clients = new Map;
|
|
3264
|
-
reaperHandle = null;
|
|
3265
|
-
signalDisposer = null;
|
|
3266
|
-
disposed = false;
|
|
3267
|
-
idleTimeoutMs;
|
|
3268
|
-
initTimeoutMs;
|
|
3269
|
-
reaperIntervalMs;
|
|
3270
|
-
clientFactory;
|
|
3271
|
-
now;
|
|
3272
3316
|
constructor(options = {}) {
|
|
3317
|
+
this.clients = new Map;
|
|
3318
|
+
this.pendingStops = new Map;
|
|
3319
|
+
this.respawnBudgets = new Map;
|
|
3320
|
+
this.reaperHandle = null;
|
|
3321
|
+
this.signalDisposer = null;
|
|
3322
|
+
this.disposed = false;
|
|
3273
3323
|
this.idleTimeoutMs = options.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
|
|
3274
3324
|
this.initTimeoutMs = options.initTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
3325
|
+
this.maxResidentClients = options.maxResidentClients ?? MAX_RESIDENT_CLIENTS;
|
|
3275
3326
|
this.reaperIntervalMs = options.reaperIntervalMs ?? REAPER_INTERVAL_MS;
|
|
3276
|
-
this.clientFactory = options.clientFactory ?? ((root,
|
|
3327
|
+
this.clientFactory = options.clientFactory ?? ((root, server) => new LspClient(root, server));
|
|
3277
3328
|
this.now = options.now ?? (() => Date.now());
|
|
3278
3329
|
this.startReaper();
|
|
3279
3330
|
this.signalDisposer = installProcessSignalCleanup(() => this.stopAll());
|
|
@@ -3291,38 +3342,103 @@ class LspManager {
|
|
|
3291
3342
|
getKey(root, serverId) {
|
|
3292
3343
|
return `${root}::${serverId}`;
|
|
3293
3344
|
}
|
|
3345
|
+
tombstoneStop(key, client) {
|
|
3346
|
+
const stop = stopClientBestEffort(client);
|
|
3347
|
+
this.pendingStops.set(key, stop);
|
|
3348
|
+
stop.finally(() => {
|
|
3349
|
+
if (this.pendingStops.get(key) === stop) {
|
|
3350
|
+
this.pendingStops.delete(key);
|
|
3351
|
+
}
|
|
3352
|
+
});
|
|
3353
|
+
return stop;
|
|
3354
|
+
}
|
|
3355
|
+
recordDeadGeneration(key) {
|
|
3356
|
+
let budget = this.respawnBudgets.get(key);
|
|
3357
|
+
if (budget === undefined) {
|
|
3358
|
+
budget = { deadGenerations: 0, exhaustedAt: null };
|
|
3359
|
+
this.respawnBudgets.set(key, budget);
|
|
3360
|
+
}
|
|
3361
|
+
budget.deadGenerations += 1;
|
|
3362
|
+
}
|
|
3363
|
+
markHealthyGeneration(key) {
|
|
3364
|
+
this.respawnBudgets.delete(key);
|
|
3365
|
+
}
|
|
3366
|
+
ensureRespawnAllowed(key, root, serverId) {
|
|
3367
|
+
const budget = this.respawnBudgets.get(key);
|
|
3368
|
+
if (budget === undefined || budget.deadGenerations < CLIENT_RESPAWN_RETRY_LIMIT)
|
|
3369
|
+
return;
|
|
3370
|
+
if (budget.exhaustedAt === null) {
|
|
3371
|
+
budget.exhaustedAt = this.now();
|
|
3372
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
3373
|
+
}
|
|
3374
|
+
if (this.now() - budget.exhaustedAt < CLIENT_RESPAWN_COOLDOWN_MS) {
|
|
3375
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
3376
|
+
}
|
|
3377
|
+
budget.deadGenerations = 0;
|
|
3378
|
+
budget.exhaustedAt = null;
|
|
3379
|
+
}
|
|
3294
3380
|
reapStale() {
|
|
3295
3381
|
const t = this.now();
|
|
3296
3382
|
for (const [key, managed] of this.clients) {
|
|
3297
3383
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
3298
|
-
stopClientBestEffort(managed.client);
|
|
3299
3384
|
this.clients.delete(key);
|
|
3385
|
+
this.tombstoneStop(key, managed.client);
|
|
3300
3386
|
continue;
|
|
3301
3387
|
}
|
|
3302
3388
|
if (!managed.isInitializing && managed.refCount === 0 && managed.pendingWaiters === 0 && t - managed.lastUsedAt > this.idleTimeoutMs) {
|
|
3303
|
-
stopClientBestEffort(managed.client);
|
|
3304
3389
|
this.clients.delete(key);
|
|
3390
|
+
this.tombstoneStop(key, managed.client);
|
|
3391
|
+
}
|
|
3392
|
+
}
|
|
3393
|
+
}
|
|
3394
|
+
evictForAdmission() {
|
|
3395
|
+
while (this.clients.size >= this.maxResidentClients) {
|
|
3396
|
+
const victim = this.leastRecentlyUsedIdleClient();
|
|
3397
|
+
if (!victim)
|
|
3398
|
+
return;
|
|
3399
|
+
this.clients.delete(victim.key);
|
|
3400
|
+
this.tombstoneStop(victim.key, victim.managed.client);
|
|
3401
|
+
}
|
|
3402
|
+
}
|
|
3403
|
+
leastRecentlyUsedIdleClient() {
|
|
3404
|
+
let candidate = null;
|
|
3405
|
+
for (const [key, managed] of this.clients) {
|
|
3406
|
+
if (managed.refCount > 0 || managed.pendingWaiters > 0 || managed.isInitializing)
|
|
3407
|
+
continue;
|
|
3408
|
+
if (candidate === null || managed.lastUsedAt < candidate.managed.lastUsedAt) {
|
|
3409
|
+
candidate = { key, managed };
|
|
3305
3410
|
}
|
|
3306
3411
|
}
|
|
3412
|
+
return candidate;
|
|
3307
3413
|
}
|
|
3308
3414
|
async tryDeleteIfOrphaned(key, managed) {
|
|
3309
3415
|
if (managed.refCount === 0 && managed.pendingWaiters === 0 && !managed.isInitializing && this.clients.get(key) === managed) {
|
|
3310
3416
|
this.clients.delete(key);
|
|
3311
|
-
await
|
|
3417
|
+
await this.tombstoneStop(key, managed.client);
|
|
3312
3418
|
}
|
|
3313
3419
|
}
|
|
3314
|
-
async getClient(root,
|
|
3420
|
+
async getClient(root, server, signal) {
|
|
3315
3421
|
if (this.disposed) {
|
|
3316
3422
|
throw new Error("LspManager has been disposed");
|
|
3317
3423
|
}
|
|
3318
3424
|
signal?.throwIfAborted();
|
|
3319
|
-
const key = this.getKey(root,
|
|
3425
|
+
const key = this.getKey(root, server.id);
|
|
3426
|
+
for (;; ) {
|
|
3427
|
+
const pendingStop = this.pendingStops.get(key);
|
|
3428
|
+
if (pendingStop === undefined)
|
|
3429
|
+
break;
|
|
3430
|
+
await awaitWithSignal(pendingStop, signal);
|
|
3431
|
+
signal?.throwIfAborted();
|
|
3432
|
+
}
|
|
3433
|
+
if (this.disposed) {
|
|
3434
|
+
throw new Error("LspManager has been disposed");
|
|
3435
|
+
}
|
|
3320
3436
|
let managed = this.clients.get(key);
|
|
3321
3437
|
if (managed) {
|
|
3322
3438
|
const t = this.now();
|
|
3323
3439
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
3324
|
-
await stopClientBestEffort(managed.client);
|
|
3325
3440
|
this.clients.delete(key);
|
|
3441
|
+
await this.tombstoneStop(key, managed.client);
|
|
3326
3442
|
managed = undefined;
|
|
3327
3443
|
}
|
|
3328
3444
|
}
|
|
@@ -3343,15 +3459,21 @@ class LspManager {
|
|
|
3343
3459
|
signal.throwIfAborted();
|
|
3344
3460
|
}
|
|
3345
3461
|
if (!managed.client.isAlive()) {
|
|
3346
|
-
|
|
3347
|
-
this.clients.
|
|
3348
|
-
|
|
3462
|
+
this.recordDeadGeneration(key);
|
|
3463
|
+
if (this.clients.get(key) === managed) {
|
|
3464
|
+
this.clients.delete(key);
|
|
3465
|
+
}
|
|
3466
|
+
await this.tombstoneStop(key, managed.client);
|
|
3467
|
+
return this.getClient(root, server, signal);
|
|
3349
3468
|
}
|
|
3469
|
+
this.markHealthyGeneration(key);
|
|
3350
3470
|
managed.refCount++;
|
|
3351
3471
|
managed.lastUsedAt = this.now();
|
|
3352
3472
|
return managed.client;
|
|
3353
3473
|
}
|
|
3354
|
-
|
|
3474
|
+
this.evictForAdmission();
|
|
3475
|
+
this.ensureRespawnAllowed(key, root, server.id);
|
|
3476
|
+
const client = this.clientFactory(root, server);
|
|
3355
3477
|
const initStartedAt = this.now();
|
|
3356
3478
|
const initPromise = (async () => {
|
|
3357
3479
|
await client.start();
|
|
@@ -3374,7 +3496,7 @@ class LspManager {
|
|
|
3374
3496
|
if (this.clients.get(key) === newManaged) {
|
|
3375
3497
|
this.clients.delete(key);
|
|
3376
3498
|
}
|
|
3377
|
-
await
|
|
3499
|
+
await this.tombstoneStop(key, client);
|
|
3378
3500
|
throw err;
|
|
3379
3501
|
}
|
|
3380
3502
|
newManaged.pendingWaiters--;
|
|
@@ -3385,6 +3507,15 @@ class LspManager {
|
|
|
3385
3507
|
await this.tryDeleteIfOrphaned(key, newManaged);
|
|
3386
3508
|
signal.throwIfAborted();
|
|
3387
3509
|
}
|
|
3510
|
+
if (!client.isAlive()) {
|
|
3511
|
+
this.recordDeadGeneration(key);
|
|
3512
|
+
if (this.clients.get(key) === newManaged) {
|
|
3513
|
+
this.clients.delete(key);
|
|
3514
|
+
}
|
|
3515
|
+
await this.tombstoneStop(key, client);
|
|
3516
|
+
return this.getClient(root, server, signal);
|
|
3517
|
+
}
|
|
3518
|
+
this.markHealthyGeneration(key);
|
|
3388
3519
|
newManaged.refCount++;
|
|
3389
3520
|
newManaged.lastUsedAt = this.now();
|
|
3390
3521
|
return client;
|
|
@@ -3405,15 +3536,21 @@ class LspManager {
|
|
|
3405
3536
|
if (client && managed.client !== client)
|
|
3406
3537
|
return;
|
|
3407
3538
|
this.clients.delete(key);
|
|
3408
|
-
|
|
3539
|
+
this.tombstoneStop(key, managed.client);
|
|
3409
3540
|
}
|
|
3410
|
-
warmupClient(root,
|
|
3541
|
+
warmupClient(root, server) {
|
|
3411
3542
|
if (this.disposed)
|
|
3412
3543
|
return;
|
|
3413
|
-
const key = this.getKey(root,
|
|
3414
|
-
if (this.clients.has(key))
|
|
3544
|
+
const key = this.getKey(root, server.id);
|
|
3545
|
+
if (this.clients.has(key) || this.pendingStops.has(key))
|
|
3546
|
+
return;
|
|
3547
|
+
this.evictForAdmission();
|
|
3548
|
+
try {
|
|
3549
|
+
this.ensureRespawnAllowed(key, root, server.id);
|
|
3550
|
+
} catch {
|
|
3415
3551
|
return;
|
|
3416
|
-
|
|
3552
|
+
}
|
|
3553
|
+
const client = this.clientFactory(root, server);
|
|
3417
3554
|
const initStartedAt = this.now();
|
|
3418
3555
|
const initPromise = (async () => {
|
|
3419
3556
|
await client.start();
|
|
@@ -3438,7 +3575,7 @@ class LspManager {
|
|
|
3438
3575
|
if (this.clients.get(key) === managed) {
|
|
3439
3576
|
this.clients.delete(key);
|
|
3440
3577
|
}
|
|
3441
|
-
|
|
3578
|
+
this.tombstoneStop(key, client);
|
|
3442
3579
|
});
|
|
3443
3580
|
}
|
|
3444
3581
|
isServerInitializing(root, serverId) {
|
|
@@ -3482,8 +3619,11 @@ class LspManager {
|
|
|
3482
3619
|
for (const managed of this.clients.values()) {
|
|
3483
3620
|
stopPromises.push(stopClientBestEffort(managed.client));
|
|
3484
3621
|
}
|
|
3622
|
+
const tombstonedStops = [...this.pendingStops.values()];
|
|
3485
3623
|
this.clients.clear();
|
|
3486
|
-
|
|
3624
|
+
this.respawnBudgets.clear();
|
|
3625
|
+
await Promise.allSettled([...stopPromises, ...tombstonedStops]);
|
|
3626
|
+
this.pendingStops.clear();
|
|
3487
3627
|
}
|
|
3488
3628
|
}
|
|
3489
3629
|
var _defaultInstance = null;
|
|
@@ -3501,57 +3641,52 @@ async function disposeDefaultLspManager() {
|
|
|
3501
3641
|
}
|
|
3502
3642
|
}
|
|
3503
3643
|
|
|
3504
|
-
// ../lsp-core/src/lsp/
|
|
3505
|
-
import { existsSync as existsSync6,
|
|
3506
|
-
import { dirname as dirname5 } from "node:path";
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
|
|
3515
|
-
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
3644
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
3645
|
+
import { existsSync as existsSync6, realpathSync as realpathSync4 } from "node:fs";
|
|
3646
|
+
import { dirname as dirname5, join as join3 } from "node:path";
|
|
3647
|
+
|
|
3648
|
+
// ../lsp-core/src/lsp/workspace-markers.ts
|
|
3649
|
+
var GIT_WORKSPACE_MARKER = ".git";
|
|
3650
|
+
var PROJECT_WORKSPACE_MARKERS = [
|
|
3651
|
+
"package.json",
|
|
3652
|
+
"pyproject.toml",
|
|
3653
|
+
"Cargo.toml",
|
|
3654
|
+
"go.mod",
|
|
3655
|
+
"pom.xml",
|
|
3656
|
+
"build.gradle"
|
|
3657
|
+
];
|
|
3658
|
+
var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
|
|
3659
|
+
|
|
3660
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
3661
|
+
function findWorkspaceRootOutsideContext(directory) {
|
|
3662
|
+
const marked = nearestMarkedAncestor(directory);
|
|
3663
|
+
if (marked !== undefined)
|
|
3664
|
+
return marked;
|
|
3665
|
+
return realpathSync4(nearestExistingAncestor(directory));
|
|
3666
|
+
}
|
|
3667
|
+
function nearestMarkedAncestor(directory) {
|
|
3668
|
+
let current = directory;
|
|
3669
|
+
for (;; ) {
|
|
3670
|
+
if (existsSync6(current) && WORKSPACE_MARKERS.some((marker) => existsSync6(join3(current, marker)))) {
|
|
3671
|
+
return realpathSync4(current);
|
|
3672
|
+
}
|
|
3673
|
+
const parent = dirname5(current);
|
|
3674
|
+
if (parent === current)
|
|
3675
|
+
return;
|
|
3676
|
+
current = parent;
|
|
3519
3677
|
}
|
|
3520
3678
|
}
|
|
3521
|
-
function
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
}
|
|
3529
|
-
|
|
3530
|
-
return value === "declined" || value === "allowed";
|
|
3531
|
-
}
|
|
3532
|
-
function writeInstallDecisions(decisions) {
|
|
3533
|
-
const path = getInstallDecisionsPath();
|
|
3534
|
-
mkdirSync(dirname5(path), { recursive: true });
|
|
3535
|
-
const tmpPath = `${path}.tmp`;
|
|
3536
|
-
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
3537
|
-
`, "utf8");
|
|
3538
|
-
renameSync2(tmpPath, path);
|
|
3539
|
-
}
|
|
3540
|
-
function isInstallDecisions(value) {
|
|
3541
|
-
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
3542
|
-
}
|
|
3543
|
-
function isInstallDecisionRecord(value) {
|
|
3544
|
-
if (!isRecord5(value))
|
|
3545
|
-
return false;
|
|
3546
|
-
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
3547
|
-
}
|
|
3548
|
-
function isRecord5(value) {
|
|
3549
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3679
|
+
function nearestExistingAncestor(directory) {
|
|
3680
|
+
let current = directory;
|
|
3681
|
+
while (!existsSync6(current)) {
|
|
3682
|
+
const parent = dirname5(current);
|
|
3683
|
+
if (parent === current)
|
|
3684
|
+
return current;
|
|
3685
|
+
current = parent;
|
|
3686
|
+
}
|
|
3687
|
+
return current;
|
|
3550
3688
|
}
|
|
3551
3689
|
|
|
3552
|
-
// ../lsp-core/src/lsp/config-loader.ts
|
|
3553
|
-
import { existsSync as existsSync7, readFileSync as readFileSync4 } from "node:fs";
|
|
3554
|
-
|
|
3555
3690
|
// ../lsp-core/src/lsp/server-definitions.ts
|
|
3556
3691
|
var LSP_INSTALL_HINTS = {
|
|
3557
3692
|
typescript: "npm install -g typescript-language-server typescript",
|
|
@@ -3597,6 +3732,26 @@ var LSP_INSTALL_HINTS = {
|
|
|
3597
3732
|
julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
|
|
3598
3733
|
razor: "Razor runs through the Roslyn language server (cohosting). " + "Install: dotnet tool install -g roslyn-language-server --prerelease (requires v5.8.0+). See https://github.com/dotnet/razor"
|
|
3599
3734
|
};
|
|
3735
|
+
var LSP_LOCAL_INSTALL_HINTS = {
|
|
3736
|
+
typescript: "bun add -d typescript-language-server typescript",
|
|
3737
|
+
vue: "bun add -d @vue/language-server",
|
|
3738
|
+
eslint: "bun add -d vscode-langservers-extracted",
|
|
3739
|
+
oxlint: "bun add -d oxlint",
|
|
3740
|
+
biome: "bun add -d @biomejs/biome",
|
|
3741
|
+
svelte: "bun add -d svelte-language-server",
|
|
3742
|
+
astro: "bun add -d @astrojs/language-server",
|
|
3743
|
+
bash: "bun add -d bash-language-server",
|
|
3744
|
+
"bash-ls": "bun add -d bash-language-server",
|
|
3745
|
+
"yaml-ls": "bun add -d yaml-language-server",
|
|
3746
|
+
php: "bun add -d intelephense",
|
|
3747
|
+
prisma: "bun add -d prisma",
|
|
3748
|
+
dockerfile: "bun add -d dockerfile-language-server-nodejs",
|
|
3749
|
+
pyright: "uv add --dev pyright",
|
|
3750
|
+
basedpyright: "uv add --dev basedpyright",
|
|
3751
|
+
ruff: "uv add --dev ruff",
|
|
3752
|
+
ty: "uv add --dev ty",
|
|
3753
|
+
"ruby-lsp": "bundle add ruby-lsp --group development"
|
|
3754
|
+
};
|
|
3600
3755
|
var BUILTIN_SERVERS = {
|
|
3601
3756
|
typescript: {
|
|
3602
3757
|
command: ["typescript-language-server", "--stdio"],
|
|
@@ -3699,7 +3854,56 @@ var BUILTIN_SERVERS = {
|
|
|
3699
3854
|
}
|
|
3700
3855
|
};
|
|
3701
3856
|
|
|
3857
|
+
// ../lsp-core/src/lsp/server-install-state.ts
|
|
3858
|
+
import { existsSync as existsSync7, mkdirSync, readFileSync as readFileSync3, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
3859
|
+
import { dirname as dirname6 } from "node:path";
|
|
3860
|
+
function getInstallDecisionsPath() {
|
|
3861
|
+
return lspRequestContext().installDecisionsPath;
|
|
3862
|
+
}
|
|
3863
|
+
function loadInstallDecisions() {
|
|
3864
|
+
const path = getInstallDecisionsPath();
|
|
3865
|
+
if (!existsSync7(path))
|
|
3866
|
+
return {};
|
|
3867
|
+
try {
|
|
3868
|
+
const parsed = JSON.parse(readFileSync3(path, "utf8"));
|
|
3869
|
+
return isInstallDecisions(parsed) ? parsed : {};
|
|
3870
|
+
} catch {
|
|
3871
|
+
return {};
|
|
3872
|
+
}
|
|
3873
|
+
}
|
|
3874
|
+
function loadInstallDecision(serverId) {
|
|
3875
|
+
return loadInstallDecisions()[serverId];
|
|
3876
|
+
}
|
|
3877
|
+
function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
|
|
3878
|
+
const decisions = loadInstallDecisions();
|
|
3879
|
+
decisions[serverId] = { decision, decidedAt };
|
|
3880
|
+
writeInstallDecisions(decisions);
|
|
3881
|
+
}
|
|
3882
|
+
function isInstallDecision(value) {
|
|
3883
|
+
return value === "declined" || value === "allowed";
|
|
3884
|
+
}
|
|
3885
|
+
function writeInstallDecisions(decisions) {
|
|
3886
|
+
const path = getInstallDecisionsPath();
|
|
3887
|
+
mkdirSync(dirname6(path), { recursive: true });
|
|
3888
|
+
const tmpPath = `${path}.tmp`;
|
|
3889
|
+
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
3890
|
+
`, "utf8");
|
|
3891
|
+
renameSync2(tmpPath, path);
|
|
3892
|
+
}
|
|
3893
|
+
function isInstallDecisions(value) {
|
|
3894
|
+
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
3895
|
+
}
|
|
3896
|
+
function isInstallDecisionRecord(value) {
|
|
3897
|
+
if (!isRecord5(value))
|
|
3898
|
+
return false;
|
|
3899
|
+
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
3900
|
+
}
|
|
3901
|
+
function isRecord5(value) {
|
|
3902
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3903
|
+
}
|
|
3904
|
+
|
|
3702
3905
|
// ../lsp-core/src/lsp/config-loader.ts
|
|
3906
|
+
import { existsSync as existsSync8, readFileSync as readFileSync4 } from "node:fs";
|
|
3703
3907
|
function getProjectConfigPaths() {
|
|
3704
3908
|
return lspRequestContext().projectConfigPaths;
|
|
3705
3909
|
}
|
|
@@ -3707,7 +3911,7 @@ function getUserConfigPath() {
|
|
|
3707
3911
|
return lspRequestContext().userConfigPath;
|
|
3708
3912
|
}
|
|
3709
3913
|
function loadJsonFile(path) {
|
|
3710
|
-
if (!
|
|
3914
|
+
if (!existsSync8(path))
|
|
3711
3915
|
return null;
|
|
3712
3916
|
try {
|
|
3713
3917
|
const parsed = JSON.parse(readFileSync4(path, "utf-8"));
|
|
@@ -3754,10 +3958,10 @@ function getMergedServers() {
|
|
|
3754
3958
|
}
|
|
3755
3959
|
if (seen.has(id))
|
|
3756
3960
|
continue;
|
|
3757
|
-
const
|
|
3758
|
-
if (!
|
|
3961
|
+
const server = createServerFromEntry(id, entry, source);
|
|
3962
|
+
if (!server)
|
|
3759
3963
|
continue;
|
|
3760
|
-
servers.push(
|
|
3964
|
+
servers.push(server);
|
|
3761
3965
|
seen.add(id);
|
|
3762
3966
|
}
|
|
3763
3967
|
}
|
|
@@ -3789,7 +3993,7 @@ function createServerFromEntry(id, entry, source) {
|
|
|
3789
3993
|
if (source === "project") {
|
|
3790
3994
|
if (!builtin)
|
|
3791
3995
|
return null;
|
|
3792
|
-
const
|
|
3996
|
+
const server = createServer({
|
|
3793
3997
|
id,
|
|
3794
3998
|
command: builtin.command,
|
|
3795
3999
|
extensions: entry.extensions ?? builtin.extensions,
|
|
@@ -3797,35 +4001,35 @@ function createServerFromEntry(id, entry, source) {
|
|
|
3797
4001
|
source
|
|
3798
4002
|
});
|
|
3799
4003
|
if (entry.initialization !== undefined) {
|
|
3800
|
-
|
|
4004
|
+
server.initialization = entry.initialization;
|
|
3801
4005
|
}
|
|
3802
|
-
return
|
|
4006
|
+
return server;
|
|
3803
4007
|
}
|
|
3804
4008
|
if (entry.command && entry.extensions) {
|
|
3805
|
-
const
|
|
4009
|
+
const server = createServer({
|
|
3806
4010
|
id,
|
|
3807
4011
|
command: entry.command,
|
|
3808
4012
|
extensions: entry.extensions,
|
|
3809
4013
|
priority: entry.priority ?? 0,
|
|
3810
4014
|
source
|
|
3811
4015
|
});
|
|
3812
|
-
applyOptionalServerFields(
|
|
3813
|
-
return
|
|
4016
|
+
applyOptionalServerFields(server, entry);
|
|
4017
|
+
return server;
|
|
3814
4018
|
}
|
|
3815
4019
|
if (!builtin)
|
|
3816
4020
|
return null;
|
|
3817
|
-
const
|
|
4021
|
+
const server = createServer({
|
|
3818
4022
|
id,
|
|
3819
4023
|
command: entry.command ?? builtin.command,
|
|
3820
4024
|
extensions: entry.extensions ?? builtin.extensions,
|
|
3821
4025
|
priority: entry.priority ?? 0,
|
|
3822
4026
|
source
|
|
3823
4027
|
});
|
|
3824
|
-
applyOptionalServerFields(
|
|
3825
|
-
return
|
|
4028
|
+
applyOptionalServerFields(server, entry);
|
|
4029
|
+
return server;
|
|
3826
4030
|
}
|
|
3827
4031
|
function createServer(input) {
|
|
3828
|
-
const
|
|
4032
|
+
const server = {
|
|
3829
4033
|
id: input.id,
|
|
3830
4034
|
command: input.command,
|
|
3831
4035
|
extensions: input.extensions,
|
|
@@ -3833,19 +4037,19 @@ function createServer(input) {
|
|
|
3833
4037
|
source: input.source
|
|
3834
4038
|
};
|
|
3835
4039
|
if (input.env !== undefined) {
|
|
3836
|
-
|
|
4040
|
+
server.env = input.env;
|
|
3837
4041
|
}
|
|
3838
4042
|
if (input.initialization !== undefined) {
|
|
3839
|
-
|
|
4043
|
+
server.initialization = input.initialization;
|
|
3840
4044
|
}
|
|
3841
|
-
return
|
|
4045
|
+
return server;
|
|
3842
4046
|
}
|
|
3843
|
-
function applyOptionalServerFields(
|
|
4047
|
+
function applyOptionalServerFields(server, entry) {
|
|
3844
4048
|
if (entry.env !== undefined) {
|
|
3845
|
-
|
|
4049
|
+
server.env = entry.env;
|
|
3846
4050
|
}
|
|
3847
4051
|
if (entry.initialization !== undefined) {
|
|
3848
|
-
|
|
4052
|
+
server.initialization = entry.initialization;
|
|
3849
4053
|
}
|
|
3850
4054
|
}
|
|
3851
4055
|
function isConfigJson(value) {
|
|
@@ -3895,64 +4099,165 @@ function getDisabledServerIds() {
|
|
|
3895
4099
|
}
|
|
3896
4100
|
|
|
3897
4101
|
// ../lsp-core/src/lsp/server-installation.ts
|
|
3898
|
-
import { existsSync as
|
|
3899
|
-
import { delimiter as delimiter3, join as
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3906
|
-
|
|
3907
|
-
|
|
3908
|
-
|
|
4102
|
+
import { existsSync as existsSync9 } from "node:fs";
|
|
4103
|
+
import { delimiter as delimiter3, dirname as dirname7, isAbsolute as isAbsolute3, join as join4, resolve as resolve7 } from "node:path";
|
|
4104
|
+
var LOCAL_BIN_RULES = [
|
|
4105
|
+
{
|
|
4106
|
+
markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
|
|
4107
|
+
binDirs: [join4("node_modules", ".bin")]
|
|
4108
|
+
},
|
|
4109
|
+
{
|
|
4110
|
+
markers: [
|
|
4111
|
+
"pyproject.toml",
|
|
4112
|
+
"ty.toml",
|
|
4113
|
+
"requirements.txt",
|
|
4114
|
+
"setup.py",
|
|
4115
|
+
"setup.cfg",
|
|
4116
|
+
"Pipfile",
|
|
4117
|
+
"pyrightconfig.json",
|
|
4118
|
+
"ruff.toml",
|
|
4119
|
+
".ruff.toml"
|
|
4120
|
+
],
|
|
4121
|
+
binDirs: [
|
|
4122
|
+
join4(".venv", "bin"),
|
|
4123
|
+
join4(".venv", "Scripts"),
|
|
4124
|
+
join4("venv", "bin"),
|
|
4125
|
+
join4("venv", "Scripts"),
|
|
4126
|
+
join4(".env", "bin"),
|
|
4127
|
+
join4(".env", "Scripts")
|
|
4128
|
+
]
|
|
4129
|
+
},
|
|
4130
|
+
{
|
|
4131
|
+
markers: ["Gemfile", "Gemfile.lock"],
|
|
4132
|
+
binDirs: [join4("vendor", "bundle", "bin"), "bin"]
|
|
4133
|
+
},
|
|
4134
|
+
{
|
|
4135
|
+
markers: ["go.mod", "go.sum", "go.work"],
|
|
4136
|
+
binDirs: ["bin"]
|
|
4137
|
+
}
|
|
4138
|
+
];
|
|
4139
|
+
var resolutionCache = new Map;
|
|
4140
|
+
var probeCount = 0;
|
|
4141
|
+
function probe(path) {
|
|
4142
|
+
probeCount += 1;
|
|
4143
|
+
return existsSync9(path);
|
|
4144
|
+
}
|
|
4145
|
+
function executableSuffixes(platform, pathExt) {
|
|
4146
|
+
if (platform !== "win32")
|
|
4147
|
+
return [""];
|
|
4148
|
+
const configured = pathExt ?? process.env["PATHEXT"] ?? "";
|
|
4149
|
+
const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
|
|
4150
|
+
return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
|
|
4151
|
+
}
|
|
4152
|
+
function probeWithSuffixes(directory, command, suffixes) {
|
|
4153
|
+
for (const suffix of suffixes) {
|
|
4154
|
+
const candidate = join4(directory, command + suffix);
|
|
4155
|
+
if (probe(candidate))
|
|
4156
|
+
return candidate;
|
|
3909
4157
|
}
|
|
3910
|
-
|
|
3911
|
-
|
|
3912
|
-
|
|
3913
|
-
|
|
3914
|
-
|
|
3915
|
-
|
|
3916
|
-
|
|
3917
|
-
|
|
3918
|
-
|
|
4158
|
+
return null;
|
|
4159
|
+
}
|
|
4160
|
+
function resolveLocal(command, workingDirectory, suffixes, stopAt) {
|
|
4161
|
+
const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
|
|
4162
|
+
let current = resolve7(workingDirectory);
|
|
4163
|
+
while (true) {
|
|
4164
|
+
for (const rule of LOCAL_BIN_RULES) {
|
|
4165
|
+
if (!rule.markers.some((marker) => probe(join4(current, marker))))
|
|
4166
|
+
continue;
|
|
4167
|
+
for (const binDir of rule.binDirs) {
|
|
4168
|
+
const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
|
|
4169
|
+
if (found !== null)
|
|
4170
|
+
return found;
|
|
4171
|
+
}
|
|
3919
4172
|
}
|
|
4173
|
+
if (probe(join4(current, ".git")))
|
|
4174
|
+
return null;
|
|
4175
|
+
if (boundary !== undefined && current === boundary)
|
|
4176
|
+
return null;
|
|
4177
|
+
const parent = dirname7(current);
|
|
4178
|
+
if (parent === current)
|
|
4179
|
+
return null;
|
|
4180
|
+
current = parent;
|
|
3920
4181
|
}
|
|
3921
|
-
|
|
3922
|
-
|
|
4182
|
+
}
|
|
4183
|
+
function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
|
|
4184
|
+
let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
|
|
4185
|
+
if (platform === "win32" && !pathEnv) {
|
|
3923
4186
|
pathEnv = process.env["Path"] ?? "";
|
|
3924
4187
|
}
|
|
3925
|
-
const
|
|
3926
|
-
|
|
3927
|
-
|
|
3928
|
-
|
|
3929
|
-
|
|
3930
|
-
|
|
3931
|
-
}
|
|
4188
|
+
for (const entry of pathEnv.split(delimiter3)) {
|
|
4189
|
+
if (entry.length === 0)
|
|
4190
|
+
continue;
|
|
4191
|
+
const found = probeWithSuffixes(entry, command, suffixes);
|
|
4192
|
+
if (found !== null)
|
|
4193
|
+
return found;
|
|
3932
4194
|
}
|
|
3933
|
-
|
|
3934
|
-
|
|
3935
|
-
|
|
4195
|
+
return null;
|
|
4196
|
+
}
|
|
4197
|
+
function resolveServerBinary(command, workingDirectory, options = {}) {
|
|
4198
|
+
if (command.length === 0)
|
|
4199
|
+
return null;
|
|
4200
|
+
const [cmd] = command;
|
|
4201
|
+
if (cmd === undefined || cmd.length === 0)
|
|
4202
|
+
return null;
|
|
4203
|
+
const platform = options.platform ?? process.platform;
|
|
4204
|
+
const suffixes = executableSuffixes(platform, options.pathExt);
|
|
4205
|
+
if (cmd.includes("/") || cmd.includes("\\")) {
|
|
4206
|
+
const explicit = isAbsolute3(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
|
|
4207
|
+
return probe(explicit) ? explicit : null;
|
|
4208
|
+
}
|
|
4209
|
+
const cacheKey = JSON.stringify([
|
|
4210
|
+
workingDirectory ?? "",
|
|
4211
|
+
cmd,
|
|
4212
|
+
platform,
|
|
4213
|
+
options.stopAt ?? "",
|
|
4214
|
+
options.pathExt ?? "",
|
|
4215
|
+
options.pathEnv ?? process.env["PATH"] ?? ""
|
|
4216
|
+
]);
|
|
4217
|
+
const cached = resolutionCache.get(cacheKey);
|
|
4218
|
+
if (cached !== undefined)
|
|
4219
|
+
return cached;
|
|
4220
|
+
let resolved = null;
|
|
4221
|
+
if (workingDirectory !== undefined && workingDirectory.length > 0) {
|
|
4222
|
+
resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
|
|
4223
|
+
}
|
|
4224
|
+
resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
|
|
4225
|
+
if (resolved === null && cmd === "node")
|
|
4226
|
+
resolved = cmd;
|
|
4227
|
+
resolutionCache.set(cacheKey, resolved);
|
|
4228
|
+
return resolved;
|
|
4229
|
+
}
|
|
4230
|
+
function isServerInstalled(command, workingDirectory, options = {}) {
|
|
4231
|
+
if (command.length === 0)
|
|
4232
|
+
return false;
|
|
4233
|
+
return resolveServerBinary(command, workingDirectory, options) !== null;
|
|
3936
4234
|
}
|
|
3937
4235
|
|
|
3938
4236
|
// ../lsp-core/src/lsp/server-resolution.ts
|
|
4237
|
+
function withResolvedCommand(command, binaryPath) {
|
|
4238
|
+
return [binaryPath, ...command.slice(1)];
|
|
4239
|
+
}
|
|
3939
4240
|
function findServerForExtension(ext) {
|
|
3940
4241
|
const servers = getMergedServers();
|
|
3941
|
-
|
|
3942
|
-
|
|
4242
|
+
const workingDirectory = contextCwd();
|
|
4243
|
+
for (const server of servers) {
|
|
4244
|
+
if (!server.extensions.includes(ext))
|
|
4245
|
+
continue;
|
|
4246
|
+
const binaryPath = resolveServerBinary(server.command, workingDirectory);
|
|
4247
|
+
if (binaryPath !== null) {
|
|
3943
4248
|
const resolvedServer = {
|
|
3944
|
-
id:
|
|
3945
|
-
command:
|
|
3946
|
-
extensions:
|
|
3947
|
-
priority:
|
|
4249
|
+
id: server.id,
|
|
4250
|
+
command: withResolvedCommand(server.command, binaryPath),
|
|
4251
|
+
extensions: server.extensions,
|
|
4252
|
+
priority: server.priority
|
|
3948
4253
|
};
|
|
3949
|
-
if (
|
|
4254
|
+
if (server.env !== undefined) {
|
|
3950
4255
|
return {
|
|
3951
4256
|
status: "found",
|
|
3952
4257
|
server: {
|
|
3953
4258
|
...resolvedServer,
|
|
3954
|
-
env:
|
|
3955
|
-
...
|
|
4259
|
+
env: server.env,
|
|
4260
|
+
...server.initialization === undefined ? {} : { initialization: server.initialization }
|
|
3956
4261
|
}
|
|
3957
4262
|
};
|
|
3958
4263
|
}
|
|
@@ -3960,20 +4265,20 @@ function findServerForExtension(ext) {
|
|
|
3960
4265
|
status: "found",
|
|
3961
4266
|
server: {
|
|
3962
4267
|
...resolvedServer,
|
|
3963
|
-
...
|
|
4268
|
+
...server.initialization === undefined ? {} : { initialization: server.initialization }
|
|
3964
4269
|
}
|
|
3965
4270
|
};
|
|
3966
4271
|
}
|
|
3967
4272
|
}
|
|
3968
|
-
for (const
|
|
3969
|
-
if (
|
|
3970
|
-
const installHint = LSP_INSTALL_HINTS[
|
|
4273
|
+
for (const server of servers) {
|
|
4274
|
+
if (server.extensions.includes(ext)) {
|
|
4275
|
+
const installHint = LSP_INSTALL_HINTS[server.id] ?? `Install '${server.command[0]}' and ensure it's in your PATH`;
|
|
3971
4276
|
return {
|
|
3972
4277
|
status: "not_installed",
|
|
3973
4278
|
server: {
|
|
3974
|
-
id:
|
|
3975
|
-
command:
|
|
3976
|
-
extensions:
|
|
4279
|
+
id: server.id,
|
|
4280
|
+
command: server.command,
|
|
4281
|
+
extensions: server.extensions
|
|
3977
4282
|
},
|
|
3978
4283
|
installHint
|
|
3979
4284
|
};
|
|
@@ -3989,20 +4294,21 @@ function findServerForExtension(ext) {
|
|
|
3989
4294
|
function getAllServers() {
|
|
3990
4295
|
const servers = getMergedServers();
|
|
3991
4296
|
const disabled = getDisabledServerIds();
|
|
4297
|
+
const workingDirectory = contextCwd();
|
|
3992
4298
|
const result = [];
|
|
3993
4299
|
const seen = new Set;
|
|
3994
|
-
for (const
|
|
3995
|
-
if (seen.has(
|
|
4300
|
+
for (const server of servers) {
|
|
4301
|
+
if (seen.has(server.id))
|
|
3996
4302
|
continue;
|
|
3997
4303
|
result.push({
|
|
3998
|
-
id:
|
|
3999
|
-
installed: isServerInstalled(
|
|
4000
|
-
extensions:
|
|
4304
|
+
id: server.id,
|
|
4305
|
+
installed: isServerInstalled(server.command, workingDirectory),
|
|
4306
|
+
extensions: server.extensions,
|
|
4001
4307
|
disabled: false,
|
|
4002
|
-
source:
|
|
4003
|
-
priority:
|
|
4308
|
+
source: server.source,
|
|
4309
|
+
priority: server.priority
|
|
4004
4310
|
});
|
|
4005
|
-
seen.add(
|
|
4311
|
+
seen.add(server.id);
|
|
4006
4312
|
}
|
|
4007
4313
|
for (const id of disabled) {
|
|
4008
4314
|
if (seen.has(id))
|
|
@@ -4010,7 +4316,7 @@ function getAllServers() {
|
|
|
4010
4316
|
const builtin = BUILTIN_SERVERS[id];
|
|
4011
4317
|
result.push({
|
|
4012
4318
|
id,
|
|
4013
|
-
installed: builtin ? isServerInstalled(builtin.command) : false,
|
|
4319
|
+
installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
|
|
4014
4320
|
extensions: builtin?.extensions ?? [],
|
|
4015
4321
|
disabled: true,
|
|
4016
4322
|
source: "disabled",
|
|
@@ -4021,7 +4327,6 @@ function getAllServers() {
|
|
|
4021
4327
|
}
|
|
4022
4328
|
|
|
4023
4329
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
4024
|
-
var WORKSPACE_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle"];
|
|
4025
4330
|
function isDirectoryPath(filePath) {
|
|
4026
4331
|
try {
|
|
4027
4332
|
return statSync3(filePath).isDirectory();
|
|
@@ -4034,36 +4339,40 @@ function findWorkspaceRoot(filePath) {
|
|
|
4034
4339
|
const abs = resolveReadablePathInsideContext(filePath);
|
|
4035
4340
|
let dir = abs;
|
|
4036
4341
|
if (!isDirectoryPath(dir)) {
|
|
4037
|
-
dir =
|
|
4342
|
+
dir = dirname8(dir);
|
|
4038
4343
|
}
|
|
4344
|
+
if (!isPathInside(cwd, abs))
|
|
4345
|
+
return findWorkspaceRootOutsideContext(dir);
|
|
4039
4346
|
const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
|
|
4347
|
+
let nearestPackageRoot;
|
|
4040
4348
|
while (isPathInside(cwd, dir)) {
|
|
4041
4349
|
const canonicalDir = existingDirectoryInsideContext(dir, cwd);
|
|
4042
4350
|
if (canonicalDir !== undefined) {
|
|
4043
|
-
|
|
4044
|
-
|
|
4045
|
-
|
|
4046
|
-
|
|
4351
|
+
if (existsSync10(join5(dir, GIT_WORKSPACE_MARKER))) {
|
|
4352
|
+
return canonicalDir;
|
|
4353
|
+
}
|
|
4354
|
+
if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
|
|
4355
|
+
nearestPackageRoot = canonicalDir;
|
|
4047
4356
|
}
|
|
4048
4357
|
}
|
|
4049
4358
|
if (dir === cwd)
|
|
4050
4359
|
break;
|
|
4051
|
-
dir =
|
|
4360
|
+
dir = dirname8(dir);
|
|
4052
4361
|
}
|
|
4053
|
-
return fallbackRoot;
|
|
4362
|
+
return nearestPackageRoot ?? fallbackRoot;
|
|
4363
|
+
}
|
|
4364
|
+
function hasProjectWorkspaceMarker(directory) {
|
|
4365
|
+
return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync10(join5(directory, marker)));
|
|
4054
4366
|
}
|
|
4055
4367
|
function resolveReadablePathInsideContext(filePath) {
|
|
4056
4368
|
const cwd = contextCwd();
|
|
4057
|
-
const abs =
|
|
4369
|
+
const abs = resolve8(cwd, filePath);
|
|
4058
4370
|
if (isPathInside(cwd, abs))
|
|
4059
4371
|
return abs;
|
|
4060
4372
|
const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
|
|
4061
4373
|
if (rebased !== undefined)
|
|
4062
4374
|
return rebased;
|
|
4063
|
-
|
|
4064
|
-
if (isPathInside(cwd, canonical))
|
|
4065
|
-
return canonical;
|
|
4066
|
-
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
4375
|
+
return canonicalizeExistingOrNearestAncestor(abs);
|
|
4067
4376
|
}
|
|
4068
4377
|
function resolvePathInsideContext(filePath) {
|
|
4069
4378
|
const cwd = contextCwd();
|
|
@@ -4078,12 +4387,12 @@ function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
|
4078
4387
|
let current = path;
|
|
4079
4388
|
const suffix = [];
|
|
4080
4389
|
while (true) {
|
|
4081
|
-
if (
|
|
4082
|
-
const canonical =
|
|
4390
|
+
if (existsSync10(current)) {
|
|
4391
|
+
const canonical = realpathSync5(current);
|
|
4083
4392
|
if (isPathInside(cwd, canonical))
|
|
4084
|
-
return suffix.length === 0 ? canonical :
|
|
4393
|
+
return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
|
|
4085
4394
|
}
|
|
4086
|
-
const parent =
|
|
4395
|
+
const parent = dirname8(current);
|
|
4087
4396
|
if (parent === current)
|
|
4088
4397
|
return;
|
|
4089
4398
|
suffix.unshift(basename3(current));
|
|
@@ -4091,9 +4400,9 @@ function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
|
4091
4400
|
}
|
|
4092
4401
|
}
|
|
4093
4402
|
function existingDirectoryInsideContext(directory, cwd) {
|
|
4094
|
-
if (!
|
|
4403
|
+
if (!existsSync10(directory))
|
|
4095
4404
|
return;
|
|
4096
|
-
const canonical =
|
|
4405
|
+
const canonical = realpathSync5(directory);
|
|
4097
4406
|
if (!statSync3(canonical).isDirectory())
|
|
4098
4407
|
return;
|
|
4099
4408
|
return isPathInside(cwd, canonical) ? canonical : undefined;
|
|
@@ -4106,7 +4415,7 @@ function nearestExistingDirectoryInsideContext(directory, cwd) {
|
|
|
4106
4415
|
return canonical;
|
|
4107
4416
|
if (current === cwd)
|
|
4108
4417
|
return;
|
|
4109
|
-
current =
|
|
4418
|
+
current = dirname8(current);
|
|
4110
4419
|
}
|
|
4111
4420
|
return;
|
|
4112
4421
|
}
|
|
@@ -4133,33 +4442,46 @@ function formatServerLookupError(result) {
|
|
|
4133
4442
|
].join(`
|
|
4134
4443
|
`);
|
|
4135
4444
|
}
|
|
4445
|
+
function formatInstallOptions(serverId, installHint) {
|
|
4446
|
+
const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
|
|
4447
|
+
if (localHint === undefined) {
|
|
4448
|
+
return ["To install, run:", ` ${installHint}`];
|
|
4449
|
+
}
|
|
4450
|
+
return [
|
|
4451
|
+
"To install in THIS repository (preferred — no global install needed):",
|
|
4452
|
+
` ${localHint}`,
|
|
4453
|
+
"",
|
|
4454
|
+
"Or install it globally:",
|
|
4455
|
+
` ${installHint}`
|
|
4456
|
+
];
|
|
4457
|
+
}
|
|
4136
4458
|
function formatNotInstalled(result) {
|
|
4137
|
-
const { server
|
|
4138
|
-
const extensions =
|
|
4139
|
-
const decision = loadInstallDecision(
|
|
4459
|
+
const { server, installHint } = result;
|
|
4460
|
+
const extensions = server.extensions.join(", ");
|
|
4461
|
+
const decision = loadInstallDecision(server.id)?.decision;
|
|
4140
4462
|
const context = lspRequestContext();
|
|
4141
4463
|
if (decision === "declined") {
|
|
4142
|
-
return `LSP server '${
|
|
4464
|
+
return `LSP server '${server.id}' (${extensions}) is NOT INSTALLED; user previously declined installation — proceed without LSP.`;
|
|
4143
4465
|
}
|
|
4144
4466
|
const header = [
|
|
4145
|
-
`LSP server '${
|
|
4467
|
+
`LSP server '${server.id}' for ${extensions} is NOT INSTALLED.`,
|
|
4146
4468
|
"",
|
|
4147
|
-
`Command not found: ${
|
|
4469
|
+
`Command not found: ${server.command[0]}`,
|
|
4148
4470
|
""
|
|
4149
4471
|
];
|
|
4472
|
+
const installOptions = formatInstallOptions(server.id, installHint);
|
|
4150
4473
|
if (decision === "allowed") {
|
|
4151
4474
|
return [
|
|
4152
4475
|
...header,
|
|
4153
4476
|
"The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
|
|
4154
|
-
|
|
4477
|
+
...installOptions.slice(1)
|
|
4155
4478
|
].join(`
|
|
4156
4479
|
`);
|
|
4157
4480
|
}
|
|
4158
4481
|
if (!context.capabilities.installDecisionTool) {
|
|
4159
4482
|
return [
|
|
4160
4483
|
...header,
|
|
4161
|
-
|
|
4162
|
-
` ${installHint}`,
|
|
4484
|
+
...installOptions,
|
|
4163
4485
|
"",
|
|
4164
4486
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
4165
4487
|
"Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
|
|
@@ -4168,13 +4490,12 @@ function formatNotInstalled(result) {
|
|
|
4168
4490
|
}
|
|
4169
4491
|
return [
|
|
4170
4492
|
...header,
|
|
4171
|
-
|
|
4172
|
-
` ${installHint}`,
|
|
4493
|
+
...installOptions,
|
|
4173
4494
|
"",
|
|
4174
4495
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
4175
4496
|
"- If the user agrees: run the install command above, then retry this tool.",
|
|
4176
4497
|
"- If the user declines, OR has NOT explicitly asked for LSP installation:",
|
|
4177
|
-
` call lsp_install_decision { server_id: "${
|
|
4498
|
+
` call lsp_install_decision { server_id: "${server.id}", decision: "declined" },`,
|
|
4178
4499
|
` which writes to ${context.installDecisionsPath},`,
|
|
4179
4500
|
" then ignore this message and proceed WITHOUT LSP."
|
|
4180
4501
|
].join(`
|
|
@@ -4198,34 +4519,34 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
|
4198
4519
|
if (result.status !== "found") {
|
|
4199
4520
|
throw new LspServerLookupError(formatServerLookupError(result), result);
|
|
4200
4521
|
}
|
|
4201
|
-
const
|
|
4522
|
+
const server = result.server;
|
|
4202
4523
|
const root = findWorkspaceRoot(absPath);
|
|
4203
4524
|
const manager = options.manager ?? getLspManager();
|
|
4204
4525
|
const acquireAndCall = async (allowRetry) => {
|
|
4205
|
-
const client = await manager.getClient(root,
|
|
4526
|
+
const client = await manager.getClient(root, server, options.signal);
|
|
4206
4527
|
try {
|
|
4207
4528
|
return await fn(client, root, absPath);
|
|
4208
4529
|
} catch (err) {
|
|
4209
4530
|
if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
|
|
4210
|
-
manager.invalidateClient(root,
|
|
4531
|
+
manager.invalidateClient(root, server.id, client);
|
|
4211
4532
|
return acquireAndCall(false);
|
|
4212
4533
|
}
|
|
4213
4534
|
if (err instanceof LspRequestTimeoutError) {
|
|
4214
|
-
if (manager.isServerInitializing(root,
|
|
4535
|
+
if (manager.isServerInitializing(root, server.id)) {
|
|
4215
4536
|
throw new LspServerInitializingError(err);
|
|
4216
4537
|
}
|
|
4217
4538
|
}
|
|
4218
4539
|
throw err;
|
|
4219
4540
|
} finally {
|
|
4220
|
-
manager.releaseClient(root,
|
|
4541
|
+
manager.releaseClient(root, server.id);
|
|
4221
4542
|
}
|
|
4222
4543
|
};
|
|
4223
4544
|
return acquireAndCall(true);
|
|
4224
4545
|
}
|
|
4225
4546
|
|
|
4226
4547
|
// ../lsp-core/src/lsp/directory-diagnostics.ts
|
|
4227
|
-
import { existsSync as
|
|
4228
|
-
import { join as
|
|
4548
|
+
import { existsSync as existsSync11, lstatSync as lstatSync4, readdirSync as readdirSync3 } from "node:fs";
|
|
4549
|
+
import { join as join6, resolve as resolve9 } from "node:path";
|
|
4229
4550
|
|
|
4230
4551
|
// ../lsp-core/src/lsp/formatters.ts
|
|
4231
4552
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
@@ -4240,10 +4561,10 @@ function uriToPath(uri) {
|
|
|
4240
4561
|
}
|
|
4241
4562
|
function formatLocation(loc) {
|
|
4242
4563
|
if ("targetUri" in loc) {
|
|
4243
|
-
const
|
|
4244
|
-
const
|
|
4245
|
-
const
|
|
4246
|
-
return `${
|
|
4564
|
+
const uri = uriToPath(loc.targetUri);
|
|
4565
|
+
const line = loc.targetRange.start.line + 1;
|
|
4566
|
+
const char = loc.targetRange.start.character;
|
|
4567
|
+
return `${uri}:${line}:${char}`;
|
|
4247
4568
|
}
|
|
4248
4569
|
const uri = uriToPath(loc.uri);
|
|
4249
4570
|
const line = loc.range.start.line + 1;
|
|
@@ -4355,7 +4676,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
|
|
|
4355
4676
|
for (const entry of entries) {
|
|
4356
4677
|
if (files.length >= maxFiles)
|
|
4357
4678
|
return;
|
|
4358
|
-
const fullPath =
|
|
4679
|
+
const fullPath = join6(currentDir, entry);
|
|
4359
4680
|
let stat;
|
|
4360
4681
|
try {
|
|
4361
4682
|
stat = lstatSync4(fullPath);
|
|
@@ -4380,15 +4701,15 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
4380
4701
|
if (!extension.startsWith(".")) {
|
|
4381
4702
|
throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
|
|
4382
4703
|
}
|
|
4383
|
-
const absDir =
|
|
4384
|
-
if (!
|
|
4704
|
+
const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
|
|
4705
|
+
if (!existsSync11(absDir)) {
|
|
4385
4706
|
throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
|
|
4386
4707
|
}
|
|
4387
4708
|
const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
|
|
4388
4709
|
if (serverResult.status !== "found") {
|
|
4389
4710
|
throw new LspServerLookupError(formatServerLookupError(serverResult));
|
|
4390
4711
|
}
|
|
4391
|
-
const
|
|
4712
|
+
const server = serverResult.server;
|
|
4392
4713
|
const allFiles = (options.listFiles ?? collectFilesWithExtension)(absDir, extension, maxFiles + 1);
|
|
4393
4714
|
const wasCapped = allFiles.length > maxFiles;
|
|
4394
4715
|
const filesToProcess = allFiles.slice(0, maxFiles);
|
|
@@ -4408,7 +4729,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
4408
4729
|
const fileErrors = [];
|
|
4409
4730
|
const maxConcurrency = Math.max(1, options.maxConcurrency ?? DIRECTORY_DIAGNOSTICS_MAX_CONCURRENCY);
|
|
4410
4731
|
options.signal?.throwIfAborted();
|
|
4411
|
-
const client = await manager.getClient(root,
|
|
4732
|
+
const client = await manager.getClient(root, server, options.signal);
|
|
4412
4733
|
try {
|
|
4413
4734
|
let nextIndex = 0;
|
|
4414
4735
|
const workers = Array.from({ length: Math.min(maxConcurrency, filesToProcess.length) }, async () => {
|
|
@@ -4436,7 +4757,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
4436
4757
|
});
|
|
4437
4758
|
await Promise.all(workers);
|
|
4438
4759
|
} finally {
|
|
4439
|
-
manager.releaseClient(root,
|
|
4760
|
+
manager.releaseClient(root, server.id);
|
|
4440
4761
|
}
|
|
4441
4762
|
const displayDiagnostics = allDiagnostics.slice(0, DEFAULT_MAX_DIAGNOSTICS);
|
|
4442
4763
|
const wasDiagCapped = allDiagnostics.length > DEFAULT_MAX_DIAGNOSTICS;
|
|
@@ -4468,7 +4789,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
4468
4789
|
|
|
4469
4790
|
// ../lsp-core/src/lsp/infer-extension.ts
|
|
4470
4791
|
import { lstatSync as lstatSync5, readdirSync as readdirSync4 } from "node:fs";
|
|
4471
|
-
import { join as
|
|
4792
|
+
import { join as join7 } from "node:path";
|
|
4472
4793
|
var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
|
|
4473
4794
|
var MAX_SCAN_ENTRIES = 500;
|
|
4474
4795
|
function inferExtensionFromDirectory(directory) {
|
|
@@ -4486,7 +4807,7 @@ function inferExtensionFromDirectory(directory) {
|
|
|
4486
4807
|
for (const entry of entries) {
|
|
4487
4808
|
if (scanned >= MAX_SCAN_ENTRIES)
|
|
4488
4809
|
return;
|
|
4489
|
-
const fullPath =
|
|
4810
|
+
const fullPath = join7(dir, entry);
|
|
4490
4811
|
let stat;
|
|
4491
4812
|
try {
|
|
4492
4813
|
stat = lstatSync5(fullPath);
|
|
@@ -4645,8 +4966,8 @@ function clientOptions(signal) {
|
|
|
4645
4966
|
}
|
|
4646
4967
|
|
|
4647
4968
|
// ../lsp-core/src/tools/result.ts
|
|
4648
|
-
function text(
|
|
4649
|
-
return { content: [{ type: "text", text
|
|
4969
|
+
function text(text, details, isError = false) {
|
|
4970
|
+
return { content: [{ type: "text", text }], details, isError };
|
|
4650
4971
|
}
|
|
4651
4972
|
|
|
4652
4973
|
// ../lsp-core/src/tools/diagnostics.ts
|
|
@@ -4666,7 +4987,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4666
4987
|
const extension = inferExtensionFromDirectory(absPath);
|
|
4667
4988
|
if (!extension) {
|
|
4668
4989
|
const message = `No supported source files found in directory: ${absPath}`;
|
|
4669
|
-
const
|
|
4990
|
+
const details = {
|
|
4670
4991
|
filePath,
|
|
4671
4992
|
severity,
|
|
4672
4993
|
mode: "directory",
|
|
@@ -4676,24 +4997,24 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4676
4997
|
error: message,
|
|
4677
4998
|
errorKind: "no_files"
|
|
4678
4999
|
};
|
|
4679
|
-
return text(message,
|
|
5000
|
+
return text(message, details);
|
|
4680
5001
|
}
|
|
4681
|
-
const
|
|
4682
|
-
const
|
|
5002
|
+
const output = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
|
|
5003
|
+
const details = {
|
|
4683
5004
|
filePath,
|
|
4684
5005
|
severity,
|
|
4685
5006
|
mode: "directory",
|
|
4686
5007
|
diagnostics: [],
|
|
4687
|
-
totalDiagnostics:
|
|
5008
|
+
totalDiagnostics: output.totalDiagnostics,
|
|
4688
5009
|
truncated: false,
|
|
4689
|
-
fileFailures: [...
|
|
5010
|
+
fileFailures: [...output.fileFailures]
|
|
4690
5011
|
};
|
|
4691
|
-
return text(
|
|
5012
|
+
return text(output.output, details);
|
|
4692
5013
|
}
|
|
4693
5014
|
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
|
|
4694
5015
|
if (result.transientError) {
|
|
4695
5016
|
const message = result.transientError.message;
|
|
4696
|
-
const
|
|
5017
|
+
const details = {
|
|
4697
5018
|
filePath,
|
|
4698
5019
|
severity,
|
|
4699
5020
|
mode: "file",
|
|
@@ -4703,7 +5024,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4703
5024
|
error: message,
|
|
4704
5025
|
errorKind: result.transientError.kind
|
|
4705
5026
|
};
|
|
4706
|
-
return text(message,
|
|
5027
|
+
return text(message, details, true);
|
|
4707
5028
|
}
|
|
4708
5029
|
const diagnostics = filterDiagnosticsBySeverity(asDiagnosticArray(result), severity);
|
|
4709
5030
|
const total = diagnostics.length;
|
|
@@ -4737,6 +5058,96 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4737
5058
|
throw error;
|
|
4738
5059
|
}
|
|
4739
5060
|
}
|
|
5061
|
+
// ../lsp-core/src/lsp/format-document.ts
|
|
5062
|
+
import { readFileSync as readFileSync5, renameSync as renameSync3, unlinkSync, writeFileSync as writeFileSync3 } from "node:fs";
|
|
5063
|
+
var DEFAULT_FORMATTING_OPTIONS = {
|
|
5064
|
+
tabSize: 4,
|
|
5065
|
+
insertSpaces: false,
|
|
5066
|
+
trimTrailingWhitespace: true,
|
|
5067
|
+
insertFinalNewline: true,
|
|
5068
|
+
trimFinalNewlines: true
|
|
5069
|
+
};
|
|
5070
|
+
var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
|
|
5071
|
+
async function formatDocumentWithClient(client, filePath, options = {}) {
|
|
5072
|
+
const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
|
|
5073
|
+
if (edits === null)
|
|
5074
|
+
return { status: "unavailable", reason: "capability_not_advertised" };
|
|
5075
|
+
if (edits.length === 0)
|
|
5076
|
+
return UNCHANGED;
|
|
5077
|
+
const before = readFileSync5(filePath, "utf-8");
|
|
5078
|
+
const normalized = normalizeTextEdits(before, edits, 0);
|
|
5079
|
+
if (normalized.text === before)
|
|
5080
|
+
return UNCHANGED;
|
|
5081
|
+
writeAtomically(filePath, normalized.text);
|
|
5082
|
+
await client.openFile(filePath);
|
|
5083
|
+
return {
|
|
5084
|
+
status: "formatted",
|
|
5085
|
+
...lineDelta(normalized.edits)
|
|
5086
|
+
};
|
|
5087
|
+
}
|
|
5088
|
+
function lineDelta(edits) {
|
|
5089
|
+
let linesAdded = 0;
|
|
5090
|
+
let linesRemoved = 0;
|
|
5091
|
+
for (const edit of edits) {
|
|
5092
|
+
linesRemoved += edit.range.end.line - edit.range.start.line + 1;
|
|
5093
|
+
linesAdded += edit.newText.split(`
|
|
5094
|
+
`).length;
|
|
5095
|
+
}
|
|
5096
|
+
return { linesAdded, linesRemoved };
|
|
5097
|
+
}
|
|
5098
|
+
function writeAtomically(filePath, content) {
|
|
5099
|
+
const tempPath = `${filePath}.omo-format.tmp`;
|
|
5100
|
+
writeFileSync3(tempPath, content, "utf-8");
|
|
5101
|
+
try {
|
|
5102
|
+
renameSync3(tempPath, filePath);
|
|
5103
|
+
} catch (error) {
|
|
5104
|
+
try {
|
|
5105
|
+
unlinkSync(tempPath);
|
|
5106
|
+
} catch {}
|
|
5107
|
+
throw error;
|
|
5108
|
+
}
|
|
5109
|
+
}
|
|
5110
|
+
|
|
5111
|
+
// ../lsp-core/src/tools/format.ts
|
|
5112
|
+
async function executeLspFormat(params, signal) {
|
|
5113
|
+
const filePath = requireString(params, "filePath");
|
|
5114
|
+
try {
|
|
5115
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
|
|
5116
|
+
return text(describeResult(filePath, result), formatDetails(filePath, result));
|
|
5117
|
+
} catch (error) {
|
|
5118
|
+
const missingDependency = missingDependencyResult(error, {
|
|
5119
|
+
filePath,
|
|
5120
|
+
status: "unavailable",
|
|
5121
|
+
reason: "server_unavailable",
|
|
5122
|
+
linesAdded: 0,
|
|
5123
|
+
linesRemoved: 0
|
|
5124
|
+
});
|
|
5125
|
+
if (missingDependency)
|
|
5126
|
+
return missingDependency;
|
|
5127
|
+
throw error;
|
|
5128
|
+
}
|
|
5129
|
+
}
|
|
5130
|
+
function formatDetails(filePath, result) {
|
|
5131
|
+
if (result.status === "unavailable") {
|
|
5132
|
+
return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
|
|
5133
|
+
}
|
|
5134
|
+
return {
|
|
5135
|
+
filePath,
|
|
5136
|
+
status: result.status,
|
|
5137
|
+
linesAdded: result.linesAdded,
|
|
5138
|
+
linesRemoved: result.linesRemoved
|
|
5139
|
+
};
|
|
5140
|
+
}
|
|
5141
|
+
function describeResult(filePath, result) {
|
|
5142
|
+
if (result.status === "unavailable") {
|
|
5143
|
+
return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
|
|
5144
|
+
}
|
|
5145
|
+
if (result.status === "unchanged") {
|
|
5146
|
+
return `Already formatted: ${filePath}`;
|
|
5147
|
+
}
|
|
5148
|
+
return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
|
|
5149
|
+
}
|
|
5150
|
+
|
|
4740
5151
|
// ../lsp-core/src/tools/install-decision.ts
|
|
4741
5152
|
async function executeLspInstallDecision(params) {
|
|
4742
5153
|
const serverId = requireString(params, "server_id");
|
|
@@ -4744,7 +5155,7 @@ async function executeLspInstallDecision(params) {
|
|
|
4744
5155
|
if (!isInstallDecision(decision)) {
|
|
4745
5156
|
return text(`Invalid decision '${String(decision)}'. Expected "declined" or "allowed".`, { serverId, errorKind: "invalid_decision" }, true);
|
|
4746
5157
|
}
|
|
4747
|
-
const serverIds = [...new Set(getMergedServers().map((
|
|
5158
|
+
const serverIds = [...new Set(getMergedServers().map((server) => server.id))];
|
|
4748
5159
|
if (!serverIds.includes(serverId)) {
|
|
4749
5160
|
const preview = serverIds.slice(0, 20).join(", ");
|
|
4750
5161
|
return text(`Unknown LSP server '${serverId}'. Known servers: ${preview}${serverIds.length > 20 ? "..." : ""}`, { serverId, errorKind: "unknown_server" }, true);
|
|
@@ -4884,10 +5295,10 @@ function objectSchema(properties, required = []) {
|
|
|
4884
5295
|
async function executeLspStatus() {
|
|
4885
5296
|
const servers = getAllServers();
|
|
4886
5297
|
const snapshots = getLspManager().getSnapshot();
|
|
4887
|
-
const installed = servers.filter((
|
|
4888
|
-
const configuredLines = servers.map((
|
|
4889
|
-
const state =
|
|
4890
|
-
return `- ${
|
|
5298
|
+
const installed = servers.filter((server) => server.installed && !server.disabled);
|
|
5299
|
+
const configuredLines = servers.map((server) => {
|
|
5300
|
+
const state = server.disabled ? "disabled" : server.installed ? "installed" : "missing";
|
|
5301
|
+
return `- ${server.id}: ${state}; source=${server.source}; extensions=${server.extensions.join(", ")}`;
|
|
4891
5302
|
});
|
|
4892
5303
|
const activeLines = snapshots.map((snapshot) => {
|
|
4893
5304
|
const state = snapshot.alive ? snapshot.isInitializing ? "initializing" : "alive" : "dead";
|
|
@@ -4930,8 +5341,8 @@ async function executeLspSymbols(params, signal) {
|
|
|
4930
5341
|
errorKind: "missing_query"
|
|
4931
5342
|
});
|
|
4932
5343
|
}
|
|
4933
|
-
const
|
|
4934
|
-
return formatSymbolsResult(filePath, scope,
|
|
5344
|
+
const symbols = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
|
|
5345
|
+
return formatSymbolsResult(filePath, scope, symbols, limit, query);
|
|
4935
5346
|
}
|
|
4936
5347
|
const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
|
|
4937
5348
|
return formatSymbolsResult(filePath, scope, symbols, limit);
|
|
@@ -5069,6 +5480,16 @@ var LSP_MCP_TOOLS = [
|
|
|
5069
5480
|
}, ["filePath", "line", "character", "newName"]),
|
|
5070
5481
|
execute: executeLspRename
|
|
5071
5482
|
},
|
|
5483
|
+
{
|
|
5484
|
+
name: "format",
|
|
5485
|
+
aliases: ["lsp_format"],
|
|
5486
|
+
title: "LSP Format",
|
|
5487
|
+
description: "Format a source file with its language server and write the returned edits to disk.",
|
|
5488
|
+
inputSchema: objectSchema({
|
|
5489
|
+
filePath: { type: "string", description: "Source file path to format." }
|
|
5490
|
+
}, ["filePath"]),
|
|
5491
|
+
execute: executeLspFormat
|
|
5492
|
+
},
|
|
5072
5493
|
{
|
|
5073
5494
|
name: "install_decision",
|
|
5074
5495
|
aliases: ["lsp_install_decision"],
|
|
@@ -5176,6 +5597,6 @@ function requestedProtocolVersion(params) {
|
|
|
5176
5597
|
return params["protocolVersion"];
|
|
5177
5598
|
}
|
|
5178
5599
|
export {
|
|
5179
|
-
|
|
5180
|
-
|
|
5600
|
+
handleLspMcpRequest,
|
|
5601
|
+
runMcpStdioServer
|
|
5181
5602
|
};
|