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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
2
|
-
import { existsSync as
|
|
3
|
-
import { basename as basename3, dirname as
|
|
2
|
+
import { existsSync as existsSync10, realpathSync as realpathSync5, statSync as statSync3 } from "node:fs";
|
|
3
|
+
import { basename as basename3, dirname as dirname8, join as join5, resolve as resolve8 } from "node:path";
|
|
4
4
|
|
|
5
5
|
// ../lsp-core/src/request-context.ts
|
|
6
6
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
@@ -9,18 +9,17 @@ import { homedir } from "node:os";
|
|
|
9
9
|
import { basename, delimiter, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
10
10
|
|
|
11
11
|
class LspRequestContextParseError extends Error {
|
|
12
|
-
code;
|
|
13
|
-
name = "LspRequestContextParseError";
|
|
14
12
|
constructor(code, message) {
|
|
15
13
|
super(message);
|
|
16
14
|
this.code = code;
|
|
15
|
+
this.name = "LspRequestContextParseError";
|
|
17
16
|
}
|
|
18
17
|
}
|
|
19
18
|
|
|
20
19
|
class LspRequestContextUnavailableError extends Error {
|
|
21
|
-
name = "LspRequestContextUnavailableError";
|
|
22
20
|
constructor() {
|
|
23
21
|
super("LSP request context is required. Standalone MCP startup must install one with runWithRequestContext(createStandaloneMcpRequestContext()).");
|
|
22
|
+
this.name = "LspRequestContextUnavailableError";
|
|
24
23
|
}
|
|
25
24
|
}
|
|
26
25
|
var storage = new AsyncLocalStorage;
|
|
@@ -50,7 +49,7 @@ function contextEnv(key) {
|
|
|
50
49
|
}
|
|
51
50
|
function createStandaloneMcpRequestContext(input = {}) {
|
|
52
51
|
const env = input.env ?? process.env;
|
|
53
|
-
const cwd = canonicalCwd(input.cwd ?? process.cwd());
|
|
52
|
+
const cwd = canonicalCwd(input.cwd ?? env["LSP_TOOLS_MCP_CWD"] ?? process.cwd());
|
|
54
53
|
const home = input.homeDir ?? homedir();
|
|
55
54
|
const projectConfigPaths = translateProjectConfigEnv(env["LSP_TOOLS_MCP_PROJECT_CONFIG"], cwd);
|
|
56
55
|
const userConfigPath = translateHomeConfigEnv(env["LSP_TOOLS_MCP_USER_CONFIG"], home, ".codex/lsp-client.json");
|
|
@@ -193,22 +192,15 @@ function effectiveExtension(filePath) {
|
|
|
193
192
|
|
|
194
193
|
// ../lsp-core/src/lsp/errors.ts
|
|
195
194
|
class LspConnectionClosedError extends Error {
|
|
196
|
-
serverId;
|
|
197
|
-
root;
|
|
198
|
-
name = "LspConnectionClosedError";
|
|
199
195
|
constructor(serverId, root, message) {
|
|
200
196
|
super(message ?? `LSP connection closed for ${serverId} at ${root}`);
|
|
201
197
|
this.serverId = serverId;
|
|
202
198
|
this.root = root;
|
|
199
|
+
this.name = "LspConnectionClosedError";
|
|
203
200
|
}
|
|
204
201
|
}
|
|
205
202
|
|
|
206
203
|
class LspProcessExitedError extends Error {
|
|
207
|
-
serverId;
|
|
208
|
-
root;
|
|
209
|
-
exitCode;
|
|
210
|
-
stderrTail;
|
|
211
|
-
name = "LspProcessExitedError";
|
|
212
204
|
constructor(serverId, root, exitCode, stderrTail) {
|
|
213
205
|
const stderrSuffix = stderrTail ? `
|
|
214
206
|
stderr tail: ${stderrTail}` : "";
|
|
@@ -217,46 +209,59 @@ stderr tail: ${stderrTail}` : "";
|
|
|
217
209
|
this.root = root;
|
|
218
210
|
this.exitCode = exitCode;
|
|
219
211
|
this.stderrTail = stderrTail;
|
|
212
|
+
this.name = "LspProcessExitedError";
|
|
220
213
|
}
|
|
221
214
|
}
|
|
222
215
|
|
|
223
216
|
class LspRequestTimeoutError extends Error {
|
|
224
|
-
method;
|
|
225
|
-
stderrTail;
|
|
226
|
-
name = "LspRequestTimeoutError";
|
|
227
217
|
constructor(method, stderrTail) {
|
|
228
218
|
const stderrSuffix = stderrTail ? `
|
|
229
219
|
recent stderr: ${stderrTail}` : "";
|
|
230
220
|
super(`LSP request timeout (method: ${method})${stderrSuffix}`);
|
|
231
221
|
this.method = method;
|
|
232
222
|
this.stderrTail = stderrTail;
|
|
223
|
+
this.name = "LspRequestTimeoutError";
|
|
233
224
|
}
|
|
234
225
|
}
|
|
235
226
|
|
|
236
227
|
class LspInvalidPathError extends Error {
|
|
237
|
-
|
|
228
|
+
constructor() {
|
|
229
|
+
super(...arguments);
|
|
230
|
+
this.name = "LspInvalidPathError";
|
|
231
|
+
}
|
|
238
232
|
}
|
|
239
233
|
|
|
240
234
|
class LspServerLookupError extends Error {
|
|
241
|
-
lookup;
|
|
242
|
-
name = "LspServerLookupError";
|
|
243
235
|
constructor(message, lookup) {
|
|
244
236
|
super(message);
|
|
245
237
|
this.lookup = lookup;
|
|
238
|
+
this.name = "LspServerLookupError";
|
|
246
239
|
}
|
|
247
240
|
}
|
|
248
241
|
|
|
249
242
|
class LspServerInitializingError extends Error {
|
|
250
|
-
originalError;
|
|
251
|
-
name = "LspServerInitializingError";
|
|
252
243
|
constructor(originalError) {
|
|
253
244
|
super(`LSP server is still initializing. Please retry in a few seconds. Original error: ${originalError.message}`);
|
|
254
245
|
this.originalError = originalError;
|
|
246
|
+
this.name = "LspServerInitializingError";
|
|
255
247
|
}
|
|
256
248
|
}
|
|
257
249
|
|
|
258
250
|
class LspProcessSpawnError extends Error {
|
|
259
|
-
|
|
251
|
+
constructor() {
|
|
252
|
+
super(...arguments);
|
|
253
|
+
this.name = "LspProcessSpawnError";
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
class LspClientRespawnBudgetExceededError extends Error {
|
|
258
|
+
constructor(serverId, root, retryLimit) {
|
|
259
|
+
super(`LSP server ${serverId} at ${root} failed to stay alive; respawn budget exhausted ` + `(${retryLimit} consecutive dead generations). Retrying after the cooldown may succeed.`);
|
|
260
|
+
this.serverId = serverId;
|
|
261
|
+
this.root = root;
|
|
262
|
+
this.retryLimit = retryLimit;
|
|
263
|
+
this.name = "LspClientRespawnBudgetExceededError";
|
|
264
|
+
}
|
|
260
265
|
}
|
|
261
266
|
function isLspDeadConnectionError(err) {
|
|
262
267
|
return err instanceof LspConnectionClosedError || err instanceof LspProcessExitedError;
|
|
@@ -279,6 +284,13 @@ import { pathToFileURL as pathToFileURL3 } from "node:url";
|
|
|
279
284
|
// ../lsp-core/src/lsp/connection.ts
|
|
280
285
|
import { pathToFileURL } from "node:url";
|
|
281
286
|
|
|
287
|
+
// ../lsp-core/src/lsp/timer-provider.ts
|
|
288
|
+
var realTimerProvider = {
|
|
289
|
+
now: () => Date.now(),
|
|
290
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
291
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
292
|
+
};
|
|
293
|
+
|
|
282
294
|
// ../lsp-core/src/lsp/constants.ts
|
|
283
295
|
var DEFAULT_MAX_REFERENCES = 200;
|
|
284
296
|
var DEFAULT_MAX_SYMBOLS = 200;
|
|
@@ -287,9 +299,12 @@ var DEFAULT_MAX_DIRECTORY_FILES = 50;
|
|
|
287
299
|
var REQUEST_TIMEOUT_MS = 15000;
|
|
288
300
|
var INIT_TIMEOUT_MS = 60000;
|
|
289
301
|
var IDLE_TIMEOUT_MS = 5 * 60000;
|
|
302
|
+
var MAX_RESIDENT_CLIENTS = 6;
|
|
290
303
|
var REAPER_INTERVAL_MS = 60000;
|
|
291
304
|
var STOP_HARD_KILL_TIMEOUT_MS = 5000;
|
|
292
305
|
var STOP_SIGKILL_GRACE_MS = 1000;
|
|
306
|
+
var CLIENT_RESPAWN_RETRY_LIMIT = 2;
|
|
307
|
+
var CLIENT_RESPAWN_COOLDOWN_MS = 60000;
|
|
293
308
|
|
|
294
309
|
// ../lsp-core/src/lsp/json-rpc-connection.ts
|
|
295
310
|
var HEADER_SEPARATOR = `\r
|
|
@@ -301,20 +316,31 @@ var METHOD_NOT_FOUND = -32601;
|
|
|
301
316
|
var INTERNAL_ERROR = -32603;
|
|
302
317
|
|
|
303
318
|
class JsonRpcConnection {
|
|
304
|
-
reader;
|
|
305
|
-
writer;
|
|
306
|
-
pendingRequests = new Map;
|
|
307
|
-
notificationHandlers = new Map;
|
|
308
|
-
requestHandlers = new Map;
|
|
309
|
-
closeHandlers = [];
|
|
310
|
-
errorHandlers = [];
|
|
311
|
-
inputBuffer = Buffer.alloc(0);
|
|
312
|
-
nextRequestId = 1;
|
|
313
|
-
listening = false;
|
|
314
|
-
disposed = false;
|
|
315
319
|
constructor(reader, writer) {
|
|
316
320
|
this.reader = reader;
|
|
317
321
|
this.writer = writer;
|
|
322
|
+
this.pendingRequests = new Map;
|
|
323
|
+
this.notificationHandlers = new Map;
|
|
324
|
+
this.requestHandlers = new Map;
|
|
325
|
+
this.closeHandlers = [];
|
|
326
|
+
this.errorHandlers = [];
|
|
327
|
+
this.inputBuffer = Buffer.alloc(0);
|
|
328
|
+
this.nextRequestId = 1;
|
|
329
|
+
this.listening = false;
|
|
330
|
+
this.disposed = false;
|
|
331
|
+
this.handleData = (chunk) => {
|
|
332
|
+
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
333
|
+
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
334
|
+
this.drainInputBuffer();
|
|
335
|
+
};
|
|
336
|
+
this.handleClose = () => {
|
|
337
|
+
for (const handler of this.closeHandlers) {
|
|
338
|
+
handler();
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
this.handleStreamError = (error) => {
|
|
342
|
+
this.emitError(error);
|
|
343
|
+
};
|
|
318
344
|
}
|
|
319
345
|
listen() {
|
|
320
346
|
if (this.listening)
|
|
@@ -349,7 +375,8 @@ class JsonRpcConnection {
|
|
|
349
375
|
let cancelAfterWrite = false;
|
|
350
376
|
let settled = false;
|
|
351
377
|
const writeCancel = () => this.writeMessage({ jsonrpc: "2.0", method: "$/cancelRequest", params: { id } });
|
|
352
|
-
|
|
378
|
+
let rejectAfterCancelWrite;
|
|
379
|
+
const responsePromise = new Promise((resolve, reject) => {
|
|
353
380
|
const cleanup = () => {
|
|
354
381
|
options.signal?.removeEventListener("abort", onAbort);
|
|
355
382
|
};
|
|
@@ -360,22 +387,26 @@ class JsonRpcConnection {
|
|
|
360
387
|
this.pendingRequests.delete(key);
|
|
361
388
|
cleanup();
|
|
362
389
|
const rejectCancelled = () => reject(abortError(options.signal));
|
|
390
|
+
rejectAfterCancelWrite = async () => {
|
|
391
|
+
try {
|
|
392
|
+
await writeCancel();
|
|
393
|
+
} catch (error) {
|
|
394
|
+
this.emitError(toError(error));
|
|
395
|
+
}
|
|
396
|
+
rejectCancelled();
|
|
397
|
+
};
|
|
363
398
|
if (!requestWritten) {
|
|
364
399
|
cancelAfterWrite = true;
|
|
365
|
-
rejectCancelled();
|
|
366
400
|
return;
|
|
367
401
|
}
|
|
368
|
-
|
|
369
|
-
this.emitError(toError(error));
|
|
370
|
-
rejectCancelled();
|
|
371
|
-
});
|
|
402
|
+
rejectAfterCancelWrite();
|
|
372
403
|
};
|
|
373
404
|
const onAbort = () => settleCancel();
|
|
374
405
|
this.pendingRequests.set(key, {
|
|
375
406
|
resolve(result) {
|
|
376
407
|
settled = true;
|
|
377
408
|
cleanup();
|
|
378
|
-
|
|
409
|
+
resolve(result);
|
|
379
410
|
},
|
|
380
411
|
reject(error) {
|
|
381
412
|
settled = true;
|
|
@@ -396,7 +427,7 @@ class JsonRpcConnection {
|
|
|
396
427
|
await this.writeMessage(message);
|
|
397
428
|
requestWritten = true;
|
|
398
429
|
if (cancelAfterWrite)
|
|
399
|
-
await
|
|
430
|
+
await rejectAfterCancelWrite?.();
|
|
400
431
|
} catch (error) {
|
|
401
432
|
if (settled)
|
|
402
433
|
return responsePromise;
|
|
@@ -435,19 +466,6 @@ class JsonRpcConnection {
|
|
|
435
466
|
this.notificationHandlers.clear();
|
|
436
467
|
this.requestHandlers.clear();
|
|
437
468
|
}
|
|
438
|
-
handleData = (chunk) => {
|
|
439
|
-
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
440
|
-
this.inputBuffer = Buffer.concat([this.inputBuffer, chunkBuffer]);
|
|
441
|
-
this.drainInputBuffer();
|
|
442
|
-
};
|
|
443
|
-
handleClose = () => {
|
|
444
|
-
for (const handler of this.closeHandlers) {
|
|
445
|
-
handler();
|
|
446
|
-
}
|
|
447
|
-
};
|
|
448
|
-
handleStreamError = (error) => {
|
|
449
|
-
this.emitError(error);
|
|
450
|
-
};
|
|
451
469
|
drainInputBuffer() {
|
|
452
470
|
while (true) {
|
|
453
471
|
const headerEnd = this.inputBuffer.indexOf(HEADER_SEPARATOR);
|
|
@@ -547,13 +565,13 @@ class JsonRpcConnection {
|
|
|
547
565
|
const payload = `Content-Length: ${Buffer.byteLength(body, "utf8")}\r
|
|
548
566
|
\r
|
|
549
567
|
${body}`;
|
|
550
|
-
return new Promise((
|
|
568
|
+
return new Promise((resolve, reject) => {
|
|
551
569
|
this.writer.write(payload, (error) => {
|
|
552
570
|
if (error) {
|
|
553
571
|
reject(error);
|
|
554
572
|
return;
|
|
555
573
|
}
|
|
556
|
-
|
|
574
|
+
resolve();
|
|
557
575
|
});
|
|
558
576
|
});
|
|
559
577
|
}
|
|
@@ -640,9 +658,9 @@ function validateCwd(cwd) {
|
|
|
640
658
|
}
|
|
641
659
|
}
|
|
642
660
|
function wrap(proc) {
|
|
643
|
-
const exitedPromise = new Promise((
|
|
644
|
-
proc.once("close", (code) =>
|
|
645
|
-
proc.once("error", () =>
|
|
661
|
+
const exitedPromise = new Promise((resolve) => {
|
|
662
|
+
proc.once("close", (code) => resolve(code ?? 0));
|
|
663
|
+
proc.once("error", () => resolve(1));
|
|
646
664
|
});
|
|
647
665
|
if (!proc.stdin || !proc.stdout || !proc.stderr) {
|
|
648
666
|
throw new LspProcessSpawnError("Spawned process is missing one of stdin/stdout/stderr pipes");
|
|
@@ -795,33 +813,29 @@ function isPosition(value) {
|
|
|
795
813
|
|
|
796
814
|
// ../lsp-core/src/lsp/transport.ts
|
|
797
815
|
class LspClientNotStartedError extends Error {
|
|
798
|
-
serverId;
|
|
799
|
-
root;
|
|
800
|
-
name = "LspClientNotStartedError";
|
|
801
816
|
constructor(serverId, root) {
|
|
802
817
|
super("LSP client not started");
|
|
803
818
|
this.serverId = serverId;
|
|
804
819
|
this.root = root;
|
|
820
|
+
this.name = "LspClientNotStartedError";
|
|
805
821
|
}
|
|
806
822
|
}
|
|
807
823
|
|
|
808
824
|
class LspClientTransport {
|
|
809
|
-
root;
|
|
810
|
-
server;
|
|
811
|
-
proc = null;
|
|
812
|
-
connection = null;
|
|
813
|
-
stderrBuffer = [];
|
|
814
|
-
processExited = false;
|
|
815
|
-
diagnosticsStore = new Map;
|
|
816
|
-
requestTimeoutMs;
|
|
817
|
-
initializeTimeoutMs;
|
|
818
|
-
workspaceApplyEditHandler = null;
|
|
819
|
-
diagnosticPullSupported = false;
|
|
820
825
|
constructor(root, server, timeouts = {}) {
|
|
821
826
|
this.root = root;
|
|
822
827
|
this.server = server;
|
|
828
|
+
this.proc = null;
|
|
829
|
+
this.connection = null;
|
|
830
|
+
this.stderrBuffer = [];
|
|
831
|
+
this.processExited = false;
|
|
832
|
+
this.diagnosticsStore = new Map;
|
|
833
|
+
this.workspaceApplyEditHandler = null;
|
|
834
|
+
this.diagnosticPullSupported = false;
|
|
835
|
+
this.documentFormattingSupported = false;
|
|
823
836
|
this.requestTimeoutMs = timeouts.requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
|
|
824
837
|
this.initializeTimeoutMs = timeouts.initializeTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
838
|
+
this.timerProvider = timeouts.timerProvider ?? realTimerProvider;
|
|
825
839
|
}
|
|
826
840
|
pid() {
|
|
827
841
|
return this.proc?.pid;
|
|
@@ -841,6 +855,12 @@ class LspClientTransport {
|
|
|
841
855
|
isDiagnosticPullSupported() {
|
|
842
856
|
return this.diagnosticPullSupported;
|
|
843
857
|
}
|
|
858
|
+
setDocumentFormattingSupported(supported) {
|
|
859
|
+
this.documentFormattingSupported = supported;
|
|
860
|
+
}
|
|
861
|
+
isDocumentFormattingSupported() {
|
|
862
|
+
return this.documentFormattingSupported;
|
|
863
|
+
}
|
|
844
864
|
handlePublishDiagnostics(params) {
|
|
845
865
|
this.diagnosticsStore.set(params.uri, [...params.diagnostics]);
|
|
846
866
|
}
|
|
@@ -916,7 +936,7 @@ class LspClientTransport {
|
|
|
916
936
|
const options = args[1];
|
|
917
937
|
const timeoutMs = options?.timeoutMs ?? this.requestTimeoutMs;
|
|
918
938
|
const timeoutController = new AbortController;
|
|
919
|
-
const timeoutHandle = setTimeout(() => {
|
|
939
|
+
const timeoutHandle = this.timerProvider.setTimeout(() => {
|
|
920
940
|
const stderrTail = this.stderrBuffer.slice(-5).join(`
|
|
921
941
|
`);
|
|
922
942
|
timeoutController.abort(new LspRequestTimeoutError(method, stderrTail || undefined));
|
|
@@ -935,7 +955,7 @@ class LspClientTransport {
|
|
|
935
955
|
}
|
|
936
956
|
throw error;
|
|
937
957
|
} finally {
|
|
938
|
-
clearTimeout(timeoutHandle);
|
|
958
|
+
this.timerProvider.clearTimeout(timeoutHandle);
|
|
939
959
|
combinedSignal.dispose();
|
|
940
960
|
}
|
|
941
961
|
}
|
|
@@ -986,8 +1006,8 @@ class LspClientTransport {
|
|
|
986
1006
|
try {
|
|
987
1007
|
proc.kill();
|
|
988
1008
|
let timeoutId;
|
|
989
|
-
const timeoutPromise = new Promise((
|
|
990
|
-
timeoutId = setTimeout(
|
|
1009
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
1010
|
+
timeoutId = setTimeout(resolve, STOP_HARD_KILL_TIMEOUT_MS);
|
|
991
1011
|
});
|
|
992
1012
|
await Promise.race([
|
|
993
1013
|
proc.exited.then(() => {
|
|
@@ -1003,7 +1023,7 @@ class LspClientTransport {
|
|
|
1003
1023
|
proc.kill("SIGKILL");
|
|
1004
1024
|
await Promise.race([
|
|
1005
1025
|
proc.exited,
|
|
1006
|
-
new Promise((
|
|
1026
|
+
new Promise((resolve) => setTimeout(resolve, STOP_SIGKILL_GRACE_MS))
|
|
1007
1027
|
]);
|
|
1008
1028
|
} catch (error) {
|
|
1009
1029
|
reportBestEffortCleanupError("hard process kill", error instanceof Error ? error : String(error));
|
|
@@ -1054,6 +1074,14 @@ function supportsDiagnosticPull(capabilities) {
|
|
|
1054
1074
|
return false;
|
|
1055
1075
|
return Object.hasOwn(capabilities, "diagnosticProvider");
|
|
1056
1076
|
}
|
|
1077
|
+
function supportsDocumentFormatting(capabilities) {
|
|
1078
|
+
if (capabilities === undefined)
|
|
1079
|
+
return false;
|
|
1080
|
+
const provider = capabilities.documentFormattingProvider;
|
|
1081
|
+
if (provider === undefined || provider === null || provider === false)
|
|
1082
|
+
return false;
|
|
1083
|
+
return provider === true || typeof provider === "object";
|
|
1084
|
+
}
|
|
1057
1085
|
|
|
1058
1086
|
class LspClientConnection extends LspClientTransport {
|
|
1059
1087
|
async initialize() {
|
|
@@ -1070,6 +1098,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
1070
1098
|
references: {},
|
|
1071
1099
|
documentSymbol: { hierarchicalDocumentSymbolSupport: true },
|
|
1072
1100
|
publishDiagnostics: {},
|
|
1101
|
+
formatting: { dynamicRegistration: false },
|
|
1073
1102
|
rename: {
|
|
1074
1103
|
prepareSupport: true,
|
|
1075
1104
|
prepareSupportDefaultBehavior: 1
|
|
@@ -1111,6 +1140,7 @@ class LspClientConnection extends LspClientTransport {
|
|
|
1111
1140
|
initializationOptions: this.server.initialization
|
|
1112
1141
|
}, { timeoutMs: this.initializeTimeoutMs });
|
|
1113
1142
|
this.setDiagnosticPullSupported(supportsDiagnosticPull(result?.capabilities));
|
|
1143
|
+
this.setDocumentFormattingSupported(supportsDocumentFormatting(result?.capabilities));
|
|
1114
1144
|
await this.sendNotification("initialized", {});
|
|
1115
1145
|
await this.sendNotification("workspace/didChangeConfiguration", {
|
|
1116
1146
|
settings: { json: { validate: { enable: true } } }
|
|
@@ -1306,6 +1336,17 @@ function canonicalPath(filePath) {
|
|
|
1306
1336
|
return absolute;
|
|
1307
1337
|
}
|
|
1308
1338
|
}
|
|
1339
|
+
function normalizeDocumentUri(uri) {
|
|
1340
|
+
let decoded = uri;
|
|
1341
|
+
try {
|
|
1342
|
+
decoded = decodeURIComponent(uri);
|
|
1343
|
+
} catch {
|
|
1344
|
+
decoded = uri;
|
|
1345
|
+
}
|
|
1346
|
+
if (process.platform !== "win32")
|
|
1347
|
+
return decoded;
|
|
1348
|
+
return decoded.replace(/^(file:\/\/\/)([a-z]):/, (_match, prefix, drive) => `${prefix}${drive.toUpperCase()}:`);
|
|
1349
|
+
}
|
|
1309
1350
|
function isSameOrDescendant(candidate, parent) {
|
|
1310
1351
|
const suffix = relative2(parent, candidate);
|
|
1311
1352
|
return suffix === "" || !suffix.startsWith("..") && suffix !== "..";
|
|
@@ -1316,17 +1357,18 @@ function movedPath(candidate, oldPath, newPath) {
|
|
|
1316
1357
|
}
|
|
1317
1358
|
|
|
1318
1359
|
class WorkspaceDocumentState {
|
|
1319
|
-
sendNotification;
|
|
1320
|
-
clearDiagnostics;
|
|
1321
|
-
openDocuments = new Map;
|
|
1322
|
-
openByUri = new Map;
|
|
1323
|
-
openPromises = new Map;
|
|
1324
|
-
now;
|
|
1325
|
-
versionlessPublishQuiescenceMs;
|
|
1326
1360
|
constructor(sendNotification, clearDiagnostics, options = {}) {
|
|
1327
1361
|
this.sendNotification = sendNotification;
|
|
1328
1362
|
this.clearDiagnostics = clearDiagnostics;
|
|
1329
|
-
this.
|
|
1363
|
+
this.openDocuments = new Map;
|
|
1364
|
+
this.openByUri = new Map;
|
|
1365
|
+
this.openPromises = new Map;
|
|
1366
|
+
this.timerProvider = options.timerProvider ?? {
|
|
1367
|
+
now: options.now ?? (() => Date.now()),
|
|
1368
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
1369
|
+
clearTimeout: (handle) => clearTimeout(handle)
|
|
1370
|
+
};
|
|
1371
|
+
this.now = () => this.timerProvider.now();
|
|
1330
1372
|
this.versionlessPublishQuiescenceMs = options.versionlessPublishQuiescenceMs ?? DEFAULT_VERSIONLESS_PUBLISH_QUIESCENCE_MS;
|
|
1331
1373
|
}
|
|
1332
1374
|
async openFile(filePath) {
|
|
@@ -1348,7 +1390,7 @@ class WorkspaceDocumentState {
|
|
|
1348
1390
|
return this.openDocuments.get(canonicalPath(filePath))?.version;
|
|
1349
1391
|
}
|
|
1350
1392
|
getStoredDiagnostics(uri) {
|
|
1351
|
-
const state = this.openByUri.get(uri);
|
|
1393
|
+
const state = this.openByUri.get(normalizeDocumentUri(uri));
|
|
1352
1394
|
if (!state)
|
|
1353
1395
|
return [];
|
|
1354
1396
|
return state.lastPublish?.diagnostics ?? state.pullCache?.diagnostics ?? [];
|
|
@@ -1370,13 +1412,13 @@ class WorkspaceDocumentState {
|
|
|
1370
1412
|
return state !== undefined && state.uri === snapshot.uri && state.version === snapshot.version && state.generation === snapshot.documentGeneration;
|
|
1371
1413
|
}
|
|
1372
1414
|
getPullCache(snapshot) {
|
|
1373
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1415
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1374
1416
|
if (!state?.pullCache || state.pullCache.documentVersion !== snapshot.version)
|
|
1375
1417
|
return null;
|
|
1376
1418
|
return state.pullCache;
|
|
1377
1419
|
}
|
|
1378
1420
|
recordPullDiagnostics(snapshot, report) {
|
|
1379
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1421
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1380
1422
|
if (!state)
|
|
1381
1423
|
return;
|
|
1382
1424
|
state.pullCache = {
|
|
@@ -1386,7 +1428,7 @@ class WorkspaceDocumentState {
|
|
|
1386
1428
|
};
|
|
1387
1429
|
}
|
|
1388
1430
|
recordPublishedDiagnostics(params) {
|
|
1389
|
-
const state = this.openByUri.get(params.uri);
|
|
1431
|
+
const state = this.openByUri.get(normalizeDocumentUri(params.uri));
|
|
1390
1432
|
if (!state)
|
|
1391
1433
|
return;
|
|
1392
1434
|
state.publishGeneration += 1;
|
|
@@ -1400,7 +1442,7 @@ class WorkspaceDocumentState {
|
|
|
1400
1442
|
this.notifyWaiters(state);
|
|
1401
1443
|
}
|
|
1402
1444
|
resolvePushDiagnostics(snapshot) {
|
|
1403
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1445
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1404
1446
|
if (!state?.lastPublish)
|
|
1405
1447
|
return { status: "missing" };
|
|
1406
1448
|
const publish = state.lastPublish;
|
|
@@ -1414,20 +1456,22 @@ class WorkspaceDocumentState {
|
|
|
1414
1456
|
return waitMs === 0 ? { status: "ready", diagnostics: publish.diagnostics } : { status: "wait", waitMs };
|
|
1415
1457
|
}
|
|
1416
1458
|
waitForDiagnosticsActivity(snapshot, timeoutMs) {
|
|
1417
|
-
const state = this.openByUri.get(snapshot.uri);
|
|
1459
|
+
const state = this.openByUri.get(normalizeDocumentUri(snapshot.uri));
|
|
1418
1460
|
if (!state || timeoutMs <= 0)
|
|
1419
1461
|
return Promise.resolve();
|
|
1462
|
+
if (state.publishGeneration !== snapshot.publishGeneration)
|
|
1463
|
+
return Promise.resolve();
|
|
1420
1464
|
return new Promise((resolveActivity) => {
|
|
1421
1465
|
let settled = false;
|
|
1422
1466
|
const finish = () => {
|
|
1423
1467
|
if (settled)
|
|
1424
1468
|
return;
|
|
1425
1469
|
settled = true;
|
|
1426
|
-
clearTimeout(timer);
|
|
1470
|
+
this.timerProvider.clearTimeout(timer);
|
|
1427
1471
|
state.waiters.delete(finish);
|
|
1428
1472
|
resolveActivity();
|
|
1429
1473
|
};
|
|
1430
|
-
const timer = setTimeout(finish, timeoutMs);
|
|
1474
|
+
const timer = this.timerProvider.setTimeout(finish, timeoutMs);
|
|
1431
1475
|
if (typeof timer.unref === "function")
|
|
1432
1476
|
timer.unref();
|
|
1433
1477
|
state.waiters.add(finish);
|
|
@@ -1535,7 +1579,7 @@ class WorkspaceDocumentState {
|
|
|
1535
1579
|
waiters: new Set
|
|
1536
1580
|
};
|
|
1537
1581
|
this.openDocuments.set(path, state);
|
|
1538
|
-
this.openByUri.set(state.uri, state);
|
|
1582
|
+
this.openByUri.set(normalizeDocumentUri(state.uri), state);
|
|
1539
1583
|
this.notifyWaiters(state);
|
|
1540
1584
|
await this.sendNotification("textDocument/didOpen", {
|
|
1541
1585
|
textDocument: { uri: state.uri, languageId: state.languageId, version: state.version, text }
|
|
@@ -1560,7 +1604,7 @@ class WorkspaceDocumentState {
|
|
|
1560
1604
|
}
|
|
1561
1605
|
async closeDocument(state) {
|
|
1562
1606
|
this.openDocuments.delete(state.path);
|
|
1563
|
-
this.openByUri.delete(state.uri);
|
|
1607
|
+
this.openByUri.delete(normalizeDocumentUri(state.uri));
|
|
1564
1608
|
this.clearDiagnostics(state.uri);
|
|
1565
1609
|
this.notifyWaiters(state);
|
|
1566
1610
|
await this.sendNotification("textDocument/didClose", { textDocument: { uri: state.uri } });
|
|
@@ -1589,13 +1633,11 @@ import { dirname as dirname2, isAbsolute as isAbsolute2, relative as relative3,
|
|
|
1589
1633
|
import { fileURLToPath } from "node:url";
|
|
1590
1634
|
|
|
1591
1635
|
class WorkspaceEditPathError extends Error {
|
|
1592
|
-
path;
|
|
1593
|
-
detail;
|
|
1594
|
-
name = "WorkspaceEditPathError";
|
|
1595
1636
|
constructor(path, detail) {
|
|
1596
1637
|
super(`${detail}: ${path}`);
|
|
1597
1638
|
this.path = path;
|
|
1598
1639
|
this.detail = detail;
|
|
1640
|
+
this.name = "WorkspaceEditPathError";
|
|
1599
1641
|
}
|
|
1600
1642
|
}
|
|
1601
1643
|
function isPathInsideWorkspace(filePath, workspaceRoot) {
|
|
@@ -1887,13 +1929,11 @@ function canonicalFingerprint(operations) {
|
|
|
1887
1929
|
|
|
1888
1930
|
// ../lsp-core/src/lsp/workspace-edit-types.ts
|
|
1889
1931
|
class WorkspaceEditValidationError extends Error {
|
|
1890
|
-
changeIndex;
|
|
1891
|
-
detail;
|
|
1892
|
-
name = "WorkspaceEditValidationError";
|
|
1893
1932
|
constructor(changeIndex, detail) {
|
|
1894
1933
|
super(`change ${changeIndex}: ${detail}`);
|
|
1895
1934
|
this.changeIndex = changeIndex;
|
|
1896
1935
|
this.detail = detail;
|
|
1936
|
+
this.name = "WorkspaceEditValidationError";
|
|
1897
1937
|
}
|
|
1898
1938
|
}
|
|
1899
1939
|
|
|
@@ -1979,14 +2019,14 @@ function parseSinglePathResource(input, kind) {
|
|
|
1979
2019
|
return;
|
|
1980
2020
|
}
|
|
1981
2021
|
if (kind === "create") {
|
|
1982
|
-
const
|
|
2022
|
+
const options = parseOptions(change["options"], ["overwrite", "ignoreIfExists"], changeIndex);
|
|
1983
2023
|
target.operations.push({
|
|
1984
2024
|
kind,
|
|
1985
2025
|
changeIndex,
|
|
1986
2026
|
path: resolvedPath.path,
|
|
1987
2027
|
reportedPath: resolvedPath.requestedPath,
|
|
1988
|
-
overwrite:
|
|
1989
|
-
ignoreIfExists:
|
|
2028
|
+
overwrite: options["overwrite"] ?? false,
|
|
2029
|
+
ignoreIfExists: options["ignoreIfExists"] ?? false,
|
|
1990
2030
|
followedSymbolicLink: resolvedPath.followedSymbolicLink
|
|
1991
2031
|
});
|
|
1992
2032
|
return;
|
|
@@ -2391,10 +2431,9 @@ function simulateDelete(operation, virtual) {
|
|
|
2391
2431
|
import { existsSync as existsSync5, lstatSync as lstatSync3, readdirSync as readdirSync2 } from "node:fs";
|
|
2392
2432
|
import { dirname as dirname4, resolve as resolve5 } from "node:path";
|
|
2393
2433
|
class WorkspaceSnapshotBuilder {
|
|
2394
|
-
workspaceRoot;
|
|
2395
|
-
snapshots = new Map;
|
|
2396
2434
|
constructor(workspaceRoot) {
|
|
2397
2435
|
this.workspaceRoot = workspaceRoot;
|
|
2436
|
+
this.snapshots = new Map;
|
|
2398
2437
|
}
|
|
2399
2438
|
build(operations) {
|
|
2400
2439
|
this.add(this.workspaceRoot, false);
|
|
@@ -2438,8 +2477,10 @@ function snapshotOperations(operations, workspaceRoot) {
|
|
|
2438
2477
|
|
|
2439
2478
|
// ../lsp-core/src/lsp/workspace-edit-plan.ts
|
|
2440
2479
|
class PlanPathIndex {
|
|
2441
|
-
|
|
2442
|
-
|
|
2480
|
+
constructor() {
|
|
2481
|
+
this.firstChangeByPath = new Map;
|
|
2482
|
+
this.reportedPathByCanonical = new Map;
|
|
2483
|
+
}
|
|
2443
2484
|
build(operations) {
|
|
2444
2485
|
for (const operation of operations) {
|
|
2445
2486
|
switch (operation.kind) {
|
|
@@ -2455,11 +2496,11 @@ class PlanPathIndex {
|
|
|
2455
2496
|
}
|
|
2456
2497
|
}
|
|
2457
2498
|
}
|
|
2458
|
-
add(path,
|
|
2499
|
+
add(path, reportedPath, changeIndex) {
|
|
2459
2500
|
if (!this.firstChangeByPath.has(path))
|
|
2460
2501
|
this.firstChangeByPath.set(path, changeIndex);
|
|
2461
2502
|
if (!this.reportedPathByCanonical.has(path))
|
|
2462
|
-
this.reportedPathByCanonical.set(path,
|
|
2503
|
+
this.reportedPathByCanonical.set(path, reportedPath);
|
|
2463
2504
|
}
|
|
2464
2505
|
}
|
|
2465
2506
|
function fingerprintWorkspaceEdit(edit, workspaceRoot) {
|
|
@@ -2528,14 +2569,11 @@ function isRecord4(value) {
|
|
|
2528
2569
|
}
|
|
2529
2570
|
|
|
2530
2571
|
class WorkspaceMutationController {
|
|
2531
|
-
workspaceRoot;
|
|
2532
|
-
documents;
|
|
2533
|
-
activeLease = null;
|
|
2534
|
-
nextLeaseId = 1;
|
|
2535
|
-
io;
|
|
2536
2572
|
constructor(workspaceRoot, documents) {
|
|
2537
2573
|
this.workspaceRoot = workspaceRoot;
|
|
2538
2574
|
this.documents = documents;
|
|
2575
|
+
this.activeLease = null;
|
|
2576
|
+
this.nextLeaseId = 1;
|
|
2539
2577
|
}
|
|
2540
2578
|
setIo(io) {
|
|
2541
2579
|
this.io = io;
|
|
@@ -2574,8 +2612,8 @@ class WorkspaceMutationController {
|
|
|
2574
2612
|
};
|
|
2575
2613
|
}
|
|
2576
2614
|
lease.phase = "applying";
|
|
2577
|
-
lease.applyCompletion = new Promise((
|
|
2578
|
-
lease.resolveApply =
|
|
2615
|
+
lease.applyCompletion = new Promise((resolve) => {
|
|
2616
|
+
lease.resolveApply = resolve;
|
|
2579
2617
|
});
|
|
2580
2618
|
const edit = isRecord4(params) ? params["edit"] : undefined;
|
|
2581
2619
|
const record = edit === undefined ? { fingerprint: null, result: failure("workspace/applyEdit params.edit is required", 0) } : await this.applyEdit(edit, lease);
|
|
@@ -2648,14 +2686,12 @@ var DIAGNOSTICS_FRESHNESS_TIMEOUT_MS = 3000;
|
|
|
2648
2686
|
var VERSIONLESS_PUBLISH_QUIESCENCE_MS = 250;
|
|
2649
2687
|
|
|
2650
2688
|
class LspClient extends LspClientConnection {
|
|
2651
|
-
diagnosticPullErrors = [];
|
|
2652
|
-
documents;
|
|
2653
|
-
workspaceMutations;
|
|
2654
|
-
diagnosticsFreshnessTimeoutMs;
|
|
2655
2689
|
constructor(root, server, options = {}) {
|
|
2656
2690
|
super(root, server, options);
|
|
2691
|
+
this.diagnosticPullErrors = [];
|
|
2657
2692
|
this.diagnosticsFreshnessTimeoutMs = options.diagnosticsFreshnessTimeoutMs ?? DIAGNOSTICS_FRESHNESS_TIMEOUT_MS;
|
|
2658
2693
|
this.documents = new WorkspaceDocumentState((method, params) => this.sendNotification(method, params), (uri) => this.diagnosticsStore.delete(uri), {
|
|
2694
|
+
timerProvider: this.timerProvider,
|
|
2659
2695
|
versionlessPublishQuiescenceMs: options.versionlessPublishQuiescenceMs ?? VERSIONLESS_PUBLISH_QUIESCENCE_MS
|
|
2660
2696
|
});
|
|
2661
2697
|
this.workspaceMutations = new WorkspaceMutationController(root, this.documents);
|
|
@@ -2708,6 +2744,18 @@ class LspClient extends LspClientConnection {
|
|
|
2708
2744
|
textDocument: { uri: pathToFileURL3(absPath).href }
|
|
2709
2745
|
}, options);
|
|
2710
2746
|
}
|
|
2747
|
+
async formatDocument(filePath, options, signal) {
|
|
2748
|
+
if (!this.isDocumentFormattingSupported())
|
|
2749
|
+
return null;
|
|
2750
|
+
const absPath = this.resolveWorkspacePath(filePath);
|
|
2751
|
+
await this.openFile(absPath);
|
|
2752
|
+
const requestOptions = signal === undefined ? {} : { signal };
|
|
2753
|
+
const edits = await this.sendRequest("textDocument/formatting", {
|
|
2754
|
+
textDocument: { uri: pathToFileURL3(absPath).href },
|
|
2755
|
+
options
|
|
2756
|
+
}, requestOptions);
|
|
2757
|
+
return edits ?? [];
|
|
2758
|
+
}
|
|
2711
2759
|
async workspaceSymbols(query, signal) {
|
|
2712
2760
|
const options = signal === undefined ? {} : { signal };
|
|
2713
2761
|
return this.sendRequest("workspace/symbol", { query }, options);
|
|
@@ -2747,7 +2795,7 @@ class LspClient extends LspClientConnection {
|
|
|
2747
2795
|
const absPath = this.resolveWorkspacePath(filePath);
|
|
2748
2796
|
const uri = pathToFileURL3(absPath).href;
|
|
2749
2797
|
await this.openFile(absPath);
|
|
2750
|
-
const deadlineAt =
|
|
2798
|
+
const deadlineAt = this.timerProvider.now() + this.diagnosticsFreshnessTimeoutMs;
|
|
2751
2799
|
for (;; ) {
|
|
2752
2800
|
signal?.throwIfAborted();
|
|
2753
2801
|
const snapshot = this.documents.captureDiagnosticSnapshot(absPath);
|
|
@@ -2760,13 +2808,13 @@ class LspClient extends LspClientConnection {
|
|
|
2760
2808
|
if (!pushFallbackOnly) {
|
|
2761
2809
|
const cached = this.documents.getPullCache(snapshot);
|
|
2762
2810
|
try {
|
|
2763
|
-
const
|
|
2764
|
-
if (
|
|
2811
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
2812
|
+
if (remainingMs <= 0)
|
|
2765
2813
|
return this.freshnessTimeout(absPath);
|
|
2766
2814
|
const result = await this.sendRequest("textDocument/diagnostic", {
|
|
2767
2815
|
textDocument: { uri },
|
|
2768
2816
|
...cached?.resultId === undefined ? {} : { previousResultId: cached.resultId }
|
|
2769
|
-
}, { timeoutMs:
|
|
2817
|
+
}, { timeoutMs: remainingMs, ...signal === undefined ? {} : { signal } });
|
|
2770
2818
|
if (!this.documents.isCurrentSnapshot(snapshot))
|
|
2771
2819
|
continue;
|
|
2772
2820
|
const report = this.parseDiagnosticPullReport(result);
|
|
@@ -2795,7 +2843,7 @@ class LspClient extends LspClientConnection {
|
|
|
2795
2843
|
}
|
|
2796
2844
|
if (!pushFallbackOnly)
|
|
2797
2845
|
continue;
|
|
2798
|
-
const remainingMs = deadlineAt -
|
|
2846
|
+
const remainingMs = deadlineAt - this.timerProvider.now();
|
|
2799
2847
|
if (remainingMs <= 0) {
|
|
2800
2848
|
if (!this.isDiagnosticPullSupported() && snapshot.publishGeneration === 0) {
|
|
2801
2849
|
const cached = this.documents.getPullCache(snapshot);
|
|
@@ -2847,7 +2895,7 @@ function waitForDiagnosticsActivity(wait, signal) {
|
|
|
2847
2895
|
return wait;
|
|
2848
2896
|
if (signal.aborted)
|
|
2849
2897
|
return Promise.reject(abortError2(signal));
|
|
2850
|
-
return new Promise((
|
|
2898
|
+
return new Promise((resolve, reject) => {
|
|
2851
2899
|
const onAbort = () => {
|
|
2852
2900
|
signal.removeEventListener("abort", onAbort);
|
|
2853
2901
|
reject(abortError2(signal));
|
|
@@ -2855,7 +2903,7 @@ function waitForDiagnosticsActivity(wait, signal) {
|
|
|
2855
2903
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
2856
2904
|
wait.then(() => {
|
|
2857
2905
|
signal.removeEventListener("abort", onAbort);
|
|
2858
|
-
|
|
2906
|
+
resolve();
|
|
2859
2907
|
}, (error) => {
|
|
2860
2908
|
signal.removeEventListener("abort", onAbort);
|
|
2861
2909
|
reject(error);
|
|
@@ -2923,7 +2971,7 @@ async function stopClientBestEffort(client) {
|
|
|
2923
2971
|
function awaitWithSignal(promise, signal) {
|
|
2924
2972
|
if (!signal)
|
|
2925
2973
|
return promise;
|
|
2926
|
-
return new Promise((
|
|
2974
|
+
return new Promise((resolve, reject) => {
|
|
2927
2975
|
let settled = false;
|
|
2928
2976
|
const onAbort = () => {
|
|
2929
2977
|
if (settled)
|
|
@@ -2941,7 +2989,7 @@ function awaitWithSignal(promise, signal) {
|
|
|
2941
2989
|
return;
|
|
2942
2990
|
settled = true;
|
|
2943
2991
|
signal.removeEventListener("abort", onAbort);
|
|
2944
|
-
|
|
2992
|
+
resolve(value);
|
|
2945
2993
|
}, (err) => {
|
|
2946
2994
|
if (settled)
|
|
2947
2995
|
return;
|
|
@@ -2953,18 +3001,16 @@ function awaitWithSignal(promise, signal) {
|
|
|
2953
3001
|
}
|
|
2954
3002
|
|
|
2955
3003
|
class LspManager {
|
|
2956
|
-
clients = new Map;
|
|
2957
|
-
reaperHandle = null;
|
|
2958
|
-
signalDisposer = null;
|
|
2959
|
-
disposed = false;
|
|
2960
|
-
idleTimeoutMs;
|
|
2961
|
-
initTimeoutMs;
|
|
2962
|
-
reaperIntervalMs;
|
|
2963
|
-
clientFactory;
|
|
2964
|
-
now;
|
|
2965
3004
|
constructor(options = {}) {
|
|
3005
|
+
this.clients = new Map;
|
|
3006
|
+
this.pendingStops = new Map;
|
|
3007
|
+
this.respawnBudgets = new Map;
|
|
3008
|
+
this.reaperHandle = null;
|
|
3009
|
+
this.signalDisposer = null;
|
|
3010
|
+
this.disposed = false;
|
|
2966
3011
|
this.idleTimeoutMs = options.idleTimeoutMs ?? IDLE_TIMEOUT_MS;
|
|
2967
3012
|
this.initTimeoutMs = options.initTimeoutMs ?? INIT_TIMEOUT_MS;
|
|
3013
|
+
this.maxResidentClients = options.maxResidentClients ?? MAX_RESIDENT_CLIENTS;
|
|
2968
3014
|
this.reaperIntervalMs = options.reaperIntervalMs ?? REAPER_INTERVAL_MS;
|
|
2969
3015
|
this.clientFactory = options.clientFactory ?? ((root, server) => new LspClient(root, server));
|
|
2970
3016
|
this.now = options.now ?? (() => Date.now());
|
|
@@ -2984,24 +3030,79 @@ class LspManager {
|
|
|
2984
3030
|
getKey(root, serverId) {
|
|
2985
3031
|
return `${root}::${serverId}`;
|
|
2986
3032
|
}
|
|
3033
|
+
tombstoneStop(key, client) {
|
|
3034
|
+
const stop = stopClientBestEffort(client);
|
|
3035
|
+
this.pendingStops.set(key, stop);
|
|
3036
|
+
stop.finally(() => {
|
|
3037
|
+
if (this.pendingStops.get(key) === stop) {
|
|
3038
|
+
this.pendingStops.delete(key);
|
|
3039
|
+
}
|
|
3040
|
+
});
|
|
3041
|
+
return stop;
|
|
3042
|
+
}
|
|
3043
|
+
recordDeadGeneration(key) {
|
|
3044
|
+
let budget = this.respawnBudgets.get(key);
|
|
3045
|
+
if (budget === undefined) {
|
|
3046
|
+
budget = { deadGenerations: 0, exhaustedAt: null };
|
|
3047
|
+
this.respawnBudgets.set(key, budget);
|
|
3048
|
+
}
|
|
3049
|
+
budget.deadGenerations += 1;
|
|
3050
|
+
}
|
|
3051
|
+
markHealthyGeneration(key) {
|
|
3052
|
+
this.respawnBudgets.delete(key);
|
|
3053
|
+
}
|
|
3054
|
+
ensureRespawnAllowed(key, root, serverId) {
|
|
3055
|
+
const budget = this.respawnBudgets.get(key);
|
|
3056
|
+
if (budget === undefined || budget.deadGenerations < CLIENT_RESPAWN_RETRY_LIMIT)
|
|
3057
|
+
return;
|
|
3058
|
+
if (budget.exhaustedAt === null) {
|
|
3059
|
+
budget.exhaustedAt = this.now();
|
|
3060
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
3061
|
+
}
|
|
3062
|
+
if (this.now() - budget.exhaustedAt < CLIENT_RESPAWN_COOLDOWN_MS) {
|
|
3063
|
+
throw new LspClientRespawnBudgetExceededError(serverId, root, CLIENT_RESPAWN_RETRY_LIMIT);
|
|
3064
|
+
}
|
|
3065
|
+
budget.deadGenerations = 0;
|
|
3066
|
+
budget.exhaustedAt = null;
|
|
3067
|
+
}
|
|
2987
3068
|
reapStale() {
|
|
2988
3069
|
const t = this.now();
|
|
2989
3070
|
for (const [key, managed] of this.clients) {
|
|
2990
3071
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
2991
|
-
stopClientBestEffort(managed.client);
|
|
2992
3072
|
this.clients.delete(key);
|
|
3073
|
+
this.tombstoneStop(key, managed.client);
|
|
2993
3074
|
continue;
|
|
2994
3075
|
}
|
|
2995
3076
|
if (!managed.isInitializing && managed.refCount === 0 && managed.pendingWaiters === 0 && t - managed.lastUsedAt > this.idleTimeoutMs) {
|
|
2996
|
-
stopClientBestEffort(managed.client);
|
|
2997
3077
|
this.clients.delete(key);
|
|
3078
|
+
this.tombstoneStop(key, managed.client);
|
|
3079
|
+
}
|
|
3080
|
+
}
|
|
3081
|
+
}
|
|
3082
|
+
evictForAdmission() {
|
|
3083
|
+
while (this.clients.size >= this.maxResidentClients) {
|
|
3084
|
+
const victim = this.leastRecentlyUsedIdleClient();
|
|
3085
|
+
if (!victim)
|
|
3086
|
+
return;
|
|
3087
|
+
this.clients.delete(victim.key);
|
|
3088
|
+
this.tombstoneStop(victim.key, victim.managed.client);
|
|
3089
|
+
}
|
|
3090
|
+
}
|
|
3091
|
+
leastRecentlyUsedIdleClient() {
|
|
3092
|
+
let candidate = null;
|
|
3093
|
+
for (const [key, managed] of this.clients) {
|
|
3094
|
+
if (managed.refCount > 0 || managed.pendingWaiters > 0 || managed.isInitializing)
|
|
3095
|
+
continue;
|
|
3096
|
+
if (candidate === null || managed.lastUsedAt < candidate.managed.lastUsedAt) {
|
|
3097
|
+
candidate = { key, managed };
|
|
2998
3098
|
}
|
|
2999
3099
|
}
|
|
3100
|
+
return candidate;
|
|
3000
3101
|
}
|
|
3001
3102
|
async tryDeleteIfOrphaned(key, managed) {
|
|
3002
3103
|
if (managed.refCount === 0 && managed.pendingWaiters === 0 && !managed.isInitializing && this.clients.get(key) === managed) {
|
|
3003
3104
|
this.clients.delete(key);
|
|
3004
|
-
await
|
|
3105
|
+
await this.tombstoneStop(key, managed.client);
|
|
3005
3106
|
}
|
|
3006
3107
|
}
|
|
3007
3108
|
async getClient(root, server, signal) {
|
|
@@ -3010,12 +3111,22 @@ class LspManager {
|
|
|
3010
3111
|
}
|
|
3011
3112
|
signal?.throwIfAborted();
|
|
3012
3113
|
const key = this.getKey(root, server.id);
|
|
3114
|
+
for (;; ) {
|
|
3115
|
+
const pendingStop = this.pendingStops.get(key);
|
|
3116
|
+
if (pendingStop === undefined)
|
|
3117
|
+
break;
|
|
3118
|
+
await awaitWithSignal(pendingStop, signal);
|
|
3119
|
+
signal?.throwIfAborted();
|
|
3120
|
+
}
|
|
3121
|
+
if (this.disposed) {
|
|
3122
|
+
throw new Error("LspManager has been disposed");
|
|
3123
|
+
}
|
|
3013
3124
|
let managed = this.clients.get(key);
|
|
3014
3125
|
if (managed) {
|
|
3015
3126
|
const t = this.now();
|
|
3016
3127
|
if (managed.isInitializing && managed.initializingSince !== null && t - managed.initializingSince > this.initTimeoutMs) {
|
|
3017
|
-
await stopClientBestEffort(managed.client);
|
|
3018
3128
|
this.clients.delete(key);
|
|
3129
|
+
await this.tombstoneStop(key, managed.client);
|
|
3019
3130
|
managed = undefined;
|
|
3020
3131
|
}
|
|
3021
3132
|
}
|
|
@@ -3036,14 +3147,20 @@ class LspManager {
|
|
|
3036
3147
|
signal.throwIfAborted();
|
|
3037
3148
|
}
|
|
3038
3149
|
if (!managed.client.isAlive()) {
|
|
3039
|
-
|
|
3040
|
-
this.clients.
|
|
3150
|
+
this.recordDeadGeneration(key);
|
|
3151
|
+
if (this.clients.get(key) === managed) {
|
|
3152
|
+
this.clients.delete(key);
|
|
3153
|
+
}
|
|
3154
|
+
await this.tombstoneStop(key, managed.client);
|
|
3041
3155
|
return this.getClient(root, server, signal);
|
|
3042
3156
|
}
|
|
3157
|
+
this.markHealthyGeneration(key);
|
|
3043
3158
|
managed.refCount++;
|
|
3044
3159
|
managed.lastUsedAt = this.now();
|
|
3045
3160
|
return managed.client;
|
|
3046
3161
|
}
|
|
3162
|
+
this.evictForAdmission();
|
|
3163
|
+
this.ensureRespawnAllowed(key, root, server.id);
|
|
3047
3164
|
const client = this.clientFactory(root, server);
|
|
3048
3165
|
const initStartedAt = this.now();
|
|
3049
3166
|
const initPromise = (async () => {
|
|
@@ -3067,7 +3184,7 @@ class LspManager {
|
|
|
3067
3184
|
if (this.clients.get(key) === newManaged) {
|
|
3068
3185
|
this.clients.delete(key);
|
|
3069
3186
|
}
|
|
3070
|
-
await
|
|
3187
|
+
await this.tombstoneStop(key, client);
|
|
3071
3188
|
throw err;
|
|
3072
3189
|
}
|
|
3073
3190
|
newManaged.pendingWaiters--;
|
|
@@ -3078,6 +3195,15 @@ class LspManager {
|
|
|
3078
3195
|
await this.tryDeleteIfOrphaned(key, newManaged);
|
|
3079
3196
|
signal.throwIfAborted();
|
|
3080
3197
|
}
|
|
3198
|
+
if (!client.isAlive()) {
|
|
3199
|
+
this.recordDeadGeneration(key);
|
|
3200
|
+
if (this.clients.get(key) === newManaged) {
|
|
3201
|
+
this.clients.delete(key);
|
|
3202
|
+
}
|
|
3203
|
+
await this.tombstoneStop(key, client);
|
|
3204
|
+
return this.getClient(root, server, signal);
|
|
3205
|
+
}
|
|
3206
|
+
this.markHealthyGeneration(key);
|
|
3081
3207
|
newManaged.refCount++;
|
|
3082
3208
|
newManaged.lastUsedAt = this.now();
|
|
3083
3209
|
return client;
|
|
@@ -3098,14 +3224,20 @@ class LspManager {
|
|
|
3098
3224
|
if (client && managed.client !== client)
|
|
3099
3225
|
return;
|
|
3100
3226
|
this.clients.delete(key);
|
|
3101
|
-
|
|
3227
|
+
this.tombstoneStop(key, managed.client);
|
|
3102
3228
|
}
|
|
3103
3229
|
warmupClient(root, server) {
|
|
3104
3230
|
if (this.disposed)
|
|
3105
3231
|
return;
|
|
3106
3232
|
const key = this.getKey(root, server.id);
|
|
3107
|
-
if (this.clients.has(key))
|
|
3233
|
+
if (this.clients.has(key) || this.pendingStops.has(key))
|
|
3108
3234
|
return;
|
|
3235
|
+
this.evictForAdmission();
|
|
3236
|
+
try {
|
|
3237
|
+
this.ensureRespawnAllowed(key, root, server.id);
|
|
3238
|
+
} catch {
|
|
3239
|
+
return;
|
|
3240
|
+
}
|
|
3109
3241
|
const client = this.clientFactory(root, server);
|
|
3110
3242
|
const initStartedAt = this.now();
|
|
3111
3243
|
const initPromise = (async () => {
|
|
@@ -3131,7 +3263,7 @@ class LspManager {
|
|
|
3131
3263
|
if (this.clients.get(key) === managed) {
|
|
3132
3264
|
this.clients.delete(key);
|
|
3133
3265
|
}
|
|
3134
|
-
|
|
3266
|
+
this.tombstoneStop(key, client);
|
|
3135
3267
|
});
|
|
3136
3268
|
}
|
|
3137
3269
|
isServerInitializing(root, serverId) {
|
|
@@ -3175,8 +3307,11 @@ class LspManager {
|
|
|
3175
3307
|
for (const managed of this.clients.values()) {
|
|
3176
3308
|
stopPromises.push(stopClientBestEffort(managed.client));
|
|
3177
3309
|
}
|
|
3310
|
+
const tombstonedStops = [...this.pendingStops.values()];
|
|
3178
3311
|
this.clients.clear();
|
|
3179
|
-
|
|
3312
|
+
this.respawnBudgets.clear();
|
|
3313
|
+
await Promise.allSettled([...stopPromises, ...tombstonedStops]);
|
|
3314
|
+
this.pendingStops.clear();
|
|
3180
3315
|
}
|
|
3181
3316
|
}
|
|
3182
3317
|
var _defaultInstance = null;
|
|
@@ -3194,57 +3329,52 @@ async function disposeDefaultLspManager() {
|
|
|
3194
3329
|
}
|
|
3195
3330
|
}
|
|
3196
3331
|
|
|
3197
|
-
// ../lsp-core/src/lsp/
|
|
3198
|
-
import { existsSync as existsSync6,
|
|
3199
|
-
import { dirname as dirname5 } from "node:path";
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3206
|
-
|
|
3207
|
-
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
|
|
3332
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
3333
|
+
import { existsSync as existsSync6, realpathSync as realpathSync4 } from "node:fs";
|
|
3334
|
+
import { dirname as dirname5, join as join3 } from "node:path";
|
|
3335
|
+
|
|
3336
|
+
// ../lsp-core/src/lsp/workspace-markers.ts
|
|
3337
|
+
var GIT_WORKSPACE_MARKER = ".git";
|
|
3338
|
+
var PROJECT_WORKSPACE_MARKERS = [
|
|
3339
|
+
"package.json",
|
|
3340
|
+
"pyproject.toml",
|
|
3341
|
+
"Cargo.toml",
|
|
3342
|
+
"go.mod",
|
|
3343
|
+
"pom.xml",
|
|
3344
|
+
"build.gradle"
|
|
3345
|
+
];
|
|
3346
|
+
var WORKSPACE_MARKERS = [GIT_WORKSPACE_MARKER, ...PROJECT_WORKSPACE_MARKERS];
|
|
3347
|
+
|
|
3348
|
+
// ../lsp-core/src/lsp/outside-context-workspace.ts
|
|
3349
|
+
function findWorkspaceRootOutsideContext(directory) {
|
|
3350
|
+
const marked = nearestMarkedAncestor(directory);
|
|
3351
|
+
if (marked !== undefined)
|
|
3352
|
+
return marked;
|
|
3353
|
+
return realpathSync4(nearestExistingAncestor(directory));
|
|
3354
|
+
}
|
|
3355
|
+
function nearestMarkedAncestor(directory) {
|
|
3356
|
+
let current = directory;
|
|
3357
|
+
for (;; ) {
|
|
3358
|
+
if (existsSync6(current) && WORKSPACE_MARKERS.some((marker) => existsSync6(join3(current, marker)))) {
|
|
3359
|
+
return realpathSync4(current);
|
|
3360
|
+
}
|
|
3361
|
+
const parent = dirname5(current);
|
|
3362
|
+
if (parent === current)
|
|
3363
|
+
return;
|
|
3364
|
+
current = parent;
|
|
3212
3365
|
}
|
|
3213
3366
|
}
|
|
3214
|
-
function
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
|
|
3221
|
-
}
|
|
3222
|
-
|
|
3223
|
-
return value === "declined" || value === "allowed";
|
|
3224
|
-
}
|
|
3225
|
-
function writeInstallDecisions(decisions) {
|
|
3226
|
-
const path = getInstallDecisionsPath();
|
|
3227
|
-
mkdirSync(dirname5(path), { recursive: true });
|
|
3228
|
-
const tmpPath = `${path}.tmp`;
|
|
3229
|
-
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
3230
|
-
`, "utf8");
|
|
3231
|
-
renameSync2(tmpPath, path);
|
|
3232
|
-
}
|
|
3233
|
-
function isInstallDecisions(value) {
|
|
3234
|
-
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
3235
|
-
}
|
|
3236
|
-
function isInstallDecisionRecord(value) {
|
|
3237
|
-
if (!isRecord5(value))
|
|
3238
|
-
return false;
|
|
3239
|
-
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
3240
|
-
}
|
|
3241
|
-
function isRecord5(value) {
|
|
3242
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3367
|
+
function nearestExistingAncestor(directory) {
|
|
3368
|
+
let current = directory;
|
|
3369
|
+
while (!existsSync6(current)) {
|
|
3370
|
+
const parent = dirname5(current);
|
|
3371
|
+
if (parent === current)
|
|
3372
|
+
return current;
|
|
3373
|
+
current = parent;
|
|
3374
|
+
}
|
|
3375
|
+
return current;
|
|
3243
3376
|
}
|
|
3244
3377
|
|
|
3245
|
-
// ../lsp-core/src/lsp/config-loader.ts
|
|
3246
|
-
import { existsSync as existsSync7, readFileSync as readFileSync4 } from "node:fs";
|
|
3247
|
-
|
|
3248
3378
|
// ../lsp-core/src/lsp/server-definitions.ts
|
|
3249
3379
|
var LSP_INSTALL_HINTS = {
|
|
3250
3380
|
typescript: "npm install -g typescript-language-server typescript",
|
|
@@ -3290,6 +3420,26 @@ var LSP_INSTALL_HINTS = {
|
|
|
3290
3420
|
julials: `julia -e 'using Pkg; Pkg.add("LanguageServer")'`,
|
|
3291
3421
|
razor: "Razor runs through the Roslyn language server (cohosting). " + "Install: dotnet tool install -g roslyn-language-server --prerelease (requires v5.8.0+). See https://github.com/dotnet/razor"
|
|
3292
3422
|
};
|
|
3423
|
+
var LSP_LOCAL_INSTALL_HINTS = {
|
|
3424
|
+
typescript: "bun add -d typescript-language-server typescript",
|
|
3425
|
+
vue: "bun add -d @vue/language-server",
|
|
3426
|
+
eslint: "bun add -d vscode-langservers-extracted",
|
|
3427
|
+
oxlint: "bun add -d oxlint",
|
|
3428
|
+
biome: "bun add -d @biomejs/biome",
|
|
3429
|
+
svelte: "bun add -d svelte-language-server",
|
|
3430
|
+
astro: "bun add -d @astrojs/language-server",
|
|
3431
|
+
bash: "bun add -d bash-language-server",
|
|
3432
|
+
"bash-ls": "bun add -d bash-language-server",
|
|
3433
|
+
"yaml-ls": "bun add -d yaml-language-server",
|
|
3434
|
+
php: "bun add -d intelephense",
|
|
3435
|
+
prisma: "bun add -d prisma",
|
|
3436
|
+
dockerfile: "bun add -d dockerfile-language-server-nodejs",
|
|
3437
|
+
pyright: "uv add --dev pyright",
|
|
3438
|
+
basedpyright: "uv add --dev basedpyright",
|
|
3439
|
+
ruff: "uv add --dev ruff",
|
|
3440
|
+
ty: "uv add --dev ty",
|
|
3441
|
+
"ruby-lsp": "bundle add ruby-lsp --group development"
|
|
3442
|
+
};
|
|
3293
3443
|
var BUILTIN_SERVERS = {
|
|
3294
3444
|
typescript: {
|
|
3295
3445
|
command: ["typescript-language-server", "--stdio"],
|
|
@@ -3392,7 +3542,56 @@ var BUILTIN_SERVERS = {
|
|
|
3392
3542
|
}
|
|
3393
3543
|
};
|
|
3394
3544
|
|
|
3545
|
+
// ../lsp-core/src/lsp/server-install-state.ts
|
|
3546
|
+
import { existsSync as existsSync7, mkdirSync, readFileSync as readFileSync3, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
3547
|
+
import { dirname as dirname6 } from "node:path";
|
|
3548
|
+
function getInstallDecisionsPath() {
|
|
3549
|
+
return lspRequestContext().installDecisionsPath;
|
|
3550
|
+
}
|
|
3551
|
+
function loadInstallDecisions() {
|
|
3552
|
+
const path = getInstallDecisionsPath();
|
|
3553
|
+
if (!existsSync7(path))
|
|
3554
|
+
return {};
|
|
3555
|
+
try {
|
|
3556
|
+
const parsed = JSON.parse(readFileSync3(path, "utf8"));
|
|
3557
|
+
return isInstallDecisions(parsed) ? parsed : {};
|
|
3558
|
+
} catch {
|
|
3559
|
+
return {};
|
|
3560
|
+
}
|
|
3561
|
+
}
|
|
3562
|
+
function loadInstallDecision(serverId) {
|
|
3563
|
+
return loadInstallDecisions()[serverId];
|
|
3564
|
+
}
|
|
3565
|
+
function recordInstallDecision(serverId, decision, decidedAt = new Date().toISOString()) {
|
|
3566
|
+
const decisions = loadInstallDecisions();
|
|
3567
|
+
decisions[serverId] = { decision, decidedAt };
|
|
3568
|
+
writeInstallDecisions(decisions);
|
|
3569
|
+
}
|
|
3570
|
+
function isInstallDecision(value) {
|
|
3571
|
+
return value === "declined" || value === "allowed";
|
|
3572
|
+
}
|
|
3573
|
+
function writeInstallDecisions(decisions) {
|
|
3574
|
+
const path = getInstallDecisionsPath();
|
|
3575
|
+
mkdirSync(dirname6(path), { recursive: true });
|
|
3576
|
+
const tmpPath = `${path}.tmp`;
|
|
3577
|
+
writeFileSync2(tmpPath, `${JSON.stringify(decisions, null, 2)}
|
|
3578
|
+
`, "utf8");
|
|
3579
|
+
renameSync2(tmpPath, path);
|
|
3580
|
+
}
|
|
3581
|
+
function isInstallDecisions(value) {
|
|
3582
|
+
return isRecord5(value) && Object.values(value).every(isInstallDecisionRecord);
|
|
3583
|
+
}
|
|
3584
|
+
function isInstallDecisionRecord(value) {
|
|
3585
|
+
if (!isRecord5(value))
|
|
3586
|
+
return false;
|
|
3587
|
+
return isInstallDecision(value["decision"]) && typeof value["decidedAt"] === "string";
|
|
3588
|
+
}
|
|
3589
|
+
function isRecord5(value) {
|
|
3590
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3591
|
+
}
|
|
3592
|
+
|
|
3395
3593
|
// ../lsp-core/src/lsp/config-loader.ts
|
|
3594
|
+
import { existsSync as existsSync8, readFileSync as readFileSync4 } from "node:fs";
|
|
3396
3595
|
function getProjectConfigPaths() {
|
|
3397
3596
|
return lspRequestContext().projectConfigPaths;
|
|
3398
3597
|
}
|
|
@@ -3400,7 +3599,7 @@ function getUserConfigPath() {
|
|
|
3400
3599
|
return lspRequestContext().userConfigPath;
|
|
3401
3600
|
}
|
|
3402
3601
|
function loadJsonFile(path) {
|
|
3403
|
-
if (!
|
|
3602
|
+
if (!existsSync8(path))
|
|
3404
3603
|
return null;
|
|
3405
3604
|
try {
|
|
3406
3605
|
const parsed = JSON.parse(readFileSync4(path, "utf-8"));
|
|
@@ -3482,7 +3681,7 @@ function createServerFromEntry(id, entry, source) {
|
|
|
3482
3681
|
if (source === "project") {
|
|
3483
3682
|
if (!builtin)
|
|
3484
3683
|
return null;
|
|
3485
|
-
const
|
|
3684
|
+
const server = createServer({
|
|
3486
3685
|
id,
|
|
3487
3686
|
command: builtin.command,
|
|
3488
3687
|
extensions: entry.extensions ?? builtin.extensions,
|
|
@@ -3490,20 +3689,20 @@ function createServerFromEntry(id, entry, source) {
|
|
|
3490
3689
|
source
|
|
3491
3690
|
});
|
|
3492
3691
|
if (entry.initialization !== undefined) {
|
|
3493
|
-
|
|
3692
|
+
server.initialization = entry.initialization;
|
|
3494
3693
|
}
|
|
3495
|
-
return
|
|
3694
|
+
return server;
|
|
3496
3695
|
}
|
|
3497
3696
|
if (entry.command && entry.extensions) {
|
|
3498
|
-
const
|
|
3697
|
+
const server = createServer({
|
|
3499
3698
|
id,
|
|
3500
3699
|
command: entry.command,
|
|
3501
3700
|
extensions: entry.extensions,
|
|
3502
3701
|
priority: entry.priority ?? 0,
|
|
3503
3702
|
source
|
|
3504
3703
|
});
|
|
3505
|
-
applyOptionalServerFields(
|
|
3506
|
-
return
|
|
3704
|
+
applyOptionalServerFields(server, entry);
|
|
3705
|
+
return server;
|
|
3507
3706
|
}
|
|
3508
3707
|
if (!builtin)
|
|
3509
3708
|
return null;
|
|
@@ -3588,54 +3787,155 @@ function getDisabledServerIds() {
|
|
|
3588
3787
|
}
|
|
3589
3788
|
|
|
3590
3789
|
// ../lsp-core/src/lsp/server-installation.ts
|
|
3591
|
-
import { existsSync as
|
|
3592
|
-
import { delimiter as delimiter3, join as
|
|
3593
|
-
|
|
3594
|
-
|
|
3595
|
-
|
|
3596
|
-
|
|
3597
|
-
|
|
3598
|
-
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
-
|
|
3790
|
+
import { existsSync as existsSync9 } from "node:fs";
|
|
3791
|
+
import { delimiter as delimiter3, dirname as dirname7, isAbsolute as isAbsolute3, join as join4, resolve as resolve7 } from "node:path";
|
|
3792
|
+
var LOCAL_BIN_RULES = [
|
|
3793
|
+
{
|
|
3794
|
+
markers: ["package.json", "bun.lock", "bun.lockb", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
|
|
3795
|
+
binDirs: [join4("node_modules", ".bin")]
|
|
3796
|
+
},
|
|
3797
|
+
{
|
|
3798
|
+
markers: [
|
|
3799
|
+
"pyproject.toml",
|
|
3800
|
+
"ty.toml",
|
|
3801
|
+
"requirements.txt",
|
|
3802
|
+
"setup.py",
|
|
3803
|
+
"setup.cfg",
|
|
3804
|
+
"Pipfile",
|
|
3805
|
+
"pyrightconfig.json",
|
|
3806
|
+
"ruff.toml",
|
|
3807
|
+
".ruff.toml"
|
|
3808
|
+
],
|
|
3809
|
+
binDirs: [
|
|
3810
|
+
join4(".venv", "bin"),
|
|
3811
|
+
join4(".venv", "Scripts"),
|
|
3812
|
+
join4("venv", "bin"),
|
|
3813
|
+
join4("venv", "Scripts"),
|
|
3814
|
+
join4(".env", "bin"),
|
|
3815
|
+
join4(".env", "Scripts")
|
|
3816
|
+
]
|
|
3817
|
+
},
|
|
3818
|
+
{
|
|
3819
|
+
markers: ["Gemfile", "Gemfile.lock"],
|
|
3820
|
+
binDirs: [join4("vendor", "bundle", "bin"), "bin"]
|
|
3821
|
+
},
|
|
3822
|
+
{
|
|
3823
|
+
markers: ["go.mod", "go.sum", "go.work"],
|
|
3824
|
+
binDirs: ["bin"]
|
|
3825
|
+
}
|
|
3826
|
+
];
|
|
3827
|
+
var resolutionCache = new Map;
|
|
3828
|
+
var probeCount = 0;
|
|
3829
|
+
function probe(path) {
|
|
3830
|
+
probeCount += 1;
|
|
3831
|
+
return existsSync9(path);
|
|
3832
|
+
}
|
|
3833
|
+
function executableSuffixes(platform, pathExt) {
|
|
3834
|
+
if (platform !== "win32")
|
|
3835
|
+
return [""];
|
|
3836
|
+
const configured = pathExt ?? process.env["PATHEXT"] ?? "";
|
|
3837
|
+
const systemExts = configured.split(";").filter((entry) => entry.length > 0).map((entry) => entry.toLowerCase());
|
|
3838
|
+
return [...new Set(["", ...systemExts, ".exe", ".cmd", ".bat", ".ps1"])];
|
|
3839
|
+
}
|
|
3840
|
+
function probeWithSuffixes(directory, command, suffixes) {
|
|
3841
|
+
for (const suffix of suffixes) {
|
|
3842
|
+
const candidate = join4(directory, command + suffix);
|
|
3843
|
+
if (probe(candidate))
|
|
3844
|
+
return candidate;
|
|
3602
3845
|
}
|
|
3603
|
-
|
|
3604
|
-
|
|
3605
|
-
|
|
3606
|
-
|
|
3607
|
-
|
|
3608
|
-
|
|
3609
|
-
|
|
3610
|
-
|
|
3611
|
-
|
|
3846
|
+
return null;
|
|
3847
|
+
}
|
|
3848
|
+
function resolveLocal(command, workingDirectory, suffixes, stopAt) {
|
|
3849
|
+
const boundary = stopAt === undefined ? undefined : resolve7(stopAt);
|
|
3850
|
+
let current = resolve7(workingDirectory);
|
|
3851
|
+
while (true) {
|
|
3852
|
+
for (const rule of LOCAL_BIN_RULES) {
|
|
3853
|
+
if (!rule.markers.some((marker) => probe(join4(current, marker))))
|
|
3854
|
+
continue;
|
|
3855
|
+
for (const binDir of rule.binDirs) {
|
|
3856
|
+
const found = probeWithSuffixes(join4(current, binDir), command, suffixes);
|
|
3857
|
+
if (found !== null)
|
|
3858
|
+
return found;
|
|
3859
|
+
}
|
|
3612
3860
|
}
|
|
3861
|
+
if (probe(join4(current, ".git")))
|
|
3862
|
+
return null;
|
|
3863
|
+
if (boundary !== undefined && current === boundary)
|
|
3864
|
+
return null;
|
|
3865
|
+
const parent = dirname7(current);
|
|
3866
|
+
if (parent === current)
|
|
3867
|
+
return null;
|
|
3868
|
+
current = parent;
|
|
3613
3869
|
}
|
|
3614
|
-
|
|
3615
|
-
|
|
3870
|
+
}
|
|
3871
|
+
function resolveFromPath(command, suffixes, platform, pathEnvOverride) {
|
|
3872
|
+
let pathEnv = pathEnvOverride ?? process.env["PATH"] ?? "";
|
|
3873
|
+
if (platform === "win32" && !pathEnv) {
|
|
3616
3874
|
pathEnv = process.env["Path"] ?? "";
|
|
3617
3875
|
}
|
|
3618
|
-
const
|
|
3619
|
-
|
|
3620
|
-
|
|
3621
|
-
|
|
3622
|
-
|
|
3623
|
-
|
|
3624
|
-
}
|
|
3876
|
+
for (const entry of pathEnv.split(delimiter3)) {
|
|
3877
|
+
if (entry.length === 0)
|
|
3878
|
+
continue;
|
|
3879
|
+
const found = probeWithSuffixes(entry, command, suffixes);
|
|
3880
|
+
if (found !== null)
|
|
3881
|
+
return found;
|
|
3625
3882
|
}
|
|
3626
|
-
|
|
3627
|
-
|
|
3628
|
-
|
|
3883
|
+
return null;
|
|
3884
|
+
}
|
|
3885
|
+
function resolveServerBinary(command, workingDirectory, options = {}) {
|
|
3886
|
+
if (command.length === 0)
|
|
3887
|
+
return null;
|
|
3888
|
+
const [cmd] = command;
|
|
3889
|
+
if (cmd === undefined || cmd.length === 0)
|
|
3890
|
+
return null;
|
|
3891
|
+
const platform = options.platform ?? process.platform;
|
|
3892
|
+
const suffixes = executableSuffixes(platform, options.pathExt);
|
|
3893
|
+
if (cmd.includes("/") || cmd.includes("\\")) {
|
|
3894
|
+
const explicit = isAbsolute3(cmd) ? cmd : resolve7(workingDirectory ?? process.cwd(), cmd);
|
|
3895
|
+
return probe(explicit) ? explicit : null;
|
|
3896
|
+
}
|
|
3897
|
+
const cacheKey = JSON.stringify([
|
|
3898
|
+
workingDirectory ?? "",
|
|
3899
|
+
cmd,
|
|
3900
|
+
platform,
|
|
3901
|
+
options.stopAt ?? "",
|
|
3902
|
+
options.pathExt ?? "",
|
|
3903
|
+
options.pathEnv ?? process.env["PATH"] ?? ""
|
|
3904
|
+
]);
|
|
3905
|
+
const cached = resolutionCache.get(cacheKey);
|
|
3906
|
+
if (cached !== undefined)
|
|
3907
|
+
return cached;
|
|
3908
|
+
let resolved = null;
|
|
3909
|
+
if (workingDirectory !== undefined && workingDirectory.length > 0) {
|
|
3910
|
+
resolved = resolveLocal(cmd, workingDirectory, suffixes, options.stopAt);
|
|
3911
|
+
}
|
|
3912
|
+
resolved ??= resolveFromPath(cmd, suffixes, platform, options.pathEnv);
|
|
3913
|
+
if (resolved === null && cmd === "node")
|
|
3914
|
+
resolved = cmd;
|
|
3915
|
+
resolutionCache.set(cacheKey, resolved);
|
|
3916
|
+
return resolved;
|
|
3917
|
+
}
|
|
3918
|
+
function isServerInstalled(command, workingDirectory, options = {}) {
|
|
3919
|
+
if (command.length === 0)
|
|
3920
|
+
return false;
|
|
3921
|
+
return resolveServerBinary(command, workingDirectory, options) !== null;
|
|
3629
3922
|
}
|
|
3630
3923
|
|
|
3631
3924
|
// ../lsp-core/src/lsp/server-resolution.ts
|
|
3925
|
+
function withResolvedCommand(command, binaryPath) {
|
|
3926
|
+
return [binaryPath, ...command.slice(1)];
|
|
3927
|
+
}
|
|
3632
3928
|
function findServerForExtension(ext) {
|
|
3633
3929
|
const servers = getMergedServers();
|
|
3930
|
+
const workingDirectory = contextCwd();
|
|
3634
3931
|
for (const server of servers) {
|
|
3635
|
-
if (server.extensions.includes(ext)
|
|
3932
|
+
if (!server.extensions.includes(ext))
|
|
3933
|
+
continue;
|
|
3934
|
+
const binaryPath = resolveServerBinary(server.command, workingDirectory);
|
|
3935
|
+
if (binaryPath !== null) {
|
|
3636
3936
|
const resolvedServer = {
|
|
3637
3937
|
id: server.id,
|
|
3638
|
-
command: server.command,
|
|
3938
|
+
command: withResolvedCommand(server.command, binaryPath),
|
|
3639
3939
|
extensions: server.extensions,
|
|
3640
3940
|
priority: server.priority
|
|
3641
3941
|
};
|
|
@@ -3682,6 +3982,7 @@ function findServerForExtension(ext) {
|
|
|
3682
3982
|
function getAllServers() {
|
|
3683
3983
|
const servers = getMergedServers();
|
|
3684
3984
|
const disabled = getDisabledServerIds();
|
|
3985
|
+
const workingDirectory = contextCwd();
|
|
3685
3986
|
const result = [];
|
|
3686
3987
|
const seen = new Set;
|
|
3687
3988
|
for (const server of servers) {
|
|
@@ -3689,7 +3990,7 @@ function getAllServers() {
|
|
|
3689
3990
|
continue;
|
|
3690
3991
|
result.push({
|
|
3691
3992
|
id: server.id,
|
|
3692
|
-
installed: isServerInstalled(server.command),
|
|
3993
|
+
installed: isServerInstalled(server.command, workingDirectory),
|
|
3693
3994
|
extensions: server.extensions,
|
|
3694
3995
|
disabled: false,
|
|
3695
3996
|
source: server.source,
|
|
@@ -3703,7 +4004,7 @@ function getAllServers() {
|
|
|
3703
4004
|
const builtin = BUILTIN_SERVERS[id];
|
|
3704
4005
|
result.push({
|
|
3705
4006
|
id,
|
|
3706
|
-
installed: builtin ? isServerInstalled(builtin.command) : false,
|
|
4007
|
+
installed: builtin ? isServerInstalled(builtin.command, workingDirectory) : false,
|
|
3707
4008
|
extensions: builtin?.extensions ?? [],
|
|
3708
4009
|
disabled: true,
|
|
3709
4010
|
source: "disabled",
|
|
@@ -3714,7 +4015,6 @@ function getAllServers() {
|
|
|
3714
4015
|
}
|
|
3715
4016
|
|
|
3716
4017
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
3717
|
-
var WORKSPACE_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle"];
|
|
3718
4018
|
function isDirectoryPath(filePath) {
|
|
3719
4019
|
try {
|
|
3720
4020
|
return statSync3(filePath).isDirectory();
|
|
@@ -3727,36 +4027,40 @@ function findWorkspaceRoot(filePath) {
|
|
|
3727
4027
|
const abs = resolveReadablePathInsideContext(filePath);
|
|
3728
4028
|
let dir = abs;
|
|
3729
4029
|
if (!isDirectoryPath(dir)) {
|
|
3730
|
-
dir =
|
|
4030
|
+
dir = dirname8(dir);
|
|
3731
4031
|
}
|
|
4032
|
+
if (!isPathInside(cwd, abs))
|
|
4033
|
+
return findWorkspaceRootOutsideContext(dir);
|
|
3732
4034
|
const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
|
|
4035
|
+
let nearestPackageRoot;
|
|
3733
4036
|
while (isPathInside(cwd, dir)) {
|
|
3734
4037
|
const canonicalDir = existingDirectoryInsideContext(dir, cwd);
|
|
3735
4038
|
if (canonicalDir !== undefined) {
|
|
3736
|
-
|
|
3737
|
-
|
|
3738
|
-
|
|
3739
|
-
|
|
4039
|
+
if (existsSync10(join5(dir, GIT_WORKSPACE_MARKER))) {
|
|
4040
|
+
return canonicalDir;
|
|
4041
|
+
}
|
|
4042
|
+
if (nearestPackageRoot === undefined && hasProjectWorkspaceMarker(dir)) {
|
|
4043
|
+
nearestPackageRoot = canonicalDir;
|
|
3740
4044
|
}
|
|
3741
4045
|
}
|
|
3742
4046
|
if (dir === cwd)
|
|
3743
4047
|
break;
|
|
3744
|
-
dir =
|
|
4048
|
+
dir = dirname8(dir);
|
|
3745
4049
|
}
|
|
3746
|
-
return fallbackRoot;
|
|
4050
|
+
return nearestPackageRoot ?? fallbackRoot;
|
|
4051
|
+
}
|
|
4052
|
+
function hasProjectWorkspaceMarker(directory) {
|
|
4053
|
+
return PROJECT_WORKSPACE_MARKERS.some((marker) => existsSync10(join5(directory, marker)));
|
|
3747
4054
|
}
|
|
3748
4055
|
function resolveReadablePathInsideContext(filePath) {
|
|
3749
4056
|
const cwd = contextCwd();
|
|
3750
|
-
const abs =
|
|
4057
|
+
const abs = resolve8(cwd, filePath);
|
|
3751
4058
|
if (isPathInside(cwd, abs))
|
|
3752
4059
|
return abs;
|
|
3753
4060
|
const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
|
|
3754
4061
|
if (rebased !== undefined)
|
|
3755
4062
|
return rebased;
|
|
3756
|
-
|
|
3757
|
-
if (isPathInside(cwd, canonical))
|
|
3758
|
-
return canonical;
|
|
3759
|
-
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
4063
|
+
return canonicalizeExistingOrNearestAncestor(abs);
|
|
3760
4064
|
}
|
|
3761
4065
|
function resolvePathInsideContext(filePath) {
|
|
3762
4066
|
const cwd = contextCwd();
|
|
@@ -3771,12 +4075,12 @@ function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
|
3771
4075
|
let current = path;
|
|
3772
4076
|
const suffix = [];
|
|
3773
4077
|
while (true) {
|
|
3774
|
-
if (
|
|
3775
|
-
const canonical =
|
|
4078
|
+
if (existsSync10(current)) {
|
|
4079
|
+
const canonical = realpathSync5(current);
|
|
3776
4080
|
if (isPathInside(cwd, canonical))
|
|
3777
|
-
return suffix.length === 0 ? canonical :
|
|
4081
|
+
return suffix.length === 0 ? canonical : join5(canonical, ...suffix);
|
|
3778
4082
|
}
|
|
3779
|
-
const parent =
|
|
4083
|
+
const parent = dirname8(current);
|
|
3780
4084
|
if (parent === current)
|
|
3781
4085
|
return;
|
|
3782
4086
|
suffix.unshift(basename3(current));
|
|
@@ -3784,9 +4088,9 @@ function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
|
3784
4088
|
}
|
|
3785
4089
|
}
|
|
3786
4090
|
function existingDirectoryInsideContext(directory, cwd) {
|
|
3787
|
-
if (!
|
|
4091
|
+
if (!existsSync10(directory))
|
|
3788
4092
|
return;
|
|
3789
|
-
const canonical =
|
|
4093
|
+
const canonical = realpathSync5(directory);
|
|
3790
4094
|
if (!statSync3(canonical).isDirectory())
|
|
3791
4095
|
return;
|
|
3792
4096
|
return isPathInside(cwd, canonical) ? canonical : undefined;
|
|
@@ -3799,7 +4103,7 @@ function nearestExistingDirectoryInsideContext(directory, cwd) {
|
|
|
3799
4103
|
return canonical;
|
|
3800
4104
|
if (current === cwd)
|
|
3801
4105
|
return;
|
|
3802
|
-
current =
|
|
4106
|
+
current = dirname8(current);
|
|
3803
4107
|
}
|
|
3804
4108
|
return;
|
|
3805
4109
|
}
|
|
@@ -3826,6 +4130,19 @@ function formatServerLookupError(result) {
|
|
|
3826
4130
|
].join(`
|
|
3827
4131
|
`);
|
|
3828
4132
|
}
|
|
4133
|
+
function formatInstallOptions(serverId, installHint) {
|
|
4134
|
+
const localHint = LSP_LOCAL_INSTALL_HINTS[serverId];
|
|
4135
|
+
if (localHint === undefined) {
|
|
4136
|
+
return ["To install, run:", ` ${installHint}`];
|
|
4137
|
+
}
|
|
4138
|
+
return [
|
|
4139
|
+
"To install in THIS repository (preferred — no global install needed):",
|
|
4140
|
+
` ${localHint}`,
|
|
4141
|
+
"",
|
|
4142
|
+
"Or install it globally:",
|
|
4143
|
+
` ${installHint}`
|
|
4144
|
+
];
|
|
4145
|
+
}
|
|
3829
4146
|
function formatNotInstalled(result) {
|
|
3830
4147
|
const { server, installHint } = result;
|
|
3831
4148
|
const extensions = server.extensions.join(", ");
|
|
@@ -3840,19 +4157,19 @@ function formatNotInstalled(result) {
|
|
|
3840
4157
|
`Command not found: ${server.command[0]}`,
|
|
3841
4158
|
""
|
|
3842
4159
|
];
|
|
4160
|
+
const installOptions = formatInstallOptions(server.id, installHint);
|
|
3843
4161
|
if (decision === "allowed") {
|
|
3844
4162
|
return [
|
|
3845
4163
|
...header,
|
|
3846
4164
|
"The user has pre-authorized LSP installation. Run the install command, then retry this tool:",
|
|
3847
|
-
|
|
4165
|
+
...installOptions.slice(1)
|
|
3848
4166
|
].join(`
|
|
3849
4167
|
`);
|
|
3850
4168
|
}
|
|
3851
4169
|
if (!context.capabilities.installDecisionTool) {
|
|
3852
4170
|
return [
|
|
3853
4171
|
...header,
|
|
3854
|
-
|
|
3855
|
-
` ${installHint}`,
|
|
4172
|
+
...installOptions,
|
|
3856
4173
|
"",
|
|
3857
4174
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
3858
4175
|
"Install-decision recording is unavailable in this harness; proceed without LSP if the user declines."
|
|
@@ -3861,8 +4178,7 @@ function formatNotInstalled(result) {
|
|
|
3861
4178
|
}
|
|
3862
4179
|
return [
|
|
3863
4180
|
...header,
|
|
3864
|
-
|
|
3865
|
-
` ${installHint}`,
|
|
4181
|
+
...installOptions,
|
|
3866
4182
|
"",
|
|
3867
4183
|
"ACTION REQUIRED — ASK THE USER whether to install this LSP server.",
|
|
3868
4184
|
"- If the user agrees: run the install command above, then retry this tool.",
|
|
@@ -3917,8 +4233,8 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
|
3917
4233
|
}
|
|
3918
4234
|
|
|
3919
4235
|
// ../lsp-core/src/lsp/directory-diagnostics.ts
|
|
3920
|
-
import { existsSync as
|
|
3921
|
-
import { join as
|
|
4236
|
+
import { existsSync as existsSync11, lstatSync as lstatSync4, readdirSync as readdirSync3 } from "node:fs";
|
|
4237
|
+
import { join as join6, resolve as resolve9 } from "node:path";
|
|
3922
4238
|
|
|
3923
4239
|
// ../lsp-core/src/lsp/formatters.ts
|
|
3924
4240
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
@@ -3933,10 +4249,10 @@ function uriToPath(uri) {
|
|
|
3933
4249
|
}
|
|
3934
4250
|
function formatLocation(loc) {
|
|
3935
4251
|
if ("targetUri" in loc) {
|
|
3936
|
-
const
|
|
3937
|
-
const
|
|
3938
|
-
const
|
|
3939
|
-
return `${
|
|
4252
|
+
const uri = uriToPath(loc.targetUri);
|
|
4253
|
+
const line = loc.targetRange.start.line + 1;
|
|
4254
|
+
const char = loc.targetRange.start.character;
|
|
4255
|
+
return `${uri}:${line}:${char}`;
|
|
3940
4256
|
}
|
|
3941
4257
|
const uri = uriToPath(loc.uri);
|
|
3942
4258
|
const line = loc.range.start.line + 1;
|
|
@@ -4048,7 +4364,7 @@ function collectFilesWithExtension(dir, extension, maxFiles) {
|
|
|
4048
4364
|
for (const entry of entries) {
|
|
4049
4365
|
if (files.length >= maxFiles)
|
|
4050
4366
|
return;
|
|
4051
|
-
const fullPath =
|
|
4367
|
+
const fullPath = join6(currentDir, entry);
|
|
4052
4368
|
let stat;
|
|
4053
4369
|
try {
|
|
4054
4370
|
stat = lstatSync4(fullPath);
|
|
@@ -4073,8 +4389,8 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
4073
4389
|
if (!extension.startsWith(".")) {
|
|
4074
4390
|
throw new LspInvalidPathError(`Extension must start with a dot (e.g., ".ts", not "${extension}"). Use ".${extension}" instead.`);
|
|
4075
4391
|
}
|
|
4076
|
-
const absDir =
|
|
4077
|
-
if (!
|
|
4392
|
+
const absDir = resolve9(options.workspaceRoot ?? contextCwd(), directory);
|
|
4393
|
+
if (!existsSync11(absDir)) {
|
|
4078
4394
|
throw new LspInvalidPathError(`Directory does not exist: ${absDir}`);
|
|
4079
4395
|
}
|
|
4080
4396
|
const serverResult = options.server === undefined ? findServerForExtension(extension) : { status: "found", server: options.server };
|
|
@@ -4161,7 +4477,7 @@ async function aggregateDiagnosticsForDirectory(directory, extension, severity,
|
|
|
4161
4477
|
|
|
4162
4478
|
// ../lsp-core/src/lsp/infer-extension.ts
|
|
4163
4479
|
import { lstatSync as lstatSync5, readdirSync as readdirSync4 } from "node:fs";
|
|
4164
|
-
import { join as
|
|
4480
|
+
import { join as join7 } from "node:path";
|
|
4165
4481
|
var SKIP_DIRECTORIES2 = new Set(["node_modules", ".git", "dist", "build", ".next", "out"]);
|
|
4166
4482
|
var MAX_SCAN_ENTRIES = 500;
|
|
4167
4483
|
function inferExtensionFromDirectory(directory) {
|
|
@@ -4179,7 +4495,7 @@ function inferExtensionFromDirectory(directory) {
|
|
|
4179
4495
|
for (const entry of entries) {
|
|
4180
4496
|
if (scanned >= MAX_SCAN_ENTRIES)
|
|
4181
4497
|
return;
|
|
4182
|
-
const fullPath =
|
|
4498
|
+
const fullPath = join7(dir, entry);
|
|
4183
4499
|
let stat;
|
|
4184
4500
|
try {
|
|
4185
4501
|
stat = lstatSync5(fullPath);
|
|
@@ -4338,8 +4654,8 @@ function clientOptions(signal) {
|
|
|
4338
4654
|
}
|
|
4339
4655
|
|
|
4340
4656
|
// ../lsp-core/src/tools/result.ts
|
|
4341
|
-
function text(
|
|
4342
|
-
return { content: [{ type: "text", text
|
|
4657
|
+
function text(text, details, isError = false) {
|
|
4658
|
+
return { content: [{ type: "text", text }], details, isError };
|
|
4343
4659
|
}
|
|
4344
4660
|
|
|
4345
4661
|
// ../lsp-core/src/tools/diagnostics.ts
|
|
@@ -4359,7 +4675,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4359
4675
|
const extension = inferExtensionFromDirectory(absPath);
|
|
4360
4676
|
if (!extension) {
|
|
4361
4677
|
const message = `No supported source files found in directory: ${absPath}`;
|
|
4362
|
-
const
|
|
4678
|
+
const details = {
|
|
4363
4679
|
filePath,
|
|
4364
4680
|
severity,
|
|
4365
4681
|
mode: "directory",
|
|
@@ -4369,24 +4685,24 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4369
4685
|
error: message,
|
|
4370
4686
|
errorKind: "no_files"
|
|
4371
4687
|
};
|
|
4372
|
-
return text(message,
|
|
4688
|
+
return text(message, details);
|
|
4373
4689
|
}
|
|
4374
|
-
const
|
|
4375
|
-
const
|
|
4690
|
+
const output = await aggregateDiagnosticsForDirectory(absPath, extension, severity, undefined, signal === undefined ? {} : { signal });
|
|
4691
|
+
const details = {
|
|
4376
4692
|
filePath,
|
|
4377
4693
|
severity,
|
|
4378
4694
|
mode: "directory",
|
|
4379
4695
|
diagnostics: [],
|
|
4380
|
-
totalDiagnostics:
|
|
4696
|
+
totalDiagnostics: output.totalDiagnostics,
|
|
4381
4697
|
truncated: false,
|
|
4382
|
-
fileFailures: [...
|
|
4698
|
+
fileFailures: [...output.fileFailures]
|
|
4383
4699
|
};
|
|
4384
|
-
return text(
|
|
4700
|
+
return text(output.output, details);
|
|
4385
4701
|
}
|
|
4386
4702
|
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
|
|
4387
4703
|
if (result.transientError) {
|
|
4388
4704
|
const message = result.transientError.message;
|
|
4389
|
-
const
|
|
4705
|
+
const details = {
|
|
4390
4706
|
filePath,
|
|
4391
4707
|
severity,
|
|
4392
4708
|
mode: "file",
|
|
@@ -4396,7 +4712,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4396
4712
|
error: message,
|
|
4397
4713
|
errorKind: result.transientError.kind
|
|
4398
4714
|
};
|
|
4399
|
-
return text(message,
|
|
4715
|
+
return text(message, details, true);
|
|
4400
4716
|
}
|
|
4401
4717
|
const diagnostics = filterDiagnosticsBySeverity(asDiagnosticArray(result), severity);
|
|
4402
4718
|
const total = diagnostics.length;
|
|
@@ -4430,6 +4746,96 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4430
4746
|
throw error;
|
|
4431
4747
|
}
|
|
4432
4748
|
}
|
|
4749
|
+
// ../lsp-core/src/lsp/format-document.ts
|
|
4750
|
+
import { readFileSync as readFileSync5, renameSync as renameSync3, unlinkSync, writeFileSync as writeFileSync3 } from "node:fs";
|
|
4751
|
+
var DEFAULT_FORMATTING_OPTIONS = {
|
|
4752
|
+
tabSize: 4,
|
|
4753
|
+
insertSpaces: false,
|
|
4754
|
+
trimTrailingWhitespace: true,
|
|
4755
|
+
insertFinalNewline: true,
|
|
4756
|
+
trimFinalNewlines: true
|
|
4757
|
+
};
|
|
4758
|
+
var UNCHANGED = { status: "unchanged", linesAdded: 0, linesRemoved: 0 };
|
|
4759
|
+
async function formatDocumentWithClient(client, filePath, options = {}) {
|
|
4760
|
+
const edits = await client.formatDocument(filePath, options.formattingOptions ?? DEFAULT_FORMATTING_OPTIONS, options.signal);
|
|
4761
|
+
if (edits === null)
|
|
4762
|
+
return { status: "unavailable", reason: "capability_not_advertised" };
|
|
4763
|
+
if (edits.length === 0)
|
|
4764
|
+
return UNCHANGED;
|
|
4765
|
+
const before = readFileSync5(filePath, "utf-8");
|
|
4766
|
+
const normalized = normalizeTextEdits(before, edits, 0);
|
|
4767
|
+
if (normalized.text === before)
|
|
4768
|
+
return UNCHANGED;
|
|
4769
|
+
writeAtomically(filePath, normalized.text);
|
|
4770
|
+
await client.openFile(filePath);
|
|
4771
|
+
return {
|
|
4772
|
+
status: "formatted",
|
|
4773
|
+
...lineDelta(normalized.edits)
|
|
4774
|
+
};
|
|
4775
|
+
}
|
|
4776
|
+
function lineDelta(edits) {
|
|
4777
|
+
let linesAdded = 0;
|
|
4778
|
+
let linesRemoved = 0;
|
|
4779
|
+
for (const edit of edits) {
|
|
4780
|
+
linesRemoved += edit.range.end.line - edit.range.start.line + 1;
|
|
4781
|
+
linesAdded += edit.newText.split(`
|
|
4782
|
+
`).length;
|
|
4783
|
+
}
|
|
4784
|
+
return { linesAdded, linesRemoved };
|
|
4785
|
+
}
|
|
4786
|
+
function writeAtomically(filePath, content) {
|
|
4787
|
+
const tempPath = `${filePath}.omo-format.tmp`;
|
|
4788
|
+
writeFileSync3(tempPath, content, "utf-8");
|
|
4789
|
+
try {
|
|
4790
|
+
renameSync3(tempPath, filePath);
|
|
4791
|
+
} catch (error) {
|
|
4792
|
+
try {
|
|
4793
|
+
unlinkSync(tempPath);
|
|
4794
|
+
} catch {}
|
|
4795
|
+
throw error;
|
|
4796
|
+
}
|
|
4797
|
+
}
|
|
4798
|
+
|
|
4799
|
+
// ../lsp-core/src/tools/format.ts
|
|
4800
|
+
async function executeLspFormat(params, signal) {
|
|
4801
|
+
const filePath = requireString(params, "filePath");
|
|
4802
|
+
try {
|
|
4803
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => formatDocumentWithClient(client, resolvedFilePath, signal === undefined ? {} : { signal }), "format", clientOptions(signal));
|
|
4804
|
+
return text(describeResult(filePath, result), formatDetails(filePath, result));
|
|
4805
|
+
} catch (error) {
|
|
4806
|
+
const missingDependency = missingDependencyResult(error, {
|
|
4807
|
+
filePath,
|
|
4808
|
+
status: "unavailable",
|
|
4809
|
+
reason: "server_unavailable",
|
|
4810
|
+
linesAdded: 0,
|
|
4811
|
+
linesRemoved: 0
|
|
4812
|
+
});
|
|
4813
|
+
if (missingDependency)
|
|
4814
|
+
return missingDependency;
|
|
4815
|
+
throw error;
|
|
4816
|
+
}
|
|
4817
|
+
}
|
|
4818
|
+
function formatDetails(filePath, result) {
|
|
4819
|
+
if (result.status === "unavailable") {
|
|
4820
|
+
return { filePath, status: "unavailable", reason: result.reason, linesAdded: 0, linesRemoved: 0 };
|
|
4821
|
+
}
|
|
4822
|
+
return {
|
|
4823
|
+
filePath,
|
|
4824
|
+
status: result.status,
|
|
4825
|
+
linesAdded: result.linesAdded,
|
|
4826
|
+
linesRemoved: result.linesRemoved
|
|
4827
|
+
};
|
|
4828
|
+
}
|
|
4829
|
+
function describeResult(filePath, result) {
|
|
4830
|
+
if (result.status === "unavailable") {
|
|
4831
|
+
return `Formatting unavailable for ${filePath}: the language server does not advertise documentFormattingProvider.`;
|
|
4832
|
+
}
|
|
4833
|
+
if (result.status === "unchanged") {
|
|
4834
|
+
return `Already formatted: ${filePath}`;
|
|
4835
|
+
}
|
|
4836
|
+
return `Formatted ${filePath} (+${result.linesAdded}/-${result.linesRemoved} lines)`;
|
|
4837
|
+
}
|
|
4838
|
+
|
|
4433
4839
|
// ../lsp-core/src/tools/install-decision.ts
|
|
4434
4840
|
async function executeLspInstallDecision(params) {
|
|
4435
4841
|
const serverId = requireString(params, "server_id");
|
|
@@ -4623,8 +5029,8 @@ async function executeLspSymbols(params, signal) {
|
|
|
4623
5029
|
errorKind: "missing_query"
|
|
4624
5030
|
});
|
|
4625
5031
|
}
|
|
4626
|
-
const
|
|
4627
|
-
return formatSymbolsResult(filePath, scope,
|
|
5032
|
+
const symbols = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
|
|
5033
|
+
return formatSymbolsResult(filePath, scope, symbols, limit, query);
|
|
4628
5034
|
}
|
|
4629
5035
|
const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
|
|
4630
5036
|
return formatSymbolsResult(filePath, scope, symbols, limit);
|
|
@@ -4762,6 +5168,16 @@ var LSP_MCP_TOOLS = [
|
|
|
4762
5168
|
}, ["filePath", "line", "character", "newName"]),
|
|
4763
5169
|
execute: executeLspRename
|
|
4764
5170
|
},
|
|
5171
|
+
{
|
|
5172
|
+
name: "format",
|
|
5173
|
+
aliases: ["lsp_format"],
|
|
5174
|
+
title: "LSP Format",
|
|
5175
|
+
description: "Format a source file with its language server and write the returned edits to disk.",
|
|
5176
|
+
inputSchema: objectSchema({
|
|
5177
|
+
filePath: { type: "string", description: "Source file path to format." }
|
|
5178
|
+
}, ["filePath"]),
|
|
5179
|
+
execute: executeLspFormat
|
|
5180
|
+
},
|
|
4765
5181
|
{
|
|
4766
5182
|
name: "install_decision",
|
|
4767
5183
|
aliases: ["lsp_install_decision"],
|
|
@@ -4795,16 +5211,17 @@ function coerceToolArguments(value) {
|
|
|
4795
5211
|
return isRecord7(value) ? value : {};
|
|
4796
5212
|
}
|
|
4797
5213
|
export {
|
|
4798
|
-
|
|
4799
|
-
executeLspTool,
|
|
4800
|
-
executeLspSymbols,
|
|
4801
|
-
executeLspStatus,
|
|
4802
|
-
executeLspRename,
|
|
4803
|
-
executeLspPrepareRename,
|
|
4804
|
-
executeLspInstallDecision,
|
|
4805
|
-
executeLspGotoDefinition,
|
|
4806
|
-
executeLspFindReferences,
|
|
4807
|
-
executeLspDiagnostics,
|
|
5214
|
+
LSP_MCP_TOOLS,
|
|
4808
5215
|
coerceToolArguments,
|
|
4809
|
-
|
|
5216
|
+
executeLspDiagnostics,
|
|
5217
|
+
executeLspFindReferences,
|
|
5218
|
+
executeLspFormat,
|
|
5219
|
+
executeLspGotoDefinition,
|
|
5220
|
+
executeLspInstallDecision,
|
|
5221
|
+
executeLspPrepareRename,
|
|
5222
|
+
executeLspRename,
|
|
5223
|
+
executeLspStatus,
|
|
5224
|
+
executeLspSymbols,
|
|
5225
|
+
executeLspTool,
|
|
5226
|
+
isRecord7 as isRecord
|
|
4810
5227
|
};
|