@ashx-j/lunr 0.2.25 → 0.2.27
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/CHANGELOG.md +31 -1
- package/LICENSE +22 -0
- package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +6 -10
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +1 -0
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
- package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
- package/dist/builtin-extensions/lunr-computer-use.js +179 -0
- package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
- package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js +94 -108
- package/dist/builtin-extensions/lunr-cron.js.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
- package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +2 -2
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
- package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
- package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
- package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
- package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -4
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +8 -5
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +15 -31
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +21 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +11 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +121 -25
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +25 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js +5 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
- package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/communication.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/communication.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +22 -11
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
- package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-tps.js +20 -17
- package/dist/builtin-extensions/pi-tps.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
- package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
- package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
- package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
- package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
- package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
- package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
- package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
- package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
- package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +48 -73
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
- package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
- package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
- package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
- package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
- package/dist/cli/install-cli.d.ts.map +1 -1
- package/dist/cli/install-cli.js +38 -30
- package/dist/cli/install-cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +13 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +75 -11
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +40 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +309 -76
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/browser/runtime.d.ts +2 -0
- package/dist/core/browser/runtime.d.ts.map +1 -1
- package/dist/core/browser/runtime.js +80 -45
- package/dist/core/browser/runtime.js.map +1 -1
- package/dist/core/browser/setup.d.ts.map +1 -1
- package/dist/core/browser/setup.js +12 -1
- package/dist/core/browser/setup.js.map +1 -1
- package/dist/core/computer-use/adapter.d.ts +28 -0
- package/dist/core/computer-use/adapter.d.ts.map +1 -0
- package/dist/core/computer-use/adapter.js +138 -0
- package/dist/core/computer-use/adapter.js.map +1 -0
- package/dist/core/computer-use/image.d.ts +27 -0
- package/dist/core/computer-use/image.d.ts.map +1 -0
- package/dist/core/computer-use/image.js +84 -0
- package/dist/core/computer-use/image.js.map +1 -0
- package/dist/core/computer-use/lease.d.ts +18 -0
- package/dist/core/computer-use/lease.d.ts.map +1 -0
- package/dist/core/computer-use/lease.js +129 -0
- package/dist/core/computer-use/lease.js.map +1 -0
- package/dist/core/computer-use/macos-runtime.d.ts +14 -0
- package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
- package/dist/core/computer-use/macos-runtime.js +148 -0
- package/dist/core/computer-use/macos-runtime.js.map +1 -0
- package/dist/core/computer-use/policy.d.ts +19 -0
- package/dist/core/computer-use/policy.d.ts.map +1 -0
- package/dist/core/computer-use/policy.js +67 -0
- package/dist/core/computer-use/policy.js.map +1 -0
- package/dist/core/computer-use/release.generated.d.ts +31 -0
- package/dist/core/computer-use/release.generated.d.ts.map +1 -0
- package/dist/core/computer-use/release.generated.js +36 -0
- package/dist/core/computer-use/release.generated.js.map +1 -0
- package/dist/core/computer-use/runtime.d.ts +13 -0
- package/dist/core/computer-use/runtime.d.ts.map +1 -0
- package/dist/core/computer-use/runtime.js +158 -0
- package/dist/core/computer-use/runtime.js.map +1 -0
- package/dist/core/computer-use/schemas.d.ts +100 -0
- package/dist/core/computer-use/schemas.d.ts.map +1 -0
- package/dist/core/computer-use/schemas.js +96 -0
- package/dist/core/computer-use/schemas.js.map +1 -0
- package/dist/core/computer-use/windows-desktop.d.ts +3 -0
- package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
- package/dist/core/computer-use/windows-desktop.js +48 -0
- package/dist/core/computer-use/windows-desktop.js.map +1 -0
- package/dist/core/computer-use/workflow.d.ts +38 -0
- package/dist/core/computer-use/workflow.d.ts.map +1 -0
- package/dist/core/computer-use/workflow.js +900 -0
- package/dist/core/computer-use/workflow.js.map +1 -0
- package/dist/core/cron/jobs.d.ts +26 -8
- package/dist/core/cron/jobs.d.ts.map +1 -1
- package/dist/core/cron/jobs.js +357 -232
- package/dist/core/cron/jobs.js.map +1 -1
- package/dist/core/cron/origin-context.d.ts +1 -0
- package/dist/core/cron/origin-context.d.ts.map +1 -1
- package/dist/core/cron/origin-context.js.map +1 -1
- package/dist/core/cron/scheduler.d.ts +22 -17
- package/dist/core/cron/scheduler.d.ts.map +1 -1
- package/dist/core/cron/scheduler.js +153 -73
- package/dist/core/cron/scheduler.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +4 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +8 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +8 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +4 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +22 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/large-subagent-launch.d.ts +1 -1
- package/dist/core/large-subagent-launch.d.ts.map +1 -1
- package/dist/core/large-subagent-launch.js +7 -7
- package/dist/core/large-subagent-launch.js.map +1 -1
- package/dist/core/model-registry.d.ts +2 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +5 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-runtime.d.ts +4 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +40 -4
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/permissions.d.ts +4 -4
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +25 -38
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts +5 -13
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +135 -116
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +1 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/prompt-resource-bridge.d.ts +12 -0
- package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
- package/dist/core/prompt-resource-bridge.js +9 -0
- package/dist/core/prompt-resource-bridge.js.map +1 -0
- package/dist/core/protected-targets.d.ts +6 -0
- package/dist/core/protected-targets.d.ts.map +1 -0
- package/dist/core/protected-targets.js +45 -0
- package/dist/core/protected-targets.js.map +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +7 -0
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/rollback.d.ts +19 -3
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +172 -56
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +3 -0
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js +14 -1
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +3 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +6 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +95 -32
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-ownership.d.ts.map +1 -1
- package/dist/core/session-ownership.js +8 -3
- package/dist/core/session-ownership.js.map +1 -1
- package/dist/core/session-retention.d.ts.map +1 -1
- package/dist/core/session-retention.js +18 -7
- package/dist/core/session-retention.js.map +1 -1
- package/dist/core/session-startup-settings.d.ts +10 -0
- package/dist/core/session-startup-settings.d.ts.map +1 -0
- package/dist/core/session-startup-settings.js +70 -0
- package/dist/core/session-startup-settings.js.map +1 -0
- package/dist/core/settings-manager.d.ts +6 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +19 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subagent-event-transport.d.ts +3 -0
- package/dist/core/subagent-event-transport.d.ts.map +1 -0
- package/dist/core/subagent-event-transport.js +61 -0
- package/dist/core/subagent-event-transport.js.map +1 -0
- package/dist/core/subscriptions.d.ts +16 -7
- package/dist/core/subscriptions.d.ts.map +1 -1
- package/dist/core/subscriptions.js +96 -55
- package/dist/core/subscriptions.js.map +1 -1
- package/dist/core/trust-manager.d.ts +2 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +6 -1
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/update-check.d.ts.map +1 -1
- package/dist/core/update-check.js.map +1 -1
- package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
- package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
- package/dist/core/usage-adapters/kimi-coding.js +2 -2
- package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js +3 -3
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-adapters/xai.d.ts +2 -2
- package/dist/core/usage-adapters/xai.d.ts.map +1 -1
- package/dist/core/usage-adapters/xai.js +3 -3
- package/dist/core/usage-adapters/xai.js.map +1 -1
- package/dist/core/usage-adapters/zai.d.ts +2 -2
- package/dist/core/usage-adapters/zai.d.ts.map +1 -1
- package/dist/core/usage-adapters/zai.js +2 -2
- package/dist/core/usage-adapters/zai.js.map +1 -1
- package/dist/core/usage-service.d.ts +9 -2
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +95 -50
- package/dist/core/usage-service.js.map +1 -1
- package/dist/gateway/adapters/discord.d.ts.map +1 -1
- package/dist/gateway/adapters/discord.js +2 -2
- package/dist/gateway/adapters/discord.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts +9 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +91 -37
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/approval.d.ts.map +1 -1
- package/dist/gateway/approval.js +3 -3
- package/dist/gateway/approval.js.map +1 -1
- package/dist/gateway/authz.d.ts +4 -4
- package/dist/gateway/authz.d.ts.map +1 -1
- package/dist/gateway/authz.js +8 -12
- package/dist/gateway/authz.js.map +1 -1
- package/dist/gateway/buttons.d.ts +8 -1
- package/dist/gateway/buttons.d.ts.map +1 -1
- package/dist/gateway/buttons.js +76 -18
- package/dist/gateway/buttons.js.map +1 -1
- package/dist/gateway/commands.d.ts +1 -0
- package/dist/gateway/commands.d.ts.map +1 -1
- package/dist/gateway/commands.js +12 -10
- package/dist/gateway/commands.js.map +1 -1
- package/dist/gateway/cron.d.ts +12 -11
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +85 -62
- package/dist/gateway/cron.js.map +1 -1
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +5 -4
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/mobile-commands.d.ts +1 -0
- package/dist/gateway/mobile-commands.d.ts.map +1 -1
- package/dist/gateway/mobile-commands.js +64 -22
- package/dist/gateway/mobile-commands.js.map +1 -1
- package/dist/gateway/presenter.d.ts +12 -2
- package/dist/gateway/presenter.d.ts.map +1 -1
- package/dist/gateway/presenter.js +74 -39
- package/dist/gateway/presenter.js.map +1 -1
- package/dist/gateway/router.d.ts +2 -2
- package/dist/gateway/router.d.ts.map +1 -1
- package/dist/gateway/router.js +22 -9
- package/dist/gateway/router.js.map +1 -1
- package/dist/gateway/service.d.ts +2 -0
- package/dist/gateway/service.d.ts.map +1 -1
- package/dist/gateway/service.js +153 -0
- package/dist/gateway/service.js.map +1 -1
- package/dist/gateway/setup.d.ts.map +1 -1
- package/dist/gateway/setup.js +6 -4
- package/dist/gateway/setup.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +86 -33
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +6 -4
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
- package/dist/modes/interactive/components/copyable-text.js +3 -2
- package/dist/modes/interactive/components/copyable-text.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -1
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +20 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +104 -109
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
- package/dist/modes/interactive/smooth-streaming.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +9 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +2 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/node-runtime/adapter-247RTYLS.js +16 -0
- package/dist/node-runtime/agent-session-services-KDMSPQDY.js +53 -0
- package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
- package/dist/node-runtime/{builtin-extensions-ZLAX7TUH.js → builtin-extensions-OX6KELNX.js} +9 -7
- package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
- package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
- package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
- package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
- package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
- package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
- package/dist/node-runtime/{chunk-NRKGMJYU.js → chunk-6O3IW3IA.js} +2 -2
- package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
- package/dist/node-runtime/chunk-A2WO6WIN.js +1197 -0
- package/dist/node-runtime/{chunk-ZXSGTGJ6.js → chunk-APVM5NEU.js} +169 -148
- package/dist/node-runtime/{chunk-RC7DMV45.js → chunk-AYHH7YSD.js} +205 -144
- package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
- package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
- package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
- package/dist/node-runtime/{chunk-KWIYUUZK.js → chunk-C3P6Q3B2.js} +469 -283
- package/dist/node-runtime/{chunk-YCUZEGJG.js → chunk-DQSCFU7R.js} +17 -8
- package/dist/node-runtime/chunk-EBLAZVSA.js +4170 -0
- package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-EPR2F3GU.js} +68 -20
- package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
- package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
- package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
- package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
- package/dist/node-runtime/chunk-FE3WZI7F.js +290 -0
- package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-FIRA54AC.js} +2 -5
- package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
- package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
- package/dist/node-runtime/chunk-FY4A63RK.js +73 -0
- package/dist/node-runtime/chunk-FYIFPFXE.js +98 -0
- package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
- package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
- package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
- package/dist/node-runtime/{chunk-6XL67VVY.js → chunk-HUD2RFJW.js} +17 -2
- package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
- package/dist/node-runtime/chunk-IAZSK7KK.js +108 -0
- package/dist/node-runtime/{chunk-2HHLJWGD.js → chunk-IHHTWSXN.js} +9 -9
- package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
- package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
- package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
- package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-JQYNHAKX.js} +1 -1
- package/dist/node-runtime/{chunk-WF7PGWRZ.js → chunk-JWEVT363.js} +37 -28
- package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
- package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
- package/dist/node-runtime/{chunk-IJIFHRTB.js → chunk-MQPKUHRN.js} +165 -85
- package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
- package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
- package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
- package/dist/node-runtime/{chunk-E4D3IGP2.js → chunk-QNVMKNNN.js} +20 -17
- package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
- package/dist/node-runtime/{chunk-7S3T6YEA.js → chunk-R4WSB2MQ.js} +5 -5
- package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
- package/dist/node-runtime/{chunk-3XPLBUEM.js → chunk-RLGY2QIL.js} +49 -59
- package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
- package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-TCT6PCUR.js} +47 -115
- package/dist/node-runtime/chunk-U5F4IC7R.js +53 -0
- package/dist/node-runtime/{chunk-OCVIXVTZ.js → chunk-UBWW2PID.js} +13 -2
- package/dist/node-runtime/{chunk-HFVZUPFJ.js → chunk-UNUZICC4.js} +3 -3
- package/dist/node-runtime/{chunk-LQP3RB67.js → chunk-UYRKUKFE.js} +1 -1
- package/dist/node-runtime/{chunk-DSIKTUPW.js → chunk-VSUEAI7O.js} +2993 -3820
- package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
- package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
- package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
- package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
- package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
- package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
- package/dist/node-runtime/{chunk-VQFSUJJG.js → chunk-ZDJUR45D.js} +430 -129
- package/dist/node-runtime/{chunk-YDO2F2IA.js → chunk-ZEVFBFNF.js} +95 -142
- package/dist/node-runtime/chunk-ZIQUS5QO.js +180 -0
- package/dist/node-runtime/cli-runtime.js +4 -4
- package/dist/node-runtime/{command-6WDOYKS6.js → command-3HMSY6W2.js} +5 -5
- package/dist/node-runtime/{commands-NZLSOHPE.js → commands-D6A6H4TS.js} +11 -16
- package/dist/node-runtime/commands-OCSSEEWJ.js +37 -0
- package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
- package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
- package/dist/node-runtime/{direct-tool-executor-77GW4F5P.js → direct-tool-executor-2QJXVQD2.js} +8 -10
- package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
- package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-BRWF5AHI.js} +4 -4
- package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
- package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
- package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
- package/dist/node-runtime/{gateway-INAYBF4Q.js → gateway-6623C2U3.js} +61 -53
- package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
- package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
- package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
- package/dist/node-runtime/{goal-NJEE5CTU.js → goal-AIHEDUYA.js} +5 -5
- package/dist/node-runtime/index.js +54 -48
- package/dist/node-runtime/{init-HS6NQXSK.js → init-JBQJIPYI.js} +3 -4
- package/dist/node-runtime/{install-cli-KL4UDDAD.js → install-cli-INGHIVBY.js} +30 -25
- package/dist/node-runtime/interactive-mode-FM5DNUSW.js +74 -0
- package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
- package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
- package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
- package/dist/node-runtime/lunr-computer-use-VDP2QNRQ.js +158 -0
- package/dist/node-runtime/{lunr-cron-LWIZJM2N.js → lunr-cron-LKVA5CZZ.js} +94 -79
- package/dist/node-runtime/main.js +42 -39
- package/dist/node-runtime/{mobile-commands-J7OJEKFO.js → mobile-commands-XT3NQXLD.js} +13 -12
- package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
- package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
- package/dist/node-runtime/{package-manager-cli-VYZM5WHN.js → package-manager-cli-CYM262SI.js} +20 -19
- package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
- package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
- package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
- package/dist/node-runtime/{pi-mcp-adapter-5UKBZP44.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
- package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
- package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
- package/dist/node-runtime/{pi-subagents-DNY7EAIG.js → pi-subagents-LT3CTO4E.js} +114 -116
- package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
- package/dist/node-runtime/{print-mode-XSFM26EL.js → print-mode-2XHN5SUA.js} +4 -3
- package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
- package/dist/node-runtime/{proxy-modes-LGEUYD7R.js → proxy-modes-VEGC6QG5.js} +9 -13
- package/dist/node-runtime/rpc-entry.js +42 -39
- package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
- package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
- package/dist/node-runtime/runtime-UGXM4NPQ.js +21 -0
- package/dist/node-runtime/{runtime-bridges-VRDDR73P.js → runtime-bridges-DNKMNJCF.js} +8 -7
- package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
- package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LNSPDTKY.js} +4 -4
- package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-YIFIAVGC.js} +3 -3
- package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
- package/dist/node-runtime/{settings-manager-J4SPQPDJ.js → settings-manager-P2TKGYTR.js} +6 -5
- package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
- package/dist/node-runtime/{setup-CQ2NLVK5.js → setup-OLQ4GXWS.js} +22 -21
- package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
- package/dist/node-runtime/{subagent-executor-KZZQGAKV.js → subagent-executor-Q5F7DBVM.js} +141 -62
- package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
- package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
- package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
- package/dist/node-runtime/{update-cli-GTFJC7XK.js → update-cli-F3XXJANQ.js} +7 -6
- package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
- package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
- package/dist/node-runtime/workflow-ICDI4N3J.js +767 -0
- package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js +25 -10
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts +2 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +12 -0
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/paths.d.ts +4 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +33 -2
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/sanitize-terminal-text.d.ts +7 -0
- package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
- package/dist/utils/sanitize-terminal-text.js +67 -0
- package/dist/utils/sanitize-terminal-text.js.map +1 -0
- package/docs/browser.md +1 -1
- package/docs/computer-use.md +362 -0
- package/docs/custom-provider.md +3 -3
- package/docs/extensions.md +8 -4
- package/docs/features.md +22 -12
- package/docs/keybindings.md +1 -1
- package/docs/models.md +5 -5
- package/docs/packages.md +1 -1
- package/docs/providers.md +2 -2
- package/docs/rpc.md +7 -7
- package/docs/security.md +10 -5
- package/docs/sessions.md +2 -2
- package/docs/skills.md +1 -1
- package/docs/terminal-setup.md +7 -7
- package/docs/themes.md +1 -1
- package/docs/usage.md +1 -1
- package/examples/extensions/auto-commit-on-exit.ts +1 -1
- package/examples/extensions/bash-spawn-hook.ts +1 -1
- package/examples/extensions/built-in-tool-renderer.ts +1 -1
- package/examples/extensions/claude-rules.ts +1 -1
- package/examples/extensions/commands.ts +1 -1
- package/examples/extensions/custom-compaction.ts +1 -1
- package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/doom-overlay/index.ts +1 -1
- package/examples/extensions/git-merge-and-resolve.ts +2 -2
- package/examples/extensions/gondolin/index.ts +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/hidden-thinking-label.ts +1 -1
- package/examples/extensions/inline-bash.ts +2 -2
- package/examples/extensions/input-transform-streaming.ts +2 -2
- package/examples/extensions/input-transform.ts +2 -2
- package/examples/extensions/interactive-shell.ts +1 -1
- package/examples/extensions/kimi-deferred-tools.ts +1 -1
- package/examples/extensions/mac-system-theme.ts +1 -1
- package/examples/extensions/minimal-mode.ts +1 -1
- package/examples/extensions/modal-editor.ts +1 -1
- package/examples/extensions/model-status.ts +1 -1
- package/examples/extensions/notify.ts +3 -3
- package/examples/extensions/overlay-qa-tests.ts +1 -1
- package/examples/extensions/overlay-test.ts +1 -1
- package/examples/extensions/pirate.ts +1 -1
- package/examples/extensions/preset.ts +3 -3
- package/examples/extensions/project-trust.ts +4 -4
- package/examples/extensions/prompt-customizer.ts +1 -1
- package/examples/extensions/rainbow-editor.ts +1 -1
- package/examples/extensions/rpc-demo.ts +1 -1
- package/examples/extensions/sandbox/index.ts +7 -7
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/shutdown-command.ts +5 -5
- package/examples/extensions/ssh.ts +2 -2
- package/examples/extensions/subagent/README.md +3 -3
- package/examples/extensions/subagent/index.ts +2 -2
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/extensions/tool-override.ts +1 -1
- package/examples/extensions/tools.ts +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/working-indicator.ts +1 -1
- package/examples/extensions/working-message-test.ts +1 -1
- package/examples/sdk/01-minimal.ts +1 -1
- package/examples/sdk/03-custom-prompt.ts +1 -1
- package/examples/sdk/04-skills.ts +1 -1
- package/examples/sdk/06-extensions.ts +2 -2
- package/examples/sdk/08-prompt-templates.ts +1 -1
- package/install-lock/package-lock.json +3841 -0
- package/install-lock/package.json +18 -0
- package/native/computer-use/LICENSE.md +21 -0
- package/npm-shrinkwrap.json +3858 -0
- package/package.json +15 -9
- package/dist/modes/interactive/components/exit-card.d.ts +0 -22
- package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
- package/dist/modes/interactive/components/exit-card.js +0 -69
- package/dist/modes/interactive/components/exit-card.js.map +0 -1
- package/dist/node-runtime/agent-session-services-YXXFCP5J.js +0 -49
- package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
- package/dist/node-runtime/chunk-4TLO4PO2.js +0 -3427
- package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
- package/dist/node-runtime/chunk-OVX6X377.js +0 -50
- package/dist/node-runtime/chunk-QTU6AKNJ.js +0 -773
- package/dist/node-runtime/chunk-TORR5XBV.js +0 -356
- package/dist/node-runtime/commands-QC6VUZJQ.js +0 -36
- package/dist/node-runtime/interactive-mode-Z5M7WYYZ.js +0 -72
- package/dist/node-runtime/mcp-auth-flow-QIXHW6QN.js +0 -32
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Detects Amazon Brazil workspaces, runs bemol to generate LSP configs,
|
|
5
5
|
* and registers a WorkspaceProvider with the LSP extension via pi.events.
|
|
6
6
|
*
|
|
7
|
-
* Install: place in ~/.
|
|
7
|
+
* Install: place in ~/.lunr/agent/extensions/pi-lsp-bemol/ or load with lunr -e
|
|
8
8
|
*
|
|
9
9
|
* Requires: bemol on PATH (toolbox install bemol)
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/bemol-extension/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAwDpE,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,EAAE,YAAY,QA+HtD","sourcesContent":["// @ts-nocheck\n/**\n * pi-lsp-bemol — Bemol workspace provider for pi-lsp-extension.\n *\n * Detects Amazon Brazil workspaces, runs bemol to generate LSP configs,\n * and registers a WorkspaceProvider with the LSP extension via pi.events.\n *\n * Install: place in ~/.
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/bemol-extension/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAwDpE,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,EAAE,YAAY,QA+HtD","sourcesContent":["// @ts-nocheck\n/**\n * pi-lsp-bemol — Bemol workspace provider for pi-lsp-extension.\n *\n * Detects Amazon Brazil workspaces, runs bemol to generate LSP configs,\n * and registers a WorkspaceProvider with the LSP extension via pi.events.\n *\n * Install: place in ~/.lunr/agent/extensions/pi-lsp-bemol/ or load with lunr -e\n *\n * Requires: bemol on PATH (toolbox install bemol)\n */\n\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { join } from \"node:path\";\nimport { BemolManager } from \"./bemol.js\";\n\n/**\n * WorkspaceProvider interface — must match the one in pi-lsp-extension.\n * The LSP extension accepts any object with this shape via pi.events.\n */\ninterface WorkspaceProvider {\n readonly type: string;\n readonly workspaceRoot: string | null;\n readonly stateDir: string | null;\n getWorkspaceFolders(): { uri: string; name: string }[];\n ensureReady(sessionId?: string): Promise<boolean>;\n getStatusText(): string;\n shutdown(): void;\n}\n\nclass BemolWorkspaceProvider implements WorkspaceProvider {\n readonly type = \"bemol\";\n readonly manager: BemolManager;\n\n constructor(manager: BemolManager) {\n this.manager = manager;\n }\n\n get workspaceRoot(): string | null {\n return this.manager.workspaceRoot;\n }\n\n get stateDir(): string | null {\n const root = this.manager.workspaceRoot;\n return root ? join(root, \".bemol\") : null;\n }\n\n getWorkspaceFolders(): { uri: string; name: string }[] {\n return this.manager.getWorkspaceFolders();\n }\n\n async ensureReady(sessionId?: string): Promise<boolean> {\n return this.manager.ensureBemolConfig(sessionId);\n }\n\n getStatusText(): string {\n const hasConfig = this.manager.hasConfig();\n const hasBemol = this.manager.bemolAvailable;\n if (hasConfig) return \"Brazil workspace (bemol config found)\";\n if (hasBemol) return \"Brazil workspace (bemol will run on first LSP use)\";\n return \"Brazil workspace (bemol not installed)\";\n }\n\n shutdown(): void {\n this.manager.shutdown();\n }\n}\n\nexport default function bemolExtension(pi: ExtensionAPI) {\n // Detect and register at factory time (synchronous, before any session_start).\n // This ensures the provider is available before autoStart kicks in.\n const bemol = new BemolManager(process.cwd());\n let provider: BemolWorkspaceProvider | null = null;\n\n if (bemol.isBrazilWorkspace) {\n provider = new BemolWorkspaceProvider(bemol);\n // Store on event bus so the LSP extension can find it regardless of load order\n (pi.events as any)[\"lsp:workspace-provider\"] = provider;\n pi.events.emit(\"lsp:register-workspace-provider\", provider);\n }\n\n // Register /bemol command and update status once we have UI context\n pi.on(\"session_start\", async (_event, ctx) => {\n if (!provider) return;\n\n // Re-detect with ctx.cwd in case it differs from process.cwd()\n if (ctx.cwd !== process.cwd()) {\n const freshBemol = new BemolManager(ctx.cwd);\n if (freshBemol.isBrazilWorkspace) {\n provider = new BemolWorkspaceProvider(freshBemol);\n pi.events.emit(\"lsp:register-workspace-provider\", provider);\n } else {\n provider = null;\n return;\n }\n }\n\n pi.registerCommand(\"bemol\", {\n description: \"Manage bemol: /bemol [run|watch|stop|status]\",\n handler: async (args, cmdCtx) => {\n if (!provider) return;\n const mgr = provider.manager;\n const subcommand = args?.trim().toLowerCase() || \"run\";\n\n switch (subcommand) {\n case \"run\": {\n if (!mgr.bemolAvailable) {\n cmdCtx.ui.notify(\"bemol is not installed. Run: toolbox install bemol\", \"warning\");\n return;\n }\n cmdCtx.ui.setStatus(\"lsp\", cmdCtx.ui.theme.fg(\"warning\", \"LSP: running bemol...\"));\n cmdCtx.ui.notify(\"Running bemol --verbose...\", \"info\");\n const result = await mgr.runBemol();\n if (result.success) {\n const roots = mgr.getWorkspaceRoots();\n cmdCtx.ui.notify(\n `bemol completed in ${(result.duration / 1000).toFixed(1)}s\\n${roots.length} package root(s) configured`,\n \"info\"\n );\n } else {\n cmdCtx.ui.notify(`bemol failed:\\n${result.output.slice(0, 500)}`, \"error\");\n }\n cmdCtx.ui.setStatus(\"lsp\", cmdCtx.ui.theme.fg(\"accent\", \"LSP: Brazil workspace (bemol done)\"));\n break;\n }\n\n case \"watch\": {\n if (!mgr.bemolAvailable) {\n cmdCtx.ui.notify(\"bemol is not installed. Run: toolbox install bemol\", \"warning\");\n return;\n }\n if (mgr.isWatching) {\n cmdCtx.ui.notify(\"bemol --watch is already running\", \"info\");\n return;\n }\n const started = mgr.startWatch();\n if (started) {\n cmdCtx.ui.notify(\"Started bemol --watch in background\", \"info\");\n cmdCtx.ui.setStatus(\"bemol\", cmdCtx.ui.theme.fg(\"accent\", \"bemol: watching\"));\n } else {\n cmdCtx.ui.notify(\"Failed to start bemol --watch\", \"error\");\n }\n break;\n }\n\n case \"stop\": {\n if (!mgr.isWatching) {\n cmdCtx.ui.notify(\"bemol --watch is not running\", \"info\");\n return;\n }\n mgr.stopWatch();\n cmdCtx.ui.notify(\"Stopped bemol --watch\", \"info\");\n cmdCtx.ui.setStatus(\"bemol\", \"\");\n break;\n }\n\n case \"status\": {\n const status = mgr.getStatus();\n const lines = [\n `Brazil workspace: ${status.isBrazilWorkspace ? \"yes\" : \"no\"}`,\n `Workspace root: ${status.workspaceRoot ?? \"N/A\"}`,\n `bemol available: ${status.bemolAvailable ? \"yes\" : \"no\"}`,\n `bemol config: ${status.hasConfig ? \"yes\" : \"missing\"}`,\n `bemol watch: ${status.watching ? \"running\" : \"stopped\"}`,\n `Package roots: ${status.workspaceRoots.length}`,\n ];\n if (status.workspaceRoots.length > 0) {\n const shown = status.workspaceRoots.slice(0, 10);\n for (const root of shown) {\n lines.push(` ${root}`);\n }\n if (status.workspaceRoots.length > 10) {\n lines.push(` ... and ${status.workspaceRoots.length - 10} more`);\n }\n }\n cmdCtx.ui.notify(lines.join(\"\\n\"), \"info\");\n break;\n }\n\n default:\n cmdCtx.ui.notify(\n \"Usage: /bemol [run|watch|stop|status]\\n run — run bemol --verbose\\n watch — start bemol --watch\\n stop — stop bemol --watch\\n status — show bemol status\",\n \"info\"\n );\n }\n },\n });\n });\n\n pi.on(\"session_shutdown\", async () => {\n if (provider) {\n provider.shutdown();\n provider = null;\n }\n });\n}\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Detects Amazon Brazil workspaces, runs bemol to generate LSP configs,
|
|
6
6
|
* and registers a WorkspaceProvider with the LSP extension via pi.events.
|
|
7
7
|
*
|
|
8
|
-
* Install: place in ~/.
|
|
8
|
+
* Install: place in ~/.lunr/agent/extensions/pi-lsp-bemol/ or load with lunr -e
|
|
9
9
|
*
|
|
10
10
|
* Requires: bemol on PATH (toolbox install bemol)
|
|
11
11
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/bemol-extension/index.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * pi-lsp-bemol — Bemol workspace provider for pi-lsp-extension.\n *\n * Detects Amazon Brazil workspaces, runs bemol to generate LSP configs,\n * and registers a WorkspaceProvider with the LSP extension via pi.events.\n *\n * Install: place in ~/.pi/agent/extensions/pi-lsp-bemol/ or load with pi -e\n *\n * Requires: bemol on PATH (toolbox install bemol)\n */\n\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { join } from \"node:path\";\nimport { BemolManager } from \"./bemol.js\";\n\n/**\n * WorkspaceProvider interface — must match the one in pi-lsp-extension.\n * The LSP extension accepts any object with this shape via pi.events.\n */\ninterface WorkspaceProvider {\n readonly type: string;\n readonly workspaceRoot: string | null;\n readonly stateDir: string | null;\n getWorkspaceFolders(): { uri: string; name: string }[];\n ensureReady(sessionId?: string): Promise<boolean>;\n getStatusText(): string;\n shutdown(): void;\n}\n\nclass BemolWorkspaceProvider implements WorkspaceProvider {\n readonly type = \"bemol\";\n readonly manager: BemolManager;\n\n constructor(manager: BemolManager) {\n this.manager = manager;\n }\n\n get workspaceRoot(): string | null {\n return this.manager.workspaceRoot;\n }\n\n get stateDir(): string | null {\n const root = this.manager.workspaceRoot;\n return root ? join(root, \".bemol\") : null;\n }\n\n getWorkspaceFolders(): { uri: string; name: string }[] {\n return this.manager.getWorkspaceFolders();\n }\n\n async ensureReady(sessionId?: string): Promise<boolean> {\n return this.manager.ensureBemolConfig(sessionId);\n }\n\n getStatusText(): string {\n const hasConfig = this.manager.hasConfig();\n const hasBemol = this.manager.bemolAvailable;\n if (hasConfig) return \"Brazil workspace (bemol config found)\";\n if (hasBemol) return \"Brazil workspace (bemol will run on first LSP use)\";\n return \"Brazil workspace (bemol not installed)\";\n }\n\n shutdown(): void {\n this.manager.shutdown();\n }\n}\n\nexport default function bemolExtension(pi: ExtensionAPI) {\n // Detect and register at factory time (synchronous, before any session_start).\n // This ensures the provider is available before autoStart kicks in.\n const bemol = new BemolManager(process.cwd());\n let provider: BemolWorkspaceProvider | null = null;\n\n if (bemol.isBrazilWorkspace) {\n provider = new BemolWorkspaceProvider(bemol);\n // Store on event bus so the LSP extension can find it regardless of load order\n (pi.events as any)[\"lsp:workspace-provider\"] = provider;\n pi.events.emit(\"lsp:register-workspace-provider\", provider);\n }\n\n // Register /bemol command and update status once we have UI context\n pi.on(\"session_start\", async (_event, ctx) => {\n if (!provider) return;\n\n // Re-detect with ctx.cwd in case it differs from process.cwd()\n if (ctx.cwd !== process.cwd()) {\n const freshBemol = new BemolManager(ctx.cwd);\n if (freshBemol.isBrazilWorkspace) {\n provider = new BemolWorkspaceProvider(freshBemol);\n pi.events.emit(\"lsp:register-workspace-provider\", provider);\n } else {\n provider = null;\n return;\n }\n }\n\n pi.registerCommand(\"bemol\", {\n description: \"Manage bemol: /bemol [run|watch|stop|status]\",\n handler: async (args, cmdCtx) => {\n if (!provider) return;\n const mgr = provider.manager;\n const subcommand = args?.trim().toLowerCase() || \"run\";\n\n switch (subcommand) {\n case \"run\": {\n if (!mgr.bemolAvailable) {\n cmdCtx.ui.notify(\"bemol is not installed. Run: toolbox install bemol\", \"warning\");\n return;\n }\n cmdCtx.ui.setStatus(\"lsp\", cmdCtx.ui.theme.fg(\"warning\", \"LSP: running bemol...\"));\n cmdCtx.ui.notify(\"Running bemol --verbose...\", \"info\");\n const result = await mgr.runBemol();\n if (result.success) {\n const roots = mgr.getWorkspaceRoots();\n cmdCtx.ui.notify(\n `bemol completed in ${(result.duration / 1000).toFixed(1)}s\\n${roots.length} package root(s) configured`,\n \"info\"\n );\n } else {\n cmdCtx.ui.notify(`bemol failed:\\n${result.output.slice(0, 500)}`, \"error\");\n }\n cmdCtx.ui.setStatus(\"lsp\", cmdCtx.ui.theme.fg(\"accent\", \"LSP: Brazil workspace (bemol done)\"));\n break;\n }\n\n case \"watch\": {\n if (!mgr.bemolAvailable) {\n cmdCtx.ui.notify(\"bemol is not installed. Run: toolbox install bemol\", \"warning\");\n return;\n }\n if (mgr.isWatching) {\n cmdCtx.ui.notify(\"bemol --watch is already running\", \"info\");\n return;\n }\n const started = mgr.startWatch();\n if (started) {\n cmdCtx.ui.notify(\"Started bemol --watch in background\", \"info\");\n cmdCtx.ui.setStatus(\"bemol\", cmdCtx.ui.theme.fg(\"accent\", \"bemol: watching\"));\n } else {\n cmdCtx.ui.notify(\"Failed to start bemol --watch\", \"error\");\n }\n break;\n }\n\n case \"stop\": {\n if (!mgr.isWatching) {\n cmdCtx.ui.notify(\"bemol --watch is not running\", \"info\");\n return;\n }\n mgr.stopWatch();\n cmdCtx.ui.notify(\"Stopped bemol --watch\", \"info\");\n cmdCtx.ui.setStatus(\"bemol\", \"\");\n break;\n }\n\n case \"status\": {\n const status = mgr.getStatus();\n const lines = [\n `Brazil workspace: ${status.isBrazilWorkspace ? \"yes\" : \"no\"}`,\n `Workspace root: ${status.workspaceRoot ?? \"N/A\"}`,\n `bemol available: ${status.bemolAvailable ? \"yes\" : \"no\"}`,\n `bemol config: ${status.hasConfig ? \"yes\" : \"missing\"}`,\n `bemol watch: ${status.watching ? \"running\" : \"stopped\"}`,\n `Package roots: ${status.workspaceRoots.length}`,\n ];\n if (status.workspaceRoots.length > 0) {\n const shown = status.workspaceRoots.slice(0, 10);\n for (const root of shown) {\n lines.push(` ${root}`);\n }\n if (status.workspaceRoots.length > 10) {\n lines.push(` ... and ${status.workspaceRoots.length - 10} more`);\n }\n }\n cmdCtx.ui.notify(lines.join(\"\\n\"), \"info\");\n break;\n }\n\n default:\n cmdCtx.ui.notify(\n \"Usage: /bemol [run|watch|stop|status]\\n run — run bemol --verbose\\n watch — start bemol --watch\\n stop — stop bemol --watch\\n status — show bemol status\",\n \"info\"\n );\n }\n },\n });\n });\n\n pi.on(\"session_shutdown\", async () => {\n if (provider) {\n provider.shutdown();\n provider = null;\n }\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/bemol-extension/index.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * pi-lsp-bemol — Bemol workspace provider for pi-lsp-extension.\n *\n * Detects Amazon Brazil workspaces, runs bemol to generate LSP configs,\n * and registers a WorkspaceProvider with the LSP extension via pi.events.\n *\n * Install: place in ~/.lunr/agent/extensions/pi-lsp-bemol/ or load with lunr -e\n *\n * Requires: bemol on PATH (toolbox install bemol)\n */\n\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { join } from \"node:path\";\nimport { BemolManager } from \"./bemol.js\";\n\n/**\n * WorkspaceProvider interface — must match the one in pi-lsp-extension.\n * The LSP extension accepts any object with this shape via pi.events.\n */\ninterface WorkspaceProvider {\n readonly type: string;\n readonly workspaceRoot: string | null;\n readonly stateDir: string | null;\n getWorkspaceFolders(): { uri: string; name: string }[];\n ensureReady(sessionId?: string): Promise<boolean>;\n getStatusText(): string;\n shutdown(): void;\n}\n\nclass BemolWorkspaceProvider implements WorkspaceProvider {\n readonly type = \"bemol\";\n readonly manager: BemolManager;\n\n constructor(manager: BemolManager) {\n this.manager = manager;\n }\n\n get workspaceRoot(): string | null {\n return this.manager.workspaceRoot;\n }\n\n get stateDir(): string | null {\n const root = this.manager.workspaceRoot;\n return root ? join(root, \".bemol\") : null;\n }\n\n getWorkspaceFolders(): { uri: string; name: string }[] {\n return this.manager.getWorkspaceFolders();\n }\n\n async ensureReady(sessionId?: string): Promise<boolean> {\n return this.manager.ensureBemolConfig(sessionId);\n }\n\n getStatusText(): string {\n const hasConfig = this.manager.hasConfig();\n const hasBemol = this.manager.bemolAvailable;\n if (hasConfig) return \"Brazil workspace (bemol config found)\";\n if (hasBemol) return \"Brazil workspace (bemol will run on first LSP use)\";\n return \"Brazil workspace (bemol not installed)\";\n }\n\n shutdown(): void {\n this.manager.shutdown();\n }\n}\n\nexport default function bemolExtension(pi: ExtensionAPI) {\n // Detect and register at factory time (synchronous, before any session_start).\n // This ensures the provider is available before autoStart kicks in.\n const bemol = new BemolManager(process.cwd());\n let provider: BemolWorkspaceProvider | null = null;\n\n if (bemol.isBrazilWorkspace) {\n provider = new BemolWorkspaceProvider(bemol);\n // Store on event bus so the LSP extension can find it regardless of load order\n (pi.events as any)[\"lsp:workspace-provider\"] = provider;\n pi.events.emit(\"lsp:register-workspace-provider\", provider);\n }\n\n // Register /bemol command and update status once we have UI context\n pi.on(\"session_start\", async (_event, ctx) => {\n if (!provider) return;\n\n // Re-detect with ctx.cwd in case it differs from process.cwd()\n if (ctx.cwd !== process.cwd()) {\n const freshBemol = new BemolManager(ctx.cwd);\n if (freshBemol.isBrazilWorkspace) {\n provider = new BemolWorkspaceProvider(freshBemol);\n pi.events.emit(\"lsp:register-workspace-provider\", provider);\n } else {\n provider = null;\n return;\n }\n }\n\n pi.registerCommand(\"bemol\", {\n description: \"Manage bemol: /bemol [run|watch|stop|status]\",\n handler: async (args, cmdCtx) => {\n if (!provider) return;\n const mgr = provider.manager;\n const subcommand = args?.trim().toLowerCase() || \"run\";\n\n switch (subcommand) {\n case \"run\": {\n if (!mgr.bemolAvailable) {\n cmdCtx.ui.notify(\"bemol is not installed. Run: toolbox install bemol\", \"warning\");\n return;\n }\n cmdCtx.ui.setStatus(\"lsp\", cmdCtx.ui.theme.fg(\"warning\", \"LSP: running bemol...\"));\n cmdCtx.ui.notify(\"Running bemol --verbose...\", \"info\");\n const result = await mgr.runBemol();\n if (result.success) {\n const roots = mgr.getWorkspaceRoots();\n cmdCtx.ui.notify(\n `bemol completed in ${(result.duration / 1000).toFixed(1)}s\\n${roots.length} package root(s) configured`,\n \"info\"\n );\n } else {\n cmdCtx.ui.notify(`bemol failed:\\n${result.output.slice(0, 500)}`, \"error\");\n }\n cmdCtx.ui.setStatus(\"lsp\", cmdCtx.ui.theme.fg(\"accent\", \"LSP: Brazil workspace (bemol done)\"));\n break;\n }\n\n case \"watch\": {\n if (!mgr.bemolAvailable) {\n cmdCtx.ui.notify(\"bemol is not installed. Run: toolbox install bemol\", \"warning\");\n return;\n }\n if (mgr.isWatching) {\n cmdCtx.ui.notify(\"bemol --watch is already running\", \"info\");\n return;\n }\n const started = mgr.startWatch();\n if (started) {\n cmdCtx.ui.notify(\"Started bemol --watch in background\", \"info\");\n cmdCtx.ui.setStatus(\"bemol\", cmdCtx.ui.theme.fg(\"accent\", \"bemol: watching\"));\n } else {\n cmdCtx.ui.notify(\"Failed to start bemol --watch\", \"error\");\n }\n break;\n }\n\n case \"stop\": {\n if (!mgr.isWatching) {\n cmdCtx.ui.notify(\"bemol --watch is not running\", \"info\");\n return;\n }\n mgr.stopWatch();\n cmdCtx.ui.notify(\"Stopped bemol --watch\", \"info\");\n cmdCtx.ui.setStatus(\"bemol\", \"\");\n break;\n }\n\n case \"status\": {\n const status = mgr.getStatus();\n const lines = [\n `Brazil workspace: ${status.isBrazilWorkspace ? \"yes\" : \"no\"}`,\n `Workspace root: ${status.workspaceRoot ?? \"N/A\"}`,\n `bemol available: ${status.bemolAvailable ? \"yes\" : \"no\"}`,\n `bemol config: ${status.hasConfig ? \"yes\" : \"missing\"}`,\n `bemol watch: ${status.watching ? \"running\" : \"stopped\"}`,\n `Package roots: ${status.workspaceRoots.length}`,\n ];\n if (status.workspaceRoots.length > 0) {\n const shown = status.workspaceRoots.slice(0, 10);\n for (const root of shown) {\n lines.push(` ${root}`);\n }\n if (status.workspaceRoots.length > 10) {\n lines.push(` ... and ${status.workspaceRoots.length - 10} more`);\n }\n }\n cmdCtx.ui.notify(lines.join(\"\\n\"), \"info\");\n break;\n }\n\n default:\n cmdCtx.ui.notify(\n \"Usage: /bemol [run|watch|stop|status]\\n run — run bemol --verbose\\n watch — start bemol --watch\\n stop — stop bemol --watch\\n status — show bemol status\",\n \"info\"\n );\n }\n },\n });\n });\n\n pi.on(\"session_shutdown\", async () => {\n if (provider) {\n provider.shutdown();\n provider = null;\n }\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/src/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,iCAAiC,CAAC;AAmHpF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,EAAE,YAAY,QAgepD;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC","sourcesContent":["// @ts-nocheck\n/**\n * pi-lsp-extension — Pi coding agent extension for LSP integration.\n *\n * Exposes Language Server Protocol capabilities as tools the LLM can call:\n * - lsp_diagnostics: compilation errors and warnings\n * - lsp_hover: type info and docs at a position\n * - lsp_definition: go to definition\n * - lsp_references: find all references\n * - lsp_symbols: file/workspace symbol search\n * - lsp_rename: preview rename refactoring\n * - lsp_completions: code completion suggestions at a position\n * - lsp_code_actions: quick fixes, refactorings, and source actions\n *\n * Position-based tools (hover, definition, references, rename, code_actions)\n * accept an optional `query` parameter as an alternative to line/character,\n * resolving a symbol name to its position automatically.\n *\n * Tool schemas, commands, and hooks register immediately. Heavy managers\n * (LspManager, FileSync, Tree-sitter/WASM, WorkspaceIndex) load on first use.\n *\n * Usage:\n * 1. npm install in this directory\n * 2. Add to pi via settings.json extensions, or: pi -e ./src/index.ts\n * 3. LSP servers start lazily when you first use a tool on a file\n */\n\nimport type { ExtensionAPI, ToolDefinition } from \"@ashx-j/lunr\";\nimport type { TSchema } from \"typebox\";\nimport { awaitWithAbort } from \"../../../utils/await-with-abort.ts\";\nimport {\n isReadToolResult,\n isWriteToolResult,\n isEditToolResult,\n} from \"../../../core/extensions/types.js\";\nimport { DiagnosticSeverity } from \"vscode-languageserver-protocol\";\n\nimport type { WorkspaceProvider } from \"./workspace-provider.js\";\nimport { LspRuntimeHost, type LspRuntimeCallbacks } from \"./runtime.js\";\nimport { createDiagnosticsTool } from \"./tools/diagnostics.js\";\nimport { createHoverTool } from \"./tools/hover.js\";\nimport { createDefinitionTool } from \"./tools/definition.js\";\nimport { createReferencesTool } from \"./tools/references.js\";\nimport { createSymbolsTool } from \"./tools/symbols.js\";\nimport { createRenameTool } from \"./tools/rename.js\";\nimport { createCodeOverviewTool } from \"./tools/code-overview.js\";\nimport { createCompletionsTool } from \"./tools/completions.js\";\nimport { createCodeSearchTool } from \"./tools/code-search.js\";\nimport { createCodeRewriteTool } from \"./tools/code-rewrite.js\";\nimport { createCodeActionsTool } from \"./tools/code-actions.js\";\nimport { syntheticDotLocks } from \"./tools/completions.js\";\nimport { relative } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { DIAGNOSTIC_SETTLE_DELAY_MS } from \"./shared/timing.js\";\n\n/**\n * Project-level LSP config — loaded from `.pi-lsp.json` in the workspace root.\n *\n * Example:\n * ```json\n * {\n * \"autoStart\": [\"java\", \"typescript\"],\n * \"lombokJar\": \"env/Lombok-1.18.x/runtime/lib/lombok-1.18.42.jar\",\n * \"servers\": {\n * \"python\": { \"command\": \"pylsp\", \"args\": [] }\n * }\n * }\n * ```\n */\ninterface ProjectLspConfig {\n /** Languages to start eagerly on session_start (e.g. [\"java\", \"typescript\"]) */\n autoStart?: string[];\n /** Path to Lombok jar (absolute or relative to project root). \"auto\" to auto-detect. */\n lombokJar?: string;\n /** Custom server configs keyed by language ID */\n servers?: Record<string, { command: string; args?: string[]; env?: Record<string, string>; initializationOptions?: Record<string, unknown>; settings?: Record<string, unknown> }>;\n /**\n * Auto-inject LSP error diagnostics into write/edit tool results.\n * Set to false to disable, or provide an array of language IDs to enable selectively.\n * Default: true (all languages).\n *\n * Examples:\n * true — inject for all languages\n * false — never inject\n * [\"typescript\"] — only inject for TypeScript files\n */\n autoInjectDiagnostics?: boolean | string[];\n}\n\ninterface ServerConfig {\n command: string;\n args: string[];\n env?: Record<string, string>;\n initializationOptions?: Record<string, unknown>;\n settings?: Record<string, unknown>;\n}\n\n/** Load .pi-lsp.json from a directory. Returns null if not found or invalid. */\nfunction loadProjectConfig(dir: string): ProjectLspConfig | null {\n const configPath = join(dir, \".pi-lsp.json\");\n try {\n if (!existsSync(configPath)) return null;\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n return parsed as ProjectLspConfig;\n } catch {\n return null;\n }\n}\n\nfunction createServiceProxy<T extends object>(getTarget: () => T | null, label: string): T {\n return new Proxy({} as T, {\n get(_target, prop, receiver) {\n const service = getTarget();\n if (!service) {\n throw new Error(`${label} is not initialized`);\n }\n const value = Reflect.get(service, prop, service);\n if (typeof value === \"function\") {\n return value.bind(service);\n }\n return value;\n },\n });\n}\n\nfunction registerToolWithRuntime<T extends TSchema, D>(pi: ExtensionAPI, tool: ToolDefinition<T, D>, ensure: () => Promise<unknown>, host: LspRuntimeHost) {\n pi.registerTool({\n ...tool,\n async execute(id, params, signal, onUpdate, ctx) {\n const generation = host.getGeneration();\n signal?.throwIfAborted();\n await awaitWithAbort(ensure(), signal);\n signal?.throwIfAborted();\n if (host.getGeneration() !== generation) throw new Error(\"LSP session changed before execution\");\n return tool.execute(id, params, signal, onUpdate, ctx);\n },\n });\n}\n\nexport default function lspExtension(pi: ExtensionAPI) {\n // Prevent EPIPE errors from LSP server exits from crashing the host process.\n // When an LSP server exits unexpectedly, in-flight writes to its stdin pipe\n // can produce EPIPE errors that escape all connection-level error handlers.\n const origListeners = process.listeners(\"uncaughtException\");\n process.on(\"uncaughtException\", (err: any) => {\n if (err?.code === \"EPIPE\") return; // swallow — LSP server exited, harmless\n // Re-throw for other handlers\n for (const listener of origListeners) (listener as any)(err);\n if (origListeners.length === 0) {\n console.error(\"[LSP] Uncaught exception:\", err);\n }\n });\n\n const host = new LspRuntimeHost();\n let pendingProvider: WorkspaceProvider | null = null;\n let latestCtx: any = null;\n let projectConfig: ProjectLspConfig | null = null;\n let sessionCwd = process.cwd();\n\n /**\n * Run `fn` with the currently captured ctx, swallowing stale-ctx errors.\n *\n * Lifecycle callbacks from LspManager (server ready, workspace setup, etc.)\n * and `pi.events` listeners can fire AFTER the session is replaced or reloaded,\n * at which point the captured ctx has been invalidated and any property access\n * throws via ExtensionRunner.assertActive(). We can't use optional chaining to\n * dodge it because the `ui` / `theme` getters themselves run assertActive().\n */\n const withLatestCtx = (fn: (ctx: any) => void) => {\n const ctx = latestCtx;\n if (!ctx) return;\n try {\n fn(ctx);\n } catch (err: any) {\n if (typeof err?.message === \"string\" && err.message.includes(\"stale after session\")) {\n // Session was replaced/reloaded — drop the stale ctx and move on.\n latestCtx = null;\n return;\n }\n throw err;\n }\n };\n\n const applyProvider = (data: unknown) => {\n const provider = data as WorkspaceProvider;\n pendingProvider = provider;\n host.setPendingProvider(provider);\n const statusText = provider.getStatusText();\n if (!statusText) return;\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n });\n };\n\n pi.events.on(\"lsp:register-workspace-provider\", applyProvider);\n\n // Check for provider registered before our listener existed\n const existing = (pi.events as any)[\"lsp:workspace-provider\"];\n if (existing) applyProvider(existing);\n\n const setLspStatus = (color: string, text: string) => {\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(color, text));\n });\n };\n\n const makeCallbacks = (): LspRuntimeCallbacks => ({\n onWorkspaceSetupStart: () => {\n setLspStatus(\"warning\", \"LSP: workspace setup...\");\n },\n onWorkspaceSetupEnd: (success: boolean, duration: number) => {\n const secs = (duration / 1000).toFixed(1);\n if (success) {\n setLspStatus(\"accent\", `LSP: workspace ready (${secs}s)`);\n } else {\n setLspStatus(\"warning\", `LSP: workspace setup failed (${secs}s)`);\n }\n },\n onServerStart: (languageId: string, command: string) => {\n setLspStatus(\"warning\", `LSP: starting ${languageId} (${command})...`);\n },\n onServerReady: (languageId: string) => {\n setLspStatus(\"accent\", `LSP: ${languageId} ready`);\n },\n onServerError: (languageId: string, _error: string) => {\n setLspStatus(\"error\", `LSP: ${languageId} failed`);\n },\n onServerCrash: (languageId: string, restarting: boolean, attempt: number) => {\n if (restarting) {\n setLspStatus(\"warning\", `LSP: restarting ${languageId}... (attempt ${attempt}/3)`);\n } else {\n setLspStatus(\"error\", `LSP: ${languageId} crashed — auto-restart exhausted`);\n }\n },\n });\n\n const applyProjectConfigToManager = (manager: { setServerConfig: Function; setLombokJar: Function }, config: ProjectLspConfig | null) => {\n if (!config) return;\n if (config.servers) {\n for (const [lang, serverConf] of Object.entries(config.servers)) {\n manager.setServerConfig(lang, {\n command: serverConf.command,\n args: serverConf.args ?? [],\n env: serverConf.env,\n initializationOptions: serverConf.initializationOptions,\n settings: serverConf.settings,\n });\n }\n }\n if (config.lombokJar && config.lombokJar !== \"auto\") {\n manager.setLombokJar(config.lombokJar);\n }\n };\n\n const buildBindOptions = (cwd: string) => ({\n cwd,\n callbacks: makeCallbacks(),\n pendingProvider,\n syntheticDotChecker: (uri: string) => syntheticDotLocks.has(uri),\n configureManager: (manager) => {\n applyProjectConfigToManager(manager, projectConfig);\n },\n });\n\n const ensureRuntime = async () => {\n return host.ensureServices(\n buildBindOptions(sessionCwd || process.cwd()),\n );\n };\n\n // session_start binds cwd/config only. Heavy managers load on first use,\n // unless autoStart is configured (then ensure + startEagerly).\n pi.on(\"session_start\", async (_event, ctx) => {\n latestCtx = ctx;\n sessionCwd = ctx.cwd;\n\n projectConfig = loadProjectConfig(ctx.cwd);\n await host.bindSession(buildBindOptions(ctx.cwd));\n\n const statusText = pendingProvider?.getStatusText?.() ?? \"\";\n if (statusText) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n } else {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n }\n\n if (projectConfig?.autoStart && projectConfig.autoStart.length > 0) {\n const langs = projectConfig.autoStart;\n const generation = host.getGeneration();\n void ensureRuntime().then((services) => {\n if (host.getGeneration() !== generation) return;\n const lombokJar = services.manager.getLombokJar?.() ?? null;\n const lombokNote = langs.includes(\"java\") && lombokJar\n ? ` (lombok: ${String(lombokJar).split(/[/\\\\]/).pop()})`\n : \"\";\n setLspStatus(\"warning\", `LSP: auto-starting ${langs.join(\", \")}${lombokNote}...`);\n services.manager.startEagerly(langs);\n }).catch((error) => {\n if (host.getGeneration() === generation) setLspStatus(\"error\", `LSP startup failed: ${String(error)}`);\n });\n }\n });\n\n const managerProxy = createServiceProxy(\n () => host.getServicesIfReady()?.manager ?? null,\n \"LSP manager\",\n );\n const treeSitterProxy = createServiceProxy(\n () => host.getServicesIfReady()?.treeSitter ?? null,\n \"Tree-sitter manager\",\n );\n const workspaceIndexProxy = createServiceProxy(\n () => host.getServicesIfReady()?.workspaceIndex ?? null,\n \"Workspace index\",\n );\n\n registerToolWithRuntime(pi, createDiagnosticsTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createHoverTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createDefinitionTool(managerProxy, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createReferencesTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createSymbolsTool(managerProxy, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createRenameTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeActionsTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCompletionsTool(\n managerProxy,\n {\n getTrackedVersion: (uri) => {\n const services = host.getServicesIfReady();\n if (!services) return null;\n return services.fileSync.getTrackedVersion(uri);\n },\n setTrackedVersion: (uri, v) => {\n host.getServicesIfReady()?.fileSync.setTrackedVersion(uri, v);\n },\n isSyntheticDotActive: (uri) => syntheticDotLocks.has(uri),\n },\n treeSitterProxy,\n ), ensureRuntime, host);\n const getRootDir = () => {\n const manager = host.getServicesIfReady()?.manager;\n if (manager) return manager.resolvePath(\".\");\n return sessionCwd || process.cwd();\n };\n registerToolWithRuntime(pi, createCodeOverviewTool(getRootDir, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeSearchTool(getRootDir, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeRewriteTool(getRootDir, treeSitterProxy, {\n onFileModified: (filePath: string) => {\n const services = host.getServicesIfReady();\n if (!services) return;\n services.fileSync.handleFileWrite(filePath).catch(() => {});\n },\n }), ensureRuntime, host);\n\n // File sync: track file reads/writes/edits without loading runtime on plain reads\n // when LSP was never used. Writes may start a server (existing behavior) so they\n // ensure runtime. After writes/edits, append file-scoped error diagnostics.\n pi.on(\"tool_result\", async (event) => {\n const generation = host.getGeneration();\n try {\n if (isReadToolResult(event) && !event.isError) {\n const services = host.getServicesIfReady();\n if (services) {\n const path = (event.input as any)?.path;\n if (path) await services.fileSync.handleFileRead(path);\n if (host.getGeneration() !== generation) return;\n }\n }\n\n if ((isWriteToolResult(event) || isEditToolResult(event)) && !event.isError) {\n const path = (event.input as any)?.path;\n if (path) {\n const services = await ensureRuntime();\n if (host.getGeneration() !== generation) return;\n await services.fileSync.handleFileWrite(path);\n }\n }\n } catch {\n // File sync errors are non-fatal\n }\n\n if (host.getGeneration() !== generation) return;\n // Auto-append diagnostics for the changed file (write/edit only)\n const services = host.getServicesIfReady();\n if ((isWriteToolResult(event) || isEditToolResult(event)) && !event.isError && services) {\n const path = (event.input as any)?.path;\n if (!path) return;\n\n const manager = services.manager;\n const languageId = manager.getLanguageId(path);\n if (!languageId) return;\n\n // Check autoInjectDiagnostics config\n const inject = projectConfig?.autoInjectDiagnostics;\n if (inject === false) return;\n if (Array.isArray(inject) && !inject.includes(languageId)) return;\n\n const client = manager.getRunningClient(languageId);\n if (!client) return;\n\n // Wait briefly for the LSP to publish updated diagnostics\n await new Promise((r) => setTimeout(r, DIAGNOSTIC_SETTLE_DELAY_MS));\n if (host.getGeneration() !== generation) return;\n\n const uri = manager.getFileUri(path);\n const diagnostics = client.getDiagnostics(uri);\n const errors = diagnostics.filter((d) => d.severity === DiagnosticSeverity.Error);\n\n if (errors.length === 0) return;\n\n // Build a compact summary — just errors, max 10 lines\n const relPath = relative(manager.resolvePath(\".\"), manager.resolvePath(path));\n const lines = errors.slice(0, 10).map((d) => {\n const line = d.range.start.line + 1;\n const col = d.range.start.character + 1;\n const source = d.source ? ` [${d.source}]` : \"\";\n return `${relPath}:${line}:${col} error: ${d.message}${source}`;\n });\n if (errors.length > 10) {\n lines.push(`... and ${errors.length - 10} more error(s)`);\n }\n\n const summary = `\\n\\n⚠ LSP: ${errors.length} error(s) in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\n return {\n content: [\n ...event.content,\n { type: \"text\" as const, text: summary },\n ],\n };\n }\n });\n\n // Update status after tool execution ends\n pi.on(\"tool_execution_end\", async (_event, ctx) => {\n latestCtx = ctx;\n const services = host.getServicesIfReady();\n if (!services) return;\n const statuses = services.manager.getStatus();\n const running = statuses.filter((s) => s.running);\n if (running.length === 0) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n } else {\n const totalDiags = running.reduce((n, s) => n + s.diagnosticsCount, 0);\n const langs = running.map((s) => s.languageId).join(\", \");\n let status = `LSP: ${langs}`;\n if (totalDiags > 0) {\n status += ` (${totalDiags} diagnostic${totalDiags !== 1 ? \"s\" : \"\"})`;\n }\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", status));\n }\n });\n\n // /lsp command — show server status\n pi.registerCommand(\"lsp\", {\n description: \"Show LSP server status\",\n handler: async (_args, ctx) => {\n const services = host.getServicesIfReady();\n if (!services) {\n ctx.ui.notify(\n host.isInitializing() ? \"LSP runtime is starting\" : \"LSP runtime is idle (not started)\",\n \"info\",\n );\n return;\n }\n\n const statuses = services.manager.getStatus();\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers configured\", \"info\");\n return;\n }\n\n const lines = statuses.map((s) => {\n const icon = s.running ? \"🟢\" : \"⚪\";\n const diags =\n s.diagnosticsCount > 0 ? ` (${s.diagnosticsCount} diagnostics)` : \"\";\n const shared = s.shared ? \" [shared]\" : \"\";\n return `${icon} ${s.languageId}: ${s.command}${diags}${shared}`;\n });\n\n ctx.ui.notify(lines.join(\"\\n\"), \"info\");\n },\n });\n\n // /lsp-restart command — restart a specific language server\n pi.registerCommand(\"lsp-restart\", {\n description: \"Restart an LSP server: /lsp-restart <language> (e.g. java, typescript)\",\n handler: async (args, ctx) => {\n const services = host.getServicesIfReady();\n if (!services) {\n if (args?.trim()) {\n ctx.ui.notify(\n host.isInitializing()\n ? \"LSP runtime is starting\"\n : \"LSP runtime is idle. Run an LSP tool before restarting a server.\",\n \"info\",\n );\n } else {\n ctx.ui.notify(\"No LSP servers are running.\\n\\nUsage: /lsp-restart <language>\", \"info\");\n }\n return;\n }\n\n const languageId = args?.trim().toLowerCase();\n if (!languageId) {\n // Show running servers and usage\n const statuses = services.manager.getStatus().filter((s) => s.running);\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers are running.\\n\\nUsage: /lsp-restart <language>\", \"info\");\n } else {\n const langs = statuses.map((s) => s.languageId).join(\", \");\n ctx.ui.notify(\n `Running servers: ${langs}\\n\\nUsage: /lsp-restart <language>\\nExample: /lsp-restart java`,\n \"info\"\n );\n }\n return;\n }\n\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"warning\", `LSP: restarting ${languageId}...`));\n ctx.ui.notify(`Restarting ${languageId} server (kills daemon if shared)...`, \"info\");\n\n try {\n await services.manager.restartServer(languageId);\n const lombokJar = languageId === \"java\" ? services.manager.getLombokJar() : null;\n const lombokNote = lombokJar ? `\\nLombok: ${lombokJar}` : \"\";\n ctx.ui.notify(`${languageId} server restarted successfully.${lombokNote}`, \"info\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${languageId} ready`));\n } catch (err: any) {\n ctx.ui.notify(`Failed to restart ${languageId}: ${err.message}`, \"error\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"error\", `LSP: ${languageId} restart failed`));\n }\n },\n });\n\n // /lsp-config command — add or override server configuration\n pi.registerCommand(\"lsp-config\", {\n description:\n \"Configure an LSP server: /lsp-config <language> <command> [args...]\",\n handler: async (args, ctx) => {\n if (!args?.trim()) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\\nExample: /lsp-config python pylsp\",\n \"info\"\n );\n return;\n }\n\n const parts = args.trim().split(/\\s+/);\n if (parts.length < 2) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\",\n \"warning\"\n );\n return;\n }\n\n const [languageId, command, ...serverArgs] = parts;\n const config: ServerConfig = { command, args: serverArgs };\n\n const services = await ensureRuntime();\n services.manager.setServerConfig(languageId, config);\n ctx.ui.notify(\n `Configured LSP for ${languageId}: ${command} ${serverArgs.join(\" \")}`,\n \"info\"\n );\n },\n });\n\n // /lsp-lombok command — set Lombok jar path for Java\n pi.registerCommand(\"lsp-lombok\", {\n description:\n \"Set Lombok jar path for Java: /lsp-lombok <path-to-lombok.jar>\",\n handler: async (args, ctx) => {\n const services = await ensureRuntime();\n const mgr = services.manager;\n\n if (!args?.trim()) {\n const current = mgr.getLombokJar();\n if (current) {\n ctx.ui.notify(`Lombok jar: ${current}`, \"info\");\n } else {\n ctx.ui.notify(\n \"No Lombok jar configured or detected.\\n\\n\" +\n \"Usage: /lsp-lombok <path-to-lombok.jar>\\n\" +\n \"Or set LOMBOK_JAR environment variable.\\n\\n\" +\n \"Download from: https://projectlombok.org/download\",\n \"info\"\n );\n }\n return;\n }\n\n const jarPath = args.trim();\n const resolved = resolve(ctx.cwd, jarPath);\n\n if (!existsSync(resolved)) {\n ctx.ui.notify(`File not found: ${resolved}`, \"error\");\n return;\n }\n\n if (!resolved.endsWith(\".jar\")) {\n ctx.ui.notify(`Warning: ${resolved} doesn't end in .jar — setting anyway`, \"warning\");\n }\n\n mgr.setLombokJar(resolved);\n ctx.ui.notify(`Lombok jar set: ${resolved}`, \"info\");\n },\n });\n\n // Clean shutdown — never loads heavy modules if they were unused\n pi.on(\"session_shutdown\", async () => {\n // Drop the captured ctx immediately — once shutdown fires, any late\n // LSP manager callback that reaches setLspStatus/applyProvider would\n // otherwise hit an invalidated ctx and throw an uncaught exception.\n latestCtx = null;\n await host.shutdown();\n });\n}\n\nexport { LspRuntimeHost } from \"./runtime.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/src/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,iCAAiC,CAAC;AAmHpF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,EAAE,YAAY,QAmdpD;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC","sourcesContent":["// @ts-nocheck\n/**\n * pi-lsp-extension — Pi coding agent extension for LSP integration.\n *\n * Exposes Language Server Protocol capabilities as tools the LLM can call:\n * - lsp_diagnostics: compilation errors and warnings\n * - lsp_hover: type info and docs at a position\n * - lsp_definition: go to definition\n * - lsp_references: find all references\n * - lsp_symbols: file/workspace symbol search\n * - lsp_rename: preview rename refactoring\n * - lsp_completions: code completion suggestions at a position\n * - lsp_code_actions: quick fixes, refactorings, and source actions\n *\n * Position-based tools (hover, definition, references, rename, code_actions)\n * accept an optional `query` parameter as an alternative to line/character,\n * resolving a symbol name to its position automatically.\n *\n * Tool schemas, commands, and hooks register immediately. Heavy managers\n * (LspManager, FileSync, Tree-sitter/WASM, WorkspaceIndex) load on first use.\n *\n * Usage:\n * 1. npm install in this directory\n * 2. Add to pi via settings.json extensions, or: pi -e ./src/index.ts\n * 3. LSP servers start lazily when you first use a tool on a file\n */\n\nimport type { ExtensionAPI, ToolDefinition } from \"@ashx-j/lunr\";\nimport type { TSchema } from \"typebox\";\nimport { awaitWithAbort } from \"../../../utils/await-with-abort.ts\";\nimport {\n isReadToolResult,\n isWriteToolResult,\n isEditToolResult,\n} from \"../../../core/extensions/types.js\";\nimport { DiagnosticSeverity } from \"vscode-languageserver-protocol\";\n\nimport type { WorkspaceProvider } from \"./workspace-provider.js\";\nimport { LspRuntimeHost, type LspRuntimeCallbacks } from \"./runtime.js\";\nimport { createDiagnosticsTool } from \"./tools/diagnostics.js\";\nimport { createHoverTool } from \"./tools/hover.js\";\nimport { createDefinitionTool } from \"./tools/definition.js\";\nimport { createReferencesTool } from \"./tools/references.js\";\nimport { createSymbolsTool } from \"./tools/symbols.js\";\nimport { createRenameTool } from \"./tools/rename.js\";\nimport { createCodeOverviewTool } from \"./tools/code-overview.js\";\nimport { createCompletionsTool } from \"./tools/completions.js\";\nimport { createCodeSearchTool } from \"./tools/code-search.js\";\nimport { createCodeRewriteTool } from \"./tools/code-rewrite.js\";\nimport { createCodeActionsTool } from \"./tools/code-actions.js\";\nimport { syntheticDotLocks } from \"./tools/completions.js\";\nimport { relative } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { DIAGNOSTIC_SETTLE_DELAY_MS } from \"./shared/timing.js\";\n\n/**\n * Project-level LSP config — loaded from `.pi-lsp.json` in the workspace root.\n *\n * Example:\n * ```json\n * {\n * \"autoStart\": [\"java\", \"typescript\"],\n * \"lombokJar\": \"env/Lombok-1.18.x/runtime/lib/lombok-1.18.42.jar\",\n * \"servers\": {\n * \"python\": { \"command\": \"pylsp\", \"args\": [] }\n * }\n * }\n * ```\n */\ninterface ProjectLspConfig {\n /** Languages to start eagerly on session_start (e.g. [\"java\", \"typescript\"]) */\n autoStart?: string[];\n /** Path to Lombok jar (absolute or relative to project root). \"auto\" to auto-detect. */\n lombokJar?: string;\n /** Custom server configs keyed by language ID */\n servers?: Record<string, { command: string; args?: string[]; env?: Record<string, string>; initializationOptions?: Record<string, unknown>; settings?: Record<string, unknown> }>;\n /**\n * Auto-inject LSP error diagnostics into write/edit tool results.\n * Set to false to disable, or provide an array of language IDs to enable selectively.\n * Default: true (all languages).\n *\n * Examples:\n * true — inject for all languages\n * false — never inject\n * [\"typescript\"] — only inject for TypeScript files\n */\n autoInjectDiagnostics?: boolean | string[];\n}\n\ninterface ServerConfig {\n command: string;\n args: string[];\n env?: Record<string, string>;\n initializationOptions?: Record<string, unknown>;\n settings?: Record<string, unknown>;\n}\n\n/** Load .pi-lsp.json from a directory. Returns null if not found or invalid. */\nfunction loadProjectConfig(dir: string): ProjectLspConfig | null {\n const configPath = join(dir, \".pi-lsp.json\");\n try {\n if (!existsSync(configPath)) return null;\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n return parsed as ProjectLspConfig;\n } catch {\n return null;\n }\n}\n\nfunction createServiceProxy<T extends object>(getTarget: () => T | null, label: string): T {\n return new Proxy({} as T, {\n get(_target, prop, receiver) {\n const service = getTarget();\n if (!service) {\n throw new Error(`${label} is not initialized`);\n }\n const value = Reflect.get(service, prop, service);\n if (typeof value === \"function\") {\n return value.bind(service);\n }\n return value;\n },\n });\n}\n\nfunction registerToolWithRuntime<T extends TSchema, D>(pi: ExtensionAPI, tool: ToolDefinition<T, D>, ensure: () => Promise<unknown>, host: LspRuntimeHost) {\n pi.registerTool({\n ...tool,\n async execute(id, params, signal, onUpdate, ctx) {\n const generation = host.getGeneration();\n signal?.throwIfAborted();\n await awaitWithAbort(ensure(), signal);\n signal?.throwIfAborted();\n if (host.getGeneration() !== generation) throw new Error(\"LSP session changed before execution\");\n return tool.execute(id, params, signal, onUpdate, ctx);\n },\n });\n}\n\nexport default function lspExtension(pi: ExtensionAPI) {\n const host = new LspRuntimeHost();\n let pendingProvider: WorkspaceProvider | null = null;\n let latestCtx: any = null;\n let projectConfig: ProjectLspConfig | null = null;\n let sessionCwd = process.cwd();\n\n /**\n * Run `fn` with the currently captured ctx, swallowing stale-ctx errors.\n *\n * Lifecycle callbacks from LspManager (server ready, workspace setup, etc.)\n * and `pi.events` listeners can fire AFTER the session is replaced or reloaded,\n * at which point the captured ctx has been invalidated and any property access\n * throws via ExtensionRunner.assertActive(). We can't use optional chaining to\n * dodge it because the `ui` / `theme` getters themselves run assertActive().\n */\n const withLatestCtx = (fn: (ctx: any) => void) => {\n const ctx = latestCtx;\n if (!ctx) return;\n try {\n fn(ctx);\n } catch (err: any) {\n if (typeof err?.message === \"string\" && err.message.includes(\"stale after session\")) {\n // Session was replaced/reloaded — drop the stale ctx and move on.\n latestCtx = null;\n return;\n }\n throw err;\n }\n };\n\n const applyProvider = (data: unknown) => {\n const provider = data as WorkspaceProvider;\n pendingProvider = provider;\n host.setPendingProvider(provider);\n const statusText = provider.getStatusText();\n if (!statusText) return;\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n });\n };\n\n pi.events.on(\"lsp:register-workspace-provider\", applyProvider);\n\n // Check for provider registered before our listener existed\n const existing = (pi.events as any)[\"lsp:workspace-provider\"];\n if (existing) applyProvider(existing);\n\n const setLspStatus = (color: string, text: string) => {\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(color, text));\n });\n };\n\n const makeCallbacks = (): LspRuntimeCallbacks => ({\n onWorkspaceSetupStart: () => {\n setLspStatus(\"warning\", \"LSP: workspace setup...\");\n },\n onWorkspaceSetupEnd: (success: boolean, duration: number) => {\n const secs = (duration / 1000).toFixed(1);\n if (success) {\n setLspStatus(\"accent\", `LSP: workspace ready (${secs}s)`);\n } else {\n setLspStatus(\"warning\", `LSP: workspace setup failed (${secs}s)`);\n }\n },\n onServerStart: (languageId: string, command: string) => {\n setLspStatus(\"warning\", `LSP: starting ${languageId} (${command})...`);\n },\n onServerReady: (languageId: string) => {\n setLspStatus(\"accent\", `LSP: ${languageId} ready`);\n },\n onServerError: (languageId: string, _error: string) => {\n setLspStatus(\"error\", `LSP: ${languageId} failed`);\n },\n onServerCrash: (languageId: string, restarting: boolean, attempt: number) => {\n if (restarting) {\n setLspStatus(\"warning\", `LSP: restarting ${languageId}... (attempt ${attempt}/3)`);\n } else {\n setLspStatus(\"error\", `LSP: ${languageId} crashed — auto-restart exhausted`);\n }\n },\n });\n\n const applyProjectConfigToManager = (manager: { setServerConfig: Function; setLombokJar: Function }, config: ProjectLspConfig | null) => {\n if (!config) return;\n if (config.servers) {\n for (const [lang, serverConf] of Object.entries(config.servers)) {\n manager.setServerConfig(lang, {\n command: serverConf.command,\n args: serverConf.args ?? [],\n env: serverConf.env,\n initializationOptions: serverConf.initializationOptions,\n settings: serverConf.settings,\n });\n }\n }\n if (config.lombokJar && config.lombokJar !== \"auto\") {\n manager.setLombokJar(config.lombokJar);\n }\n };\n\n const buildBindOptions = (cwd: string) => ({\n cwd,\n callbacks: makeCallbacks(),\n pendingProvider,\n syntheticDotChecker: (uri: string) => syntheticDotLocks.has(uri),\n configureManager: (manager) => {\n applyProjectConfigToManager(manager, projectConfig);\n },\n });\n\n const ensureRuntime = async () => {\n return host.ensureServices(\n buildBindOptions(sessionCwd || process.cwd()),\n );\n };\n\n // session_start binds cwd/config only. Heavy managers load on first use,\n // unless autoStart is configured (then ensure + startEagerly).\n pi.on(\"session_start\", async (_event, ctx) => {\n latestCtx = ctx;\n sessionCwd = ctx.cwd;\n\n projectConfig = ctx.isProjectTrusted() ? loadProjectConfig(ctx.cwd) : null;\n await host.bindSession(buildBindOptions(ctx.cwd));\n\n const statusText = pendingProvider?.getStatusText?.() ?? \"\";\n if (statusText) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n } else {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n }\n\n if (projectConfig?.autoStart && projectConfig.autoStart.length > 0) {\n const langs = projectConfig.autoStart;\n const generation = host.getGeneration();\n void ensureRuntime().then((services) => {\n if (host.getGeneration() !== generation) return;\n const lombokJar = services.manager.getLombokJar?.() ?? null;\n const lombokNote = langs.includes(\"java\") && lombokJar\n ? ` (lombok: ${String(lombokJar).split(/[/\\\\]/).pop()})`\n : \"\";\n setLspStatus(\"warning\", `LSP: auto-starting ${langs.join(\", \")}${lombokNote}...`);\n services.manager.startEagerly(langs);\n }).catch((error) => {\n if (host.getGeneration() === generation) setLspStatus(\"error\", `LSP startup failed: ${String(error)}`);\n });\n }\n });\n\n const managerProxy = createServiceProxy(\n () => host.getServicesIfReady()?.manager ?? null,\n \"LSP manager\",\n );\n const treeSitterProxy = createServiceProxy(\n () => host.getServicesIfReady()?.treeSitter ?? null,\n \"Tree-sitter manager\",\n );\n const workspaceIndexProxy = createServiceProxy(\n () => host.getServicesIfReady()?.workspaceIndex ?? null,\n \"Workspace index\",\n );\n\n registerToolWithRuntime(pi, createDiagnosticsTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createHoverTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createDefinitionTool(managerProxy, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createReferencesTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createSymbolsTool(managerProxy, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createRenameTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeActionsTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCompletionsTool(\n managerProxy,\n {\n getTrackedVersion: (uri) => {\n const services = host.getServicesIfReady();\n if (!services) return null;\n return services.fileSync.getTrackedVersion(uri);\n },\n setTrackedVersion: (uri, v) => {\n host.getServicesIfReady()?.fileSync.setTrackedVersion(uri, v);\n },\n isSyntheticDotActive: (uri) => syntheticDotLocks.has(uri),\n },\n treeSitterProxy,\n ), ensureRuntime, host);\n const getRootDir = () => {\n const manager = host.getServicesIfReady()?.manager;\n if (manager) return manager.resolvePath(\".\");\n return sessionCwd || process.cwd();\n };\n registerToolWithRuntime(pi, createCodeOverviewTool(getRootDir, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeSearchTool(getRootDir, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeRewriteTool(getRootDir, treeSitterProxy, {\n onFileModified: (filePath: string) => {\n const services = host.getServicesIfReady();\n if (!services) return;\n services.fileSync.handleFileWrite(filePath).catch(() => {});\n },\n }), ensureRuntime, host);\n\n // File sync: track file reads/writes/edits without loading runtime on plain reads\n // when LSP was never used. Writes may start a server (existing behavior) so they\n // ensure runtime. After writes/edits, append file-scoped error diagnostics.\n pi.on(\"tool_result\", async (event) => {\n const generation = host.getGeneration();\n try {\n if (isReadToolResult(event) && !event.isError) {\n const services = host.getServicesIfReady();\n if (services) {\n const path = (event.input as any)?.path;\n if (path) await services.fileSync.handleFileRead(path);\n if (host.getGeneration() !== generation) return;\n }\n }\n\n if ((isWriteToolResult(event) || isEditToolResult(event)) && !event.isError) {\n const path = (event.input as any)?.path;\n if (path) {\n const services = await ensureRuntime();\n if (host.getGeneration() !== generation) return;\n await services.fileSync.handleFileWrite(path);\n }\n }\n } catch {\n // File sync errors are non-fatal\n }\n\n if (host.getGeneration() !== generation) return;\n // Auto-append diagnostics for the changed file (write/edit only)\n const services = host.getServicesIfReady();\n if ((isWriteToolResult(event) || isEditToolResult(event)) && !event.isError && services) {\n const path = (event.input as any)?.path;\n if (!path) return;\n\n const manager = services.manager;\n const languageId = manager.getLanguageId(path);\n if (!languageId) return;\n\n // Check autoInjectDiagnostics config\n const inject = projectConfig?.autoInjectDiagnostics;\n if (inject === false) return;\n if (Array.isArray(inject) && !inject.includes(languageId)) return;\n\n const client = manager.getRunningClient(languageId);\n if (!client) return;\n\n // Wait briefly for the LSP to publish updated diagnostics\n await new Promise((r) => setTimeout(r, DIAGNOSTIC_SETTLE_DELAY_MS));\n if (host.getGeneration() !== generation) return;\n\n const uri = manager.getFileUri(path);\n const diagnostics = client.getDiagnostics(uri);\n const errors = diagnostics.filter((d) => d.severity === DiagnosticSeverity.Error);\n\n if (errors.length === 0) return;\n\n // Build a compact summary — just errors, max 10 lines\n const relPath = relative(manager.resolvePath(\".\"), manager.resolvePath(path));\n const lines = errors.slice(0, 10).map((d) => {\n const line = d.range.start.line + 1;\n const col = d.range.start.character + 1;\n const source = d.source ? ` [${d.source}]` : \"\";\n return `${relPath}:${line}:${col} error: ${d.message}${source}`;\n });\n if (errors.length > 10) {\n lines.push(`... and ${errors.length - 10} more error(s)`);\n }\n\n const summary = `\\n\\n⚠ LSP: ${errors.length} error(s) in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\n return {\n content: [\n ...event.content,\n { type: \"text\" as const, text: summary },\n ],\n };\n }\n });\n\n // Update status after tool execution ends\n pi.on(\"tool_execution_end\", async (_event, ctx) => {\n latestCtx = ctx;\n const services = host.getServicesIfReady();\n if (!services) return;\n const statuses = services.manager.getStatus();\n const running = statuses.filter((s) => s.running);\n if (running.length === 0) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n } else {\n const totalDiags = running.reduce((n, s) => n + s.diagnosticsCount, 0);\n const langs = running.map((s) => s.languageId).join(\", \");\n let status = `LSP: ${langs}`;\n if (totalDiags > 0) {\n status += ` (${totalDiags} diagnostic${totalDiags !== 1 ? \"s\" : \"\"})`;\n }\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", status));\n }\n });\n\n // /lsp command — show server status\n pi.registerCommand(\"lsp\", {\n description: \"Show LSP server status\",\n handler: async (_args, ctx) => {\n const services = host.getServicesIfReady();\n if (!services) {\n ctx.ui.notify(\n host.isInitializing() ? \"LSP runtime is starting\" : \"LSP runtime is idle (not started)\",\n \"info\",\n );\n return;\n }\n\n const statuses = services.manager.getStatus();\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers configured\", \"info\");\n return;\n }\n\n const lines = statuses.map((s) => {\n const icon = s.running ? \"🟢\" : \"⚪\";\n const diags =\n s.diagnosticsCount > 0 ? ` (${s.diagnosticsCount} diagnostics)` : \"\";\n const shared = s.shared ? \" [shared]\" : \"\";\n return `${icon} ${s.languageId}: ${s.command}${diags}${shared}`;\n });\n\n ctx.ui.notify(lines.join(\"\\n\"), \"info\");\n },\n });\n\n // /lsp-restart command — restart a specific language server\n pi.registerCommand(\"lsp-restart\", {\n description: \"Restart an LSP server: /lsp-restart <language> (e.g. java, typescript)\",\n handler: async (args, ctx) => {\n const services = host.getServicesIfReady();\n if (!services) {\n if (args?.trim()) {\n ctx.ui.notify(\n host.isInitializing()\n ? \"LSP runtime is starting\"\n : \"LSP runtime is idle. Run an LSP tool before restarting a server.\",\n \"info\",\n );\n } else {\n ctx.ui.notify(\"No LSP servers are running.\\n\\nUsage: /lsp-restart <language>\", \"info\");\n }\n return;\n }\n\n const languageId = args?.trim().toLowerCase();\n if (!languageId) {\n // Show running servers and usage\n const statuses = services.manager.getStatus().filter((s) => s.running);\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers are running.\\n\\nUsage: /lsp-restart <language>\", \"info\");\n } else {\n const langs = statuses.map((s) => s.languageId).join(\", \");\n ctx.ui.notify(\n `Running servers: ${langs}\\n\\nUsage: /lsp-restart <language>\\nExample: /lsp-restart java`,\n \"info\"\n );\n }\n return;\n }\n\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"warning\", `LSP: restarting ${languageId}...`));\n ctx.ui.notify(`Restarting ${languageId} server (kills daemon if shared)...`, \"info\");\n\n try {\n await services.manager.restartServer(languageId);\n const lombokJar = languageId === \"java\" ? services.manager.getLombokJar() : null;\n const lombokNote = lombokJar ? `\\nLombok: ${lombokJar}` : \"\";\n ctx.ui.notify(`${languageId} server restarted successfully.${lombokNote}`, \"info\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${languageId} ready`));\n } catch (err: any) {\n ctx.ui.notify(`Failed to restart ${languageId}: ${err.message}`, \"error\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"error\", `LSP: ${languageId} restart failed`));\n }\n },\n });\n\n // /lsp-config command — add or override server configuration\n pi.registerCommand(\"lsp-config\", {\n description:\n \"Configure an LSP server: /lsp-config <language> <command> [args...]\",\n handler: async (args, ctx) => {\n if (!args?.trim()) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\\nExample: /lsp-config python pylsp\",\n \"info\"\n );\n return;\n }\n\n const parts = args.trim().split(/\\s+/);\n if (parts.length < 2) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\",\n \"warning\"\n );\n return;\n }\n\n const [languageId, command, ...serverArgs] = parts;\n const config: ServerConfig = { command, args: serverArgs };\n\n const services = await ensureRuntime();\n services.manager.setServerConfig(languageId, config);\n ctx.ui.notify(\n `Configured LSP for ${languageId}: ${command} ${serverArgs.join(\" \")}`,\n \"info\"\n );\n },\n });\n\n // /lsp-lombok command — set Lombok jar path for Java\n pi.registerCommand(\"lsp-lombok\", {\n description:\n \"Set Lombok jar path for Java: /lsp-lombok <path-to-lombok.jar>\",\n handler: async (args, ctx) => {\n const services = await ensureRuntime();\n const mgr = services.manager;\n\n if (!args?.trim()) {\n const current = mgr.getLombokJar();\n if (current) {\n ctx.ui.notify(`Lombok jar: ${current}`, \"info\");\n } else {\n ctx.ui.notify(\n \"No Lombok jar configured or detected.\\n\\n\" +\n \"Usage: /lsp-lombok <path-to-lombok.jar>\\n\" +\n \"Or set LOMBOK_JAR environment variable.\\n\\n\" +\n \"Download from: https://projectlombok.org/download\",\n \"info\"\n );\n }\n return;\n }\n\n const jarPath = args.trim();\n const resolved = resolve(ctx.cwd, jarPath);\n\n if (!existsSync(resolved)) {\n ctx.ui.notify(`File not found: ${resolved}`, \"error\");\n return;\n }\n\n if (!resolved.endsWith(\".jar\")) {\n ctx.ui.notify(`Warning: ${resolved} doesn't end in .jar — setting anyway`, \"warning\");\n }\n\n mgr.setLombokJar(resolved);\n ctx.ui.notify(`Lombok jar set: ${resolved}`, \"info\");\n },\n });\n\n // Clean shutdown — never loads heavy modules if they were unused\n pi.on(\"session_shutdown\", async () => {\n // Drop the captured ctx immediately — once shutdown fires, any late\n // LSP manager callback that reaches setLspStatus/applyProvider would\n // otherwise hit an invalidated ctx and throw an uncaught exception.\n latestCtx = null;\n await host.shutdown();\n });\n}\n\nexport { LspRuntimeHost } from \"./runtime.js\";\n"]}
|
|
@@ -90,20 +90,6 @@ function registerToolWithRuntime(pi, tool, ensure, host) {
|
|
|
90
90
|
});
|
|
91
91
|
}
|
|
92
92
|
export default function lspExtension(pi) {
|
|
93
|
-
// Prevent EPIPE errors from LSP server exits from crashing the host process.
|
|
94
|
-
// When an LSP server exits unexpectedly, in-flight writes to its stdin pipe
|
|
95
|
-
// can produce EPIPE errors that escape all connection-level error handlers.
|
|
96
|
-
const origListeners = process.listeners("uncaughtException");
|
|
97
|
-
process.on("uncaughtException", (err) => {
|
|
98
|
-
if (err?.code === "EPIPE")
|
|
99
|
-
return; // swallow — LSP server exited, harmless
|
|
100
|
-
// Re-throw for other handlers
|
|
101
|
-
for (const listener of origListeners)
|
|
102
|
-
listener(err);
|
|
103
|
-
if (origListeners.length === 0) {
|
|
104
|
-
console.error("[LSP] Uncaught exception:", err);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
93
|
const host = new LspRuntimeHost();
|
|
108
94
|
let pendingProvider = null;
|
|
109
95
|
let latestCtx = null;
|
|
@@ -225,7 +211,7 @@ export default function lspExtension(pi) {
|
|
|
225
211
|
pi.on("session_start", async (_event, ctx) => {
|
|
226
212
|
latestCtx = ctx;
|
|
227
213
|
sessionCwd = ctx.cwd;
|
|
228
|
-
projectConfig = loadProjectConfig(ctx.cwd);
|
|
214
|
+
projectConfig = ctx.isProjectTrusted() ? loadProjectConfig(ctx.cwd) : null;
|
|
229
215
|
await host.bindSession(buildBindOptions(ctx.cwd));
|
|
230
216
|
const statusText = pendingProvider?.getStatusText?.() ?? "";
|
|
231
217
|
if (statusText) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * pi-lsp-extension — Pi coding agent extension for LSP integration.\n *\n * Exposes Language Server Protocol capabilities as tools the LLM can call:\n * - lsp_diagnostics: compilation errors and warnings\n * - lsp_hover: type info and docs at a position\n * - lsp_definition: go to definition\n * - lsp_references: find all references\n * - lsp_symbols: file/workspace symbol search\n * - lsp_rename: preview rename refactoring\n * - lsp_completions: code completion suggestions at a position\n * - lsp_code_actions: quick fixes, refactorings, and source actions\n *\n * Position-based tools (hover, definition, references, rename, code_actions)\n * accept an optional `query` parameter as an alternative to line/character,\n * resolving a symbol name to its position automatically.\n *\n * Tool schemas, commands, and hooks register immediately. Heavy managers\n * (LspManager, FileSync, Tree-sitter/WASM, WorkspaceIndex) load on first use.\n *\n * Usage:\n * 1. npm install in this directory\n * 2. Add to pi via settings.json extensions, or: pi -e ./src/index.ts\n * 3. LSP servers start lazily when you first use a tool on a file\n */\n\nimport type { ExtensionAPI, ToolDefinition } from \"@ashx-j/lunr\";\nimport type { TSchema } from \"typebox\";\nimport { awaitWithAbort } from \"../../../utils/await-with-abort.ts\";\nimport {\n isReadToolResult,\n isWriteToolResult,\n isEditToolResult,\n} from \"../../../core/extensions/types.js\";\nimport { DiagnosticSeverity } from \"vscode-languageserver-protocol\";\n\nimport type { WorkspaceProvider } from \"./workspace-provider.js\";\nimport { LspRuntimeHost, type LspRuntimeCallbacks } from \"./runtime.js\";\nimport { createDiagnosticsTool } from \"./tools/diagnostics.js\";\nimport { createHoverTool } from \"./tools/hover.js\";\nimport { createDefinitionTool } from \"./tools/definition.js\";\nimport { createReferencesTool } from \"./tools/references.js\";\nimport { createSymbolsTool } from \"./tools/symbols.js\";\nimport { createRenameTool } from \"./tools/rename.js\";\nimport { createCodeOverviewTool } from \"./tools/code-overview.js\";\nimport { createCompletionsTool } from \"./tools/completions.js\";\nimport { createCodeSearchTool } from \"./tools/code-search.js\";\nimport { createCodeRewriteTool } from \"./tools/code-rewrite.js\";\nimport { createCodeActionsTool } from \"./tools/code-actions.js\";\nimport { syntheticDotLocks } from \"./tools/completions.js\";\nimport { relative } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { DIAGNOSTIC_SETTLE_DELAY_MS } from \"./shared/timing.js\";\n\n/**\n * Project-level LSP config — loaded from `.pi-lsp.json` in the workspace root.\n *\n * Example:\n * ```json\n * {\n * \"autoStart\": [\"java\", \"typescript\"],\n * \"lombokJar\": \"env/Lombok-1.18.x/runtime/lib/lombok-1.18.42.jar\",\n * \"servers\": {\n * \"python\": { \"command\": \"pylsp\", \"args\": [] }\n * }\n * }\n * ```\n */\ninterface ProjectLspConfig {\n /** Languages to start eagerly on session_start (e.g. [\"java\", \"typescript\"]) */\n autoStart?: string[];\n /** Path to Lombok jar (absolute or relative to project root). \"auto\" to auto-detect. */\n lombokJar?: string;\n /** Custom server configs keyed by language ID */\n servers?: Record<string, { command: string; args?: string[]; env?: Record<string, string>; initializationOptions?: Record<string, unknown>; settings?: Record<string, unknown> }>;\n /**\n * Auto-inject LSP error diagnostics into write/edit tool results.\n * Set to false to disable, or provide an array of language IDs to enable selectively.\n * Default: true (all languages).\n *\n * Examples:\n * true — inject for all languages\n * false — never inject\n * [\"typescript\"] — only inject for TypeScript files\n */\n autoInjectDiagnostics?: boolean | string[];\n}\n\ninterface ServerConfig {\n command: string;\n args: string[];\n env?: Record<string, string>;\n initializationOptions?: Record<string, unknown>;\n settings?: Record<string, unknown>;\n}\n\n/** Load .pi-lsp.json from a directory. Returns null if not found or invalid. */\nfunction loadProjectConfig(dir: string): ProjectLspConfig | null {\n const configPath = join(dir, \".pi-lsp.json\");\n try {\n if (!existsSync(configPath)) return null;\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n return parsed as ProjectLspConfig;\n } catch {\n return null;\n }\n}\n\nfunction createServiceProxy<T extends object>(getTarget: () => T | null, label: string): T {\n return new Proxy({} as T, {\n get(_target, prop, receiver) {\n const service = getTarget();\n if (!service) {\n throw new Error(`${label} is not initialized`);\n }\n const value = Reflect.get(service, prop, service);\n if (typeof value === \"function\") {\n return value.bind(service);\n }\n return value;\n },\n });\n}\n\nfunction registerToolWithRuntime<T extends TSchema, D>(pi: ExtensionAPI, tool: ToolDefinition<T, D>, ensure: () => Promise<unknown>, host: LspRuntimeHost) {\n pi.registerTool({\n ...tool,\n async execute(id, params, signal, onUpdate, ctx) {\n const generation = host.getGeneration();\n signal?.throwIfAborted();\n await awaitWithAbort(ensure(), signal);\n signal?.throwIfAborted();\n if (host.getGeneration() !== generation) throw new Error(\"LSP session changed before execution\");\n return tool.execute(id, params, signal, onUpdate, ctx);\n },\n });\n}\n\nexport default function lspExtension(pi: ExtensionAPI) {\n // Prevent EPIPE errors from LSP server exits from crashing the host process.\n // When an LSP server exits unexpectedly, in-flight writes to its stdin pipe\n // can produce EPIPE errors that escape all connection-level error handlers.\n const origListeners = process.listeners(\"uncaughtException\");\n process.on(\"uncaughtException\", (err: any) => {\n if (err?.code === \"EPIPE\") return; // swallow — LSP server exited, harmless\n // Re-throw for other handlers\n for (const listener of origListeners) (listener as any)(err);\n if (origListeners.length === 0) {\n console.error(\"[LSP] Uncaught exception:\", err);\n }\n });\n\n const host = new LspRuntimeHost();\n let pendingProvider: WorkspaceProvider | null = null;\n let latestCtx: any = null;\n let projectConfig: ProjectLspConfig | null = null;\n let sessionCwd = process.cwd();\n\n /**\n * Run `fn` with the currently captured ctx, swallowing stale-ctx errors.\n *\n * Lifecycle callbacks from LspManager (server ready, workspace setup, etc.)\n * and `pi.events` listeners can fire AFTER the session is replaced or reloaded,\n * at which point the captured ctx has been invalidated and any property access\n * throws via ExtensionRunner.assertActive(). We can't use optional chaining to\n * dodge it because the `ui` / `theme` getters themselves run assertActive().\n */\n const withLatestCtx = (fn: (ctx: any) => void) => {\n const ctx = latestCtx;\n if (!ctx) return;\n try {\n fn(ctx);\n } catch (err: any) {\n if (typeof err?.message === \"string\" && err.message.includes(\"stale after session\")) {\n // Session was replaced/reloaded — drop the stale ctx and move on.\n latestCtx = null;\n return;\n }\n throw err;\n }\n };\n\n const applyProvider = (data: unknown) => {\n const provider = data as WorkspaceProvider;\n pendingProvider = provider;\n host.setPendingProvider(provider);\n const statusText = provider.getStatusText();\n if (!statusText) return;\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n });\n };\n\n pi.events.on(\"lsp:register-workspace-provider\", applyProvider);\n\n // Check for provider registered before our listener existed\n const existing = (pi.events as any)[\"lsp:workspace-provider\"];\n if (existing) applyProvider(existing);\n\n const setLspStatus = (color: string, text: string) => {\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(color, text));\n });\n };\n\n const makeCallbacks = (): LspRuntimeCallbacks => ({\n onWorkspaceSetupStart: () => {\n setLspStatus(\"warning\", \"LSP: workspace setup...\");\n },\n onWorkspaceSetupEnd: (success: boolean, duration: number) => {\n const secs = (duration / 1000).toFixed(1);\n if (success) {\n setLspStatus(\"accent\", `LSP: workspace ready (${secs}s)`);\n } else {\n setLspStatus(\"warning\", `LSP: workspace setup failed (${secs}s)`);\n }\n },\n onServerStart: (languageId: string, command: string) => {\n setLspStatus(\"warning\", `LSP: starting ${languageId} (${command})...`);\n },\n onServerReady: (languageId: string) => {\n setLspStatus(\"accent\", `LSP: ${languageId} ready`);\n },\n onServerError: (languageId: string, _error: string) => {\n setLspStatus(\"error\", `LSP: ${languageId} failed`);\n },\n onServerCrash: (languageId: string, restarting: boolean, attempt: number) => {\n if (restarting) {\n setLspStatus(\"warning\", `LSP: restarting ${languageId}... (attempt ${attempt}/3)`);\n } else {\n setLspStatus(\"error\", `LSP: ${languageId} crashed — auto-restart exhausted`);\n }\n },\n });\n\n const applyProjectConfigToManager = (manager: { setServerConfig: Function; setLombokJar: Function }, config: ProjectLspConfig | null) => {\n if (!config) return;\n if (config.servers) {\n for (const [lang, serverConf] of Object.entries(config.servers)) {\n manager.setServerConfig(lang, {\n command: serverConf.command,\n args: serverConf.args ?? [],\n env: serverConf.env,\n initializationOptions: serverConf.initializationOptions,\n settings: serverConf.settings,\n });\n }\n }\n if (config.lombokJar && config.lombokJar !== \"auto\") {\n manager.setLombokJar(config.lombokJar);\n }\n };\n\n const buildBindOptions = (cwd: string) => ({\n cwd,\n callbacks: makeCallbacks(),\n pendingProvider,\n syntheticDotChecker: (uri: string) => syntheticDotLocks.has(uri),\n configureManager: (manager) => {\n applyProjectConfigToManager(manager, projectConfig);\n },\n });\n\n const ensureRuntime = async () => {\n return host.ensureServices(\n buildBindOptions(sessionCwd || process.cwd()),\n );\n };\n\n // session_start binds cwd/config only. Heavy managers load on first use,\n // unless autoStart is configured (then ensure + startEagerly).\n pi.on(\"session_start\", async (_event, ctx) => {\n latestCtx = ctx;\n sessionCwd = ctx.cwd;\n\n projectConfig = loadProjectConfig(ctx.cwd);\n await host.bindSession(buildBindOptions(ctx.cwd));\n\n const statusText = pendingProvider?.getStatusText?.() ?? \"\";\n if (statusText) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n } else {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n }\n\n if (projectConfig?.autoStart && projectConfig.autoStart.length > 0) {\n const langs = projectConfig.autoStart;\n const generation = host.getGeneration();\n void ensureRuntime().then((services) => {\n if (host.getGeneration() !== generation) return;\n const lombokJar = services.manager.getLombokJar?.() ?? null;\n const lombokNote = langs.includes(\"java\") && lombokJar\n ? ` (lombok: ${String(lombokJar).split(/[/\\\\]/).pop()})`\n : \"\";\n setLspStatus(\"warning\", `LSP: auto-starting ${langs.join(\", \")}${lombokNote}...`);\n services.manager.startEagerly(langs);\n }).catch((error) => {\n if (host.getGeneration() === generation) setLspStatus(\"error\", `LSP startup failed: ${String(error)}`);\n });\n }\n });\n\n const managerProxy = createServiceProxy(\n () => host.getServicesIfReady()?.manager ?? null,\n \"LSP manager\",\n );\n const treeSitterProxy = createServiceProxy(\n () => host.getServicesIfReady()?.treeSitter ?? null,\n \"Tree-sitter manager\",\n );\n const workspaceIndexProxy = createServiceProxy(\n () => host.getServicesIfReady()?.workspaceIndex ?? null,\n \"Workspace index\",\n );\n\n registerToolWithRuntime(pi, createDiagnosticsTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createHoverTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createDefinitionTool(managerProxy, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createReferencesTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createSymbolsTool(managerProxy, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createRenameTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeActionsTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCompletionsTool(\n managerProxy,\n {\n getTrackedVersion: (uri) => {\n const services = host.getServicesIfReady();\n if (!services) return null;\n return services.fileSync.getTrackedVersion(uri);\n },\n setTrackedVersion: (uri, v) => {\n host.getServicesIfReady()?.fileSync.setTrackedVersion(uri, v);\n },\n isSyntheticDotActive: (uri) => syntheticDotLocks.has(uri),\n },\n treeSitterProxy,\n ), ensureRuntime, host);\n const getRootDir = () => {\n const manager = host.getServicesIfReady()?.manager;\n if (manager) return manager.resolvePath(\".\");\n return sessionCwd || process.cwd();\n };\n registerToolWithRuntime(pi, createCodeOverviewTool(getRootDir, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeSearchTool(getRootDir, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeRewriteTool(getRootDir, treeSitterProxy, {\n onFileModified: (filePath: string) => {\n const services = host.getServicesIfReady();\n if (!services) return;\n services.fileSync.handleFileWrite(filePath).catch(() => {});\n },\n }), ensureRuntime, host);\n\n // File sync: track file reads/writes/edits without loading runtime on plain reads\n // when LSP was never used. Writes may start a server (existing behavior) so they\n // ensure runtime. After writes/edits, append file-scoped error diagnostics.\n pi.on(\"tool_result\", async (event) => {\n const generation = host.getGeneration();\n try {\n if (isReadToolResult(event) && !event.isError) {\n const services = host.getServicesIfReady();\n if (services) {\n const path = (event.input as any)?.path;\n if (path) await services.fileSync.handleFileRead(path);\n if (host.getGeneration() !== generation) return;\n }\n }\n\n if ((isWriteToolResult(event) || isEditToolResult(event)) && !event.isError) {\n const path = (event.input as any)?.path;\n if (path) {\n const services = await ensureRuntime();\n if (host.getGeneration() !== generation) return;\n await services.fileSync.handleFileWrite(path);\n }\n }\n } catch {\n // File sync errors are non-fatal\n }\n\n if (host.getGeneration() !== generation) return;\n // Auto-append diagnostics for the changed file (write/edit only)\n const services = host.getServicesIfReady();\n if ((isWriteToolResult(event) || isEditToolResult(event)) && !event.isError && services) {\n const path = (event.input as any)?.path;\n if (!path) return;\n\n const manager = services.manager;\n const languageId = manager.getLanguageId(path);\n if (!languageId) return;\n\n // Check autoInjectDiagnostics config\n const inject = projectConfig?.autoInjectDiagnostics;\n if (inject === false) return;\n if (Array.isArray(inject) && !inject.includes(languageId)) return;\n\n const client = manager.getRunningClient(languageId);\n if (!client) return;\n\n // Wait briefly for the LSP to publish updated diagnostics\n await new Promise((r) => setTimeout(r, DIAGNOSTIC_SETTLE_DELAY_MS));\n if (host.getGeneration() !== generation) return;\n\n const uri = manager.getFileUri(path);\n const diagnostics = client.getDiagnostics(uri);\n const errors = diagnostics.filter((d) => d.severity === DiagnosticSeverity.Error);\n\n if (errors.length === 0) return;\n\n // Build a compact summary — just errors, max 10 lines\n const relPath = relative(manager.resolvePath(\".\"), manager.resolvePath(path));\n const lines = errors.slice(0, 10).map((d) => {\n const line = d.range.start.line + 1;\n const col = d.range.start.character + 1;\n const source = d.source ? ` [${d.source}]` : \"\";\n return `${relPath}:${line}:${col} error: ${d.message}${source}`;\n });\n if (errors.length > 10) {\n lines.push(`... and ${errors.length - 10} more error(s)`);\n }\n\n const summary = `\\n\\n⚠ LSP: ${errors.length} error(s) in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\n return {\n content: [\n ...event.content,\n { type: \"text\" as const, text: summary },\n ],\n };\n }\n });\n\n // Update status after tool execution ends\n pi.on(\"tool_execution_end\", async (_event, ctx) => {\n latestCtx = ctx;\n const services = host.getServicesIfReady();\n if (!services) return;\n const statuses = services.manager.getStatus();\n const running = statuses.filter((s) => s.running);\n if (running.length === 0) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n } else {\n const totalDiags = running.reduce((n, s) => n + s.diagnosticsCount, 0);\n const langs = running.map((s) => s.languageId).join(\", \");\n let status = `LSP: ${langs}`;\n if (totalDiags > 0) {\n status += ` (${totalDiags} diagnostic${totalDiags !== 1 ? \"s\" : \"\"})`;\n }\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", status));\n }\n });\n\n // /lsp command — show server status\n pi.registerCommand(\"lsp\", {\n description: \"Show LSP server status\",\n handler: async (_args, ctx) => {\n const services = host.getServicesIfReady();\n if (!services) {\n ctx.ui.notify(\n host.isInitializing() ? \"LSP runtime is starting\" : \"LSP runtime is idle (not started)\",\n \"info\",\n );\n return;\n }\n\n const statuses = services.manager.getStatus();\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers configured\", \"info\");\n return;\n }\n\n const lines = statuses.map((s) => {\n const icon = s.running ? \"🟢\" : \"⚪\";\n const diags =\n s.diagnosticsCount > 0 ? ` (${s.diagnosticsCount} diagnostics)` : \"\";\n const shared = s.shared ? \" [shared]\" : \"\";\n return `${icon} ${s.languageId}: ${s.command}${diags}${shared}`;\n });\n\n ctx.ui.notify(lines.join(\"\\n\"), \"info\");\n },\n });\n\n // /lsp-restart command — restart a specific language server\n pi.registerCommand(\"lsp-restart\", {\n description: \"Restart an LSP server: /lsp-restart <language> (e.g. java, typescript)\",\n handler: async (args, ctx) => {\n const services = host.getServicesIfReady();\n if (!services) {\n if (args?.trim()) {\n ctx.ui.notify(\n host.isInitializing()\n ? \"LSP runtime is starting\"\n : \"LSP runtime is idle. Run an LSP tool before restarting a server.\",\n \"info\",\n );\n } else {\n ctx.ui.notify(\"No LSP servers are running.\\n\\nUsage: /lsp-restart <language>\", \"info\");\n }\n return;\n }\n\n const languageId = args?.trim().toLowerCase();\n if (!languageId) {\n // Show running servers and usage\n const statuses = services.manager.getStatus().filter((s) => s.running);\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers are running.\\n\\nUsage: /lsp-restart <language>\", \"info\");\n } else {\n const langs = statuses.map((s) => s.languageId).join(\", \");\n ctx.ui.notify(\n `Running servers: ${langs}\\n\\nUsage: /lsp-restart <language>\\nExample: /lsp-restart java`,\n \"info\"\n );\n }\n return;\n }\n\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"warning\", `LSP: restarting ${languageId}...`));\n ctx.ui.notify(`Restarting ${languageId} server (kills daemon if shared)...`, \"info\");\n\n try {\n await services.manager.restartServer(languageId);\n const lombokJar = languageId === \"java\" ? services.manager.getLombokJar() : null;\n const lombokNote = lombokJar ? `\\nLombok: ${lombokJar}` : \"\";\n ctx.ui.notify(`${languageId} server restarted successfully.${lombokNote}`, \"info\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${languageId} ready`));\n } catch (err: any) {\n ctx.ui.notify(`Failed to restart ${languageId}: ${err.message}`, \"error\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"error\", `LSP: ${languageId} restart failed`));\n }\n },\n });\n\n // /lsp-config command — add or override server configuration\n pi.registerCommand(\"lsp-config\", {\n description:\n \"Configure an LSP server: /lsp-config <language> <command> [args...]\",\n handler: async (args, ctx) => {\n if (!args?.trim()) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\\nExample: /lsp-config python pylsp\",\n \"info\"\n );\n return;\n }\n\n const parts = args.trim().split(/\\s+/);\n if (parts.length < 2) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\",\n \"warning\"\n );\n return;\n }\n\n const [languageId, command, ...serverArgs] = parts;\n const config: ServerConfig = { command, args: serverArgs };\n\n const services = await ensureRuntime();\n services.manager.setServerConfig(languageId, config);\n ctx.ui.notify(\n `Configured LSP for ${languageId}: ${command} ${serverArgs.join(\" \")}`,\n \"info\"\n );\n },\n });\n\n // /lsp-lombok command — set Lombok jar path for Java\n pi.registerCommand(\"lsp-lombok\", {\n description:\n \"Set Lombok jar path for Java: /lsp-lombok <path-to-lombok.jar>\",\n handler: async (args, ctx) => {\n const services = await ensureRuntime();\n const mgr = services.manager;\n\n if (!args?.trim()) {\n const current = mgr.getLombokJar();\n if (current) {\n ctx.ui.notify(`Lombok jar: ${current}`, \"info\");\n } else {\n ctx.ui.notify(\n \"No Lombok jar configured or detected.\\n\\n\" +\n \"Usage: /lsp-lombok <path-to-lombok.jar>\\n\" +\n \"Or set LOMBOK_JAR environment variable.\\n\\n\" +\n \"Download from: https://projectlombok.org/download\",\n \"info\"\n );\n }\n return;\n }\n\n const jarPath = args.trim();\n const resolved = resolve(ctx.cwd, jarPath);\n\n if (!existsSync(resolved)) {\n ctx.ui.notify(`File not found: ${resolved}`, \"error\");\n return;\n }\n\n if (!resolved.endsWith(\".jar\")) {\n ctx.ui.notify(`Warning: ${resolved} doesn't end in .jar — setting anyway`, \"warning\");\n }\n\n mgr.setLombokJar(resolved);\n ctx.ui.notify(`Lombok jar set: ${resolved}`, \"info\");\n },\n });\n\n // Clean shutdown — never loads heavy modules if they were unused\n pi.on(\"session_shutdown\", async () => {\n // Drop the captured ctx immediately — once shutdown fires, any late\n // LSP manager callback that reaches setLspStatus/applyProvider would\n // otherwise hit an invalidated ctx and throw an uncaught exception.\n latestCtx = null;\n await host.shutdown();\n });\n}\n\nexport { LspRuntimeHost } from \"./runtime.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/pi-lsp-extension/src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,OAAO,EAAE,cAAc,EAA4B,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AA4ChE,gFAAgF;AAChF,SAAS,iBAAiB,CAAC,GAAW,EAA2B;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/D,OAAO,MAA0B,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AAAA,CACF;AAED,SAAS,kBAAkB,CAAmB,SAAyB,EAAE,KAAa,EAAK;IACzF,OAAO,IAAI,KAAK,CAAC,EAAO,EAAE;QACxB,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAClD,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,KAAK,CAAC;QAAA,CACd;KACF,CAAC,CAAC;AAAA,CACJ;AAED,SAAS,uBAAuB,CAAuB,EAAgB,EAAE,IAA0B,EAAE,MAA8B,EAAE,IAAoB,EAAE;IACzJ,EAAE,CAAC,YAAY,CAAC;QACd,GAAG,IAAI;QACP,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE;YAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,MAAM,cAAc,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;YACvC,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACjG,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAAA,CACxD;KACF,CAAC,CAAC;AAAA,CACJ;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAgB,EAAE;IACrD,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;IAClC,IAAI,eAAe,GAA6B,IAAI,CAAC;IACrD,IAAI,SAAS,GAAQ,IAAI,CAAC;IAC1B,IAAI,aAAa,GAA4B,IAAI,CAAC;IAClD,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE/B;;;;;;;;OAQG;IACH,MAAM,aAAa,GAAG,CAAC,EAAsB,EAAE,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC;YACH,EAAE,CAAC,GAAG,CAAC,CAAC;QACV,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBACpF,oEAAkE;gBAClE,SAAS,GAAG,IAAI,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IAAA,CACF,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAyB,CAAC;QAC3C,eAAe,GAAG,QAAQ,CAAC;QAC3B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,aAAa,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK;gBAAE,OAAO;YAC3B,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,UAAU,EAAE,CAAC,CAAC,CAAC;QAAA,CAC1E,CAAC,CAAC;IAAA,CACJ,CAAC;IAEF,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,iCAAiC,EAAE,aAAa,CAAC,CAAC;IAE/D,4DAA4D;IAC5D,MAAM,QAAQ,GAAI,EAAE,CAAC,MAAc,CAAC,wBAAwB,CAAC,CAAC;IAC9D,IAAI,QAAQ;QAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEtC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE,CAAC;QACpD,aAAa,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK;gBAAE,OAAO;YAC3B,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAAA,CACvD,CAAC,CAAC;IAAA,CACJ,CAAC;IAEF,MAAM,aAAa,GAAG,GAAwB,EAAE,CAAC,CAAC;QAChD,qBAAqB,EAAE,GAAG,EAAE,CAAC;YAC3B,YAAY,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;QAAA,CACpD;QACD,mBAAmB,EAAE,CAAC,OAAgB,EAAE,QAAgB,EAAE,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,CAAC,QAAQ,EAAE,yBAAyB,IAAI,IAAI,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,SAAS,EAAE,gCAAgC,IAAI,IAAI,CAAC,CAAC;YACpE,CAAC;QAAA,CACF;QACD,aAAa,EAAE,CAAC,UAAkB,EAAE,OAAe,EAAE,EAAE,CAAC;YACtD,YAAY,CAAC,SAAS,EAAE,iBAAiB,UAAU,KAAK,OAAO,MAAM,CAAC,CAAC;QAAA,CACxE;QACD,aAAa,EAAE,CAAC,UAAkB,EAAE,EAAE,CAAC;YACrC,YAAY,CAAC,QAAQ,EAAE,QAAQ,UAAU,QAAQ,CAAC,CAAC;QAAA,CACpD;QACD,aAAa,EAAE,CAAC,UAAkB,EAAE,MAAc,EAAE,EAAE,CAAC;YACrD,YAAY,CAAC,OAAO,EAAE,QAAQ,UAAU,SAAS,CAAC,CAAC;QAAA,CACpD;QACD,aAAa,EAAE,CAAC,UAAkB,EAAE,UAAmB,EAAE,OAAe,EAAE,EAAE,CAAC;YAC3E,IAAI,UAAU,EAAE,CAAC;gBACf,YAAY,CAAC,SAAS,EAAE,mBAAmB,UAAU,gBAAgB,OAAO,KAAK,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,OAAO,EAAE,QAAQ,UAAU,qCAAmC,CAAC,CAAC;YAC/E,CAAC;QAAA,CACF;KACF,CAAC,CAAC;IAEH,MAAM,2BAA2B,GAAG,CAAC,OAA8D,EAAE,MAA+B,EAAE,EAAE,CAAC;QACvI,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChE,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE;oBAC5B,OAAO,EAAE,UAAU,CAAC,OAAO;oBAC3B,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,EAAE;oBAC3B,GAAG,EAAE,UAAU,CAAC,GAAG;oBACnB,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;oBACvD,QAAQ,EAAE,UAAU,CAAC,QAAQ;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YACpD,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;IAAA,CACF,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC;QACzC,GAAG;QACH,SAAS,EAAE,aAAa,EAAE;QAC1B,eAAe;QACf,mBAAmB,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC;QAChE,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7B,2BAA2B,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAAA,CACrD;KACF,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,cAAc,CACxB,gBAAgB,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAC9C,CAAC;IAAA,CACH,CAAC;IAEF,yEAAyE;IACzE,+DAA+D;IAC/D,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC5C,SAAS,GAAG,GAAG,CAAC;QAChB,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC;QAErB,aAAa,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3E,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAElD,MAAM,UAAU,GAAG,eAAe,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC;QAC5D,IAAI,UAAU,EAAE,CAAC;YACf,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,UAAU,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,aAAa,EAAE,SAAS,IAAI,aAAa,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,KAAK,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,UAAU;oBAAE,OAAO;gBAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,IAAI,CAAC;gBAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS;oBACpD,CAAC,CAAC,aAAa,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG;oBACxD,CAAC,CAAC,EAAE,CAAC;gBACP,YAAY,CAAC,SAAS,EAAE,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC;gBAClF,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAAA,CACtC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBAClB,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,UAAU;oBAAE,YAAY,CAAC,OAAO,EAAE,uBAAuB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAAA,CACxG,CAAC,CAAC;QACL,CAAC;IAAA,CACF,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,kBAAkB,CACrC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,IAAI,IAAI,EAChD,aAAa,CACd,CAAC;IACF,MAAM,eAAe,GAAG,kBAAkB,CACxC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,UAAU,IAAI,IAAI,EACnD,qBAAqB,CACtB,CAAC;IACF,MAAM,mBAAmB,GAAG,kBAAkB,CAC5C,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,cAAc,IAAI,IAAI,EACvD,iBAAiB,CAClB,CAAC;IAEF,uBAAuB,CAAC,EAAE,EAAE,qBAAqB,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACvG,uBAAuB,CAAC,EAAE,EAAE,eAAe,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACjG,uBAAuB,CAAC,EAAE,EAAE,oBAAoB,CAAC,YAAY,EAAE,eAAe,EAAE,mBAAmB,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAC3H,uBAAuB,CAAC,EAAE,EAAE,oBAAoB,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACtG,uBAAuB,CAAC,EAAE,EAAE,iBAAiB,CAAC,YAAY,EAAE,eAAe,EAAE,mBAAmB,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACxH,uBAAuB,CAAC,EAAE,EAAE,gBAAgB,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAClG,uBAAuB,CAAC,EAAE,EAAE,qBAAqB,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACvG,uBAAuB,CAAC,EAAE,EAAE,qBAAqB,CAC7C,YAAY,EACZ;QACE,iBAAiB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3C,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC3B,OAAO,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAAA,CACjD;QACD,iBAAiB,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,kBAAkB,EAAE,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAA,CAC/D;QACD,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC;KAC1D,EACD,eAAe,CAChB,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAC1B,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC;QACnD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAAA,CACpC,CAAC;IACF,uBAAuB,CAAC,EAAE,EAAE,sBAAsB,CAAC,UAAU,EAAE,eAAe,EAAE,mBAAmB,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAC3H,uBAAuB,CAAC,EAAE,EAAE,oBAAoB,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACpG,uBAAuB,CAAC,EAAE,EAAE,qBAAqB,CAAC,UAAU,EAAE,eAAe,EAAE;QAC3E,cAAc,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3C,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QAAA,CAC7D;KACF,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAE3B,kFAAkF;IAClF,iFAAiF;IACjF,4EAA4E;IAC5E,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC3C,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,IAAI,GAAI,KAAK,CAAC,KAAa,EAAE,IAAI,CAAC;oBACxC,IAAI,IAAI;wBAAE,MAAM,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;oBACvD,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,UAAU;wBAAE,OAAO;gBAClD,CAAC;YACH,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC5E,MAAM,IAAI,GAAI,KAAK,CAAC,KAAa,EAAE,IAAI,CAAC;gBACxC,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;oBACvC,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,UAAU;wBAAE,OAAO;oBAChD,MAAM,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,UAAU;YAAE,OAAO;QAChD,iEAAiE;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC3C,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxF,MAAM,IAAI,GAAI,KAAK,CAAC,KAAa,EAAE,IAAI,CAAC;YACxC,IAAI,CAAC,IAAI;gBAAE,OAAO;YAElB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACjC,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,CAAC,UAAU;gBAAE,OAAO;YAExB,qCAAqC;YACrC,MAAM,MAAM,GAAG,aAAa,EAAE,qBAAqB,CAAC;YACpD,IAAI,MAAM,KAAK,KAAK;gBAAE,OAAO;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,OAAO;YAElE,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,0DAA0D;YAC1D,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC,CAAC;YACpE,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,UAAU;gBAAE,OAAO;YAEhD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAElF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAEhC,wDAAsD;YACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;gBACpC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;gBACxC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChD,OAAO,GAAG,OAAO,IAAI,IAAI,IAAI,GAAG,WAAW,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;YAAA,CACjE,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,GAAG,EAAE,gBAAgB,CAAC,CAAC;YAC5D,CAAC;YAED,MAAM,OAAO,GAAG,gBAAc,MAAM,CAAC,MAAM,gBAAgB,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAE3F,OAAO;gBACL,OAAO,EAAE;oBACP,GAAG,KAAK,CAAC,OAAO;oBAChB,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE;iBACzC;aACF,CAAC;QACJ,CAAC;IAAA,CACF,CAAC,CAAC;IAEH,0CAA0C;IAC1C,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QACjD,SAAS,GAAG,GAAG,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,MAAM,GAAG,QAAQ,KAAK,EAAE,CAAC;YAC7B,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,UAAU,cAAc,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;YACxE,CAAC;YACD,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;IAAA,CACF,CAAC,CAAC;IAEH,sCAAoC;IACpC,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE;QACxB,WAAW,EAAE,wBAAwB;QACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,mCAAmC,EACvF,MAAM,CACP,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAG,CAAC,CAAC,CAAC,KAAG,CAAC;gBACnC,MAAM,KAAK,GACT,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,gBAAgB,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC;YAAA,CACjE,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAAA,CACzC;KACF,CAAC,CAAC;IAEH,8DAA4D;IAC5D,EAAE,CAAC,eAAe,CAAC,aAAa,EAAE;QAChC,WAAW,EAAE,wEAAwE;QACrF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;oBACjB,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,IAAI,CAAC,cAAc,EAAE;wBACnB,CAAC,CAAC,yBAAyB;wBAC3B,CAAC,CAAC,kEAAkE,EACtE,MAAM,CACP,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,+DAA+D,EAAE,MAAM,CAAC,CAAC;gBACzF,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,iCAAiC;gBACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACvE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,+DAA+D,EAAE,MAAM,CAAC,CAAC;gBACzF,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3D,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,oBAAoB,KAAK,gEAAgE,EACzF,MAAM,CACP,CAAC;gBACJ,CAAC;gBACD,OAAO;YACT,CAAC;YAED,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,mBAAmB,UAAU,KAAK,CAAC,CAAC,CAAC;YACxF,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,UAAU,qCAAqC,EAAE,MAAM,CAAC,CAAC;YAErF,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBACjD,MAAM,SAAS,GAAG,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjF,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,UAAU,kCAAkC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;gBACnF,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,UAAU,QAAQ,CAAC,CAAC,CAAC;YACjF,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,UAAU,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC1E,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,UAAU,iBAAiB,CAAC,CAAC,CAAC;YACzF,CAAC;QAAA,CACF;KACF,CAAC,CAAC;IAEH,+DAA6D;IAC7D,EAAE,CAAC,eAAe,CAAC,YAAY,EAAE;QAC/B,WAAW,EACT,qEAAqE;QACvE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;gBAClB,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,sFAAsF,EACtF,MAAM,CACP,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,mDAAmD,EACnD,SAAS,CACV,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,KAAK,CAAC;YACnD,MAAM,MAAM,GAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAE3D,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;YACvC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACrD,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,sBAAsB,UAAU,KAAK,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EACtE,MAAM,CACP,CAAC;QAAA,CACH;KACF,CAAC,CAAC;IAEH,uDAAqD;IACrD,EAAE,CAAC,eAAe,CAAC,YAAY,EAAE;QAC/B,WAAW,EACT,gEAAgE;QAClE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC;YAE7B,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;gBACnC,IAAI,OAAO,EAAE,CAAC;oBACZ,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;gBAClD,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,2CAA2C;wBAC3C,2CAA2C;wBAC3C,6CAA6C;wBAC7C,mDAAmD,EACnD,MAAM,CACP,CAAC;gBACJ,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAE3C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,QAAQ,yCAAuC,EAAE,SAAS,CAAC,CAAC;YACxF,CAAC;YAED,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QAAA,CACtD;KACF,CAAC,CAAC;IAEH,mEAAiE;IACjE,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC;QACpC,sEAAoE;QACpE,qEAAqE;QACrE,oEAAoE;QACpE,SAAS,GAAG,IAAI,CAAC;QACjB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IAAA,CACvB,CAAC,CAAC;AAAA,CACJ;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC","sourcesContent":["// @ts-nocheck\n/**\n * pi-lsp-extension — Pi coding agent extension for LSP integration.\n *\n * Exposes Language Server Protocol capabilities as tools the LLM can call:\n * - lsp_diagnostics: compilation errors and warnings\n * - lsp_hover: type info and docs at a position\n * - lsp_definition: go to definition\n * - lsp_references: find all references\n * - lsp_symbols: file/workspace symbol search\n * - lsp_rename: preview rename refactoring\n * - lsp_completions: code completion suggestions at a position\n * - lsp_code_actions: quick fixes, refactorings, and source actions\n *\n * Position-based tools (hover, definition, references, rename, code_actions)\n * accept an optional `query` parameter as an alternative to line/character,\n * resolving a symbol name to its position automatically.\n *\n * Tool schemas, commands, and hooks register immediately. Heavy managers\n * (LspManager, FileSync, Tree-sitter/WASM, WorkspaceIndex) load on first use.\n *\n * Usage:\n * 1. npm install in this directory\n * 2. Add to pi via settings.json extensions, or: pi -e ./src/index.ts\n * 3. LSP servers start lazily when you first use a tool on a file\n */\n\nimport type { ExtensionAPI, ToolDefinition } from \"@ashx-j/lunr\";\nimport type { TSchema } from \"typebox\";\nimport { awaitWithAbort } from \"../../../utils/await-with-abort.ts\";\nimport {\n isReadToolResult,\n isWriteToolResult,\n isEditToolResult,\n} from \"../../../core/extensions/types.js\";\nimport { DiagnosticSeverity } from \"vscode-languageserver-protocol\";\n\nimport type { WorkspaceProvider } from \"./workspace-provider.js\";\nimport { LspRuntimeHost, type LspRuntimeCallbacks } from \"./runtime.js\";\nimport { createDiagnosticsTool } from \"./tools/diagnostics.js\";\nimport { createHoverTool } from \"./tools/hover.js\";\nimport { createDefinitionTool } from \"./tools/definition.js\";\nimport { createReferencesTool } from \"./tools/references.js\";\nimport { createSymbolsTool } from \"./tools/symbols.js\";\nimport { createRenameTool } from \"./tools/rename.js\";\nimport { createCodeOverviewTool } from \"./tools/code-overview.js\";\nimport { createCompletionsTool } from \"./tools/completions.js\";\nimport { createCodeSearchTool } from \"./tools/code-search.js\";\nimport { createCodeRewriteTool } from \"./tools/code-rewrite.js\";\nimport { createCodeActionsTool } from \"./tools/code-actions.js\";\nimport { syntheticDotLocks } from \"./tools/completions.js\";\nimport { relative } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { DIAGNOSTIC_SETTLE_DELAY_MS } from \"./shared/timing.js\";\n\n/**\n * Project-level LSP config — loaded from `.pi-lsp.json` in the workspace root.\n *\n * Example:\n * ```json\n * {\n * \"autoStart\": [\"java\", \"typescript\"],\n * \"lombokJar\": \"env/Lombok-1.18.x/runtime/lib/lombok-1.18.42.jar\",\n * \"servers\": {\n * \"python\": { \"command\": \"pylsp\", \"args\": [] }\n * }\n * }\n * ```\n */\ninterface ProjectLspConfig {\n /** Languages to start eagerly on session_start (e.g. [\"java\", \"typescript\"]) */\n autoStart?: string[];\n /** Path to Lombok jar (absolute or relative to project root). \"auto\" to auto-detect. */\n lombokJar?: string;\n /** Custom server configs keyed by language ID */\n servers?: Record<string, { command: string; args?: string[]; env?: Record<string, string>; initializationOptions?: Record<string, unknown>; settings?: Record<string, unknown> }>;\n /**\n * Auto-inject LSP error diagnostics into write/edit tool results.\n * Set to false to disable, or provide an array of language IDs to enable selectively.\n * Default: true (all languages).\n *\n * Examples:\n * true — inject for all languages\n * false — never inject\n * [\"typescript\"] — only inject for TypeScript files\n */\n autoInjectDiagnostics?: boolean | string[];\n}\n\ninterface ServerConfig {\n command: string;\n args: string[];\n env?: Record<string, string>;\n initializationOptions?: Record<string, unknown>;\n settings?: Record<string, unknown>;\n}\n\n/** Load .pi-lsp.json from a directory. Returns null if not found or invalid. */\nfunction loadProjectConfig(dir: string): ProjectLspConfig | null {\n const configPath = join(dir, \".pi-lsp.json\");\n try {\n if (!existsSync(configPath)) return null;\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n return parsed as ProjectLspConfig;\n } catch {\n return null;\n }\n}\n\nfunction createServiceProxy<T extends object>(getTarget: () => T | null, label: string): T {\n return new Proxy({} as T, {\n get(_target, prop, receiver) {\n const service = getTarget();\n if (!service) {\n throw new Error(`${label} is not initialized`);\n }\n const value = Reflect.get(service, prop, service);\n if (typeof value === \"function\") {\n return value.bind(service);\n }\n return value;\n },\n });\n}\n\nfunction registerToolWithRuntime<T extends TSchema, D>(pi: ExtensionAPI, tool: ToolDefinition<T, D>, ensure: () => Promise<unknown>, host: LspRuntimeHost) {\n pi.registerTool({\n ...tool,\n async execute(id, params, signal, onUpdate, ctx) {\n const generation = host.getGeneration();\n signal?.throwIfAborted();\n await awaitWithAbort(ensure(), signal);\n signal?.throwIfAborted();\n if (host.getGeneration() !== generation) throw new Error(\"LSP session changed before execution\");\n return tool.execute(id, params, signal, onUpdate, ctx);\n },\n });\n}\n\nexport default function lspExtension(pi: ExtensionAPI) {\n const host = new LspRuntimeHost();\n let pendingProvider: WorkspaceProvider | null = null;\n let latestCtx: any = null;\n let projectConfig: ProjectLspConfig | null = null;\n let sessionCwd = process.cwd();\n\n /**\n * Run `fn` with the currently captured ctx, swallowing stale-ctx errors.\n *\n * Lifecycle callbacks from LspManager (server ready, workspace setup, etc.)\n * and `pi.events` listeners can fire AFTER the session is replaced or reloaded,\n * at which point the captured ctx has been invalidated and any property access\n * throws via ExtensionRunner.assertActive(). We can't use optional chaining to\n * dodge it because the `ui` / `theme` getters themselves run assertActive().\n */\n const withLatestCtx = (fn: (ctx: any) => void) => {\n const ctx = latestCtx;\n if (!ctx) return;\n try {\n fn(ctx);\n } catch (err: any) {\n if (typeof err?.message === \"string\" && err.message.includes(\"stale after session\")) {\n // Session was replaced/reloaded — drop the stale ctx and move on.\n latestCtx = null;\n return;\n }\n throw err;\n }\n };\n\n const applyProvider = (data: unknown) => {\n const provider = data as WorkspaceProvider;\n pendingProvider = provider;\n host.setPendingProvider(provider);\n const statusText = provider.getStatusText();\n if (!statusText) return;\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n });\n };\n\n pi.events.on(\"lsp:register-workspace-provider\", applyProvider);\n\n // Check for provider registered before our listener existed\n const existing = (pi.events as any)[\"lsp:workspace-provider\"];\n if (existing) applyProvider(existing);\n\n const setLspStatus = (color: string, text: string) => {\n withLatestCtx((ctx) => {\n if (!ctx.ui?.theme) return;\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(color, text));\n });\n };\n\n const makeCallbacks = (): LspRuntimeCallbacks => ({\n onWorkspaceSetupStart: () => {\n setLspStatus(\"warning\", \"LSP: workspace setup...\");\n },\n onWorkspaceSetupEnd: (success: boolean, duration: number) => {\n const secs = (duration / 1000).toFixed(1);\n if (success) {\n setLspStatus(\"accent\", `LSP: workspace ready (${secs}s)`);\n } else {\n setLspStatus(\"warning\", `LSP: workspace setup failed (${secs}s)`);\n }\n },\n onServerStart: (languageId: string, command: string) => {\n setLspStatus(\"warning\", `LSP: starting ${languageId} (${command})...`);\n },\n onServerReady: (languageId: string) => {\n setLspStatus(\"accent\", `LSP: ${languageId} ready`);\n },\n onServerError: (languageId: string, _error: string) => {\n setLspStatus(\"error\", `LSP: ${languageId} failed`);\n },\n onServerCrash: (languageId: string, restarting: boolean, attempt: number) => {\n if (restarting) {\n setLspStatus(\"warning\", `LSP: restarting ${languageId}... (attempt ${attempt}/3)`);\n } else {\n setLspStatus(\"error\", `LSP: ${languageId} crashed — auto-restart exhausted`);\n }\n },\n });\n\n const applyProjectConfigToManager = (manager: { setServerConfig: Function; setLombokJar: Function }, config: ProjectLspConfig | null) => {\n if (!config) return;\n if (config.servers) {\n for (const [lang, serverConf] of Object.entries(config.servers)) {\n manager.setServerConfig(lang, {\n command: serverConf.command,\n args: serverConf.args ?? [],\n env: serverConf.env,\n initializationOptions: serverConf.initializationOptions,\n settings: serverConf.settings,\n });\n }\n }\n if (config.lombokJar && config.lombokJar !== \"auto\") {\n manager.setLombokJar(config.lombokJar);\n }\n };\n\n const buildBindOptions = (cwd: string) => ({\n cwd,\n callbacks: makeCallbacks(),\n pendingProvider,\n syntheticDotChecker: (uri: string) => syntheticDotLocks.has(uri),\n configureManager: (manager) => {\n applyProjectConfigToManager(manager, projectConfig);\n },\n });\n\n const ensureRuntime = async () => {\n return host.ensureServices(\n buildBindOptions(sessionCwd || process.cwd()),\n );\n };\n\n // session_start binds cwd/config only. Heavy managers load on first use,\n // unless autoStart is configured (then ensure + startEagerly).\n pi.on(\"session_start\", async (_event, ctx) => {\n latestCtx = ctx;\n sessionCwd = ctx.cwd;\n\n projectConfig = ctx.isProjectTrusted() ? loadProjectConfig(ctx.cwd) : null;\n await host.bindSession(buildBindOptions(ctx.cwd));\n\n const statusText = pendingProvider?.getStatusText?.() ?? \"\";\n if (statusText) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${statusText}`));\n } else {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n }\n\n if (projectConfig?.autoStart && projectConfig.autoStart.length > 0) {\n const langs = projectConfig.autoStart;\n const generation = host.getGeneration();\n void ensureRuntime().then((services) => {\n if (host.getGeneration() !== generation) return;\n const lombokJar = services.manager.getLombokJar?.() ?? null;\n const lombokNote = langs.includes(\"java\") && lombokJar\n ? ` (lombok: ${String(lombokJar).split(/[/\\\\]/).pop()})`\n : \"\";\n setLspStatus(\"warning\", `LSP: auto-starting ${langs.join(\", \")}${lombokNote}...`);\n services.manager.startEagerly(langs);\n }).catch((error) => {\n if (host.getGeneration() === generation) setLspStatus(\"error\", `LSP startup failed: ${String(error)}`);\n });\n }\n });\n\n const managerProxy = createServiceProxy(\n () => host.getServicesIfReady()?.manager ?? null,\n \"LSP manager\",\n );\n const treeSitterProxy = createServiceProxy(\n () => host.getServicesIfReady()?.treeSitter ?? null,\n \"Tree-sitter manager\",\n );\n const workspaceIndexProxy = createServiceProxy(\n () => host.getServicesIfReady()?.workspaceIndex ?? null,\n \"Workspace index\",\n );\n\n registerToolWithRuntime(pi, createDiagnosticsTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createHoverTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createDefinitionTool(managerProxy, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createReferencesTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createSymbolsTool(managerProxy, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createRenameTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeActionsTool(managerProxy, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCompletionsTool(\n managerProxy,\n {\n getTrackedVersion: (uri) => {\n const services = host.getServicesIfReady();\n if (!services) return null;\n return services.fileSync.getTrackedVersion(uri);\n },\n setTrackedVersion: (uri, v) => {\n host.getServicesIfReady()?.fileSync.setTrackedVersion(uri, v);\n },\n isSyntheticDotActive: (uri) => syntheticDotLocks.has(uri),\n },\n treeSitterProxy,\n ), ensureRuntime, host);\n const getRootDir = () => {\n const manager = host.getServicesIfReady()?.manager;\n if (manager) return manager.resolvePath(\".\");\n return sessionCwd || process.cwd();\n };\n registerToolWithRuntime(pi, createCodeOverviewTool(getRootDir, treeSitterProxy, workspaceIndexProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeSearchTool(getRootDir, treeSitterProxy), ensureRuntime, host);\n registerToolWithRuntime(pi, createCodeRewriteTool(getRootDir, treeSitterProxy, {\n onFileModified: (filePath: string) => {\n const services = host.getServicesIfReady();\n if (!services) return;\n services.fileSync.handleFileWrite(filePath).catch(() => {});\n },\n }), ensureRuntime, host);\n\n // File sync: track file reads/writes/edits without loading runtime on plain reads\n // when LSP was never used. Writes may start a server (existing behavior) so they\n // ensure runtime. After writes/edits, append file-scoped error diagnostics.\n pi.on(\"tool_result\", async (event) => {\n const generation = host.getGeneration();\n try {\n if (isReadToolResult(event) && !event.isError) {\n const services = host.getServicesIfReady();\n if (services) {\n const path = (event.input as any)?.path;\n if (path) await services.fileSync.handleFileRead(path);\n if (host.getGeneration() !== generation) return;\n }\n }\n\n if ((isWriteToolResult(event) || isEditToolResult(event)) && !event.isError) {\n const path = (event.input as any)?.path;\n if (path) {\n const services = await ensureRuntime();\n if (host.getGeneration() !== generation) return;\n await services.fileSync.handleFileWrite(path);\n }\n }\n } catch {\n // File sync errors are non-fatal\n }\n\n if (host.getGeneration() !== generation) return;\n // Auto-append diagnostics for the changed file (write/edit only)\n const services = host.getServicesIfReady();\n if ((isWriteToolResult(event) || isEditToolResult(event)) && !event.isError && services) {\n const path = (event.input as any)?.path;\n if (!path) return;\n\n const manager = services.manager;\n const languageId = manager.getLanguageId(path);\n if (!languageId) return;\n\n // Check autoInjectDiagnostics config\n const inject = projectConfig?.autoInjectDiagnostics;\n if (inject === false) return;\n if (Array.isArray(inject) && !inject.includes(languageId)) return;\n\n const client = manager.getRunningClient(languageId);\n if (!client) return;\n\n // Wait briefly for the LSP to publish updated diagnostics\n await new Promise((r) => setTimeout(r, DIAGNOSTIC_SETTLE_DELAY_MS));\n if (host.getGeneration() !== generation) return;\n\n const uri = manager.getFileUri(path);\n const diagnostics = client.getDiagnostics(uri);\n const errors = diagnostics.filter((d) => d.severity === DiagnosticSeverity.Error);\n\n if (errors.length === 0) return;\n\n // Build a compact summary — just errors, max 10 lines\n const relPath = relative(manager.resolvePath(\".\"), manager.resolvePath(path));\n const lines = errors.slice(0, 10).map((d) => {\n const line = d.range.start.line + 1;\n const col = d.range.start.character + 1;\n const source = d.source ? ` [${d.source}]` : \"\";\n return `${relPath}:${line}:${col} error: ${d.message}${source}`;\n });\n if (errors.length > 10) {\n lines.push(`... and ${errors.length - 10} more error(s)`);\n }\n\n const summary = `\\n\\n⚠ LSP: ${errors.length} error(s) in ${relPath}:\\n${lines.join(\"\\n\")}`;\n\n return {\n content: [\n ...event.content,\n { type: \"text\" as const, text: summary },\n ],\n };\n }\n });\n\n // Update status after tool execution ends\n pi.on(\"tool_execution_end\", async (_event, ctx) => {\n latestCtx = ctx;\n const services = host.getServicesIfReady();\n if (!services) return;\n const statuses = services.manager.getStatus();\n const running = statuses.filter((s) => s.running);\n if (running.length === 0) {\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"dim\", \"LSP: idle\"));\n } else {\n const totalDiags = running.reduce((n, s) => n + s.diagnosticsCount, 0);\n const langs = running.map((s) => s.languageId).join(\", \");\n let status = `LSP: ${langs}`;\n if (totalDiags > 0) {\n status += ` (${totalDiags} diagnostic${totalDiags !== 1 ? \"s\" : \"\"})`;\n }\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", status));\n }\n });\n\n // /lsp command — show server status\n pi.registerCommand(\"lsp\", {\n description: \"Show LSP server status\",\n handler: async (_args, ctx) => {\n const services = host.getServicesIfReady();\n if (!services) {\n ctx.ui.notify(\n host.isInitializing() ? \"LSP runtime is starting\" : \"LSP runtime is idle (not started)\",\n \"info\",\n );\n return;\n }\n\n const statuses = services.manager.getStatus();\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers configured\", \"info\");\n return;\n }\n\n const lines = statuses.map((s) => {\n const icon = s.running ? \"🟢\" : \"⚪\";\n const diags =\n s.diagnosticsCount > 0 ? ` (${s.diagnosticsCount} diagnostics)` : \"\";\n const shared = s.shared ? \" [shared]\" : \"\";\n return `${icon} ${s.languageId}: ${s.command}${diags}${shared}`;\n });\n\n ctx.ui.notify(lines.join(\"\\n\"), \"info\");\n },\n });\n\n // /lsp-restart command — restart a specific language server\n pi.registerCommand(\"lsp-restart\", {\n description: \"Restart an LSP server: /lsp-restart <language> (e.g. java, typescript)\",\n handler: async (args, ctx) => {\n const services = host.getServicesIfReady();\n if (!services) {\n if (args?.trim()) {\n ctx.ui.notify(\n host.isInitializing()\n ? \"LSP runtime is starting\"\n : \"LSP runtime is idle. Run an LSP tool before restarting a server.\",\n \"info\",\n );\n } else {\n ctx.ui.notify(\"No LSP servers are running.\\n\\nUsage: /lsp-restart <language>\", \"info\");\n }\n return;\n }\n\n const languageId = args?.trim().toLowerCase();\n if (!languageId) {\n // Show running servers and usage\n const statuses = services.manager.getStatus().filter((s) => s.running);\n if (statuses.length === 0) {\n ctx.ui.notify(\"No LSP servers are running.\\n\\nUsage: /lsp-restart <language>\", \"info\");\n } else {\n const langs = statuses.map((s) => s.languageId).join(\", \");\n ctx.ui.notify(\n `Running servers: ${langs}\\n\\nUsage: /lsp-restart <language>\\nExample: /lsp-restart java`,\n \"info\"\n );\n }\n return;\n }\n\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"warning\", `LSP: restarting ${languageId}...`));\n ctx.ui.notify(`Restarting ${languageId} server (kills daemon if shared)...`, \"info\");\n\n try {\n await services.manager.restartServer(languageId);\n const lombokJar = languageId === \"java\" ? services.manager.getLombokJar() : null;\n const lombokNote = lombokJar ? `\\nLombok: ${lombokJar}` : \"\";\n ctx.ui.notify(`${languageId} server restarted successfully.${lombokNote}`, \"info\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"accent\", `LSP: ${languageId} ready`));\n } catch (err: any) {\n ctx.ui.notify(`Failed to restart ${languageId}: ${err.message}`, \"error\");\n ctx.ui.setStatus(\"lsp\", ctx.ui.theme.fg(\"error\", `LSP: ${languageId} restart failed`));\n }\n },\n });\n\n // /lsp-config command — add or override server configuration\n pi.registerCommand(\"lsp-config\", {\n description:\n \"Configure an LSP server: /lsp-config <language> <command> [args...]\",\n handler: async (args, ctx) => {\n if (!args?.trim()) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\\nExample: /lsp-config python pylsp\",\n \"info\"\n );\n return;\n }\n\n const parts = args.trim().split(/\\s+/);\n if (parts.length < 2) {\n ctx.ui.notify(\n \"Usage: /lsp-config <language> <command> [args...]\",\n \"warning\"\n );\n return;\n }\n\n const [languageId, command, ...serverArgs] = parts;\n const config: ServerConfig = { command, args: serverArgs };\n\n const services = await ensureRuntime();\n services.manager.setServerConfig(languageId, config);\n ctx.ui.notify(\n `Configured LSP for ${languageId}: ${command} ${serverArgs.join(\" \")}`,\n \"info\"\n );\n },\n });\n\n // /lsp-lombok command — set Lombok jar path for Java\n pi.registerCommand(\"lsp-lombok\", {\n description:\n \"Set Lombok jar path for Java: /lsp-lombok <path-to-lombok.jar>\",\n handler: async (args, ctx) => {\n const services = await ensureRuntime();\n const mgr = services.manager;\n\n if (!args?.trim()) {\n const current = mgr.getLombokJar();\n if (current) {\n ctx.ui.notify(`Lombok jar: ${current}`, \"info\");\n } else {\n ctx.ui.notify(\n \"No Lombok jar configured or detected.\\n\\n\" +\n \"Usage: /lsp-lombok <path-to-lombok.jar>\\n\" +\n \"Or set LOMBOK_JAR environment variable.\\n\\n\" +\n \"Download from: https://projectlombok.org/download\",\n \"info\"\n );\n }\n return;\n }\n\n const jarPath = args.trim();\n const resolved = resolve(ctx.cwd, jarPath);\n\n if (!existsSync(resolved)) {\n ctx.ui.notify(`File not found: ${resolved}`, \"error\");\n return;\n }\n\n if (!resolved.endsWith(\".jar\")) {\n ctx.ui.notify(`Warning: ${resolved} doesn't end in .jar — setting anyway`, \"warning\");\n }\n\n mgr.setLombokJar(resolved);\n ctx.ui.notify(`Lombok jar set: ${resolved}`, \"info\");\n },\n });\n\n // Clean shutdown — never loads heavy modules if they were unused\n pi.on(\"session_shutdown\", async () => {\n // Drop the captured ctx immediately — once shutdown fires, any late\n // LSP manager callback that reaches setLspStatus/applyProvider would\n // otherwise hit an invalidated ctx and throw an uncaught exception.\n latestCtx = null;\n await host.shutdown();\n });\n}\n\nexport { LspRuntimeHost } from \"./runtime.js\";\n"]}
|
|
@@ -45,6 +45,9 @@ export declare class LspClient {
|
|
|
45
45
|
private _disposed;
|
|
46
46
|
/** True if connected to a daemon socket (server init handled by daemon) */
|
|
47
47
|
private _isDaemonClient;
|
|
48
|
+
private readonly stop;
|
|
49
|
+
private startPromise;
|
|
50
|
+
private shutdownPromise;
|
|
48
51
|
readonly languageId: string;
|
|
49
52
|
readonly command: string;
|
|
50
53
|
readonly rootDir: string;
|
|
@@ -58,6 +61,8 @@ export declare class LspClient {
|
|
|
58
61
|
getAllDiagnostics(): Map<string, Diagnostic[]>;
|
|
59
62
|
/** Start the LSP server and perform the initialize handshake */
|
|
60
63
|
start(): Promise<void>;
|
|
64
|
+
/** Cancel an owned handshake without waiting for the remote server. */
|
|
65
|
+
private waitForStart;
|
|
61
66
|
/** Register shared connection handlers (diagnostics, workspace/configuration, errors) */
|
|
62
67
|
private registerConnectionHandlers;
|
|
63
68
|
private connectToSocket;
|
|
@@ -76,5 +81,6 @@ export declare class LspClient {
|
|
|
76
81
|
didClose(uri: string): void;
|
|
77
82
|
/** Gracefully shut down or disconnect from the server */
|
|
78
83
|
shutdown(): Promise<void>;
|
|
84
|
+
private shutdownOwnedTransport;
|
|
79
85
|
}
|
|
80
86
|
//# sourceMappingURL=lsp-client.d.ts.map
|