oh-my-opencode 5.0.0-beta.8 → 5.0.0-beta.81
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 +59118 -63486
- 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 +58841 -63186
- 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/lifecycle-inline-spec.d.ts +1 -1
- 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 +34199 -28037
- package/dist/mcp/index.d.ts +0 -4
- package/dist/mcp/types.d.ts +0 -1
- package/dist/oh-my-opencode.schema.json +28 -59
- 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 +8 -3
- package/dist/skills/frontend/references/design/README.md +13 -4
- 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/design-system-architecture.md +1 -0
- package/dist/skills/frontend/references/design/interaction-skill.md +2 -0
- package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
- package/dist/skills/frontend/references/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/references/perfection/README.md +1 -0
- 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 +22186 -30577
- package/package.json +51 -50
- 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 +1421 -960
- package/packages/lsp-daemon/dist/client.d.ts +10 -0
- package/packages/lsp-daemon/dist/client.js +956 -498
- package/packages/lsp-daemon/dist/daemon-client.d.ts +3 -0
- package/packages/lsp-daemon/dist/daemon-client.js +23 -3
- package/packages/lsp-daemon/dist/ensure-daemon.d.ts +6 -1
- package/packages/lsp-daemon/dist/ensure-daemon.js +27 -5
- package/packages/lsp-daemon/dist/index.js +860 -407
- 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 +5 -4
- 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 +5 -4
- 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 +8402 -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 +6 -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 +6 -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 +977 -545
- 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 +6 -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 +8 -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 +6 -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 +5328 -1382
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +5524 -1579
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +6 -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 +6 -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 +13 -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 +7 -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 +992 -681
- package/packages/omo-codex/plugin/package.json +6 -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 +8 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +13 -4
- 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/design-system-architecture.md +1 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/interaction-skill.md +2 -0
- package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/omo-codex/plugin/skills/frontend/references/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/references/perfection/README.md +1 -0
- 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 +16149 -4304
- 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 +8 -3
- package/packages/shared-skills/skills/frontend/references/design/README.md +13 -4
- 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/design-system-architecture.md +1 -0
- package/packages/shared-skills/skills/frontend/references/design/interaction-skill.md +2 -0
- package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
- package/packages/shared-skills/skills/frontend/references/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/references/perfection/README.md +1 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/lighthouse-audit.py +2 -2
- package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
- package/packages/shared-skills/skills/init-deep/SKILL.md +14 -14
- package/packages/shared-skills/skills/lsp-setup/SKILL.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +1 -1
- package/packages/shared-skills/skills/refactor/SKILL.md +5 -5
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +5 -5
- package/packages/shared-skills/skills/review-work/SKILL.md +101 -419
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +32 -86
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +32 -27
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +111 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +2 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_mobile_chrome.js +5 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/playwright_real_chrome.js +8 -6
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_stealth.py +86 -0
- package/packages/shared-skills/skills/ultimate-browsing/engine/tests/test_playwright_templates.py +4 -7
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +86 -95
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +18 -5
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +16 -13
- package/packages/shared-skills/skills/ultimate-browsing/scripts/extract_cookies.py +3 -3
- package/packages/shared-skills/skills/{start-work → ulw-execute}/SKILL.md +24 -22
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +5 -6
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +6 -5
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +2 -2
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -1
- package/packages/shared-skills/skills/ulw-research/SKILL.md +10 -5
- package/packages/shared-skills/skills/visual-qa/AGENTS.md +58 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +4 -3
- package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +75 -0
- package/postinstall.mjs +2 -0
- package/script/qa/web-terminal-visual-qa.mjs +2 -0
- package/script/qa/xterm-live-terminal.mjs +18 -2
- package/.agents/skills/work-with-pr-workspace/evals/evals.json +0 -76
- package/.agents/skills/work-with-pr-workspace/iteration-1/benchmark.json +0 -138
- package/.agents/skills/work-with-pr-workspace/iteration-1/benchmark.md +0 -42
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/eval_metadata.json +0 -57
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/grading.json +0 -15
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/code-changes.md +0 -454
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/execution-plan.md +0 -136
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/pr-description.md +0 -47
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/verification-strategy.md +0 -163
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/grading.json +0 -15
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/code-changes.md +0 -615
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/execution-plan.md +0 -99
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/pr-description.md +0 -50
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/verification-strategy.md +0 -111
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/eval_metadata.json +0 -37
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/grading.json +0 -11
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/code-changes.md +0 -205
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/execution-plan.md +0 -78
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/pr-description.md +0 -42
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/verification-strategy.md +0 -87
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/grading.json +0 -11
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/code-changes.md +0 -334
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/execution-plan.md +0 -86
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/pr-description.md +0 -23
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/verification-strategy.md +0 -119
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/eval_metadata.json +0 -32
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +0 -221
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/execution-plan.md +0 -104
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/pr-description.md +0 -41
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/verification-strategy.md +0 -84
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +0 -342
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/execution-plan.md +0 -131
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/pr-description.md +0 -39
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/verification-strategy.md +0 -128
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/eval_metadata.json +0 -32
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/code-changes.md +0 -143
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/execution-plan.md +0 -82
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/pr-description.md +0 -51
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/verification-strategy.md +0 -69
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/code-changes.md +0 -252
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/execution-plan.md +0 -83
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/pr-description.md +0 -33
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/verification-strategy.md +0 -101
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/eval_metadata.json +0 -32
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/code-changes.md +0 -387
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/execution-plan.md +0 -112
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/pr-description.md +0 -51
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/verification-strategy.md +0 -75
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/grading.json +0 -10
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/code-changes.md +0 -529
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/execution-plan.md +0 -127
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/pr-description.md +0 -42
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/verification-strategy.md +0 -120
- package/.agents/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/timing.json +0 -1
- package/.agents/skills/work-with-pr-workspace/iteration-1/review.html +0 -1326
- package/.opencode/skills/work-with-pr-workspace/evals/evals.json +0 -76
- package/.opencode/skills/work-with-pr-workspace/iteration-1/benchmark.json +0 -138
- package/.opencode/skills/work-with-pr-workspace/iteration-1/benchmark.md +0 -42
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/eval_metadata.json +0 -57
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/grading.json +0 -15
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/code-changes.md +0 -454
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/execution-plan.md +0 -136
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/pr-description.md +0 -47
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/outputs/verification-strategy.md +0 -163
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/with_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/grading.json +0 -15
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/code-changes.md +0 -615
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/execution-plan.md +0 -99
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/pr-description.md +0 -50
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/outputs/verification-strategy.md +0 -111
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-1/without_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/eval_metadata.json +0 -37
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/grading.json +0 -11
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/code-changes.md +0 -205
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/execution-plan.md +0 -78
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/pr-description.md +0 -42
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/outputs/verification-strategy.md +0 -87
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/with_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/grading.json +0 -11
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/code-changes.md +0 -334
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/execution-plan.md +0 -86
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/pr-description.md +0 -23
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/outputs/verification-strategy.md +0 -119
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-2/without_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/eval_metadata.json +0 -32
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/code-changes.md +0 -221
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/execution-plan.md +0 -104
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/pr-description.md +0 -41
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/outputs/verification-strategy.md +0 -84
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/with_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/code-changes.md +0 -342
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/execution-plan.md +0 -131
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/pr-description.md +0 -39
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/outputs/verification-strategy.md +0 -128
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-3/without_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/eval_metadata.json +0 -32
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/code-changes.md +0 -143
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/execution-plan.md +0 -82
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/pr-description.md +0 -51
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/outputs/verification-strategy.md +0 -69
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/with_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/code-changes.md +0 -252
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/execution-plan.md +0 -83
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/pr-description.md +0 -33
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/outputs/verification-strategy.md +0 -101
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-4/without_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/eval_metadata.json +0 -32
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/code-changes.md +0 -387
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/execution-plan.md +0 -112
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/pr-description.md +0 -51
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/outputs/verification-strategy.md +0 -75
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/with_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/grading.json +0 -10
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/code-changes.md +0 -529
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/execution-plan.md +0 -127
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/pr-description.md +0 -42
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/outputs/verification-strategy.md +0 -120
- package/.opencode/skills/work-with-pr-workspace/iteration-1/eval-5/without_skill/timing.json +0 -1
- package/.opencode/skills/work-with-pr-workspace/iteration-1/review.html +0 -1326
- package/dist/config/schema/codegraph.d.ts +0 -12
- package/dist/config/schema/start-work.d.ts +0 -5
- package/dist/features/builtin-commands/templates/start-work.d.ts +0 -1
- package/dist/features/builtin-skills/index.d.ts +0 -1
- package/dist/features/builtin-skills/skill-file-loader.d.ts +0 -1
- package/dist/features/builtin-skills/skills/agent-browser-skill.d.ts +0 -1
- package/dist/features/builtin-skills/skills/agent-browser-template.d.ts +0 -1
- package/dist/features/builtin-skills/skills/debugging.d.ts +0 -1
- package/dist/features/builtin-skills/skills/dev-browser.d.ts +0 -1
- package/dist/features/builtin-skills/skills/frontend.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/commit-atomic-planning.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/commit-context-analysis.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/commit-execution-verification.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/history-search-workflow.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/overview.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/quick-reference.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-sections/rebase-workflow.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master-skill-metadata.d.ts +0 -1
- package/dist/features/builtin-skills/skills/git-master.d.ts +0 -1
- package/dist/features/builtin-skills/skills/index.d.ts +0 -1
- package/dist/features/builtin-skills/skills/init-deep.d.ts +0 -1
- package/dist/features/builtin-skills/skills/playwright-cli.d.ts +0 -1
- package/dist/features/builtin-skills/skills/playwright-mcp-skill.d.ts +0 -1
- package/dist/features/builtin-skills/skills/playwright.d.ts +0 -1
- package/dist/features/builtin-skills/skills/remove-ai-slops.d.ts +0 -1
- package/dist/features/builtin-skills/skills/review-work.d.ts +0 -1
- package/dist/features/builtin-skills/skills/security-research.d.ts +0 -1
- package/dist/features/builtin-skills/skills/security-review.d.ts +0 -1
- package/dist/features/builtin-skills/skills/team-mode.d.ts +0 -1
- package/dist/features/builtin-skills/skills/visual-qa.d.ts +0 -1
- package/dist/features/builtin-skills/skills.d.ts +0 -1
- package/dist/features/builtin-skills/types.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/agent-loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/command-loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/discovery-core.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/discovery-paths.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/discovery.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/hook-loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/index.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/install-path-resolver.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/installed-plugin-database.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/loaded-plugin.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/mcp-server-loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/plugin-key.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/plugin-manifest.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/plugin-path-resolver.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/plugin-settings.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/scope-filter.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/skill-loader.d.ts +0 -1
- package/dist/features/claude-code-plugin-loader/types.d.ts +0 -1
- package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
- package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
- package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
- package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
- package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
- package/dist/hooks/ralph-loop/completion-promise-detector-test-input.d.ts +0 -11
- package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
- package/dist/hooks/start-work/start-work-hook.d.ts +0 -23
- package/dist/mcp/codegraph.d.ts +0 -16
- package/dist/plugin/chat-message/start-work-message.d.ts +0 -5
- package/dist/shared/prompt-async-gate/message-inspection-error.d.ts +0 -1
- package/dist/shared/prompt-async-gate/pending-tool-turn.d.ts +0 -1
- package/dist/shared/prompt-async-gate/prompt-message-state.d.ts +0 -1
- package/dist/shared/prompt-async-gate/queue.d.ts +0 -1
- package/dist/shared/prompt-async-gate/recent-dispatches.d.ts +0 -1
- package/dist/shared/prompt-async-gate/reservations.d.ts +0 -1
- package/dist/shared/prompt-async-gate/semantic-dedupe.d.ts +0 -1
- package/dist/shared/prompt-async-gate/session-idle-dispatch.d.ts +0 -1
- package/dist/shared/prompt-async-gate/timing.d.ts +0 -1
- package/dist/shared/prompt-async-gate/types.d.ts +0 -1
- package/dist/skills/data-scientist/references/common-scenarios.md +0 -176
- package/dist/skills/data-scientist/references/execution-templates.md +0 -197
- package/dist/skills/data-scientist/references/integration-patterns.md +0 -153
- package/dist/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/dist/skills/visual-qa/references/agent-browser-setup.md +0 -45
- package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
- package/dist/tools/call-omo-agent/message-storage-directory.d.ts +0 -1
- package/dist/tools/delegate-task/anthropic-categories.d.ts +0 -2
- package/dist/tools/delegate-task/model-string-parser.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/cleanup-errors.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/constants.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/language-mappings.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/lsp/process-signal-cleanup.d.ts +0 -1
- package/packages/lsp-tools-mcp/dist/missing-dependency-result.d.ts +0 -1
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
- package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
- package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12244
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9842
- package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
- package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -309
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -80
- package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -21
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
- package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
- package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
- package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
- package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
- package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
- package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
- package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
- package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
- package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
- package/packages/omo-codex/plugin/components/start-work-continuation/LICENSE +0 -21
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +0 -28
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +0 -477
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +0 -17
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
- package/packages/omo-codex/plugin/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/omo-codex/plugin/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/omo-codex/plugin/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/omo-codex/plugin/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/omo-codex/plugin/skills/start-work/agents/openai.yaml +0 -2
- package/packages/omo-codex/plugin/skills/visual-qa/references/agent-browser-setup.md +0 -45
- package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
- package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
- package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
- package/packages/shared-skills/skills/data-scientist/references/common-scenarios.md +0 -176
- package/packages/shared-skills/skills/data-scientist/references/execution-templates.md +0 -197
- package/packages/shared-skills/skills/data-scientist/references/integration-patterns.md +0 -153
- package/packages/shared-skills/skills/data-scientist/references/performance-benchmarks.md +0 -37
- package/packages/shared-skills/skills/visual-qa/references/agent-browser-setup.md +0 -45
- /package/dist/hooks/{start-work → ulw-execute}/context-info-formatters.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/explicit-plan-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/notepad-scaffold.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/parse-user-request.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-discovery-context.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/plan-selection.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/session-plan-affinity.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/work-initializer.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-block.d.ts +0 -0
- /package/dist/hooks/{start-work → ulw-execute}/worktree-detector.d.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/.gitattributes +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/CHANGELOG.md +0 -0
- /package/packages/omo-codex/plugin/components/{codegraph → ulw-execute-continuation}/LICENSE +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/src/plan-checklist.ts +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-completed.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-mixed-platforms.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/boulder-single-codex-work.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-all-done.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-scaffold.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-nested-checkboxes.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/test/fixtures/plan-with-unchecked.md +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.build.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/tsconfig.json +0 -0
- /package/packages/omo-codex/plugin/components/{start-work-continuation → ulw-execute-continuation}/vitest.config.ts +0 -0
|
@@ -15,6 +15,13 @@ import { pathToFileURL as pathToFileURL3 } from "node:url";
|
|
|
15
15
|
// ../lsp-core/src/lsp/connection.ts
|
|
16
16
|
import { pathToFileURL } from "node:url";
|
|
17
17
|
|
|
18
|
+
// ../lsp-core/src/lsp/timer-provider.ts
|
|
19
|
+
var realTimerProvider = {
|
|
20
|
+
now: () => Date.now(),
|
|
21
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
22
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
23
|
+
};
|
|
24
|
+
|
|
18
25
|
// ../lsp-core/src/lsp/constants.ts
|
|
19
26
|
var DEFAULT_MAX_REFERENCES = 200;
|
|
20
27
|
var DEFAULT_MAX_SYMBOLS = 200;
|
|
@@ -23,28 +30,24 @@ var DEFAULT_MAX_DIRECTORY_FILES = 50;
|
|
|
23
30
|
var REQUEST_TIMEOUT_MS = 15000;
|
|
24
31
|
var INIT_TIMEOUT_MS = 60000;
|
|
25
32
|
var IDLE_TIMEOUT_MS = 5 * 60000;
|
|
33
|
+
var MAX_RESIDENT_CLIENTS = 6;
|
|
26
34
|
var REAPER_INTERVAL_MS = 60000;
|
|
27
35
|
var STOP_HARD_KILL_TIMEOUT_MS = 5000;
|
|
28
36
|
var STOP_SIGKILL_GRACE_MS = 1000;
|
|
37
|
+
var CLIENT_RESPAWN_RETRY_LIMIT = 2;
|
|
38
|
+
var CLIENT_RESPAWN_COOLDOWN_MS = 60000;
|
|
29
39
|
|
|
30
40
|
// ../lsp-core/src/lsp/errors.ts
|
|
31
41
|
class LspConnectionClosedError extends Error {
|
|
32
|
-
serverId;
|
|
33
|
-
root;
|
|
34
|
-
name = "LspConnectionClosedError";
|
|
35
42
|
constructor(serverId, root, message) {
|
|
36
43
|
super(message ?? `LSP connection closed for ${serverId} at ${root}`);
|
|
37
44
|
this.serverId = serverId;
|
|
38
45
|
this.root = root;
|
|
46
|
+
this.name = "LspConnectionClosedError";
|
|
39
47
|
}
|
|
40
48
|
}
|
|
41
49
|
|
|
42
50
|
class LspProcessExitedError extends Error {
|
|
43
|
-
serverId;
|
|
44
|
-
root;
|
|
45
|
-
exitCode;
|
|
46
|
-
stderrTail;
|
|
47
|
-
name = "LspProcessExitedError";
|
|
48
51
|
constructor(serverId, root, exitCode, stderrTail) {
|
|
49
52
|
const stderrSuffix = stderrTail ? `
|
|
50
53
|
stderr tail: ${stderrTail}` : "";
|
|
@@ -53,46 +56,59 @@ stderr tail: ${stderrTail}` : "";
|
|
|
53
56
|
this.root = root;
|
|
54
57
|
this.exitCode = exitCode;
|
|
55
58
|
this.stderrTail = stderrTail;
|
|
59
|
+
this.name = "LspProcessExitedError";
|
|
56
60
|
}
|
|
57
61
|
}
|
|
58
62
|
|
|
59
63
|
class LspRequestTimeoutError extends Error {
|
|
60
|
-
method;
|
|
61
|
-
stderrTail;
|
|
62
|
-
name = "LspRequestTimeoutError";
|
|
63
64
|
constructor(method, stderrTail) {
|
|
64
65
|
const stderrSuffix = stderrTail ? `
|
|
65
66
|
recent stderr: ${stderrTail}` : "";
|
|
66
67
|
super(`LSP request timeout (method: ${method})${stderrSuffix}`);
|
|
67
68
|
this.method = method;
|
|
68
69
|
this.stderrTail = stderrTail;
|
|
70
|
+
this.name = "LspRequestTimeoutError";
|
|
69
71
|
}
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
class LspInvalidPathError extends Error {
|
|
73
|
-
|
|
75
|
+
constructor() {
|
|
76
|
+
super(...arguments);
|
|
77
|
+
this.name = "LspInvalidPathError";
|
|
78
|
+
}
|
|
74
79
|
}
|
|
75
80
|
|
|
76
81
|
class LspServerLookupError extends Error {
|
|
77
|
-
lookup;
|
|
78
|
-
name = "LspServerLookupError";
|
|
79
82
|
constructor(message, lookup) {
|
|
80
83
|
super(message);
|
|
81
84
|
this.lookup = lookup;
|
|
85
|
+
this.name = "LspServerLookupError";
|
|
82
86
|
}
|
|
83
87
|
}
|
|
84
88
|
|
|
85
89
|
class LspServerInitializingError extends Error {
|
|
86
|
-
originalError;
|
|
87
|
-
name = "LspServerInitializingError";
|
|
88
90
|
constructor(originalError) {
|
|
89
91
|
super(`LSP server is still initializing. Please retry in a few seconds. Original error: ${originalError.message}`);
|
|
90
92
|
this.originalError = originalError;
|
|
93
|
+
this.name = "LspServerInitializingError";
|
|
91
94
|
}
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
class LspProcessSpawnError extends Error {
|
|
95
|
-
|
|
98
|
+
constructor() {
|
|
99
|
+
super(...arguments);
|
|
100
|
+
this.name = "LspProcessSpawnError";
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
class LspClientRespawnBudgetExceededError extends Error {
|
|
105
|
+
constructor(serverId, root, retryLimit) {
|
|
106
|
+
super(`LSP server ${serverId} at ${root} failed to stay alive; respawn budget exhausted ` + `(${retryLimit} consecutive dead generations). Retrying after the cooldown may succeed.`);
|
|
107
|
+
this.serverId = serverId;
|
|
108
|
+
this.root = root;
|
|
109
|
+
this.retryLimit = retryLimit;
|
|
110
|
+
this.name = "LspClientRespawnBudgetExceededError";
|
|
111
|
+
}
|
|
96
112
|
}
|
|
97
113
|
function isLspDeadConnectionError(err) {
|
|
98
114
|
return err instanceof LspConnectionClosedError || err instanceof LspProcessExitedError;
|
|
@@ -108,20 +124,31 @@ var METHOD_NOT_FOUND = -32601;
|
|
|
108
124
|
var INTERNAL_ERROR = -32603;
|
|
109
125
|
|
|
110
126
|
class JsonRpcConnection {
|
|
111
|
-
reader;
|
|
112
|
-
writer;
|
|
113
|
-
pendingRequests = new Map;
|
|
114
|
-
notificationHandlers = new Map;
|
|
115
|
-
requestHandlers = new Map;
|
|
116
|
-
closeHandlers = [];
|
|
117
|
-
errorHandlers = [];
|
|
118
|
-
inputBuffer = Buffer.alloc(0);
|
|
119
|
-
nextRequestId = 1;
|
|
120
|
-
listening = false;
|
|
121
|
-
disposed = false;
|
|
122
127
|
constructor(reader, writer) {
|
|
123
128
|
this.reader = reader;
|
|
124
129
|
this.writer = writer;
|
|
130
|
+
this.pendingRequests = new Map;
|
|
131
|
+
this.notificationHandlers = new Map;
|
|
132
|
+
this.requestHandlers = new Map;
|
|
133
|
+
this.closeHandlers = [];
|
|
134
|
+
this.errorHandlers = [];
|
|
135
|
+
this.inputBuffer = Buffer.alloc(0);
|
|
136
|
+
this.nextRequestId = 1;
|
|
137
|
+
this.listening = false;
|
|
138
|
+
this.disposed = false;
|
|
139
|
+
this.handleData = (chunk) => {
|
|
140
|
+
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
141
|
+
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
142
|
+
this.drainInputBuffer();
|
|
143
|
+
};
|
|
144
|
+
this.handleClose = () => {
|
|
145
|
+
for (const handler of this.closeHandlers) {
|
|
146
|
+
handler();
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
this.handleStreamError = (error) => {
|
|
150
|
+
this.emitError(error);
|
|
151
|
+
};
|
|
125
152
|
}
|
|
126
153
|
listen() {
|
|
127
154
|
if (this.listening)
|
|
@@ -156,6 +183,7 @@ class JsonRpcConnection {
|
|
|
156
183
|
let cancelAfterWrite = false;
|
|
157
184
|
let settled = false;
|
|
158
185
|
const writeCancel = () => this.writeMessage({ jsonrpc: "2.0", method: "$/cancelRequest", params: { id } });
|
|
186
|
+
let rejectAfterCancelWrite;
|
|
159
187
|
const responsePromise = new Promise((resolve, reject) => {
|
|
160
188
|
const cleanup = () => {
|
|
161
189
|
options.signal?.removeEventListener("abort", onAbort);
|
|
@@ -167,15 +195,19 @@ class JsonRpcConnection {
|
|
|
167
195
|
this.pendingRequests.delete(key);
|
|
168
196
|
cleanup();
|
|
169
197
|
const rejectCancelled = () => reject(abortError(options.signal));
|
|
198
|
+
rejectAfterCancelWrite = async () => {
|
|
199
|
+
try {
|
|
200
|
+
await writeCancel();
|
|
201
|
+
} catch (error) {
|
|
202
|
+
this.emitError(toError(error));
|
|
203
|
+
}
|
|
204
|
+
rejectCancelled();
|
|
205
|
+
};
|
|
170
206
|
if (!requestWritten) {
|
|
171
207
|
cancelAfterWrite = true;
|
|
172
|
-
rejectCancelled();
|
|
173
208
|
return;
|
|
174
209
|
}
|
|
175
|
-
|
|
176
|
-
this.emitError(toError(error));
|
|
177
|
-
rejectCancelled();
|
|
178
|
-
});
|
|
210
|
+
rejectAfterCancelWrite();
|
|
179
211
|
};
|
|
180
212
|
const onAbort = () => settleCancel();
|
|
181
213
|
this.pendingRequests.set(key, {
|
|
@@ -203,7 +235,7 @@ class JsonRpcConnection {
|
|
|
203
235
|
await this.writeMessage(message);
|
|
204
236
|
requestWritten = true;
|
|
205
237
|
if (cancelAfterWrite)
|
|
206
|
-
await
|
|
238
|
+
await rejectAfterCancelWrite?.();
|
|
207
239
|
} catch (error) {
|
|
208
240
|
if (settled)
|
|
209
241
|
return responsePromise;
|
|
@@ -242,19 +274,6 @@ class JsonRpcConnection {
|
|
|
242
274
|
this.notificationHandlers.clear();
|
|
243
275
|
this.requestHandlers.clear();
|
|
244
276
|
}
|
|
245
|
-
handleData = (chunk) => {
|
|
246
|
-
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
247
|
-
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
248
|
-
this.drainInputBuffer();
|
|
249
|
-
};
|
|
250
|
-
handleClose = () => {
|
|
251
|
-
for (const handler of this.closeHandlers) {
|
|
252
|
-
handler();
|
|
253
|
-
}
|
|
254
|
-
};
|
|
255
|
-
handleStreamError = (error) => {
|
|
256
|
-
this.emitError(error);
|
|
257
|
-
};
|
|
258
277
|
drainInputBuffer() {
|
|
259
278
|
while (true) {
|
|
260
279
|
const headerEnd = this.inputBuffer.indexOf(HEADER_SEPARATOR);
|
|
@@ -602,33 +621,29 @@ function isPosition(value) {
|
|
|
602
621
|
|
|
603
622
|
// ../lsp-core/src/lsp/transport.ts
|
|
604
623
|
class LspClientNotStartedError extends Error {
|
|
605
|
-
serverId;
|
|
606
|
-
root;
|
|
607
|
-
name = "LspClientNotStartedError";
|
|
608
624
|
constructor(serverId, root) {
|
|
609
625
|
super("LSP client not started");
|
|
610
626
|
this.serverId = serverId;
|
|
611
627
|
this.root = root;
|
|
628
|
+
this.name = "LspClientNotStartedError";
|
|
612
629
|
}
|
|
613
630
|
}
|
|
614
631
|
|
|
615
632
|
class LspClientTransport {
|
|
616
|
-
root;
|
|
617
|
-
server;
|
|
618
|
-
proc = null;
|
|
619
|
-
connection = null;
|
|
620
|
-
stderrBuffer = [];
|
|
621
|
-
processExited = false;
|
|
622
|
-
diagnosticsStore = new Map;
|
|
623
|
-
requestTimeoutMs;
|
|
624
|
-
initializeTimeoutMs;
|
|
625
|
-
workspaceApplyEditHandler = null;
|
|
626
|
-
diagnosticPullSupported = false;
|
|
627
633
|
constructor(root, server, timeouts = {}) {
|
|
628
634
|
this.root = root;
|
|
629
635
|
this.server = server;
|
|
636
|
+
this.proc = null;
|
|
637
|
+
this.connection = null;
|
|
638
|
+
this.stderrBuffer = [];
|
|
639
|
+
this.processExited = false;
|
|
640
|
+
this.diagnosticsStore = new Map;
|
|
641
|
+
this.workspaceApplyEditHandler = null;
|
|
642
|
+
this.diagnosticPullSupported = false;
|
|
643
|
+
this.documentFormattingSupported = false;
|
|
630
644
|
this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
|
|
631
645
|
this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
646
|
+
this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
|
|
632
647
|
}
|
|
633
648
|
pid() {
|
|
634
649
|
return this.proc?.pid;
|
|
@@ -648,6 +663,12 @@ class LspClientTransport {
|
|
|
648
663
|
isDiagnosticPullSupported() {
|
|
649
664
|
return this.diagnosticPullSupported;
|
|
650
665
|
}
|
|
666
|
+
setDocumentFormattingSupported(supported) {
|
|
667
|
+
this.documentFormattingSupported = supported;
|
|
668
|
+
}
|
|
669
|
+
isDocumentFormattingSupported() {
|
|
670
|
+
return this.documentFormattingSupported;
|
|
671
|
+
}
|
|
651
672
|
handlePublishDiagnostics(params) {
|
|
652
673
|
this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
|
|
653
674
|
}
|
|
@@ -723,7 +744,7 @@ class LspClientTransport {
|
|
|
723
744
|
const options = args[1];
|
|
724
745
|
const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
|
|
725
746
|
const timeoutController = new AbortController;
|
|
726
|
-
const timeoutHandle = setTimeout(() => {
|
|
747
|
+
const timeoutHandle = this.timerProvider.setTimeout(() => {
|
|
727
748
|
const stderrTail = this.stderrBuffer.slice(-5).join(`
|
|
728
749
|
`);
|
|
729
750
|
timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
|
|
@@ -742,7 +763,7 @@ class LspClientTransport {
|
|
|
742
763
|
}
|
|
743
764
|
throw error;
|
|
744
765
|
} finally {
|
|
745
|
-
clearTimeout(timeoutHandle);
|
|
766
|
+
this.timerProvider.clearTimeout(timeoutHandle);
|
|
746
767
|
combinedSignal.dispose();
|
|
747
768
|
}
|
|
748
769
|
}
|
|
@@ -861,6 +882,14 @@ function supportsDiagnosticPull(capabilities) {
|
|
|
861
882
|
return false;
|
|
862
883
|
return Object.hasOwn(capabilities, "diagnosticProvider");
|
|
863
884
|
}
|
|
885
|
+
function supportsDocumentFormatting(capabilities) {
|
|
886
|
+
if (capabilities === undefined)
|
|
887
|
+
return false;
|
|
888
|
+
const provider = capabilities.documentFormattingProvider;
|
|
889
|
+
if (provider === undefined || provider === null || provider === false)
|
|
890
|
+
return false;
|
|
891
|
+
return provider === true || typeof provider === "object";
|
|
892
|
+
}
|
|
864
893
|
|
|
865
894
|
class LspClientConnection extends LspClientTransport {
|
|
866
895
|
async initialize() {
|
|
@@ -877,6 +906,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
877
906
|
references: {},
|
|
878
907
|
documentSymbol: { hierarchicalDocumentSymbolSupport: true },
|
|
879
908
|
publishDiagnostics: {},
|
|
909
|
+
formatting: { dynamicRegistration: false },
|
|
880
910
|
rename: {
|
|
881
911
|
prepareSupport: true,
|
|
882
912
|
prepareSupportDefaultBehavior: 1
|
|
@@ -918,6 +948,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
918
948
|
initializationOptions: this.server.initialization
|
|
919
949
|
}, { timeoutMs: this.initializeTimeoutMs });
|
|
920
950
|
this.setDiagnosticPullSupported(supportsDiagnosticPull(result?.capabilities));
|
|
951
|
+
this.setDocumentFormattingSupported(supportsDocumentFormatting(result?.capabilities));
|
|
921
952
|
await this.sendNotification("initialized", {});
|
|
922
953
|
await this.sendNotification("workspace/didChangeConfiguration", {
|
|
923
954
|
settings: { json: { validate: { enable: true } } }
|
|
@@ -1123,6 +1154,17 @@ function canonicalPath(filePath) {
|
|
|
1123
1154
|
return absolute;
|
|
1124
1155
|
}
|
|
1125
1156
|
}
|
|
1157
|
+
function normalizeDocumentUri(uri) {
|
|
1158
|
+
let decoded = uri;
|
|
1159
|
+
try {
|
|
1160
|
+
decoded = decodeURIComponent(uri);
|
|
1161
|
+
} catch {
|
|
1162
|
+
decoded = uri;
|
|
1163
|
+
}
|
|
1164
|
+
if (process.platform !== "win32")
|
|
1165
|
+
return decoded;
|
|
1166
|
+
return decoded.replace(/^(file:\/\/\/)([a-z]):/, (_match, prefix, drive) => `${prefix}${drive.toUpperCase()}:`);
|
|
1167
|
+
}
|
|
1126
1168
|
function isSameOrDescendant(candidate, parent) {
|
|
1127
1169
|
const suffix = relative(parent, candidate);
|
|
1128
1170
|
return suffix === "" || !suffix.startsWith("..") && suffix !== "..";
|
|
@@ -1133,17 +1175,18 @@ function movedPath(candidate, oldPath, newPath) {
|
|
|
1133
1175
|
}
|
|
1134
1176
|
|
|
1135
1177
|
class WorkspaceDocumentState {
|
|
1136
|
-
sendNotification;
|
|
1137
|
-
clearDiagnostics;
|
|
1138
|
-
openDocuments = new Map;
|
|
1139
|
-
openByUri = new Map;
|
|
1140
|
-
openPromises = new Map;
|
|
1141
|
-
now;
|
|
1142
|
-
versionlessPublishQuiescenceMs;
|
|
1143
1178
|
constructor(sendNotification, clearDiagnostics, options = {}) {
|
|
1144
1179
|
this.sendNotification = sendNotification;
|
|
1145
1180
|
this.clearDiagnostics = clearDiagnostics;
|
|
1146
|
-
this.
|
|
1181
|
+
this.openDocuments = new Map;
|
|
1182
|
+
this.openByUri = new Map;
|
|
1183
|
+
this.openPromises = new Map;
|
|
1184
|
+
this.timerProvider = options.timerProvider ?? {
|
|
1185
|
+
now: options.now ?? (() => Date.now()),
|
|
1186
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
1187
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
1188
|
+
};
|
|
1189
|
+
this.now = () => this.timerProvider.now();
|
|
1147
1190
|
this.versionlessPublishQuiescenceMs = options.versionlessPublishQuiescenceMs ?? DEFAULT_VERSIONLESS_PUBLISH_QUIESCENCE_MS;
|
|
1148
1191
|
}
|
|
1149
1192
|
async openFile(filePath) {
|
|
@@ -1165,7 +1208,7 @@ class WorkspaceDocumentState {
|
|
|
1165
1208
|
return this.openDocuments.get(canonicalPath(filePath))?.version;
|
|
1166
1209
|
}
|
|
1167
1210
|
getStoredDiagnostics(uri) {
|
|
1168
|
-
const state = this.openByUri.get(uri);
|
|
1211
|
+
const state = this.openByUri.get(normalizeDocumentUri(uri));
|
|
1169
1212
|
if (!state)
|
|
1170
1213
|
return [];
|
|
1171
1214
|
return state.lastPublish?.diagnostics ?? state.pullCache?.diagnostics ?? [];
|
|
@@ -1187,13 +1230,13 @@ class WorkspaceDocumentState {
|
|
|
1187
1230
|
return state !== undefined && state.uri === snapshot.uri && state.version === snapshot.version && state.generation === snapshot.documentGeneration;
|
|
1188
1231
|
}
|
|
1189
1232
|
getPullCache(snapshot) {
|
|
1190
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1233
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1191
1234
|
if (!state?.pullCache || state.pullCache.documentVersion !== snapshot.version)
|
|
1192
1235
|
return null;
|
|
1193
1236
|
return state.pullCache;
|
|
1194
1237
|
}
|
|
1195
1238
|
recordPullDiagnostics(snapshot, report) {
|
|
1196
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1239
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1197
1240
|
if (!state)
|
|
1198
1241
|
return;
|
|
1199
1242
|
state.pullCache = {
|
|
@@ -1203,7 +1246,7 @@ class WorkspaceDocumentState {
|
|
|
1203
1246
|
};
|
|
1204
1247
|
}
|
|
1205
1248
|
recordPublishedDiagnostics(params) {
|
|
1206
|
-
const state = this.openByUri.get(params.uri);
|
|
1249
|
+
const state = this.openByUri.get(normalizeDocumentUri(params.uri));
|
|
1207
1250
|
if (!state)
|
|
1208
1251
|
return;
|
|
1209
1252
|
state.publishGeneration += 1;
|
|
@@ -1217,7 +1260,7 @@ class WorkspaceDocumentState {
|
|
|
1217
1260
|
this.notifyWaiters(state);
|
|
1218
1261
|
}
|
|
1219
1262
|
resolvePushDiagnostics(snapshot) {
|
|
1220
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1263
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1221
1264
|
if (!state?.lastPublish)
|
|
1222
1265
|
return { status: "missing" };
|
|
1223
1266
|
const publish = state.lastPublish;
|
|
@@ -1231,20 +1274,22 @@ class WorkspaceDocumentState {
|
|
|
1231
1274
|
return waitMs === 0 ? { status: "ready", diagnostics: publish.diagnostics } : { status: "wait", waitMs };
|
|
1232
1275
|
}
|
|
1233
1276
|
waitForDiagnosticsActivity(snapshot, timeoutMs) {
|
|
1234
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1277
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1235
1278
|
if (!state || timeoutMs <= 0)
|
|
1236
1279
|
return Promise.resolve();
|
|
1280
|
+
if (state.publishGeneration !== snapshot.publishGeneration)
|
|
1281
|
+
return Promise.resolve();
|
|
1237
1282
|
return new Promise((resolveActivity) => {
|
|
1238
1283
|
let settled = false;
|
|
1239
1284
|
const finish = () => {
|
|
1240
1285
|
if (settled)
|
|
1241
1286
|
return;
|
|
1242
1287
|
settled = true;
|
|
1243
|
-
clearTimeout(timer);
|
|
1288
|
+
this.timerProvider.clearTimeout(timer);
|
|
1244
1289
|
state.waiters.delete(finish);
|
|
1245
1290
|
resolveActivity();
|
|
1246
1291
|
};
|
|
1247
|
-
const timer = setTimeout(finish, timeoutMs);
|
|
1292
|
+
const timer = this.timerProvider.setTimeout(finish, timeoutMs);
|
|
1248
1293
|
if (typeof timer.unref === "function")
|
|
1249
1294
|
timer.unref();
|
|
1250
1295
|
state.waiters.add(finish);
|
|
@@ -1352,7 +1397,7 @@ class WorkspaceDocumentState {
|
|
|
1352
1397
|
waiters: new Set
|
|
1353
1398
|
};
|
|
1354
1399
|
this.openDocuments.set(path, state);
|
|
1355
|
-
this.openByUri.set(state.uri, state);
|
|
1400
|
+
this.openByUri.set(normalizeDocumentUri(state.uri), state);
|
|
1356
1401
|
this.notifyWaiters(state);
|
|
1357
1402
|
await this.sendNotification("textDocument/didOpen", {
|
|
1358
1403
|
textDocument: { uri: state.uri, languageId: state.languageId, version: state.version, text }
|
|
@@ -1377,7 +1422,7 @@ class WorkspaceDocumentState {
|
|
|
1377
1422
|
}
|
|
1378
1423
|
async closeDocument(state) {
|
|
1379
1424
|
this.openDocuments.delete(state.path);
|
|
1380
|
-
this.openByUri.delete(state.uri);
|
|
1425
|
+
this.openByUri.delete(normalizeDocumentUri(state.uri));
|
|
1381
1426
|
this.clearDiagnostics(state.uri);
|
|
1382
1427
|
this.notifyWaiters(state);
|
|
1383
1428
|
await this.sendNotification("textDocument/didClose", { textDocument: { uri: state.uri } });
|
|
@@ -1406,13 +1451,11 @@ import { dirname, isAbsolute, relative as relative2, resolve as resolve2 } from
|
|
|
1406
1451
|
import { fileURLToPath } from "node:url";
|
|
1407
1452
|
|
|
1408
1453
|
class WorkspaceEditPathError extends Error {
|
|
1409
|
-
path;
|
|
1410
|
-
detail;
|
|
1411
|
-
name = "WorkspaceEditPathError";
|
|
1412
1454
|
constructor(path, detail) {
|
|
1413
1455
|
super(`${detail}: ${path}`);
|
|
1414
1456
|
this.path = path;
|
|
1415
1457
|
this.detail = detail;
|
|
1458
|
+
this.name = "WorkspaceEditPathError";
|
|
1416
1459
|
}
|
|
1417
1460
|
}
|
|
1418
1461
|
function isPathInsideWorkspace(filePath, workspaceRoot) {
|
|
@@ -1704,13 +1747,11 @@ function canonicalFingerprint(operations) {
|
|
|
1704
1747
|
|
|
1705
1748
|
// ../lsp-core/src/lsp/workspace-edit-types.ts
|
|
1706
1749
|
class WorkspaceEditValidationError extends Error {
|
|
1707
|
-
changeIndex;
|
|
1708
|
-
detail;
|
|
1709
|
-
name = "WorkspaceEditValidationError";
|
|
1710
1750
|
constructor(changeIndex, detail) {
|
|
1711
1751
|
super(`change ${changeIndex}: ${detail}`);
|
|
1712
1752
|
this.changeIndex = changeIndex;
|
|
1713
1753
|
this.detail = detail;
|
|
1754
|
+
this.name = "WorkspaceEditValidationError";
|
|
1714
1755
|
}
|
|
1715
1756
|
}
|
|
1716
1757
|
|
|
@@ -1796,14 +1837,14 @@ function parseSinglePathResource(input, kind) {
|
|
|
1796
1837
|
return;
|
|
1797
1838
|
}
|
|
1798
1839
|
if (kind === "create") {
|
|
1799
|
-
const
|
|
1840
|
+
const options = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
|
|
1800
1841
|
target.operations.push({
|
|
1801
1842
|
kind,
|
|
1802
1843
|
changeIndex,
|
|
1803
1844
|
path: resolvedPath.path,
|
|
1804
1845
|
reportedPath: resolvedPath.requestedPath,
|
|
1805
|
-
overwrite:
|
|
1806
|
-
ignoreIfExists:
|
|
1846
|
+
overwrite: options["overwrite"] ?? false,
|
|
1847
|
+
ignoreIfExists: options["ignoreIfExists"] ?? false,
|
|
1807
1848
|
followedSymbolicLink: resolvedPath.followedSymbolicLink
|
|
1808
1849
|
});
|
|
1809
1850
|
return;
|
|
@@ -2208,10 +2249,9 @@ function simulateDelete(operation, virtual) {
|
|
|
2208
2249
|
import { existsSync as existsSync4, lstatSync as lstatSync3, readdirSync as readdirSync2 } from "node:fs";
|
|
2209
2250
|
import { dirname as dirname3, resolve as resolve4 } from "node:path";
|
|
2210
2251
|
class WorkspaceSnapshotBuilder {
|
|
2211
|
-
workspaceRoot;
|
|
2212
|
-
snapshots = new Map;
|
|
2213
2252
|
constructor(workspaceRoot) {
|
|
2214
2253
|
this.workspaceRoot = workspaceRoot;
|
|
2254
|
+
this.snapshots = new Map;
|
|
2215
2255
|
}
|
|
2216
2256
|
build(operations) {
|
|
2217
2257
|
this.add(this.workspaceRoot, false);
|
|
@@ -2255,8 +2295,10 @@ function snapshotOperations(operations, workspaceRoot) {
|
|
|
2255
2295
|
|
|
2256
2296
|
// ../lsp-core/src/lsp/workspace-edit-plan.ts
|
|
2257
2297
|
class PlanPathIndex {
|
|
2258
|
-
|
|
2259
|
-
|
|
2298
|
+
constructor() {
|
|
2299
|
+
this.firstChangeByPath = new Map;
|
|
2300
|
+
this.reportedPathByCanonical = new Map;
|
|
2301
|
+
}
|
|
2260
2302
|
build(operations) {
|
|
2261
2303
|
for (const operation of operations) {
|
|
2262
2304
|
switch (operation.kind) {
|
|
@@ -2272,11 +2314,11 @@ class PlanPathIndex {
|
|
|
2272
2314
|
}
|
|
2273
2315
|
}
|
|
2274
2316
|
}
|
|
2275
|
-
add(path,
|
|
2317
|
+
add(path, reportedPath, changeIndex) {
|
|
2276
2318
|
if (!this.firstChangeByPath.has(path))
|
|
2277
2319
|
this.firstChangeByPath.set(path, changeIndex);
|
|
2278
2320
|
if (!this.reportedPathByCanonical.has(path))
|
|
2279
|
-
this.reportedPathByCanonical.set(path,
|
|
2321
|
+
this.reportedPathByCanonical.set(path, reportedPath);
|
|
2280
2322
|
}
|
|
2281
2323
|
}
|
|
2282
2324
|
function fingerprintWorkspaceEdit(edit, workspaceRoot) {
|
|
@@ -2345,14 +2387,11 @@ function isRecord3(value) {
|
|
|
2345
2387
|
}
|
|
2346
2388
|
|
|
2347
2389
|
class WorkspaceMutationController {
|
|
2348
|
-
workspaceRoot;
|
|
2349
|
-
documents;
|
|
2350
|
-
activeLease = null;
|
|
2351
|
-
nextLeaseId = 1;
|
|
2352
|
-
io;
|
|
2353
2390
|
constructor(workspaceRoot, documents) {
|
|
2354
2391
|
this.workspaceRoot = workspaceRoot;
|
|
2355
2392
|
this.documents = documents;
|
|
2393
|
+
this.activeLease = null;
|
|
2394
|
+
this.nextLeaseId = 1;
|
|
2356
2395
|
}
|
|
2357
2396
|
setIo(io) {
|
|
2358
2397
|
this.io = io;
|
|
@@ -2391,8 +2430,8 @@ class WorkspaceMutationController {
|
|
|
2391
2430
|
};
|
|
2392
2431
|
}
|
|
2393
2432
|
lease.phase = "applying";
|
|
2394
|
-
lease.applyCompletion = new Promise((
|
|
2395
|
-
lease.resolveApply =
|
|
2433
|
+
lease.applyCompletion = new Promise((resolve) => {
|
|
2434
|
+
lease.resolveApply = resolve;
|
|
2396
2435
|
});
|
|
2397
2436
|
const edit = isRecord3(params) ? params["edit"] : undefined;
|
|
2398
2437
|
const record = edit === undefined ? { fingerprint: null, result: failure("workspace/applyEdit params.edit is required", 0) } : await this.applyEdit(edit, lease);
|
|
@@ -2465,14 +2504,12 @@ var DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3000;
|
|
|
2465
2504
|
var VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
|
|
2466
2505
|
|
|
2467
2506
|
class LspClient extends LspClientConnection {
|
|
2468
|
-
diagnosticPullErrors = [];
|
|
2469
|
-
documents;
|
|
2470
|
-
workspaceMutations;
|
|
2471
|
-
diagnosticsFreshnessTimeoutMs;
|
|
2472
2507
|
constructor(root, server, options = {}) {
|
|
2473
2508
|
super(root, server, options);
|
|
2509
|
+
this.diagnosticPullErrors = [];
|
|
2474
2510
|
this.diagnosticsFreshnessTimeoutMs = options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
|
|
2475
2511
|
this.documents = new WorkspaceDocumentState((method, params) => this.sendNotification(method, params), (uri) => this.diagnosticsStore.delete(uri), {
|
|
2512
|
+
timerProvider: this.timerProvider,
|
|
2476
2513
|
versionlessPublishQuiescenceMs: options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS
|
|
2477
2514
|
});
|
|
2478
2515
|
this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
|
|
@@ -2525,6 +2562,18 @@ class LspClient extends LspClientConnection {
|
|
|
2525
2562
|
textDocument: { uri: pathToFileURL3(absPath).href }
|
|
2526
2563
|
}, options);
|
|
2527
2564
|
}
|
|
2565
|
+
async formatDocument(filePath, options, signal) {
|
|
2566
|
+
if (!this.isDocumentFormattingSupported())
|
|
2567
|
+
return null;
|
|
2568
|
+
const absPath = this.resolveWorkspacePath(filePath);
|
|
2569
|
+
await this.openFile(absPath);
|
|
2570
|
+
const requestOptions = signal === undefined ? {} : { signal };
|
|
2571
|
+
const edits = await this.sendRequest("textDocument/formatting", {
|
|
2572
|
+
textDocument: { uri: pathToFileURL3(absPath).href },
|
|
2573
|
+
options
|
|
2574
|
+
}, requestOptions);
|
|
2575
|
+
return edits ?? [];
|
|
2576
|
+
}
|
|
2528
2577
|
async workspaceSymbols(query, signal) {
|
|
2529
2578
|
const options = signal === undefined ? {} : { signal };
|
|
2530
2579
|
return this.sendRequest("workspace/symbol", { query }, options);
|
|
@@ -2564,7 +2613,7 @@ class LspClient extends LspClientConnection {
|
|
|
2564
2613
|
const absPath = this.resolveWorkspacePath(filePath);
|
|
2565
2614
|
const uri = pathToFileURL3(absPath).href;
|
|
2566
2615
|
await this.openFile(absPath);
|
|
2567
|
-
const deadlineAt =
|
|
2616
|
+
const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
|
|
2568
2617
|
for (;; ) {
|
|
2569
2618
|
signal?.throwIfAborted();
|
|
2570
2619
|
const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
|
|
@@ -2577,13 +2626,13 @@ class LspClient extends LspClientConnection {
|
|
|
2577
2626
|
if (!pushFallbackOnly) {
|
|
2578
2627
|
const cached = this.documents.getPullCache(snapshot);
|
|
2579
2628
|
try {
|
|
2580
|
-
const
|
|
2581
|
-
if (
|
|
2629
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
2630
|
+
if (remainingMs <= 0)
|
|
2582
2631
|
return this.freshnessTimeout(absPath);
|
|
2583
2632
|
const result = await this.sendRequest("textDocument/diagnostic", {
|
|
2584
2633
|
textDocument: { uri },
|
|
2585
2634
|
...cached?.resultId === undefined ? {} : { previousResultId: cached.resultId }
|
|
2586
|
-
}, { timeoutMs:
|
|
2635
|
+
}, { timeoutMs: remainingMs, ...signal === undefined ? {} : { signal } });
|
|
2587
2636
|
if (!this.documents.isCurrentSnapshot(snapshot))
|
|
2588
2637
|
continue;
|
|
2589
2638
|
const report = this.parseDiagnosticPullReport(result);
|
|
@@ -2612,7 +2661,7 @@ class LspClient extends LspClientConnection {
|
|
|
2612
2661
|
}
|
|
2613
2662
|
if (!pushFallbackOnly)
|
|
2614
2663
|
continue;
|
|
2615
|
-
const remainingMs = deadlineAt -
|
|
2664
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
2616
2665
|
if (remainingMs <= 0) {
|
|
2617
2666
|
if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
|
|
2618
2667
|
const cached = this.documents.getPullCache(snapshot);
|
|
@@ -2664,7 +2713,7 @@ function waitForDiagnosticsActivity(wait, signal) {
|
|
|
2664
2713
|
return wait;
|
|
2665
2714
|
if (signal.aborted)
|
|
2666
2715
|
return Promise.reject(abortError2(signal));
|
|
2667
|
-
return new Promise((
|
|
2716
|
+
return new Promise((resolve, reject) => {
|
|
2668
2717
|
const onAbort = () => {
|
|
2669
2718
|
signal.removeEventListener("abort", onAbort);
|
|
2670
2719
|
reject(abortError2(signal));
|
|
@@ -2672,7 +2721,7 @@ function waitForDiagnosticsActivity(wait, signal) {
|
|
|
2672
2721
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
2673
2722
|
wait.then(() => {
|
|
2674
2723
|
signal.removeEventListener("abort", onAbort);
|
|
2675
|
-
|
|
2724
|
+
resolve();
|
|
2676
2725
|
}, (error) => {
|
|
2677
2726
|
signal.removeEventListener("abort", onAbort);
|
|
2678
2727
|
reject(error);
|
|
@@ -2740,7 +2789,7 @@ async function stopClientBestEffort(client) {
|
|
|
2740
2789
|
function awaitWithSignal(promise, signal) {
|
|
2741
2790
|
if (!signal)
|
|
2742
2791
|
return promise;
|
|
2743
|
-
return new Promise((
|
|
2792
|
+
return new Promise((resolve, reject) => {
|
|
2744
2793
|
let settled = false;
|
|
2745
2794
|
const onAbort = () => {
|
|
2746
2795
|
if (settled)
|
|
@@ -2758,7 +2807,7 @@ function awaitWithSignal(promise, signal) {
|
|
|
2758
2807
|
return;
|
|
2759
2808
|
settled = true;
|
|
2760
2809
|
signal.removeEventListener("abort", onAbort);
|
|
2761
|
-
|
|
2810
|
+
resolve(value);
|
|
2762
2811
|
}, (err) => {
|
|
2763
2812
|
if (settled)
|
|
2764
2813
|
return;
|
|
@@ -2770,18 +2819,16 @@ function awaitWithSignal(promise, signal) {
|
|
|
2770
2819
|
}
|
|
2771
2820
|
|
|
2772
2821
|
class LspManager {
|
|
2773
|
-
clients = new Map;
|
|
2774
|
-
reaperHandle = null;
|
|
2775
|
-
signalDisposer = null;
|
|
2776
|
-
disposed = false;
|
|
2777
|
-
idleTimeoutMs;
|
|
2778
|
-
initTimeoutMs;
|
|
2779
|
-
reaperIntervalMs;
|
|
2780
|
-
clientFactory;
|
|
2781
|
-
now;
|
|
2782
2822
|
constructor(options = {}) {
|
|
2823
|
+
this.clients = new Map;
|
|
2824
|
+
this.pendingStops = new Map;
|
|
2825
|
+
this.respawnBudgets = new Map;
|
|
2826
|
+
this.reaperHandle = null;
|
|
2827
|
+
this.signalDisposer = null;
|
|
2828
|
+
this.disposed = false;
|
|
2783
2829
|
this.idleTimeoutMs = options.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
|
|
2784
2830
|
this.initTimeoutMs = options.initTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
2831
|
+
this.maxResidentClients = options.maxResidentClients ?? MAX_RESIDENT_CLIENTS;
|
|
2785
2832
|
this.reaperIntervalMs = options.reaperIntervalMs ?? REAPER_INTERVAL_MS;
|
|
2786
2833
|
this.clientFactory = options.clientFactory ?? ((root, server) => new LspClient(root, server));
|
|
2787
2834
|
this.now = options.now ?? (() => Date.now());
|
|
@@ -2801,24 +2848,79 @@ class LspManager {
|
|
|
2801
2848
|
getKey(root, serverId) {
|
|
2802
2849
|
return `${root}::${serverId}`;
|
|
2803
2850
|
}
|
|
2851
|
+
tombstoneStop(key, client) {
|
|
2852
|
+
const stop = stopClientBestEffort(client);
|
|
2853
|
+
this.pendingStops.set(key, stop);
|
|
2854
|
+
stop.finally(() => {
|
|
2855
|
+
if (this.pendingStops.get(key) === stop) {
|
|
2856
|
+
this.pendingStops.delete(key);
|
|
2857
|
+
}
|
|
2858
|
+
});
|
|
2859
|
+
return stop;
|
|
2860
|
+
}
|
|
2861
|
+
recordDeadGeneration(key) {
|
|
2862
|
+
let budget = this.respawnBudgets.get(key);
|
|
2863
|
+
if (budget === undefined) {
|
|
2864
|
+
budget = { deadGenerations: 0, exhaustedAt: null };
|
|
2865
|
+
this.respawnBudgets.set(key, budget);
|
|
2866
|
+
}
|
|
2867
|
+
budget.deadGenerations += 1;
|
|
2868
|
+
}
|
|
2869
|
+
markHealthyGeneration(key) {
|
|
2870
|
+
this.respawnBudgets.delete(key);
|
|
2871
|
+
}
|
|
2872
|
+
ensureRespawnAllowed(key, root, serverId) {
|
|
2873
|
+
const budget = this.respawnBudgets.get(key);
|
|
2874
|
+
if (budget === undefined || budget.deadGenerations < CLIENT_RESPAWN_RETRY_LIMIT)
|
|
2875
|
+
return;
|
|
2876
|
+
if (budget.exhaustedAt === null) {
|
|
2877
|
+
budget.exhaustedAt = this.now();
|
|
2878
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
2879
|
+
}
|
|
2880
|
+
if (this.now() - budget.exhaustedAt < CLIENT_RESPAWN_COOLDOWN_MS) {
|
|
2881
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
2882
|
+
}
|
|
2883
|
+
budget.deadGenerations = 0;
|
|
2884
|
+
budget.exhaustedAt = null;
|
|
2885
|
+
}
|
|
2804
2886
|
reapStale() {
|
|
2805
2887
|
const t = this.now();
|
|
2806
2888
|
for (const [key, managed] of this.clients) {
|
|
2807
2889
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
2808
|
-
stopClientBestEffort(managed.client);
|
|
2809
2890
|
this.clients.delete(key);
|
|
2891
|
+
this.tombstoneStop(key, managed.client);
|
|
2810
2892
|
continue;
|
|
2811
2893
|
}
|
|
2812
2894
|
if (!managed.isInitializing && managed.refCount === 0 && managed.pendingWaiters === 0 && t - managed.lastUsedAt > this.idleTimeoutMs) {
|
|
2813
|
-
stopClientBestEffort(managed.client);
|
|
2814
2895
|
this.clients.delete(key);
|
|
2896
|
+
this.tombstoneStop(key, managed.client);
|
|
2897
|
+
}
|
|
2898
|
+
}
|
|
2899
|
+
}
|
|
2900
|
+
evictForAdmission() {
|
|
2901
|
+
while (this.clients.size >= this.maxResidentClients) {
|
|
2902
|
+
const victim = this.leastRecentlyUsedIdleClient();
|
|
2903
|
+
if (!victim)
|
|
2904
|
+
return;
|
|
2905
|
+
this.clients.delete(victim.key);
|
|
2906
|
+
this.tombstoneStop(victim.key, victim.managed.client);
|
|
2907
|
+
}
|
|
2908
|
+
}
|
|
2909
|
+
leastRecentlyUsedIdleClient() {
|
|
2910
|
+
let candidate = null;
|
|
2911
|
+
for (const [key, managed] of this.clients) {
|
|
2912
|
+
if (managed.refCount > 0 || managed.pendingWaiters > 0 || managed.isInitializing)
|
|
2913
|
+
continue;
|
|
2914
|
+
if (candidate === null || managed.lastUsedAt < candidate.managed.lastUsedAt) {
|
|
2915
|
+
candidate = { key, managed };
|
|
2815
2916
|
}
|
|
2816
2917
|
}
|
|
2918
|
+
return candidate;
|
|
2817
2919
|
}
|
|
2818
2920
|
async tryDeleteIfOrphaned(key, managed) {
|
|
2819
2921
|
if (managed.refCount === 0 && managed.pendingWaiters === 0 && !managed.isInitializing && this.clients.get(key) === managed) {
|
|
2820
2922
|
this.clients.delete(key);
|
|
2821
|
-
await
|
|
2923
|
+
await this.tombstoneStop(key, managed.client);
|
|
2822
2924
|
}
|
|
2823
2925
|
}
|
|
2824
2926
|
async getClient(root, server, signal) {
|
|
@@ -2827,12 +2929,22 @@ class LspManager {
|
|
|
2827
2929
|
}
|
|
2828
2930
|
signal?.throwIfAborted();
|
|
2829
2931
|
const key = this.getKey(root, server.id);
|
|
2932
|
+
for (;; ) {
|
|
2933
|
+
const pendingStop = this.pendingStops.get(key);
|
|
2934
|
+
if (pendingStop === undefined)
|
|
2935
|
+
break;
|
|
2936
|
+
await awaitWithSignal(pendingStop, signal);
|
|
2937
|
+
signal?.throwIfAborted();
|
|
2938
|
+
}
|
|
2939
|
+
if (this.disposed) {
|
|
2940
|
+
throw new Error("LspManager has been disposed");
|
|
2941
|
+
}
|
|
2830
2942
|
let managed = this.clients.get(key);
|
|
2831
2943
|
if (managed) {
|
|
2832
2944
|
const t = this.now();
|
|
2833
2945
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
2834
|
-
await stopClientBestEffort(managed.client);
|
|
2835
2946
|
this.clients.delete(key);
|
|
2947
|
+
await this.tombstoneStop(key, managed.client);
|
|
2836
2948
|
managed = undefined;
|
|
2837
2949
|
}
|
|
2838
2950
|
}
|
|
@@ -2853,14 +2965,20 @@ class LspManager {
|
|
|
2853
2965
|
signal.throwIfAborted();
|
|
2854
2966
|
}
|
|
2855
2967
|
if (!managed.client.isAlive()) {
|
|
2856
|
-
|
|
2857
|
-
this.clients.
|
|
2968
|
+
this.recordDeadGeneration(key);
|
|
2969
|
+
if (this.clients.get(key) === managed) {
|
|
2970
|
+
this.clients.delete(key);
|
|
2971
|
+
}
|
|
2972
|
+
await this.tombstoneStop(key, managed.client);
|
|
2858
2973
|
return this.getClient(root, server, signal);
|
|
2859
2974
|
}
|
|
2975
|
+
this.markHealthyGeneration(key);
|
|
2860
2976
|
managed.refCount++;
|
|
2861
2977
|
managed.lastUsedAt = this.now();
|
|
2862
2978
|
return managed.client;
|
|
2863
2979
|
}
|
|
2980
|
+
this.evictForAdmission();
|
|
2981
|
+
this.ensureRespawnAllowed(key, root, server.id);
|
|
2864
2982
|
const client = this.clientFactory(root, server);
|
|
2865
2983
|
const initStartedAt = this.now();
|
|
2866
2984
|
const initPromise = (async () => {
|
|
@@ -2884,7 +3002,7 @@ class LspManager {
|
|
|
2884
3002
|
if (this.clients.get(key) === newManaged) {
|
|
2885
3003
|
this.clients.delete(key);
|
|
2886
3004
|
}
|
|
2887
|
-
await
|
|
3005
|
+
await this.tombstoneStop(key, client);
|
|
2888
3006
|
throw err;
|
|
2889
3007
|
}
|
|
2890
3008
|
newManaged.pendingWaiters--;
|
|
@@ -2895,6 +3013,15 @@ class LspManager {
|
|
|
2895
3013
|
await this.tryDeleteIfOrphaned(key, newManaged);
|
|
2896
3014
|
signal.throwIfAborted();
|
|
2897
3015
|
}
|
|
3016
|
+
if (!client.isAlive()) {
|
|
3017
|
+
this.recordDeadGeneration(key);
|
|
3018
|
+
if (this.clients.get(key) === newManaged) {
|
|
3019
|
+
this.clients.delete(key);
|
|
3020
|
+
}
|
|
3021
|
+
await this.tombstoneStop(key, client);
|
|
3022
|
+
return this.getClient(root, server, signal);
|
|
3023
|
+
}
|
|
3024
|
+
this.markHealthyGeneration(key);
|
|
2898
3025
|
newManaged.refCount++;
|
|
2899
3026
|
newManaged.lastUsedAt = this.now();
|
|
2900
3027
|
return client;
|
|
@@ -2915,14 +3042,20 @@ class LspManager {
|
|
|
2915
3042
|
if (client && managed.client !== client)
|
|
2916
3043
|
return;
|
|
2917
3044
|
this.clients.delete(key);
|
|
2918
|
-
|
|
3045
|
+
this.tombstoneStop(key, managed.client);
|
|
2919
3046
|
}
|
|
2920
3047
|
warmupClient(root, server) {
|
|
2921
3048
|
if (this.disposed)
|
|
2922
3049
|
return;
|
|
2923
3050
|
const key = this.getKey(root, server.id);
|
|
2924
|
-
if (this.clients.has(key))
|
|
3051
|
+
if (this.clients.has(key) || this.pendingStops.has(key))
|
|
3052
|
+
return;
|
|
3053
|
+
this.evictForAdmission();
|
|
3054
|
+
try {
|
|
3055
|
+
this.ensureRespawnAllowed(key, root, server.id);
|
|
3056
|
+
} catch {
|
|
2925
3057
|
return;
|
|
3058
|
+
}
|
|
2926
3059
|
const client = this.clientFactory(root, server);
|
|
2927
3060
|
const initStartedAt = this.now();
|
|
2928
3061
|
const initPromise = (async () => {
|
|
@@ -2948,7 +3081,7 @@ class LspManager {
|
|
|
2948
3081
|
if (this.clients.get(key) === managed) {
|
|
2949
3082
|
this.clients.delete(key);
|
|
2950
3083
|
}
|
|
2951
|
-
|
|
3084
|
+
this.tombstoneStop(key, client);
|
|
2952
3085
|
});
|
|
2953
3086
|
}
|
|
2954
3087
|
isServerInitializing(root, serverId) {
|
|
@@ -2992,8 +3125,11 @@ class LspManager {
|
|
|
2992
3125
|
for (const managed of this.clients.values()) {
|
|
2993
3126
|
stopPromises.push(stopClientBestEffort(managed.client));
|
|
2994
3127
|
}
|
|
3128
|
+
const tombstonedStops = [...this.pendingStops.values()];
|
|
2995
3129
|
this.clients.clear();
|
|
2996
|
-
|
|
3130
|
+
this.respawnBudgets.clear();
|
|
3131
|
+
await Promise.allSettled([...stopPromises, ...tombstonedStops]);
|
|
3132
|
+
this.pendingStops.clear();
|
|
2997
3133
|
}
|
|
2998
3134
|
}
|
|
2999
3135
|
var _defaultInstance = null;
|
|
@@ -3013,7 +3149,8 @@ async function disposeDefaultLspManager() {
|
|
|
3013
3149
|
// src/daemon-client.ts
|
|
3014
3150
|
import { connect } from "node:net";
|
|
3015
3151
|
import { homedir as homedir3 } from "node:os";
|
|
3016
|
-
import { join as
|
|
3152
|
+
import { join as join8 } from "node:path";
|
|
3153
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
3017
3154
|
|
|
3018
3155
|
// ../lsp-core/src/request-context.ts
|
|
3019
3156
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
@@ -3022,18 +3159,17 @@ import { homedir } from "node:os";
|
|
|
3022
3159
|
import { basename as basename2, delimiter as delimiter2, dirname as dirname4, isAbsolute as isAbsolute2, join as join2, relative as relative4, resolve as resolve6 } from "node:path";
|
|
3023
3160
|
|
|
3024
3161
|
class LspRequestContextParseError extends Error {
|
|
3025
|
-
code;
|
|
3026
|
-
name = "LspRequestContextParseError";
|
|
3027
3162
|
constructor(code, message) {
|
|
3028
3163
|
super(message);
|
|
3029
3164
|
this.code = code;
|
|
3165
|
+
this.name = "LspRequestContextParseError";
|
|
3030
3166
|
}
|
|
3031
3167
|
}
|
|
3032
3168
|
|
|
3033
3169
|
class LspRequestContextUnavailableError extends Error {
|
|
3034
|
-
name = "LspRequestContextUnavailableError";
|
|
3035
3170
|
constructor() {
|
|
3036
3171
|
super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
|
|
3172
|
+
this.name = "LspRequestContextUnavailableError";
|
|
3037
3173
|
}
|
|
3038
3174
|
}
|
|
3039
3175
|
var storage = new AsyncLocalStorage;
|
|
@@ -3053,7 +3189,7 @@ function contextCwd() {
|
|
|
3053
3189
|
}
|
|
3054
3190
|
function createStandaloneMcpRequestContext(input = {}) {
|
|
3055
3191
|
const env = input.env ?? process.env;
|
|
3056
|
-
const cwd = canonicalCwd(input.cwd ?? process.cwd());
|
|
3192
|
+
const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
|
|
3057
3193
|
const home = input.homeDir ?? homedir();
|
|
3058
3194
|
const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
|
|
3059
3195
|
const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
|
|
@@ -3191,7 +3327,6 @@ function isPlainRecord(value) {
|
|
|
3191
3327
|
|
|
3192
3328
|
// src/daemon-request-error.ts
|
|
3193
3329
|
class DaemonRequestError extends Error {
|
|
3194
|
-
requestWritten;
|
|
3195
3330
|
constructor(message, requestWritten) {
|
|
3196
3331
|
super(message);
|
|
3197
3332
|
this.name = "DaemonRequestError";
|
|
@@ -3214,7 +3349,6 @@ class DaemonRequestCancelledError extends DaemonRequestError {
|
|
|
3214
3349
|
}
|
|
3215
3350
|
|
|
3216
3351
|
class DaemonRequestTimedOutError extends DaemonRequestError {
|
|
3217
|
-
timeoutMs;
|
|
3218
3352
|
constructor(requestWritten, timeoutMs) {
|
|
3219
3353
|
super("daemon request timed out", requestWritten);
|
|
3220
3354
|
this.name = "DaemonRequestTimedOutError";
|
|
@@ -3293,14 +3427,12 @@ var PROTOCOL_ERROR_CODE = -32002;
|
|
|
3293
3427
|
var AUTH_TOKEN_BYTES = 32;
|
|
3294
3428
|
|
|
3295
3429
|
class UnsafePrivateDirectoryError extends Error {
|
|
3296
|
-
path;
|
|
3297
|
-
reason;
|
|
3298
|
-
name = "UnsafePrivateDirectoryError";
|
|
3299
|
-
code = "unsafe_private_directory";
|
|
3300
3430
|
constructor(path, reason) {
|
|
3301
3431
|
super(`unsafe private directory ${path}: ${reason}`);
|
|
3302
3432
|
this.path = path;
|
|
3303
3433
|
this.reason = reason;
|
|
3434
|
+
this.name = "UnsafePrivateDirectoryError";
|
|
3435
|
+
this.code = "unsafe_private_directory";
|
|
3304
3436
|
}
|
|
3305
3437
|
}
|
|
3306
3438
|
function authEnvelope(token) {
|
|
@@ -3484,20 +3616,18 @@ var OMO_LSP_DAEMON_VERSION = "OMO_LSP_DAEMON_VERSION";
|
|
|
3484
3616
|
var DAEMON_VERSION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$/;
|
|
3485
3617
|
|
|
3486
3618
|
class InvalidRuntimeOverrideError extends Error {
|
|
3487
|
-
code = "invalid_runtime_override";
|
|
3488
|
-
reason;
|
|
3489
3619
|
constructor(reason, message) {
|
|
3490
3620
|
super(message);
|
|
3621
|
+
this.code = "invalid_runtime_override";
|
|
3491
3622
|
this.name = "InvalidRuntimeOverrideError";
|
|
3492
3623
|
this.reason = reason;
|
|
3493
3624
|
}
|
|
3494
3625
|
}
|
|
3495
3626
|
|
|
3496
3627
|
class InvalidDaemonVersionError extends Error {
|
|
3497
|
-
code = "invalid_daemon_version";
|
|
3498
|
-
version;
|
|
3499
3628
|
constructor(version) {
|
|
3500
3629
|
super("LSP daemon version must match [A-Za-z0-9][A-Za-z0-9._+-]{0,127}");
|
|
3630
|
+
this.code = "invalid_daemon_version";
|
|
3501
3631
|
this.name = "InvalidDaemonVersionError";
|
|
3502
3632
|
this.version = version;
|
|
3503
3633
|
}
|
|
@@ -3543,10 +3673,9 @@ var requireFromHere = createRequire(import.meta.url);
|
|
|
3543
3673
|
var MAX_SOCKET_PATH_LENGTH = 100;
|
|
3544
3674
|
|
|
3545
3675
|
class InvalidDaemonDirectoryError extends Error {
|
|
3546
|
-
code = "invalid_daemon_directory";
|
|
3547
|
-
directory;
|
|
3548
3676
|
constructor(directory) {
|
|
3549
3677
|
super(`${OMO_LSP_DAEMON_DIR} must be an absolute path`);
|
|
3678
|
+
this.code = "invalid_daemon_directory";
|
|
3550
3679
|
this.name = "InvalidDaemonDirectoryError";
|
|
3551
3680
|
this.directory = directory;
|
|
3552
3681
|
}
|
|
@@ -3661,9 +3790,11 @@ function createLineDecoder(onMessage, onParseError) {
|
|
|
3661
3790
|
}
|
|
3662
3791
|
|
|
3663
3792
|
// src/ensure-daemon.ts
|
|
3664
|
-
var PROBE_TIMEOUT_MS =
|
|
3793
|
+
var PROBE_TIMEOUT_MS = 2000;
|
|
3665
3794
|
var DEFAULT_READY_TIMEOUT_MS = 5000;
|
|
3666
3795
|
var DEFAULT_POLL_INTERVAL_MS = 100;
|
|
3796
|
+
var FAILED_SPAWN_COOLDOWN_MS = 5000;
|
|
3797
|
+
var failedSpawnUntil = new Map;
|
|
3667
3798
|
|
|
3668
3799
|
class DaemonUnreachableError extends Error {
|
|
3669
3800
|
constructor(socketPath) {
|
|
@@ -3676,11 +3807,22 @@ async function ensureDaemonRunning(paths, deps = defaultEnsureDaemonDeps(), opti
|
|
|
3676
3807
|
const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
3677
3808
|
const signal = options.signal;
|
|
3678
3809
|
throwIfAborted(signal);
|
|
3679
|
-
if (await awaitWithSignal2(deps.probe(paths, signal), signal))
|
|
3810
|
+
if (await awaitWithSignal2(deps.probe(paths, signal), signal)) {
|
|
3811
|
+
failedSpawnUntil.delete(paths.socket);
|
|
3680
3812
|
return;
|
|
3813
|
+
}
|
|
3681
3814
|
throwIfAborted(signal);
|
|
3815
|
+
const retryAt = failedSpawnUntil.get(paths.socket);
|
|
3816
|
+
if (retryAt !== undefined && deps.now() < retryAt)
|
|
3817
|
+
throw new DaemonUnreachableError(paths.socket);
|
|
3818
|
+
failedSpawnUntil.delete(paths.socket);
|
|
3682
3819
|
deps.spawnDaemon(paths);
|
|
3683
|
-
|
|
3820
|
+
try {
|
|
3821
|
+
await waitUntilReachable(paths, deps, readyTimeoutMs, pollIntervalMs, signal);
|
|
3822
|
+
} catch (error) {
|
|
3823
|
+
failedSpawnUntil.set(paths.socket, deps.now() + FAILED_SPAWN_COOLDOWN_MS);
|
|
3824
|
+
throw error;
|
|
3825
|
+
}
|
|
3684
3826
|
}
|
|
3685
3827
|
async function waitUntilReachable(paths, deps, readyTimeoutMs, pollIntervalMs, signal) {
|
|
3686
3828
|
const deadline = deps.now() + readyTimeoutMs;
|
|
@@ -3700,7 +3842,7 @@ async function probeDaemon(paths, timeoutMs = PROBE_TIMEOUT_MS, signal) {
|
|
|
3700
3842
|
return await pingDaemon(paths, token, timeoutMs, signal) !== null;
|
|
3701
3843
|
}
|
|
3702
3844
|
function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
|
|
3703
|
-
return new Promise((
|
|
3845
|
+
return new Promise((resolve) => {
|
|
3704
3846
|
const socket = new Socket;
|
|
3705
3847
|
let settled = false;
|
|
3706
3848
|
let timer;
|
|
@@ -3712,7 +3854,7 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
|
|
|
3712
3854
|
clearTimeout(timer);
|
|
3713
3855
|
signal?.removeEventListener("abort", onAbort);
|
|
3714
3856
|
socket.destroy();
|
|
3715
|
-
|
|
3857
|
+
resolve(value);
|
|
3716
3858
|
};
|
|
3717
3859
|
const onAbort = () => finish(null);
|
|
3718
3860
|
const decoder = createLineDecoder((message) => {
|
|
@@ -3735,13 +3877,17 @@ function pingDaemon(paths, token, timeoutMs = PROBE_TIMEOUT_MS, signal) {
|
|
|
3735
3877
|
socket.connect(paths.socket);
|
|
3736
3878
|
});
|
|
3737
3879
|
}
|
|
3738
|
-
function spawnDaemonProcess(paths) {
|
|
3880
|
+
function spawnDaemonProcess(paths, deps = {}) {
|
|
3739
3881
|
mkdirSync2(dirname6(paths.log), { recursive: true });
|
|
3740
3882
|
const logFd = openSync2(paths.log, "a");
|
|
3741
3883
|
try {
|
|
3742
|
-
const
|
|
3884
|
+
const spawnDaemonChild = deps.spawn ?? spawn2;
|
|
3885
|
+
const executable = deps.resolveExecutable?.() ?? resolveDaemonNodeExecutable();
|
|
3886
|
+
const child = spawnDaemonChild(executable, [paths.cliPath, "daemon"], {
|
|
3743
3887
|
detached: true,
|
|
3744
|
-
stdio: ["ignore", logFd, logFd]
|
|
3888
|
+
stdio: ["ignore", logFd, logFd],
|
|
3889
|
+
windowsHide: true,
|
|
3890
|
+
env: { ...process.env, BUN_BE_BUN: "1" }
|
|
3745
3891
|
});
|
|
3746
3892
|
child.once("spawn", () => closeSync2(logFd));
|
|
3747
3893
|
child.once("error", (error) => {
|
|
@@ -3771,7 +3917,7 @@ function defaultEnsureDaemonDeps() {
|
|
|
3771
3917
|
};
|
|
3772
3918
|
}
|
|
3773
3919
|
function sleepWithSignal(ms, signal) {
|
|
3774
|
-
return new Promise((
|
|
3920
|
+
return new Promise((resolve) => {
|
|
3775
3921
|
let settled = false;
|
|
3776
3922
|
const finish = () => {
|
|
3777
3923
|
if (settled)
|
|
@@ -3779,7 +3925,7 @@ function sleepWithSignal(ms, signal) {
|
|
|
3779
3925
|
settled = true;
|
|
3780
3926
|
clearTimeout(timer);
|
|
3781
3927
|
signal?.removeEventListener("abort", finish);
|
|
3782
|
-
|
|
3928
|
+
resolve();
|
|
3783
3929
|
};
|
|
3784
3930
|
const timer = setTimeout(finish, ms);
|
|
3785
3931
|
if (signal?.aborted) {
|
|
@@ -3794,7 +3940,7 @@ function awaitWithSignal2(promise, signal) {
|
|
|
3794
3940
|
return promise;
|
|
3795
3941
|
if (signal.aborted)
|
|
3796
3942
|
return Promise.reject(abortError3(signal));
|
|
3797
|
-
return new Promise((
|
|
3943
|
+
return new Promise((resolve, reject) => {
|
|
3798
3944
|
let settled = false;
|
|
3799
3945
|
const finish = (run) => {
|
|
3800
3946
|
if (settled)
|
|
@@ -3805,7 +3951,7 @@ function awaitWithSignal2(promise, signal) {
|
|
|
3805
3951
|
};
|
|
3806
3952
|
const onAbort = () => finish(() => reject(abortError3(signal)));
|
|
3807
3953
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
3808
|
-
promise.then((value) => finish(() =>
|
|
3954
|
+
promise.then((value) => finish(() => resolve(value)), (error) => finish(() => reject(error)));
|
|
3809
3955
|
});
|
|
3810
3956
|
}
|
|
3811
3957
|
function throwIfAborted(signal) {
|
|
@@ -3834,18 +3980,18 @@ function parsePingResponse(message) {
|
|
|
3834
3980
|
return null;
|
|
3835
3981
|
if (!endpoint || typeof endpoint !== "object" || Array.isArray(endpoint))
|
|
3836
3982
|
return null;
|
|
3837
|
-
const
|
|
3983
|
+
const path = Reflect.get(endpoint, "path");
|
|
3838
3984
|
const kind = Reflect.get(endpoint, "kind");
|
|
3839
|
-
if (typeof
|
|
3985
|
+
if (typeof path !== "string")
|
|
3840
3986
|
return null;
|
|
3841
3987
|
if (kind === "windows")
|
|
3842
|
-
return { pid, nonce, startedAt, endpoint: { kind, path
|
|
3988
|
+
return { pid, nonce, startedAt, endpoint: { kind, path } };
|
|
3843
3989
|
if (kind === "missing")
|
|
3844
|
-
return { pid, nonce, startedAt, endpoint: { kind, path
|
|
3990
|
+
return { pid, nonce, startedAt, endpoint: { kind, path } };
|
|
3845
3991
|
const dev = Reflect.get(endpoint, "dev");
|
|
3846
3992
|
const ino = Reflect.get(endpoint, "ino");
|
|
3847
3993
|
if (kind === "unix" && typeof dev === "number" && typeof ino === "number") {
|
|
3848
|
-
return { pid, nonce, startedAt, endpoint: { kind, path
|
|
3994
|
+
return { pid, nonce, startedAt, endpoint: { kind, path, dev, ino } };
|
|
3849
3995
|
}
|
|
3850
3996
|
return null;
|
|
3851
3997
|
}
|
|
@@ -3893,7 +4039,7 @@ ${body}` : `${body}
|
|
|
3893
4039
|
await writeChunk(output, payload);
|
|
3894
4040
|
}
|
|
3895
4041
|
function writeChunk(output, chunk) {
|
|
3896
|
-
return new Promise((
|
|
4042
|
+
return new Promise((resolve, reject) => {
|
|
3897
4043
|
let settled = false;
|
|
3898
4044
|
const onError = (error) => {
|
|
3899
4045
|
if (settled)
|
|
@@ -3913,7 +4059,7 @@ function writeChunk(output, chunk) {
|
|
|
3913
4059
|
return;
|
|
3914
4060
|
}
|
|
3915
4061
|
output.removeListener("error", onError);
|
|
3916
|
-
|
|
4062
|
+
resolve();
|
|
3917
4063
|
});
|
|
3918
4064
|
} catch (error) {
|
|
3919
4065
|
output.removeListener("error", onError);
|
|
@@ -4022,6 +4168,7 @@ async function runJsonRpcStdioServer(config) {
|
|
|
4022
4168
|
const idleTimer = createIdleTimer(idleTimeoutMs, log, () => {
|
|
4023
4169
|
isClosed = true;
|
|
4024
4170
|
config.onIdleTimeout?.();
|
|
4171
|
+
config.input.destroy();
|
|
4025
4172
|
});
|
|
4026
4173
|
const watchdog = createParentWatchdog(config.parentWatchdog, (parentPid, pollIntervalMs) => {
|
|
4027
4174
|
isClosed = true;
|
|
@@ -4118,7 +4265,11 @@ function createParentWatchdog(config, onDeadParent) {
|
|
|
4118
4265
|
const probeAlive = config.probeAlive ?? isProcessAlive;
|
|
4119
4266
|
let fired = false;
|
|
4120
4267
|
const timer = setInterval(() => {
|
|
4121
|
-
if (fired
|
|
4268
|
+
if (fired)
|
|
4269
|
+
return;
|
|
4270
|
+
const alive = probeAlive(parentPid);
|
|
4271
|
+
config.onPoll?.(alive);
|
|
4272
|
+
if (alive)
|
|
4122
4273
|
return;
|
|
4123
4274
|
fired = true;
|
|
4124
4275
|
onDeadParent(parentPid, pollIntervalMs);
|
|
@@ -4153,60 +4304,55 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
|
|
|
4153
4304
|
};
|
|
4154
4305
|
}
|
|
4155
4306
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
4156
|
-
import { existsSync as
|
|
4157
|
-
import { basename as basename3, dirname as
|
|
4307
|
+
import { existsSync as existsSync11, realpathSync as realpathSync5, statSync as statSync4 } from "node:fs";
|
|
4308
|
+
import { basename as basename3, dirname as dirname10, join as join5, resolve as resolve8 } from "node:path";
|
|
4158
4309
|
|
|
4159
|
-
// ../lsp-core/src/lsp/
|
|
4160
|
-
import { existsSync as existsSync7,
|
|
4161
|
-
import { dirname as dirname7 } from "node:path";
|
|
4162
|
-
|
|
4163
|
-
|
|
4164
|
-
|
|
4165
|
-
|
|
4166
|
-
|
|
4167
|
-
|
|
4168
|
-
|
|
4169
|
-
|
|
4170
|
-
|
|
4171
|
-
|
|
4172
|
-
|
|
4173
|
-
|
|
4310
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
4311
|
+
import { existsSync as existsSync7, realpathSync as realpathSync4 } from "node:fs";
|
|
4312
|
+
import { dirname as dirname7, join as join3 } from "node:path";
|
|
4313
|
+
|
|
4314
|
+
// ../lsp-core/src/lsp/workspace-markers.ts
|
|
4315
|
+
var GIT_WORKSPACE_MARKER = ".git";
|
|
4316
|
+
var PROJECT_WORKSPACE_MARKERS = [
|
|
4317
|
+
"package.json",
|
|
4318
|
+
"pyproject.toml",
|
|
4319
|
+
"Cargo.toml",
|
|
4320
|
+
"go.mod",
|
|
4321
|
+
"pom.xml",
|
|
4322
|
+
"build.gradle"
|
|
4323
|
+
];
|
|
4324
|
+
var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
|
|
4325
|
+
|
|
4326
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
4327
|
+
function findWorkspaceRootOutsideContext(directory) {
|
|
4328
|
+
const marked = nearestMarkedAncestor(directory);
|
|
4329
|
+
if (marked !== undefined)
|
|
4330
|
+
return marked;
|
|
4331
|
+
return realpathSync4(nearestExistingAncestor(directory));
|
|
4332
|
+
}
|
|
4333
|
+
function nearestMarkedAncestor(directory) {
|
|
4334
|
+
let current = directory;
|
|
4335
|
+
for (;; ) {
|
|
4336
|
+
if (existsSync7(current) && WORKSPACE_MARKERS.some((marker) => existsSync7(join3(current, marker)))) {
|
|
4337
|
+
return realpathSync4(current);
|
|
4338
|
+
}
|
|
4339
|
+
const parent = dirname7(current);
|
|
4340
|
+
if (parent === current)
|
|
4341
|
+
return;
|
|
4342
|
+
current = parent;
|
|
4174
4343
|
}
|
|
4175
4344
|
}
|
|
4176
|
-
function
|
|
4177
|
-
|
|
4178
|
-
|
|
4179
|
-
|
|
4180
|
-
|
|
4181
|
-
|
|
4182
|
-
|
|
4183
|
-
}
|
|
4184
|
-
|
|
4185
|
-
return value === "declined" || value === "allowed";
|
|
4186
|
-
}
|
|
4187
|
-
function writeInstallDecisions(decisions) {
|
|
4188
|
-
const path2 = getInstallDecisionsPath();
|
|
4189
|
-
mkdirSync3(dirname7(path2), { recursive: true });
|
|
4190
|
-
const tmpPath = `${path2}.tmp`;
|
|
4191
|
-
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
4192
|
-
`, "utf8");
|
|
4193
|
-
renameSync2(tmpPath, path2);
|
|
4194
|
-
}
|
|
4195
|
-
function isInstallDecisions(value) {
|
|
4196
|
-
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
4197
|
-
}
|
|
4198
|
-
function isInstallDecisionRecord(value) {
|
|
4199
|
-
if (!isRecord5(value))
|
|
4200
|
-
return false;
|
|
4201
|
-
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
4202
|
-
}
|
|
4203
|
-
function isRecord5(value) {
|
|
4204
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4345
|
+
function nearestExistingAncestor(directory) {
|
|
4346
|
+
let current = directory;
|
|
4347
|
+
while (!existsSync7(current)) {
|
|
4348
|
+
const parent = dirname7(current);
|
|
4349
|
+
if (parent === current)
|
|
4350
|
+
return current;
|
|
4351
|
+
current = parent;
|
|
4352
|
+
}
|
|
4353
|
+
return current;
|
|
4205
4354
|
}
|
|
4206
4355
|
|
|
4207
|
-
// ../lsp-core/src/lsp/config-loader.ts
|
|
4208
|
-
import { existsSync as existsSync8, readFileSync as readFileSync5 } from "node:fs";
|
|
4209
|
-
|
|
4210
4356
|
// ../lsp-core/src/lsp/server-definitions.ts
|
|
4211
4357
|
var LSP_INSTALL_HINTS = {
|
|
4212
4358
|
typescript: "npm install -g typescript-language-server typescript",
|
|
@@ -4252,6 +4398,26 @@ var LSP_INSTALL_HINTS = {
|
|
|
4252
4398
|
julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
|
|
4253
4399
|
razor: "Razor runs through the Roslyn language server (cohosting). " + "Install: dotnet tool install -g roslyn-language-server --prerelease (requires v5.8.0+). See https://github.com/dotnet/razor"
|
|
4254
4400
|
};
|
|
4401
|
+
var LSP_LOCAL_INSTALL_HINTS = {
|
|
4402
|
+
typescript: "bun add -d typescript-language-server typescript",
|
|
4403
|
+
vue: "bun add -d @vue/language-server",
|
|
4404
|
+
eslint: "bun add -d vscode-langservers-extracted",
|
|
4405
|
+
oxlint: "bun add -d oxlint",
|
|
4406
|
+
biome: "bun add -d @biomejs/biome",
|
|
4407
|
+
svelte: "bun add -d svelte-language-server",
|
|
4408
|
+
astro: "bun add -d @astrojs/language-server",
|
|
4409
|
+
bash: "bun add -d bash-language-server",
|
|
4410
|
+
"bash-ls": "bun add -d bash-language-server",
|
|
4411
|
+
"yaml-ls": "bun add -d yaml-language-server",
|
|
4412
|
+
php: "bun add -d intelephense",
|
|
4413
|
+
prisma: "bun add -d prisma",
|
|
4414
|
+
dockerfile: "bun add -d dockerfile-language-server-nodejs",
|
|
4415
|
+
pyright: "uv add --dev pyright",
|
|
4416
|
+
basedpyright: "uv add --dev basedpyright",
|
|
4417
|
+
ruff: "uv add --dev ruff",
|
|
4418
|
+
ty: "uv add --dev ty",
|
|
4419
|
+
"ruby-lsp": "bundle add ruby-lsp --group development"
|
|
4420
|
+
};
|
|
4255
4421
|
var BUILTIN_SERVERS = {
|
|
4256
4422
|
typescript: {
|
|
4257
4423
|
command: ["typescript-language-server", "--stdio"],
|
|
@@ -4354,18 +4520,67 @@ var BUILTIN_SERVERS = {
|
|
|
4354
4520
|
}
|
|
4355
4521
|
};
|
|
4356
4522
|
|
|
4523
|
+
// ../lsp-core/src/lsp/server-install-state.ts
|
|
4524
|
+
import { existsSync as existsSync8, mkdirSync as mkdirSync3, readFileSync as readFileSync4, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
4525
|
+
import { dirname as dirname8 } from "node:path";
|
|
4526
|
+
function getInstallDecisionsPath() {
|
|
4527
|
+
return lspRequestContext().installDecisionsPath;
|
|
4528
|
+
}
|
|
4529
|
+
function loadInstallDecisions() {
|
|
4530
|
+
const path = getInstallDecisionsPath();
|
|
4531
|
+
if (!existsSync8(path))
|
|
4532
|
+
return {};
|
|
4533
|
+
try {
|
|
4534
|
+
const parsed = JSON.parse(readFileSync4(path, "utf8"));
|
|
4535
|
+
return isInstallDecisions(parsed) ? parsed : {};
|
|
4536
|
+
} catch {
|
|
4537
|
+
return {};
|
|
4538
|
+
}
|
|
4539
|
+
}
|
|
4540
|
+
function loadInstallDecision(serverId) {
|
|
4541
|
+
return loadInstallDecisions()[serverId];
|
|
4542
|
+
}
|
|
4543
|
+
function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
|
|
4544
|
+
const decisions = loadInstallDecisions();
|
|
4545
|
+
decisions[serverId] = { decision, decidedAt };
|
|
4546
|
+
writeInstallDecisions(decisions);
|
|
4547
|
+
}
|
|
4548
|
+
function isInstallDecision(value) {
|
|
4549
|
+
return value === "declined" || value === "allowed";
|
|
4550
|
+
}
|
|
4551
|
+
function writeInstallDecisions(decisions) {
|
|
4552
|
+
const path = getInstallDecisionsPath();
|
|
4553
|
+
mkdirSync3(dirname8(path), { recursive: true });
|
|
4554
|
+
const tmpPath = `${path}.tmp`;
|
|
4555
|
+
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
4556
|
+
`, "utf8");
|
|
4557
|
+
renameSync2(tmpPath, path);
|
|
4558
|
+
}
|
|
4559
|
+
function isInstallDecisions(value) {
|
|
4560
|
+
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
4561
|
+
}
|
|
4562
|
+
function isInstallDecisionRecord(value) {
|
|
4563
|
+
if (!isRecord5(value))
|
|
4564
|
+
return false;
|
|
4565
|
+
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
4566
|
+
}
|
|
4567
|
+
function isRecord5(value) {
|
|
4568
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4569
|
+
}
|
|
4570
|
+
|
|
4357
4571
|
// ../lsp-core/src/lsp/config-loader.ts
|
|
4572
|
+
import { existsSync as existsSync9, readFileSync as readFileSync5 } from "node:fs";
|
|
4358
4573
|
function getProjectConfigPaths() {
|
|
4359
4574
|
return lspRequestContext().projectConfigPaths;
|
|
4360
4575
|
}
|
|
4361
4576
|
function getUserConfigPath() {
|
|
4362
4577
|
return lspRequestContext().userConfigPath;
|
|
4363
4578
|
}
|
|
4364
|
-
function loadJsonFile(
|
|
4365
|
-
if (!
|
|
4579
|
+
function loadJsonFile(path) {
|
|
4580
|
+
if (!existsSync9(path))
|
|
4366
4581
|
return null;
|
|
4367
4582
|
try {
|
|
4368
|
-
const parsed = JSON.parse(readFileSync5(
|
|
4583
|
+
const parsed = JSON.parse(readFileSync5(path, "utf-8"));
|
|
4369
4584
|
return isConfigJson(parsed) ? parsed : null;
|
|
4370
4585
|
} catch {
|
|
4371
4586
|
return null;
|
|
@@ -4382,8 +4597,8 @@ function loadAllConfigs() {
|
|
|
4382
4597
|
return configs;
|
|
4383
4598
|
}
|
|
4384
4599
|
function loadFirstJsonFile(paths) {
|
|
4385
|
-
for (const
|
|
4386
|
-
const config = loadJsonFile(
|
|
4600
|
+
for (const path of paths) {
|
|
4601
|
+
const config = loadJsonFile(path);
|
|
4387
4602
|
if (config)
|
|
4388
4603
|
return config;
|
|
4389
4604
|
}
|
|
@@ -4409,10 +4624,10 @@ function getMergedServers() {
|
|
|
4409
4624
|
}
|
|
4410
4625
|
if (seen.has(id))
|
|
4411
4626
|
continue;
|
|
4412
|
-
const
|
|
4413
|
-
if (!
|
|
4627
|
+
const server = createServerFromEntry(id, entry, source);
|
|
4628
|
+
if (!server)
|
|
4414
4629
|
continue;
|
|
4415
|
-
servers.push(
|
|
4630
|
+
servers.push(server);
|
|
4416
4631
|
seen.add(id);
|
|
4417
4632
|
}
|
|
4418
4633
|
}
|
|
@@ -4444,7 +4659,7 @@ function createServerFromEntry(id, entry, source) {
|
|
|
4444
4659
|
if (source === "project") {
|
|
4445
4660
|
if (!builtin)
|
|
4446
4661
|
return null;
|
|
4447
|
-
const
|
|
4662
|
+
const server = createServer({
|
|
4448
4663
|
id,
|
|
4449
4664
|
command: builtin.command,
|
|
4450
4665
|
extensions: entry.extensions ?? builtin.extensions,
|
|
@@ -4452,35 +4667,35 @@ function createServerFromEntry(id, entry, source) {
|
|
|
4452
4667
|
source
|
|
4453
4668
|
});
|
|
4454
4669
|
if (entry.initialization !== undefined) {
|
|
4455
|
-
|
|
4670
|
+
server.initialization = entry.initialization;
|
|
4456
4671
|
}
|
|
4457
|
-
return
|
|
4672
|
+
return server;
|
|
4458
4673
|
}
|
|
4459
4674
|
if (entry.command && entry.extensions) {
|
|
4460
|
-
const
|
|
4675
|
+
const server = createServer({
|
|
4461
4676
|
id,
|
|
4462
4677
|
command: entry.command,
|
|
4463
4678
|
extensions: entry.extensions,
|
|
4464
4679
|
priority: entry.priority ?? 0,
|
|
4465
4680
|
source
|
|
4466
4681
|
});
|
|
4467
|
-
applyOptionalServerFields(
|
|
4468
|
-
return
|
|
4682
|
+
applyOptionalServerFields(server, entry);
|
|
4683
|
+
return server;
|
|
4469
4684
|
}
|
|
4470
4685
|
if (!builtin)
|
|
4471
4686
|
return null;
|
|
4472
|
-
const
|
|
4687
|
+
const server = createServer({
|
|
4473
4688
|
id,
|
|
4474
4689
|
command: entry.command ?? builtin.command,
|
|
4475
4690
|
extensions: entry.extensions ?? builtin.extensions,
|
|
4476
4691
|
priority: entry.priority ?? 0,
|
|
4477
4692
|
source
|
|
4478
4693
|
});
|
|
4479
|
-
applyOptionalServerFields(
|
|
4480
|
-
return
|
|
4694
|
+
applyOptionalServerFields(server, entry);
|
|
4695
|
+
return server;
|
|
4481
4696
|
}
|
|
4482
4697
|
function createServer(input) {
|
|
4483
|
-
const
|
|
4698
|
+
const server = {
|
|
4484
4699
|
id: input.id,
|
|
4485
4700
|
command: input.command,
|
|
4486
4701
|
extensions: input.extensions,
|
|
@@ -4488,19 +4703,19 @@ function createServer(input) {
|
|
|
4488
4703
|
source: input.source
|
|
4489
4704
|
};
|
|
4490
4705
|
if (input.env !== undefined) {
|
|
4491
|
-
|
|
4706
|
+
server.env = input.env;
|
|
4492
4707
|
}
|
|
4493
4708
|
if (input.initialization !== undefined) {
|
|
4494
|
-
|
|
4709
|
+
server.initialization = input.initialization;
|
|
4495
4710
|
}
|
|
4496
|
-
return
|
|
4711
|
+
return server;
|
|
4497
4712
|
}
|
|
4498
|
-
function applyOptionalServerFields(
|
|
4713
|
+
function applyOptionalServerFields(server, entry) {
|
|
4499
4714
|
if (entry.env !== undefined) {
|
|
4500
|
-
|
|
4715
|
+
server.env = entry.env;
|
|
4501
4716
|
}
|
|
4502
4717
|
if (entry.initialization !== undefined) {
|
|
4503
|
-
|
|
4718
|
+
server.initialization = entry.initialization;
|
|
4504
4719
|
}
|
|
4505
4720
|
}
|
|
4506
4721
|
function isConfigJson(value) {
|
|
@@ -4550,64 +4765,165 @@ function getDisabledServerIds() {
|
|
|
4550
4765
|
}
|
|
4551
4766
|
|
|
4552
4767
|
// ../lsp-core/src/lsp/server-installation.ts
|
|
4553
|
-
import { existsSync as
|
|
4554
|
-
import { delimiter as delimiter3, join as
|
|
4555
|
-
|
|
4556
|
-
|
|
4557
|
-
|
|
4558
|
-
|
|
4559
|
-
|
|
4560
|
-
|
|
4561
|
-
|
|
4562
|
-
|
|
4563
|
-
|
|
4768
|
+
import { existsSync as existsSync10 } from "node:fs";
|
|
4769
|
+
import { delimiter as delimiter3, dirname as dirname9, isAbsolute as isAbsolute5, join as join4, resolve as resolve7 } from "node:path";
|
|
4770
|
+
var LOCAL_BIN_RULES = [
|
|
4771
|
+
{
|
|
4772
|
+
markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
|
|
4773
|
+
binDirs: [join4("node_modules", ".bin")]
|
|
4774
|
+
},
|
|
4775
|
+
{
|
|
4776
|
+
markers: [
|
|
4777
|
+
"pyproject.toml",
|
|
4778
|
+
"ty.toml",
|
|
4779
|
+
"requirements.txt",
|
|
4780
|
+
"setup.py",
|
|
4781
|
+
"setup.cfg",
|
|
4782
|
+
"Pipfile",
|
|
4783
|
+
"pyrightconfig.json",
|
|
4784
|
+
"ruff.toml",
|
|
4785
|
+
".ruff.toml"
|
|
4786
|
+
],
|
|
4787
|
+
binDirs: [
|
|
4788
|
+
join4(".venv", "bin"),
|
|
4789
|
+
join4(".venv", "Scripts"),
|
|
4790
|
+
join4("venv", "bin"),
|
|
4791
|
+
join4("venv", "Scripts"),
|
|
4792
|
+
join4(".env", "bin"),
|
|
4793
|
+
join4(".env", "Scripts")
|
|
4794
|
+
]
|
|
4795
|
+
},
|
|
4796
|
+
{
|
|
4797
|
+
markers: ["Gemfile", "Gemfile.lock"],
|
|
4798
|
+
binDirs: [join4("vendor", "bundle", "bin"), "bin"]
|
|
4799
|
+
},
|
|
4800
|
+
{
|
|
4801
|
+
markers: ["go.mod", "go.sum", "go.work"],
|
|
4802
|
+
binDirs: ["bin"]
|
|
4564
4803
|
}
|
|
4565
|
-
|
|
4566
|
-
|
|
4567
|
-
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
|
|
4571
|
-
|
|
4572
|
-
|
|
4573
|
-
|
|
4804
|
+
];
|
|
4805
|
+
var resolutionCache = new Map;
|
|
4806
|
+
var probeCount = 0;
|
|
4807
|
+
function probe(path) {
|
|
4808
|
+
probeCount += 1;
|
|
4809
|
+
return existsSync10(path);
|
|
4810
|
+
}
|
|
4811
|
+
function executableSuffixes(platform, pathExt) {
|
|
4812
|
+
if (platform !== "win32")
|
|
4813
|
+
return [""];
|
|
4814
|
+
const configured = pathExt ?? process.env["PATHEXT"] ?? "";
|
|
4815
|
+
const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
|
|
4816
|
+
return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
|
|
4817
|
+
}
|
|
4818
|
+
function probeWithSuffixes(directory, command, suffixes) {
|
|
4819
|
+
for (const suffix of suffixes) {
|
|
4820
|
+
const candidate = join4(directory, command + suffix);
|
|
4821
|
+
if (probe(candidate))
|
|
4822
|
+
return candidate;
|
|
4823
|
+
}
|
|
4824
|
+
return null;
|
|
4825
|
+
}
|
|
4826
|
+
function resolveLocal(command, workingDirectory, suffixes, stopAt) {
|
|
4827
|
+
const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
|
|
4828
|
+
let current = resolve7(workingDirectory);
|
|
4829
|
+
while (true) {
|
|
4830
|
+
for (const rule of LOCAL_BIN_RULES) {
|
|
4831
|
+
if (!rule.markers.some((marker) => probe(join4(current, marker))))
|
|
4832
|
+
continue;
|
|
4833
|
+
for (const binDir of rule.binDirs) {
|
|
4834
|
+
const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
|
|
4835
|
+
if (found !== null)
|
|
4836
|
+
return found;
|
|
4837
|
+
}
|
|
4574
4838
|
}
|
|
4839
|
+
if (probe(join4(current, ".git")))
|
|
4840
|
+
return null;
|
|
4841
|
+
if (boundary !== undefined && current === boundary)
|
|
4842
|
+
return null;
|
|
4843
|
+
const parent = dirname9(current);
|
|
4844
|
+
if (parent === current)
|
|
4845
|
+
return null;
|
|
4846
|
+
current = parent;
|
|
4575
4847
|
}
|
|
4576
|
-
|
|
4577
|
-
|
|
4848
|
+
}
|
|
4849
|
+
function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
|
|
4850
|
+
let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
|
|
4851
|
+
if (platform === "win32" && !pathEnv) {
|
|
4578
4852
|
pathEnv = process.env["Path"] ?? "";
|
|
4579
4853
|
}
|
|
4580
|
-
const
|
|
4581
|
-
|
|
4582
|
-
|
|
4583
|
-
|
|
4584
|
-
|
|
4585
|
-
|
|
4586
|
-
}
|
|
4854
|
+
for (const entry of pathEnv.split(delimiter3)) {
|
|
4855
|
+
if (entry.length === 0)
|
|
4856
|
+
continue;
|
|
4857
|
+
const found = probeWithSuffixes(entry, command, suffixes);
|
|
4858
|
+
if (found !== null)
|
|
4859
|
+
return found;
|
|
4587
4860
|
}
|
|
4588
|
-
|
|
4589
|
-
|
|
4590
|
-
|
|
4861
|
+
return null;
|
|
4862
|
+
}
|
|
4863
|
+
function resolveServerBinary(command, workingDirectory, options = {}) {
|
|
4864
|
+
if (command.length === 0)
|
|
4865
|
+
return null;
|
|
4866
|
+
const [cmd] = command;
|
|
4867
|
+
if (cmd === undefined || cmd.length === 0)
|
|
4868
|
+
return null;
|
|
4869
|
+
const platform = options.platform ?? process.platform;
|
|
4870
|
+
const suffixes = executableSuffixes(platform, options.pathExt);
|
|
4871
|
+
if (cmd.includes("/") || cmd.includes("\\")) {
|
|
4872
|
+
const explicit = isAbsolute5(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
|
|
4873
|
+
return probe(explicit) ? explicit : null;
|
|
4874
|
+
}
|
|
4875
|
+
const cacheKey = JSON.stringify([
|
|
4876
|
+
workingDirectory ?? "",
|
|
4877
|
+
cmd,
|
|
4878
|
+
platform,
|
|
4879
|
+
options.stopAt ?? "",
|
|
4880
|
+
options.pathExt ?? "",
|
|
4881
|
+
options.pathEnv ?? process.env["PATH"] ?? ""
|
|
4882
|
+
]);
|
|
4883
|
+
const cached = resolutionCache.get(cacheKey);
|
|
4884
|
+
if (cached !== undefined)
|
|
4885
|
+
return cached;
|
|
4886
|
+
let resolved = null;
|
|
4887
|
+
if (workingDirectory !== undefined && workingDirectory.length > 0) {
|
|
4888
|
+
resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
|
|
4889
|
+
}
|
|
4890
|
+
resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
|
|
4891
|
+
if (resolved === null && cmd === "node")
|
|
4892
|
+
resolved = cmd;
|
|
4893
|
+
resolutionCache.set(cacheKey, resolved);
|
|
4894
|
+
return resolved;
|
|
4895
|
+
}
|
|
4896
|
+
function isServerInstalled(command, workingDirectory, options = {}) {
|
|
4897
|
+
if (command.length === 0)
|
|
4898
|
+
return false;
|
|
4899
|
+
return resolveServerBinary(command, workingDirectory, options) !== null;
|
|
4591
4900
|
}
|
|
4592
4901
|
|
|
4593
4902
|
// ../lsp-core/src/lsp/server-resolution.ts
|
|
4903
|
+
function withResolvedCommand(command, binaryPath) {
|
|
4904
|
+
return [binaryPath, ...command.slice(1)];
|
|
4905
|
+
}
|
|
4594
4906
|
function findServerForExtension(ext) {
|
|
4595
4907
|
const servers = getMergedServers();
|
|
4596
|
-
|
|
4597
|
-
|
|
4908
|
+
const workingDirectory = contextCwd();
|
|
4909
|
+
for (const server of servers) {
|
|
4910
|
+
if (!server.extensions.includes(ext))
|
|
4911
|
+
continue;
|
|
4912
|
+
const binaryPath = resolveServerBinary(server.command, workingDirectory);
|
|
4913
|
+
if (binaryPath !== null) {
|
|
4598
4914
|
const resolvedServer = {
|
|
4599
|
-
id:
|
|
4600
|
-
command:
|
|
4601
|
-
extensions:
|
|
4602
|
-
priority:
|
|
4915
|
+
id: server.id,
|
|
4916
|
+
command: withResolvedCommand(server.command, binaryPath),
|
|
4917
|
+
extensions: server.extensions,
|
|
4918
|
+
priority: server.priority
|
|
4603
4919
|
};
|
|
4604
|
-
if (
|
|
4920
|
+
if (server.env !== undefined) {
|
|
4605
4921
|
return {
|
|
4606
4922
|
status: "found",
|
|
4607
4923
|
server: {
|
|
4608
4924
|
...resolvedServer,
|
|
4609
|
-
env:
|
|
4610
|
-
...
|
|
4925
|
+
env: server.env,
|
|
4926
|
+
...server.initialization === undefined ? {} : { initialization: server.initialization }
|
|
4611
4927
|
}
|
|
4612
4928
|
};
|
|
4613
4929
|
}
|
|
@@ -4615,20 +4931,20 @@ function findServerForExtension(ext) {
|
|
|
4615
4931
|
status: "found",
|
|
4616
4932
|
server: {
|
|
4617
4933
|
...resolvedServer,
|
|
4618
|
-
...
|
|
4934
|
+
...server.initialization === undefined ? {} : { initialization: server.initialization }
|
|
4619
4935
|
}
|
|
4620
4936
|
};
|
|
4621
4937
|
}
|
|
4622
4938
|
}
|
|
4623
|
-
for (const
|
|
4624
|
-
if (
|
|
4625
|
-
const installHint = LSP_INSTALL_HINTS[
|
|
4939
|
+
for (const server of servers) {
|
|
4940
|
+
if (server.extensions.includes(ext)) {
|
|
4941
|
+
const installHint = LSP_INSTALL_HINTS[server.id] ?? `Install '${server.command[0]}' and ensure it's in your PATH`;
|
|
4626
4942
|
return {
|
|
4627
4943
|
status: "not_installed",
|
|
4628
4944
|
server: {
|
|
4629
|
-
id:
|
|
4630
|
-
command:
|
|
4631
|
-
extensions:
|
|
4945
|
+
id: server.id,
|
|
4946
|
+
command: server.command,
|
|
4947
|
+
extensions: server.extensions
|
|
4632
4948
|
},
|
|
4633
4949
|
installHint
|
|
4634
4950
|
};
|
|
@@ -4644,20 +4960,21 @@ function findServerForExtension(ext) {
|
|
|
4644
4960
|
function getAllServers() {
|
|
4645
4961
|
const servers = getMergedServers();
|
|
4646
4962
|
const disabled = getDisabledServerIds();
|
|
4963
|
+
const workingDirectory = contextCwd();
|
|
4647
4964
|
const result = [];
|
|
4648
4965
|
const seen = new Set;
|
|
4649
|
-
for (const
|
|
4650
|
-
if (seen.has(
|
|
4966
|
+
for (const server of servers) {
|
|
4967
|
+
if (seen.has(server.id))
|
|
4651
4968
|
continue;
|
|
4652
4969
|
result.push({
|
|
4653
|
-
id:
|
|
4654
|
-
installed: isServerInstalled(
|
|
4655
|
-
extensions:
|
|
4970
|
+
id: server.id,
|
|
4971
|
+
installed: isServerInstalled(server.command, workingDirectory),
|
|
4972
|
+
extensions: server.extensions,
|
|
4656
4973
|
disabled: false,
|
|
4657
|
-
source:
|
|
4658
|
-
priority:
|
|
4974
|
+
source: server.source,
|
|
4975
|
+
priority: server.priority
|
|
4659
4976
|
});
|
|
4660
|
-
seen.add(
|
|
4977
|
+
seen.add(server.id);
|
|
4661
4978
|
}
|
|
4662
4979
|
for (const id of disabled) {
|
|
4663
4980
|
if (seen.has(id))
|
|
@@ -4665,7 +4982,7 @@ function getAllServers() {
|
|
|
4665
4982
|
const builtin = BUILTIN_SERVERS[id];
|
|
4666
4983
|
result.push({
|
|
4667
4984
|
id,
|
|
4668
|
-
installed: builtin ? isServerInstalled(builtin.command) : false,
|
|
4985
|
+
installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
|
|
4669
4986
|
extensions: builtin?.extensions ?? [],
|
|
4670
4987
|
disabled: true,
|
|
4671
4988
|
source: "disabled",
|
|
@@ -4676,7 +4993,6 @@ function getAllServers() {
|
|
|
4676
4993
|
}
|
|
4677
4994
|
|
|
4678
4995
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
4679
|
-
var WORKSPACE_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle"];
|
|
4680
4996
|
function isDirectoryPath(filePath) {
|
|
4681
4997
|
try {
|
|
4682
4998
|
return statSync4(filePath).isDirectory();
|
|
@@ -4689,36 +5005,40 @@ function findWorkspaceRoot(filePath) {
|
|
|
4689
5005
|
const abs = resolveReadablePathInsideContext(filePath);
|
|
4690
5006
|
let dir = abs;
|
|
4691
5007
|
if (!isDirectoryPath(dir)) {
|
|
4692
|
-
dir =
|
|
5008
|
+
dir = dirname10(dir);
|
|
4693
5009
|
}
|
|
5010
|
+
if (!isPathInside(cwd, abs))
|
|
5011
|
+
return findWorkspaceRootOutsideContext(dir);
|
|
4694
5012
|
const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
|
|
5013
|
+
let nearestPackageRoot;
|
|
4695
5014
|
while (isPathInside(cwd, dir)) {
|
|
4696
5015
|
const canonicalDir = existingDirectoryInsideContext(dir, cwd);
|
|
4697
5016
|
if (canonicalDir !== undefined) {
|
|
4698
|
-
|
|
4699
|
-
|
|
4700
|
-
|
|
4701
|
-
|
|
5017
|
+
if (existsSync11(join5(dir, GIT_WORKSPACE_MARKER))) {
|
|
5018
|
+
return canonicalDir;
|
|
5019
|
+
}
|
|
5020
|
+
if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
|
|
5021
|
+
nearestPackageRoot = canonicalDir;
|
|
4702
5022
|
}
|
|
4703
5023
|
}
|
|
4704
5024
|
if (dir === cwd)
|
|
4705
5025
|
break;
|
|
4706
|
-
dir =
|
|
5026
|
+
dir = dirname10(dir);
|
|
4707
5027
|
}
|
|
4708
|
-
return fallbackRoot;
|
|
5028
|
+
return nearestPackageRoot ?? fallbackRoot;
|
|
5029
|
+
}
|
|
5030
|
+
function hasProjectWorkspaceMarker(directory) {
|
|
5031
|
+
return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync11(join5(directory, marker)));
|
|
4709
5032
|
}
|
|
4710
5033
|
function resolveReadablePathInsideContext(filePath) {
|
|
4711
5034
|
const cwd = contextCwd();
|
|
4712
|
-
const abs =
|
|
5035
|
+
const abs = resolve8(cwd, filePath);
|
|
4713
5036
|
if (isPathInside(cwd, abs))
|
|
4714
5037
|
return abs;
|
|
4715
5038
|
const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
|
|
4716
5039
|
if (rebased !== undefined)
|
|
4717
5040
|
return rebased;
|
|
4718
|
-
|
|
4719
|
-
if (isPathInside(cwd, canonical))
|
|
4720
|
-
return canonical;
|
|
4721
|
-
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
5041
|
+
return canonicalizeExistingOrNearestAncestor(abs);
|
|
4722
5042
|
}
|
|
4723
5043
|
function resolvePathInsideContext(filePath) {
|
|
4724
5044
|
const cwd = contextCwd();
|
|
@@ -4729,16 +5049,16 @@ function resolvePathInsideContext(filePath) {
|
|
|
4729
5049
|
}
|
|
4730
5050
|
return canonical;
|
|
4731
5051
|
}
|
|
4732
|
-
function rebaseThroughCanonicalAncestor(
|
|
4733
|
-
let current =
|
|
5052
|
+
function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
5053
|
+
let current = path;
|
|
4734
5054
|
const suffix = [];
|
|
4735
5055
|
while (true) {
|
|
4736
|
-
if (
|
|
4737
|
-
const canonical =
|
|
5056
|
+
if (existsSync11(current)) {
|
|
5057
|
+
const canonical = realpathSync5(current);
|
|
4738
5058
|
if (isPathInside(cwd, canonical))
|
|
4739
|
-
return suffix.length === 0 ? canonical :
|
|
5059
|
+
return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
|
|
4740
5060
|
}
|
|
4741
|
-
const parent =
|
|
5061
|
+
const parent = dirname10(current);
|
|
4742
5062
|
if (parent === current)
|
|
4743
5063
|
return;
|
|
4744
5064
|
suffix.unshift(basename3(current));
|
|
@@ -4746,9 +5066,9 @@ function rebaseThroughCanonicalAncestor(path2, cwd) {
|
|
|
4746
5066
|
}
|
|
4747
5067
|
}
|
|
4748
5068
|
function existingDirectoryInsideContext(directory, cwd) {
|
|
4749
|
-
if (!
|
|
5069
|
+
if (!existsSync11(directory))
|
|
4750
5070
|
return;
|
|
4751
|
-
const canonical =
|
|
5071
|
+
const canonical = realpathSync5(directory);
|
|
4752
5072
|
if (!statSync4(canonical).isDirectory())
|
|
4753
5073
|
return;
|
|
4754
5074
|
return isPathInside(cwd, canonical) ? canonical : undefined;
|
|
@@ -4761,7 +5081,7 @@ function nearestExistingDirectoryInsideContext(directory, cwd) {
|
|
|
4761
5081
|
return canonical;
|
|
4762
5082
|
if (current === cwd)
|
|
4763
5083
|
return;
|
|
4764
|
-
current =
|
|
5084
|
+
current = dirname10(current);
|
|
4765
5085
|
}
|
|
4766
5086
|
return;
|
|
4767
5087
|
}
|
|
@@ -4788,33 +5108,46 @@ function formatServerLookupError(result) {
|
|
|
4788
5108
|
].join(`
|
|
4789
5109
|
`);
|
|
4790
5110
|
}
|
|
5111
|
+
function formatInstallOptions(serverId, installHint) {
|
|
5112
|
+
const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
|
|
5113
|
+
if (localHint === undefined) {
|
|
5114
|
+
return ["To install, run:", ` ${installHint}`];
|
|
5115
|
+
}
|
|
5116
|
+
return [
|
|
5117
|
+
"To install in THIS repository (preferred — no global install needed):",
|
|
5118
|
+
` ${localHint}`,
|
|
5119
|
+
"",
|
|
5120
|
+
"Or install it globally:",
|
|
5121
|
+
` ${installHint}`
|
|
5122
|
+
];
|
|
5123
|
+
}
|
|
4791
5124
|
function formatNotInstalled(result) {
|
|
4792
|
-
const { server
|
|
4793
|
-
const extensions =
|
|
4794
|
-
const decision = loadInstallDecision(
|
|
5125
|
+
const { server, installHint } = result;
|
|
5126
|
+
const extensions = server.extensions.join(", ");
|
|
5127
|
+
const decision = loadInstallDecision(server.id)?.decision;
|
|
4795
5128
|
const context = lspRequestContext();
|
|
4796
5129
|
if (decision === "declined") {
|
|
4797
|
-
return `LSP server '${
|
|
5130
|
+
return `LSP server '${server.id}' (${extensions}) is NOT INSTALLED; user previously declined installation — proceed without LSP.`;
|
|
4798
5131
|
}
|
|
4799
5132
|
const header = [
|
|
4800
|
-
`LSP server '${
|
|
5133
|
+
`LSP server '${server.id}' for ${extensions} is NOT INSTALLED.`,
|
|
4801
5134
|
"",
|
|
4802
|
-
`Command not found: ${
|
|
5135
|
+
`Command not found: ${server.command[0]}`,
|
|
4803
5136
|
""
|
|
4804
5137
|
];
|
|
5138
|
+
const installOptions = formatInstallOptions(server.id, installHint);
|
|
4805
5139
|
if (decision === "allowed") {
|
|
4806
5140
|
return [
|
|
4807
5141
|
...header,
|
|
4808
5142
|
"The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
|
|
4809
|
-
|
|
5143
|
+
...installOptions.slice(1)
|
|
4810
5144
|
].join(`
|
|
4811
5145
|
`);
|
|
4812
5146
|
}
|
|
4813
5147
|
if (!context.capabilities.installDecisionTool) {
|
|
4814
5148
|
return [
|
|
4815
5149
|
...header,
|
|
4816
|
-
|
|
4817
|
-
` ${installHint}`,
|
|
5150
|
+
...installOptions,
|
|
4818
5151
|
"",
|
|
4819
5152
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
4820
5153
|
"Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
|
|
@@ -4823,13 +5156,12 @@ function formatNotInstalled(result) {
|
|
|
4823
5156
|
}
|
|
4824
5157
|
return [
|
|
4825
5158
|
...header,
|
|
4826
|
-
|
|
4827
|
-
` ${installHint}`,
|
|
5159
|
+
...installOptions,
|
|
4828
5160
|
"",
|
|
4829
5161
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
4830
5162
|
"- If the user agrees: run the install command above, then retry this tool.",
|
|
4831
5163
|
"- If the user declines, OR has NOT explicitly asked for LSP installation:",
|
|
4832
|
-
` call lsp_install_decision { server_id: "${
|
|
5164
|
+
` call lsp_install_decision { server_id: "${server.id}", decision: "declined" },`,
|
|
4833
5165
|
` which writes to ${context.installDecisionsPath},`,
|
|
4834
5166
|
" then ignore this message and proceed WITHOUT LSP."
|
|
4835
5167
|
].join(`
|
|
@@ -4853,34 +5185,34 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
|
4853
5185
|
if (result.status !== "found") {
|
|
4854
5186
|
throw new LspServerLookupError(formatServerLookupError(result), result);
|
|
4855
5187
|
}
|
|
4856
|
-
const
|
|
5188
|
+
const server = result.server;
|
|
4857
5189
|
const root = findWorkspaceRoot(absPath);
|
|
4858
5190
|
const manager = options.manager ?? getLspManager();
|
|
4859
5191
|
const acquireAndCall = async (allowRetry) => {
|
|
4860
|
-
const client = await manager.getClient(root,
|
|
5192
|
+
const client = await manager.getClient(root, server, options.signal);
|
|
4861
5193
|
try {
|
|
4862
5194
|
return await fn(client, root, absPath);
|
|
4863
5195
|
} catch (err) {
|
|
4864
5196
|
if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
|
|
4865
|
-
manager.invalidateClient(root,
|
|
5197
|
+
manager.invalidateClient(root, server.id, client);
|
|
4866
5198
|
return acquireAndCall(false);
|
|
4867
5199
|
}
|
|
4868
5200
|
if (err instanceof LspRequestTimeoutError) {
|
|
4869
|
-
if (manager.isServerInitializing(root,
|
|
5201
|
+
if (manager.isServerInitializing(root, server.id)) {
|
|
4870
5202
|
throw new LspServerInitializingError(err);
|
|
4871
5203
|
}
|
|
4872
5204
|
}
|
|
4873
5205
|
throw err;
|
|
4874
5206
|
} finally {
|
|
4875
|
-
manager.releaseClient(root,
|
|
5207
|
+
manager.releaseClient(root, server.id);
|
|
4876
5208
|
}
|
|
4877
5209
|
};
|
|
4878
5210
|
return acquireAndCall(true);
|
|
4879
5211
|
}
|
|
4880
5212
|
|
|
4881
5213
|
// ../lsp-core/src/lsp/directory-diagnostics.ts
|
|
4882
|
-
import { existsSync as
|
|
4883
|
-
import { join as
|
|
5214
|
+
import { existsSync as existsSync12, lstatSync as lstatSync5, readdirSync as readdirSync3 } from "node:fs";
|
|
5215
|
+
import { join as join6, resolve as resolve9 } from "node:path";
|
|
4884
5216
|
|
|
4885
5217
|
// ../lsp-core/src/lsp/formatters.ts
|
|
4886
5218
|
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
@@ -4895,10 +5227,10 @@ function uriToPath(uri) {
|
|
|
4895
5227
|
}
|
|
4896
5228
|
function formatLocation(loc) {
|
|
4897
5229
|
if ("targetUri" in loc) {
|
|
4898
|
-
const
|
|
4899
|
-
const
|
|
4900
|
-
const
|
|
4901
|
-
return `${
|
|
5230
|
+
const uri = uriToPath(loc.targetUri);
|
|
5231
|
+
const line = loc.targetRange.start.line + 1;
|
|
5232
|
+
const char = loc.targetRange.start.character;
|
|
5233
|
+
return `${uri}:${line}:${char}`;
|
|
4902
5234
|
}
|
|
4903
5235
|
const uri = uriToPath(loc.uri);
|
|
4904
5236
|
const line = loc.range.start.line + 1;
|
|
@@ -5010,7 +5342,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
|
|
|
5010
5342
|
for (const entry of entries) {
|
|
5011
5343
|
if (files.length >= maxFiles)
|
|
5012
5344
|
return;
|
|
5013
|
-
const fullPath =
|
|
5345
|
+
const fullPath = join6(currentDir, entry);
|
|
5014
5346
|
let stat;
|
|
5015
5347
|
try {
|
|
5016
5348
|
stat = lstatSync5(fullPath);
|
|
@@ -5035,15 +5367,15 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
5035
5367
|
if (!extension.startsWith(".")) {
|
|
5036
5368
|
throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
|
|
5037
5369
|
}
|
|
5038
|
-
const absDir =
|
|
5039
|
-
if (!
|
|
5370
|
+
const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
|
|
5371
|
+
if (!existsSync12(absDir)) {
|
|
5040
5372
|
throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
|
|
5041
5373
|
}
|
|
5042
5374
|
const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
|
|
5043
5375
|
if (serverResult.status !== "found") {
|
|
5044
5376
|
throw new LspServerLookupError(formatServerLookupError(serverResult));
|
|
5045
5377
|
}
|
|
5046
|
-
const
|
|
5378
|
+
const server = serverResult.server;
|
|
5047
5379
|
const allFiles = (options.listFiles ?? collectFilesWithExtension)(absDir, extension, maxFiles + 1);
|
|
5048
5380
|
const wasCapped = allFiles.length > maxFiles;
|
|
5049
5381
|
const filesToProcess = allFiles.slice(0, maxFiles);
|
|
@@ -5063,7 +5395,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
5063
5395
|
const fileErrors = [];
|
|
5064
5396
|
const maxConcurrency = Math.max(1, options.maxConcurrency ?? DIRECTORY_DIAGNOSTICS_MAX_CONCURRENCY);
|
|
5065
5397
|
options.signal?.throwIfAborted();
|
|
5066
|
-
const client = await manager.getClient(root,
|
|
5398
|
+
const client = await manager.getClient(root, server, options.signal);
|
|
5067
5399
|
try {
|
|
5068
5400
|
let nextIndex = 0;
|
|
5069
5401
|
const workers = Array.from({ length: Math.min(maxConcurrency, filesToProcess.length) }, async () => {
|
|
@@ -5091,7 +5423,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
5091
5423
|
});
|
|
5092
5424
|
await Promise.all(workers);
|
|
5093
5425
|
} finally {
|
|
5094
|
-
manager.releaseClient(root,
|
|
5426
|
+
manager.releaseClient(root, server.id);
|
|
5095
5427
|
}
|
|
5096
5428
|
const displayDiagnostics = allDiagnostics.slice(0, DEFAULT_MAX_DIAGNOSTICS);
|
|
5097
5429
|
const wasDiagCapped = allDiagnostics.length > DEFAULT_MAX_DIAGNOSTICS;
|
|
@@ -5123,7 +5455,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
5123
5455
|
|
|
5124
5456
|
// ../lsp-core/src/lsp/infer-extension.ts
|
|
5125
5457
|
import { lstatSync as lstatSync6, readdirSync as readdirSync4 } from "node:fs";
|
|
5126
|
-
import { join as
|
|
5458
|
+
import { join as join7 } from "node:path";
|
|
5127
5459
|
var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
|
|
5128
5460
|
var MAX_SCAN_ENTRIES = 500;
|
|
5129
5461
|
function inferExtensionFromDirectory(directory) {
|
|
@@ -5141,7 +5473,7 @@ function inferExtensionFromDirectory(directory) {
|
|
|
5141
5473
|
for (const entry of entries) {
|
|
5142
5474
|
if (scanned >= MAX_SCAN_ENTRIES)
|
|
5143
5475
|
return;
|
|
5144
|
-
const fullPath =
|
|
5476
|
+
const fullPath = join7(dir, entry);
|
|
5145
5477
|
let stat;
|
|
5146
5478
|
try {
|
|
5147
5479
|
stat = lstatSync6(fullPath);
|
|
@@ -5300,8 +5632,8 @@ function clientOptions(signal) {
|
|
|
5300
5632
|
}
|
|
5301
5633
|
|
|
5302
5634
|
// ../lsp-core/src/tools/result.ts
|
|
5303
|
-
function text(
|
|
5304
|
-
return { content: [{ type: "text", text
|
|
5635
|
+
function text(text, details, isError = false) {
|
|
5636
|
+
return { content: [{ type: "text", text }], details, isError };
|
|
5305
5637
|
}
|
|
5306
5638
|
|
|
5307
5639
|
// ../lsp-core/src/tools/diagnostics.ts
|
|
@@ -5321,7 +5653,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
5321
5653
|
const extension = inferExtensionFromDirectory(absPath);
|
|
5322
5654
|
if (!extension) {
|
|
5323
5655
|
const message = `No supported source files found in directory: ${absPath}`;
|
|
5324
|
-
const
|
|
5656
|
+
const details = {
|
|
5325
5657
|
filePath,
|
|
5326
5658
|
severity,
|
|
5327
5659
|
mode: "directory",
|
|
@@ -5331,24 +5663,24 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
5331
5663
|
error: message,
|
|
5332
5664
|
errorKind: "no_files"
|
|
5333
5665
|
};
|
|
5334
|
-
return text(message,
|
|
5666
|
+
return text(message, details);
|
|
5335
5667
|
}
|
|
5336
|
-
const
|
|
5337
|
-
const
|
|
5668
|
+
const output = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
|
|
5669
|
+
const details = {
|
|
5338
5670
|
filePath,
|
|
5339
5671
|
severity,
|
|
5340
5672
|
mode: "directory",
|
|
5341
5673
|
diagnostics: [],
|
|
5342
|
-
totalDiagnostics:
|
|
5674
|
+
totalDiagnostics: output.totalDiagnostics,
|
|
5343
5675
|
truncated: false,
|
|
5344
|
-
fileFailures: [...
|
|
5676
|
+
fileFailures: [...output.fileFailures]
|
|
5345
5677
|
};
|
|
5346
|
-
return text(
|
|
5678
|
+
return text(output.output, details);
|
|
5347
5679
|
}
|
|
5348
5680
|
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
|
|
5349
5681
|
if (result.transientError) {
|
|
5350
5682
|
const message = result.transientError.message;
|
|
5351
|
-
const
|
|
5683
|
+
const details = {
|
|
5352
5684
|
filePath,
|
|
5353
5685
|
severity,
|
|
5354
5686
|
mode: "file",
|
|
@@ -5358,7 +5690,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
5358
5690
|
error: message,
|
|
5359
5691
|
errorKind: result.transientError.kind
|
|
5360
5692
|
};
|
|
5361
|
-
return text(message,
|
|
5693
|
+
return text(message, details, true);
|
|
5362
5694
|
}
|
|
5363
5695
|
const diagnostics = filterDiagnosticsBySeverity(asDiagnosticArray(result), severity);
|
|
5364
5696
|
const total = diagnostics.length;
|
|
@@ -5392,6 +5724,96 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
5392
5724
|
throw error;
|
|
5393
5725
|
}
|
|
5394
5726
|
}
|
|
5727
|
+
// ../lsp-core/src/lsp/format-document.ts
|
|
5728
|
+
import { readFileSync as readFileSync6, renameSync as renameSync3, unlinkSync as unlinkSync2, writeFileSync as writeFileSync3 } from "node:fs";
|
|
5729
|
+
var DEFAULT_FORMATTING_OPTIONS = {
|
|
5730
|
+
tabSize: 4,
|
|
5731
|
+
insertSpaces: false,
|
|
5732
|
+
trimTrailingWhitespace: true,
|
|
5733
|
+
insertFinalNewline: true,
|
|
5734
|
+
trimFinalNewlines: true
|
|
5735
|
+
};
|
|
5736
|
+
var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
|
|
5737
|
+
async function formatDocumentWithClient(client, filePath, options = {}) {
|
|
5738
|
+
const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
|
|
5739
|
+
if (edits === null)
|
|
5740
|
+
return { status: "unavailable", reason: "capability_not_advertised" };
|
|
5741
|
+
if (edits.length === 0)
|
|
5742
|
+
return UNCHANGED;
|
|
5743
|
+
const before = readFileSync6(filePath, "utf-8");
|
|
5744
|
+
const normalized = normalizeTextEdits(before, edits, 0);
|
|
5745
|
+
if (normalized.text === before)
|
|
5746
|
+
return UNCHANGED;
|
|
5747
|
+
writeAtomically(filePath, normalized.text);
|
|
5748
|
+
await client.openFile(filePath);
|
|
5749
|
+
return {
|
|
5750
|
+
status: "formatted",
|
|
5751
|
+
...lineDelta(normalized.edits)
|
|
5752
|
+
};
|
|
5753
|
+
}
|
|
5754
|
+
function lineDelta(edits) {
|
|
5755
|
+
let linesAdded = 0;
|
|
5756
|
+
let linesRemoved = 0;
|
|
5757
|
+
for (const edit of edits) {
|
|
5758
|
+
linesRemoved += edit.range.end.line - edit.range.start.line + 1;
|
|
5759
|
+
linesAdded += edit.newText.split(`
|
|
5760
|
+
`).length;
|
|
5761
|
+
}
|
|
5762
|
+
return { linesAdded, linesRemoved };
|
|
5763
|
+
}
|
|
5764
|
+
function writeAtomically(filePath, content) {
|
|
5765
|
+
const tempPath = `${filePath}.omo-format.tmp`;
|
|
5766
|
+
writeFileSync3(tempPath, content, "utf-8");
|
|
5767
|
+
try {
|
|
5768
|
+
renameSync3(tempPath, filePath);
|
|
5769
|
+
} catch (error) {
|
|
5770
|
+
try {
|
|
5771
|
+
unlinkSync2(tempPath);
|
|
5772
|
+
} catch {}
|
|
5773
|
+
throw error;
|
|
5774
|
+
}
|
|
5775
|
+
}
|
|
5776
|
+
|
|
5777
|
+
// ../lsp-core/src/tools/format.ts
|
|
5778
|
+
async function executeLspFormat(params, signal) {
|
|
5779
|
+
const filePath = requireString(params, "filePath");
|
|
5780
|
+
try {
|
|
5781
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
|
|
5782
|
+
return text(describeResult(filePath, result), formatDetails(filePath, result));
|
|
5783
|
+
} catch (error) {
|
|
5784
|
+
const missingDependency = missingDependencyResult(error, {
|
|
5785
|
+
filePath,
|
|
5786
|
+
status: "unavailable",
|
|
5787
|
+
reason: "server_unavailable",
|
|
5788
|
+
linesAdded: 0,
|
|
5789
|
+
linesRemoved: 0
|
|
5790
|
+
});
|
|
5791
|
+
if (missingDependency)
|
|
5792
|
+
return missingDependency;
|
|
5793
|
+
throw error;
|
|
5794
|
+
}
|
|
5795
|
+
}
|
|
5796
|
+
function formatDetails(filePath, result) {
|
|
5797
|
+
if (result.status === "unavailable") {
|
|
5798
|
+
return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
|
|
5799
|
+
}
|
|
5800
|
+
return {
|
|
5801
|
+
filePath,
|
|
5802
|
+
status: result.status,
|
|
5803
|
+
linesAdded: result.linesAdded,
|
|
5804
|
+
linesRemoved: result.linesRemoved
|
|
5805
|
+
};
|
|
5806
|
+
}
|
|
5807
|
+
function describeResult(filePath, result) {
|
|
5808
|
+
if (result.status === "unavailable") {
|
|
5809
|
+
return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
|
|
5810
|
+
}
|
|
5811
|
+
if (result.status === "unchanged") {
|
|
5812
|
+
return `Already formatted: ${filePath}`;
|
|
5813
|
+
}
|
|
5814
|
+
return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
|
|
5815
|
+
}
|
|
5816
|
+
|
|
5395
5817
|
// ../lsp-core/src/tools/install-decision.ts
|
|
5396
5818
|
async function executeLspInstallDecision(params) {
|
|
5397
5819
|
const serverId = requireString(params, "server_id");
|
|
@@ -5399,7 +5821,7 @@ async function executeLspInstallDecision(params) {
|
|
|
5399
5821
|
if (!isInstallDecision(decision)) {
|
|
5400
5822
|
return text(`Invalid decision '${String(decision)}'. Expected "declined" or "allowed".`, { serverId, errorKind: "invalid_decision" }, true);
|
|
5401
5823
|
}
|
|
5402
|
-
const serverIds = [...new Set(getMergedServers().map((
|
|
5824
|
+
const serverIds = [...new Set(getMergedServers().map((server) => server.id))];
|
|
5403
5825
|
if (!serverIds.includes(serverId)) {
|
|
5404
5826
|
const preview = serverIds.slice(0, 20).join(", ");
|
|
5405
5827
|
return text(`Unknown LSP server '${serverId}'. Known servers: ${preview}${serverIds.length > 20 ? "..." : ""}`, { serverId, errorKind: "unknown_server" }, true);
|
|
@@ -5539,10 +5961,10 @@ function objectSchema(properties, required = []) {
|
|
|
5539
5961
|
async function executeLspStatus() {
|
|
5540
5962
|
const servers = getAllServers();
|
|
5541
5963
|
const snapshots = getLspManager().getSnapshot();
|
|
5542
|
-
const installed = servers.filter((
|
|
5543
|
-
const configuredLines = servers.map((
|
|
5544
|
-
const state =
|
|
5545
|
-
return `- ${
|
|
5964
|
+
const installed = servers.filter((server) => server.installed && !server.disabled);
|
|
5965
|
+
const configuredLines = servers.map((server) => {
|
|
5966
|
+
const state = server.disabled ? "disabled" : server.installed ? "installed" : "missing";
|
|
5967
|
+
return `- ${server.id}: ${state}; source=${server.source}; extensions=${server.extensions.join(", ")}`;
|
|
5546
5968
|
});
|
|
5547
5969
|
const activeLines = snapshots.map((snapshot) => {
|
|
5548
5970
|
const state = snapshot.alive ? snapshot.isInitializing ? "initializing" : "alive" : "dead";
|
|
@@ -5585,8 +6007,8 @@ async function executeLspSymbols(params, signal) {
|
|
|
5585
6007
|
errorKind: "missing_query"
|
|
5586
6008
|
});
|
|
5587
6009
|
}
|
|
5588
|
-
const
|
|
5589
|
-
return formatSymbolsResult(filePath, scope,
|
|
6010
|
+
const symbols = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
|
|
6011
|
+
return formatSymbolsResult(filePath, scope, symbols, limit, query);
|
|
5590
6012
|
}
|
|
5591
6013
|
const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
|
|
5592
6014
|
return formatSymbolsResult(filePath, scope, symbols, limit);
|
|
@@ -5724,6 +6146,16 @@ var LSP_MCP_TOOLS = [
|
|
|
5724
6146
|
}, ["filePath", "line", "character", "newName"]),
|
|
5725
6147
|
execute: executeLspRename
|
|
5726
6148
|
},
|
|
6149
|
+
{
|
|
6150
|
+
name: "format",
|
|
6151
|
+
aliases: ["lsp_format"],
|
|
6152
|
+
title: "LSP Format",
|
|
6153
|
+
description: "Format a source file with its language server and write the returned edits to disk.",
|
|
6154
|
+
inputSchema: objectSchema({
|
|
6155
|
+
filePath: { type: "string", description: "Source file path to format." }
|
|
6156
|
+
}, ["filePath"]),
|
|
6157
|
+
execute: executeLspFormat
|
|
6158
|
+
},
|
|
5727
6159
|
{
|
|
5728
6160
|
name: "install_decision",
|
|
5729
6161
|
aliases: ["lsp_install_decision"],
|
|
@@ -5824,7 +6256,10 @@ function requestedProtocolVersion(params) {
|
|
|
5824
6256
|
var CONTEXT_KEY = "_context";
|
|
5825
6257
|
|
|
5826
6258
|
class InvalidDaemonRequestError extends Error {
|
|
5827
|
-
|
|
6259
|
+
constructor() {
|
|
6260
|
+
super(...arguments);
|
|
6261
|
+
this.name = "InvalidDaemonRequestError";
|
|
6262
|
+
}
|
|
5828
6263
|
}
|
|
5829
6264
|
function extractRequestContext(raw) {
|
|
5830
6265
|
if (!isPlainRecord(raw) || raw["method"] !== "tools/call")
|
|
@@ -5906,6 +6341,7 @@ function parseContext(value) {
|
|
|
5906
6341
|
|
|
5907
6342
|
// src/daemon-client.ts
|
|
5908
6343
|
var DEFAULT_REQUEST_TIMEOUT_MS = 30000;
|
|
6344
|
+
var STARTUP_BACKOFF_MS = [0, 100, 300];
|
|
5909
6345
|
var nextProxyRequestId = 1;
|
|
5910
6346
|
async function callToolViaDaemon(name, args, options) {
|
|
5911
6347
|
const context = requireContext(options.context);
|
|
@@ -5913,17 +6349,31 @@ async function callToolViaDaemon(name, args, options) {
|
|
|
5913
6349
|
const ensure = options.ensure ?? ((ensurePaths, signal) => ensureDaemonRunning(ensurePaths, undefined, signal === undefined ? {} : { signal }));
|
|
5914
6350
|
const timeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
5915
6351
|
const requestArgs = withContext(args, context);
|
|
6352
|
+
const probe = options.probe ?? ((probePaths, signal) => probeDaemon(probePaths, undefined, signal));
|
|
6353
|
+
const sleep = options.sleep ?? ((ms, signal) => delay(ms, undefined, { signal }));
|
|
5916
6354
|
let lastError;
|
|
5917
6355
|
let authRefreshUsed = false;
|
|
5918
|
-
for (
|
|
6356
|
+
for (const [attempt, backoffMs] of STARTUP_BACKOFF_MS.entries()) {
|
|
5919
6357
|
try {
|
|
5920
|
-
|
|
6358
|
+
if (backoffMs > 0)
|
|
6359
|
+
await sleep(backoffMs, options.signal);
|
|
6360
|
+
if (options.signal?.aborted)
|
|
6361
|
+
throw new DaemonRequestCancelledError(false);
|
|
6362
|
+
if (attempt === 0) {
|
|
6363
|
+
await ensureDaemonAvailable(paths, ensure, options.signal);
|
|
6364
|
+
} else if (!await probe(paths, options.signal)) {
|
|
6365
|
+
throw new DaemonUnreachableError(paths.socket);
|
|
6366
|
+
}
|
|
5921
6367
|
const token = readAuthToken(paths);
|
|
5922
6368
|
if (!token)
|
|
5923
6369
|
throw new DaemonRequestError("daemon auth token missing", false);
|
|
5924
6370
|
const sendOptions = options.signal === undefined ? { timeoutMs } : { timeoutMs, signal: options.signal };
|
|
5925
6371
|
return await sendToolCall(paths, token, name, requestArgs, sendOptions);
|
|
5926
6372
|
} catch (error) {
|
|
6373
|
+
if (options.signal?.aborted) {
|
|
6374
|
+
lastError = new DaemonRequestCancelledError(false);
|
|
6375
|
+
break;
|
|
6376
|
+
}
|
|
5927
6377
|
lastError = error;
|
|
5928
6378
|
if (error instanceof DaemonAuthenticationRejectedError && !authRefreshUsed) {
|
|
5929
6379
|
authRefreshUsed = true;
|
|
@@ -5940,14 +6390,17 @@ async function callToolViaDaemon(name, args, options) {
|
|
|
5940
6390
|
function callDiagnosticsViaDaemon(filePath, options) {
|
|
5941
6391
|
return callToolViaDaemon("diagnostics", { filePath, severity: "error" }, options);
|
|
5942
6392
|
}
|
|
6393
|
+
function callFormatViaDaemon(filePath, options) {
|
|
6394
|
+
return callToolViaDaemon("format", { filePath }, options);
|
|
6395
|
+
}
|
|
5943
6396
|
function currentRequestContext(env = process.env) {
|
|
5944
6397
|
const cwd = process.cwd();
|
|
5945
6398
|
const home = env["HOME"] ?? homedir3();
|
|
5946
6399
|
return parseLspRequestContext({
|
|
5947
6400
|
cwd,
|
|
5948
|
-
projectConfigPaths: [
|
|
5949
|
-
userConfigPath:
|
|
5950
|
-
installDecisionsPath:
|
|
6401
|
+
projectConfigPaths: [join8(cwd, ".codex", "lsp-client.json")],
|
|
6402
|
+
userConfigPath: join8(home, ".codex", "lsp-client.json"),
|
|
6403
|
+
installDecisionsPath: join8(home, ".codex", "lsp-install-decisions.json"),
|
|
5951
6404
|
capabilities: { installDecisionTool: true }
|
|
5952
6405
|
});
|
|
5953
6406
|
}
|
|
@@ -5962,7 +6415,7 @@ function withContext(args, context) {
|
|
|
5962
6415
|
function ensureDaemonAvailable(paths, ensure, signal) {
|
|
5963
6416
|
if (!signal)
|
|
5964
6417
|
return ensure(paths);
|
|
5965
|
-
return new Promise((
|
|
6418
|
+
return new Promise((resolve, reject) => {
|
|
5966
6419
|
let settled = false;
|
|
5967
6420
|
const finish = (run) => {
|
|
5968
6421
|
if (settled)
|
|
@@ -5977,11 +6430,11 @@ function ensureDaemonAvailable(paths, ensure, signal) {
|
|
|
5977
6430
|
return;
|
|
5978
6431
|
}
|
|
5979
6432
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
5980
|
-
Promise.resolve().then(() => ensure(paths, signal)).then(() => finish(() =>
|
|
6433
|
+
Promise.resolve().then(() => ensure(paths, signal)).then(() => finish(() => resolve()), (error) => finish(() => reject(signal.aborted ? new DaemonRequestCancelledError(false) : error)));
|
|
5981
6434
|
});
|
|
5982
6435
|
}
|
|
5983
6436
|
function sendToolCall(paths, token, name, args, options) {
|
|
5984
|
-
return new Promise((
|
|
6437
|
+
return new Promise((resolve, reject) => {
|
|
5985
6438
|
const socket = connect(paths.socket);
|
|
5986
6439
|
const requestId = allocateProxyRequestId();
|
|
5987
6440
|
let settled = false;
|
|
@@ -6034,7 +6487,7 @@ function sendToolCall(paths, token, name, args, options) {
|
|
|
6034
6487
|
}
|
|
6035
6488
|
const result = toToolResult(message, requestId);
|
|
6036
6489
|
if (result)
|
|
6037
|
-
finish(() =>
|
|
6490
|
+
finish(() => resolve(result));
|
|
6038
6491
|
else
|
|
6039
6492
|
finish(() => reject(new DaemonRequestError("invalid daemon response", requestWritten)));
|
|
6040
6493
|
});
|
|
@@ -6079,8 +6532,8 @@ function isRetryableTool(name) {
|
|
|
6079
6532
|
return name !== "rename" && name !== "lsp_rename";
|
|
6080
6533
|
}
|
|
6081
6534
|
// src/proxy.ts
|
|
6082
|
-
import { existsSync as
|
|
6083
|
-
import { basename as basename4, delimiter as delimiter4, dirname as
|
|
6535
|
+
import { existsSync as existsSync13, realpathSync as realpathSync6 } from "node:fs";
|
|
6536
|
+
import { basename as basename4, delimiter as delimiter4, dirname as dirname11, isAbsolute as isAbsolute6 } from "node:path";
|
|
6084
6537
|
var DEFAULT_STARTUP_TIMEOUT_MS = 1e4;
|
|
6085
6538
|
async function runMcpStdioProxy(options = {}) {
|
|
6086
6539
|
const input = options.input ?? process.stdin;
|
|
@@ -6203,34 +6656,34 @@ function canonicalizePathList(value) {
|
|
|
6203
6656
|
return value.split(delimiter4).map((entry) => canonicalizePath(entry) ?? entry).join(delimiter4);
|
|
6204
6657
|
}
|
|
6205
6658
|
function canonicalizePath(value) {
|
|
6206
|
-
if (value === undefined || !
|
|
6659
|
+
if (value === undefined || !isAbsolute6(value) || !existsSync13(value))
|
|
6207
6660
|
return value;
|
|
6208
|
-
return
|
|
6661
|
+
return realpathSync6(value);
|
|
6209
6662
|
}
|
|
6210
|
-
function projectRootFromOpenCodeConfigPath(
|
|
6211
|
-
if (basename4(
|
|
6663
|
+
function projectRootFromOpenCodeConfigPath(path) {
|
|
6664
|
+
if (basename4(path) !== "lsp.json" && basename4(path) !== "lsp-client.json")
|
|
6212
6665
|
return;
|
|
6213
|
-
const configDir =
|
|
6666
|
+
const configDir = dirname11(path);
|
|
6214
6667
|
const configDirName = basename4(configDir);
|
|
6215
6668
|
if (configDirName !== ".opencode" && configDirName !== ".omo")
|
|
6216
6669
|
return;
|
|
6217
|
-
return
|
|
6670
|
+
return dirname11(configDir);
|
|
6218
6671
|
}
|
|
6219
6672
|
export {
|
|
6220
|
-
|
|
6221
|
-
runMcpStdioProxy,
|
|
6222
|
-
resolveDaemonRuntime,
|
|
6223
|
-
probeDaemon,
|
|
6224
|
-
ensureDaemonRunning,
|
|
6225
|
-
disposeDefaultLspManager,
|
|
6226
|
-
daemonPaths,
|
|
6227
|
-
currentRequestContext,
|
|
6228
|
-
callToolViaDaemon,
|
|
6229
|
-
callDiagnosticsViaDaemon,
|
|
6230
|
-
OMO_LSP_DAEMON_VERSION,
|
|
6231
|
-
OMO_LSP_DAEMON_DIR,
|
|
6232
|
-
OMO_LSP_DAEMON_CLI,
|
|
6233
|
-
InvalidRuntimeOverrideError,
|
|
6673
|
+
InvalidDaemonDirectoryError,
|
|
6234
6674
|
InvalidDaemonVersionError,
|
|
6235
|
-
|
|
6675
|
+
InvalidRuntimeOverrideError,
|
|
6676
|
+
OMO_LSP_DAEMON_CLI,
|
|
6677
|
+
OMO_LSP_DAEMON_DIR,
|
|
6678
|
+
OMO_LSP_DAEMON_VERSION,
|
|
6679
|
+
callDiagnosticsViaDaemon,
|
|
6680
|
+
callToolViaDaemon,
|
|
6681
|
+
currentRequestContext,
|
|
6682
|
+
daemonPaths,
|
|
6683
|
+
disposeDefaultLspManager,
|
|
6684
|
+
ensureDaemonRunning,
|
|
6685
|
+
probeDaemon,
|
|
6686
|
+
resolveDaemonRuntime,
|
|
6687
|
+
runMcpStdioProxy,
|
|
6688
|
+
validateDaemonVersion
|
|
6236
6689
|
};
|