@ashx-j/lunr 0.1.0 → 0.1.2
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/dist/builtin-extensions/ashxj-spinners.d.ts +1 -1
- package/dist/builtin-extensions/ashxj-spinners.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-spinners.js.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts +5 -5
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +3 -3
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts +2 -2
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +2 -2
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/index.d.ts +1 -1
- package/dist/builtin-extensions/lunr-local-providers/index.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts +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.map +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.d.ts +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.js +1 -1
- package/dist/builtin-extensions/lunr-plan-tools.js.map +1 -1
- package/dist/builtin-extensions/lunr-skill-creator/index.d.ts +1 -1
- package/dist/builtin-extensions/lunr-skill-creator/index.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-skill-creator/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-todos.d.ts +1 -1
- package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-todos.js +1 -1
- package/dist/builtin-extensions/lunr-todos.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/accounting.js.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts +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.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts +2 -2
- 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 +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-intercom/ui/compose.d.ts +2 -2
- package/dist/builtin-extensions/pi-intercom/ui/compose.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/compose.js +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/compose.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.d.ts +2 -2
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.js +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/inline-message.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/session-list.d.ts +2 -2
- package/dist/builtin-extensions/pi-intercom/ui/session-list.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/session-list.js +1 -1
- package/dist/builtin-extensions/pi-intercom/ui/session-list.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.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts +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 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-actions.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-overview.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +1 -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.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-search.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/completions.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/definition.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/diagnostics.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/hover.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/references.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/rename.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.d.ts +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.js +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/tools/symbols.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/elicitation-handler.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-panel.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/mcp-setup-panel.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/panel-keys.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts +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.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.d.ts +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/sampling-handler.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +1 -1
- 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-mcp-adapter/tool-result-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.js +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/tool-result-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/types.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/types.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/utils.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.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.generated.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.generated.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.generated.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.d.ts +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-ollama-cloud/thinking-levels.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/deterministic-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts +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.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/loop-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/model-selection.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/model-selection.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/model-selection.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/notifications.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/notifications.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/notifications.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.d.ts +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +1 -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 +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/skill-loaded-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-renderer.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.d.ts +3 -3
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.js +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-widget.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts +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 +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +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 +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/rpc.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/rpc.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/rpc.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/steering-notices.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
- 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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/async-steering-action.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +2 -2
- 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.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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +2 -2
- 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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-spawn.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/single-output.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-transcript.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.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 +1 -1
- 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 +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.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-bridge.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-live-state.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render-helpers.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/model-selection.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts +3 -3
- 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-subagents/src/watchdog/runtime.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js.map +1 -1
- package/dist/builtin-extensions/pi-tps.d.ts +1 -1
- package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-tps.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/gemini-search.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +2 -2
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.js +1 -1
- package/dist/builtin-extensions/pi-web-access/openai-search.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.d.ts +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.js +1 -1
- package/dist/builtin-extensions/pi-web-access/summary-review.js.map +1 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +1 -1
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/register-bedrock.js +2 -2
- package/dist/bun/register-bedrock.js.map +1 -1
- package/dist/catalog/models.json +1 -1
- package/dist/catalog/providers/opencode-go.json +1 -1
- package/dist/catalog/providers/openrouter.json +1 -1
- package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
- package/dist/catalog/providers/qwen-token-plan.json +1 -1
- package/dist/catalog/publication.json +3 -3
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli/startup-ui.d.ts +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +2 -2
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +2 -2
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +1 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/cache-stats.d.ts +1 -1
- package/dist/core/cache-stats.d.ts.map +1 -1
- package/dist/core/cache-stats.js.map +1 -1
- package/dist/core/catalog-merge.d.ts +1 -1
- package/dist/core/catalog-merge.d.ts.map +1 -1
- package/dist/core/catalog-merge.js +7 -1
- package/dist/core/catalog-merge.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -2
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +2 -2
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/context-breakdown.d.ts +1 -1
- package/dist/core/context-breakdown.d.ts.map +1 -1
- package/dist/core/context-breakdown.js.map +1 -1
- package/dist/core/defaults.d.ts +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/defaults.js.map +1 -1
- package/dist/core/export-html/index.d.ts +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +25 -25
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -3
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +5 -5
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/grok-cli-auth.d.ts +32 -0
- package/dist/core/grok-cli-auth.d.ts.map +1 -0
- package/dist/core/grok-cli-auth.js +218 -0
- package/dist/core/grok-cli-auth.js.map +1 -0
- package/dist/core/keybindings.d.ts +2 -2
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +1 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/live-catalog.d.ts +1 -1
- package/dist/core/live-catalog.d.ts.map +1 -1
- package/dist/core/live-catalog.js.map +1 -1
- package/dist/core/messages.d.ts +3 -3
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +10 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +24 -5
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/official-catalog.d.ts +1 -1
- package/dist/core/official-catalog.d.ts.map +1 -1
- package/dist/core/official-catalog.js.map +1 -1
- package/dist/core/provider-attribution.d.ts +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/provider-composer.d.ts +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +2 -2
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +1 -1
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +3 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +2 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +1 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subscriptions.d.ts +1 -1
- package/dist/core/subscriptions.d.ts.map +1 -1
- package/dist/core/subscriptions.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +1 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +2 -2
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +1 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/write.d.ts +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-adapters/xai.d.ts.map +1 -1
- package/dist/core/usage-adapters/xai.js +4 -0
- package/dist/core/usage-adapters/xai.js.map +1 -1
- package/dist/core/usage-history.d.ts.map +1 -1
- package/dist/core/usage-history.js.map +1 -1
- package/dist/core/usage-service.d.ts +11 -1
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +45 -9
- package/dist/core/usage-service.js.map +1 -1
- package/dist/core/user-models.d.ts +1 -1
- package/dist/core/user-models.d.ts.map +1 -1
- package/dist/core/user-models.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts +3 -3
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/commands.d.ts.map +1 -1
- package/dist/gateway/commands.js.map +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +1 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +1 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/boot-screen.d.ts +1 -1
- package/dist/modes/interactive/components/boot-screen.d.ts.map +1 -1
- package/dist/modes/interactive/components/boot-screen.js +1 -1
- package/dist/modes/interactive/components/boot-screen.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +1 -1
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +1 -1
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +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/extension-input.d.ts +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +1 -1
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +1 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +1 -1
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.d.ts +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.js +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +2 -2
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +1 -1
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +2 -2
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +2 -2
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +2 -2
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +1 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/processes-selector.d.ts +1 -1
- package/dist/modes/interactive/components/processes-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/processes-selector.js +1 -1
- package/dist/modes/interactive/components/processes-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +1 -1
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +1 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +1 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +1 -1
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +1 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +2 -2
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +1 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-summary.d.ts +1 -1
- package/dist/modes/interactive/components/thinking-summary.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-summary.js.map +1 -1
- package/dist/modes/interactive/components/thinking-tail.d.ts +1 -1
- package/dist/modes/interactive/components/thinking-tail.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-tail.js +1 -1
- package/dist/modes/interactive/components/thinking-tail.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +1 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +1 -1
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +1 -1
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/usage-view.js +1 -1
- package/dist/modes/interactive/components/usage-view.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +1 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +1 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +29 -4
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/smooth-streaming.d.ts +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/interactive/theme/theme-controller.d.ts +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +2 -2
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +2 -2
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +2 -2
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +2 -2
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/examples/extensions/auto-commit-on-exit.ts +1 -1
- package/examples/extensions/bash-spawn-hook.ts +2 -2
- package/examples/extensions/bookmark.ts +1 -1
- package/examples/extensions/border-status-editor.ts +3 -3
- package/examples/extensions/built-in-tool-renderer.ts +3 -3
- package/examples/extensions/claude-rules.ts +1 -1
- package/examples/extensions/commands.ts +1 -1
- package/examples/extensions/confirm-destructive.ts +1 -1
- package/examples/extensions/custom-compaction.ts +3 -3
- package/examples/extensions/custom-footer.ts +3 -3
- package/examples/extensions/custom-header.ts +2 -2
- package/examples/extensions/custom-provider-anthropic/index.ts +2 -2
- 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 +2 -2
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
- package/examples/extensions/dirty-repo-guard.ts +1 -1
- package/examples/extensions/doom-overlay/doom-component.ts +2 -2
- package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
- package/examples/extensions/doom-overlay/index.ts +1 -1
- package/examples/extensions/dynamic-resources/index.ts +1 -1
- package/examples/extensions/dynamic-tools.ts +1 -1
- package/examples/extensions/entry-renderer.ts +2 -2
- package/examples/extensions/event-bus.ts +1 -1
- package/examples/extensions/file-trigger.ts +1 -1
- package/examples/extensions/git-checkpoint.ts +1 -1
- package/examples/extensions/git-merge-and-resolve.ts +1 -1
- package/examples/extensions/github-issue-autocomplete.ts +2 -2
- package/examples/extensions/gondolin/index.ts +2 -2
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/handoff.ts +4 -4
- package/examples/extensions/hello.ts +2 -2
- package/examples/extensions/hidden-thinking-label.ts +1 -1
- package/examples/extensions/inline-bash.ts +1 -1
- package/examples/extensions/input-transform-streaming.ts +1 -1
- package/examples/extensions/input-transform.ts +1 -1
- 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/message-renderer.ts +2 -2
- package/examples/extensions/minimal-mode.ts +3 -3
- package/examples/extensions/modal-editor.ts +2 -2
- package/examples/extensions/model-status.ts +1 -1
- package/examples/extensions/notify.ts +1 -1
- package/examples/extensions/overlay-qa-tests.ts +3 -3
- package/examples/extensions/overlay-test.ts +2 -2
- package/examples/extensions/permission-gate.ts +1 -1
- package/examples/extensions/pirate.ts +1 -1
- package/examples/extensions/plan-mode/index.ts +4 -4
- package/examples/extensions/preset.ts +4 -4
- package/examples/extensions/project-trust.ts +1 -1
- package/examples/extensions/prompt-customizer.ts +1 -1
- package/examples/extensions/protected-paths.ts +1 -1
- package/examples/extensions/provider-payload.ts +1 -1
- package/examples/extensions/qna.ts +3 -3
- package/examples/extensions/question.ts +2 -2
- package/examples/extensions/questionnaire.ts +2 -2
- package/examples/extensions/rainbow-editor.ts +1 -1
- package/examples/extensions/reload-runtime.ts +1 -1
- package/examples/extensions/rpc-demo.ts +1 -1
- package/examples/extensions/sandbox/index.ts +2 -2
- package/examples/extensions/send-user-message.ts +1 -1
- package/examples/extensions/session-name.ts +1 -1
- package/examples/extensions/shutdown-command.ts +1 -1
- package/examples/extensions/snake.ts +2 -2
- package/examples/extensions/space-invaders.ts +2 -2
- package/examples/extensions/ssh.ts +2 -2
- package/examples/extensions/status-line.ts +1 -1
- package/examples/extensions/structured-output.ts +2 -2
- package/examples/extensions/subagent/agents.ts +1 -1
- package/examples/extensions/subagent/index.ts +5 -5
- package/examples/extensions/summarize.ts +4 -4
- package/examples/extensions/system-prompt-header.ts +1 -1
- package/examples/extensions/tic-tac-toe.ts +3 -3
- package/examples/extensions/timed-confirm.ts +1 -1
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/extensions/todo.ts +3 -3
- package/examples/extensions/tool-override.ts +2 -2
- package/examples/extensions/tools.ts +3 -3
- package/examples/extensions/trigger-compact.ts +1 -1
- package/examples/extensions/truncated-tool.ts +3 -3
- package/examples/extensions/widget-placement.ts +1 -1
- package/examples/extensions/with-deps/index.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/rpc-extension-ui.ts +1 -1
- package/examples/sdk/01-minimal.ts +1 -1
- package/examples/sdk/02-custom-model.ts +2 -2
- package/examples/sdk/03-custom-prompt.ts +1 -1
- package/examples/sdk/04-skills.ts +1 -1
- package/examples/sdk/05-tools.ts +1 -1
- package/examples/sdk/06-extensions.ts +2 -2
- package/examples/sdk/07-context-files.ts +1 -1
- package/examples/sdk/08-prompt-templates.ts +1 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +1 -1
- package/examples/sdk/10-settings.ts +1 -1
- package/examples/sdk/11-sessions.ts +1 -1
- package/examples/sdk/12-full-control.ts +2 -2
- package/examples/sdk/13-session-runtime.ts +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-overview.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-overview.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * code_overview — Summarize project structure, key files, and symbols.\n *\n * Uses tree-sitter for symbol extraction. Shows:\n * - Directory tree (respecting .gitignore, max depth ~3)\n * - Top-level symbols per key file\n * - Dependency manifests\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@earendil-works/pi-coding-agent\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { resolve, relative } from \"node:path\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport type { WorkspaceIndex } from \"../tree-sitter/workspace-index.js\";\nimport { extractSymbols } from \"../tree-sitter/symbol-extractor.js\";\nimport { SKIP_DIRS } from \"../shared/constants.js\";\n\n// Shared constant imported from ../shared/constants.ts\n\n/** Known dependency manifest files */\nconst MANIFESTS = [\n \"package.json\", \"Cargo.toml\", \"go.mod\", \"go.sum\",\n \"pom.xml\", \"build.gradle\", \"build.gradle.kts\",\n \"requirements.txt\", \"pyproject.toml\", \"setup.py\", \"setup.cfg\",\n \"Gemfile\", \"Makefile\", \"CMakeLists.txt\",\n];\n\n/** Known entry point patterns */\nconst ENTRY_PATTERNS = [\n \"index.ts\", \"index.js\", \"main.ts\", \"main.js\", \"app.ts\", \"app.js\",\n \"main.py\", \"app.py\", \"__init__.py\",\n \"main.rs\", \"lib.rs\",\n \"main.go\",\n \"Main.java\", \"Application.java\",\n];\n\nconst MAX_TREE_DEPTH = 3;\nconst MAX_TREE_ENTRIES = 200;\n\nconst OverviewParams = Type.Object({\n path: Type.Optional(Type.String({ description: \"Root directory to analyze (defaults to project root)\" })),\n depth: Type.Optional(Type.Number({ description: \"Maximum directory depth (default: 3)\" })),\n});\n\ninterface OverviewDetails { files: number; symbols: number }\n\nexport function createCodeOverviewTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n workspaceIndex: WorkspaceIndex,\n): ToolDefinition<typeof OverviewParams, OverviewDetails> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_overview\",\n label: \"Code Overview\",\n description: \"Summarize project structure: directory tree, top-level symbols per key file, dependency manifests. Uses tree-sitter for symbol extraction — no LSP required.\",\n promptSnippet: \"Get a structural overview of the project (directories, key files, symbols)\",\n parameters: OverviewParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const targetDir = resolve(rootDir, params.path ?? \".\");\n const maxDepth = params.depth ?? MAX_TREE_DEPTH;\n\n const sections: string[] = [];\n let totalFiles = 0;\n let totalSymbols = 0;\n\n // 1. Directory tree\n const treeLines: string[] = [];\n await buildTree(targetDir, \"\", 0, maxDepth, treeLines);\n totalFiles = treeLines.filter((l) => !l.endsWith(\"/\")).length;\n sections.push(\"## Directory Structure\\n\\n```\\n\" + treeLines.join(\"\\n\") + \"\\n```\");\n\n // 2. Dependency manifests\n const manifests: string[] = [];\n for (const m of MANIFESTS) {\n const path = resolve(targetDir, m);\n if (existsSync(path)) {\n manifests.push(m);\n }\n }\n if (manifests.length > 0) {\n sections.push(\"## Dependency Manifests\\n\\n\" + manifests.map((m) => `- ${m}`).join(\"\\n\"));\n }\n\n // 3. Key files with symbols\n const keyFiles = await findKeyFiles(targetDir);\n if (keyFiles.length > 0) {\n const symbolSections: string[] = [];\n for (const file of keyFiles.slice(0, 10)) {\n try {\n const content = await readFile(file, \"utf-8\");\n const languageId = treeSitter.getLanguageId(file);\n if (!languageId) continue;\n\n const tree = await treeSitter.parse(file, content);\n if (!tree) continue;\n\n const symbols = extractSymbols(tree, languageId);\n if (symbols.length === 0) continue;\n\n const relPath = relative(targetDir, file);\n const symbolLines = symbols.slice(0, 20).map((s) => {\n const kindNames: Record<number, string> = {\n 5: \"class\", 6: \"method\", 10: \"enum\", 11: \"interface\",\n 12: \"function\", 13: \"variable\", 14: \"constant\", 22: \"struct\",\n };\n const kind = kindNames[s.kind] ?? \"symbol\";\n return ` ${kind} ${s.name} (line ${s.line})`;\n });\n if (symbols.length > 20) {\n symbolLines.push(` ... and ${symbols.length - 20} more`);\n }\n totalSymbols += symbols.length;\n symbolSections.push(`### ${relPath}\\n${symbolLines.join(\"\\n\")}`);\n } catch { /* skip */ }\n }\n if (symbolSections.length > 0) {\n sections.push(\"## Key Files\\n\\n\" + symbolSections.join(\"\\n\\n\"));\n }\n }\n\n // 4. Workspace index stats\n if (workspaceIndex.isBuilt) {\n const stats = workspaceIndex.getStats();\n sections.push(`## Index Stats\\n\\n- ${stats.files} indexed files\\n- ${stats.symbols} symbols`);\n }\n\n const output = sections.join(\"\\n\\n\");\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let text = truncation.content;\n if (truncation.truncated) {\n text += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text }],\n details: { files: totalFiles, symbols: totalSymbols },\n };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"code_overview \"));\n if (args.path) text += theme.fg(\"accent\", args.path);\n else text += theme.fg(\"dim\", \"(project root)\");\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Analyzing...\"), 0, 0);\n const d = result.details;\n if (!d) return new Text(theme.fg(\"dim\", \"No overview\"), 0, 0);\n return new Text(theme.fg(\"success\", `${d.files} files, ${d.symbols} symbols`), 0, 0);\n },\n };\n}\n\n/** Build a directory tree representation */\nasync function buildTree(\n dir: string,\n prefix: string,\n depth: number,\n maxDepth: number,\n lines: string[],\n): Promise<void> {\n if (depth > maxDepth || lines.length > MAX_TREE_ENTRIES) return;\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n // Sort: directories first, then files\n const sorted = entries\n .filter((e) => !e.name.startsWith(\".\") || e.name === \".github\")\n .sort((a, b) => {\n if (a.isDirectory() && !b.isDirectory()) return -1;\n if (!a.isDirectory() && b.isDirectory()) return 1;\n return a.name.localeCompare(b.name);\n });\n\n for (let i = 0; i < sorted.length; i++) {\n if (lines.length > MAX_TREE_ENTRIES) {\n lines.push(`${prefix}... (truncated)`);\n return;\n }\n\n const entry = sorted[i];\n const isLast = i === sorted.length - 1;\n const connector = isLast ? \"└── \" : \"├── \";\n const childPrefix = isLast ? \" \" : \"│ \";\n\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) {\n lines.push(`${prefix}${connector}${entry.name}/ (skipped)`);\n continue;\n }\n lines.push(`${prefix}${connector}${entry.name}/`);\n await buildTree(\n resolve(dir, entry.name),\n prefix + childPrefix,\n depth + 1,\n maxDepth,\n lines,\n );\n } else {\n lines.push(`${prefix}${connector}${entry.name}`);\n }\n }\n } catch { /* permission denied */ }\n}\n\n/** Find key/entry-point files in the project */\nasync function findKeyFiles(dir: string): Promise<string[]> {\n const found: string[] = [];\n\n // Check common entry point locations\n const searchDirs = [dir, resolve(dir, \"src\"), resolve(dir, \"lib\"), resolve(dir, \"app\")];\n\n for (const searchDir of searchDirs) {\n for (const pattern of ENTRY_PATTERNS) {\n const fullPath = resolve(searchDir, pattern);\n if (existsSync(fullPath)) {\n found.push(fullPath);\n }\n }\n }\n\n return [...new Set(found)]; // deduplicate\n}\n"]}
|
|
1
|
+
{"version":3,"file":"code-overview.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-overview.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACxG,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,uDAAuD;AAEvD,sCAAsC;AACtC,MAAM,SAAS,GAAG;IAChB,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ;IAChD,SAAS,EAAE,cAAc,EAAE,kBAAkB;IAC7C,kBAAkB,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW;IAC7D,SAAS,EAAE,UAAU,EAAE,gBAAgB;CACxC,CAAC;AAEF,iCAAiC;AACjC,MAAM,cAAc,GAAG;IACrB,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ;IAChE,SAAS,EAAE,QAAQ,EAAE,aAAa;IAClC,SAAS,EAAE,QAAQ;IACnB,SAAS;IACT,WAAW,EAAE,kBAAkB;CAChC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC,CAAC;IACzG,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC,CAAC;CAC3F,CAAC,CAAC;AAIH,MAAM,UAAU,sBAAsB,CACpC,eAAwC,EACxC,UAA6B,EAC7B,cAA8B,EAC0B;IACxD,MAAM,UAAU,GAAG,OAAO,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC;IAEnG,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,gKAA8J;QAC3K,aAAa,EAAE,4EAA4E;QAC3F,UAAU,EAAE,cAAc;QAE1B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE;YACjC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,IAAI,cAAc,CAAC;YAEhD,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,YAAY,GAAG,CAAC,CAAC;YAErB,oBAAoB;YACpB,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,MAAM,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YACvD,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9D,QAAQ,CAAC,IAAI,CAAC,iCAAiC,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;YAElF,0BAA0B;YAC1B,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBACnC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,QAAQ,CAAC,IAAI,CAAC,6BAA6B,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3F,CAAC;YAED,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,cAAc,GAAa,EAAE,CAAC;gBACpC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACzC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;wBAClD,IAAI,CAAC,UAAU;4BAAE,SAAS;wBAE1B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBACnD,IAAI,CAAC,IAAI;4BAAE,SAAS;wBAEpB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;wBACjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;4BAAE,SAAS;wBAEnC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;wBAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;4BAClD,MAAM,SAAS,GAA2B;gCACxC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW;gCACpD,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ;6BAC7D,CAAC;4BACF,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;4BAC3C,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,GAAG,CAAC;wBAAA,CAC/C,CAAC,CAAC;wBACH,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;4BACxB,WAAW,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;wBAC5D,CAAC;wBACD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;wBAC/B,cAAc,CAAC,IAAI,CAAC,OAAO,OAAO,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnE,CAAC;oBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;gBACxB,CAAC;gBACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,QAAQ,CAAC,IAAI,CAAC,kBAAkB,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAED,2BAA2B;YAC3B,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,KAAK,qBAAqB,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;YAChG,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACtG,IAAI,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;YAC9B,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBACzB,IAAI,IAAI,2BAA2B,UAAU,CAAC,WAAW,OAAO,UAAU,CAAC,UAAU,SAAS,CAAC;YACjG,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACjC,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE;aACtD,CAAC;QAAA,CACH;QAED,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YACtB,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC/D,IAAI,IAAI,CAAC,IAAI;gBAAE,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;;gBAChD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YAC/C,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAAA,CAC7B;QAED,YAAY,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE;YACzC,IAAI,SAAS;gBAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1E,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;YACzB,IAAI,CAAC,CAAC;gBAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,OAAO,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAAA,CACtF;KACF,CAAC;AAAA,CACH;AAED,4CAA4C;AAC5C,KAAK,UAAU,SAAS,CACtB,GAAW,EACX,MAAc,EACd,KAAa,EACb,QAAgB,EAChB,KAAe,EACA;IACf,IAAI,KAAK,GAAG,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB;QAAE,OAAO;IAEhE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,sCAAsC;QACtC,MAAM,MAAM,GAAG,OAAO;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;aAC9D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACd,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;gBAAE,OAAO,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,OAAO,CAAC,CAAC;YAClD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAAA,CACrC,CAAC,CAAC;QAEL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;gBACpC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,iBAAiB,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,YAAM,CAAC,CAAC,CAAC,YAAM,CAAC;YAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAM,CAAC;YAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC;oBAC5D,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;gBAClD,MAAM,SAAS,CACb,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EACxB,MAAM,GAAG,WAAW,EACpB,KAAK,GAAG,CAAC,EACT,QAAQ,EACR,KAAK,CACN,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;AAAA,CACpC;AAED,gDAAgD;AAChD,KAAK,UAAU,YAAY,CAAC,GAAW,EAAqB;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,qCAAqC;IACrC,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAExF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc;AAAf,CAC5B","sourcesContent":["// @ts-nocheck\n/**\n * code_overview — Summarize project structure, key files, and symbols.\n *\n * Uses tree-sitter for symbol extraction. Shows:\n * - Directory tree (respecting .gitignore, max depth ~3)\n * - Top-level symbols per key file\n * - Dependency manifests\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { Text } from \"@ashx-j/lunr-tui\";\nimport { resolve, relative } from \"node:path\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport type { WorkspaceIndex } from \"../tree-sitter/workspace-index.js\";\nimport { extractSymbols } from \"../tree-sitter/symbol-extractor.js\";\nimport { SKIP_DIRS } from \"../shared/constants.js\";\n\n// Shared constant imported from ../shared/constants.ts\n\n/** Known dependency manifest files */\nconst MANIFESTS = [\n \"package.json\", \"Cargo.toml\", \"go.mod\", \"go.sum\",\n \"pom.xml\", \"build.gradle\", \"build.gradle.kts\",\n \"requirements.txt\", \"pyproject.toml\", \"setup.py\", \"setup.cfg\",\n \"Gemfile\", \"Makefile\", \"CMakeLists.txt\",\n];\n\n/** Known entry point patterns */\nconst ENTRY_PATTERNS = [\n \"index.ts\", \"index.js\", \"main.ts\", \"main.js\", \"app.ts\", \"app.js\",\n \"main.py\", \"app.py\", \"__init__.py\",\n \"main.rs\", \"lib.rs\",\n \"main.go\",\n \"Main.java\", \"Application.java\",\n];\n\nconst MAX_TREE_DEPTH = 3;\nconst MAX_TREE_ENTRIES = 200;\n\nconst OverviewParams = Type.Object({\n path: Type.Optional(Type.String({ description: \"Root directory to analyze (defaults to project root)\" })),\n depth: Type.Optional(Type.Number({ description: \"Maximum directory depth (default: 3)\" })),\n});\n\ninterface OverviewDetails { files: number; symbols: number }\n\nexport function createCodeOverviewTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n workspaceIndex: WorkspaceIndex,\n): ToolDefinition<typeof OverviewParams, OverviewDetails> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_overview\",\n label: \"Code Overview\",\n description: \"Summarize project structure: directory tree, top-level symbols per key file, dependency manifests. Uses tree-sitter for symbol extraction — no LSP required.\",\n promptSnippet: \"Get a structural overview of the project (directories, key files, symbols)\",\n parameters: OverviewParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const targetDir = resolve(rootDir, params.path ?? \".\");\n const maxDepth = params.depth ?? MAX_TREE_DEPTH;\n\n const sections: string[] = [];\n let totalFiles = 0;\n let totalSymbols = 0;\n\n // 1. Directory tree\n const treeLines: string[] = [];\n await buildTree(targetDir, \"\", 0, maxDepth, treeLines);\n totalFiles = treeLines.filter((l) => !l.endsWith(\"/\")).length;\n sections.push(\"## Directory Structure\\n\\n```\\n\" + treeLines.join(\"\\n\") + \"\\n```\");\n\n // 2. Dependency manifests\n const manifests: string[] = [];\n for (const m of MANIFESTS) {\n const path = resolve(targetDir, m);\n if (existsSync(path)) {\n manifests.push(m);\n }\n }\n if (manifests.length > 0) {\n sections.push(\"## Dependency Manifests\\n\\n\" + manifests.map((m) => `- ${m}`).join(\"\\n\"));\n }\n\n // 3. Key files with symbols\n const keyFiles = await findKeyFiles(targetDir);\n if (keyFiles.length > 0) {\n const symbolSections: string[] = [];\n for (const file of keyFiles.slice(0, 10)) {\n try {\n const content = await readFile(file, \"utf-8\");\n const languageId = treeSitter.getLanguageId(file);\n if (!languageId) continue;\n\n const tree = await treeSitter.parse(file, content);\n if (!tree) continue;\n\n const symbols = extractSymbols(tree, languageId);\n if (symbols.length === 0) continue;\n\n const relPath = relative(targetDir, file);\n const symbolLines = symbols.slice(0, 20).map((s) => {\n const kindNames: Record<number, string> = {\n 5: \"class\", 6: \"method\", 10: \"enum\", 11: \"interface\",\n 12: \"function\", 13: \"variable\", 14: \"constant\", 22: \"struct\",\n };\n const kind = kindNames[s.kind] ?? \"symbol\";\n return ` ${kind} ${s.name} (line ${s.line})`;\n });\n if (symbols.length > 20) {\n symbolLines.push(` ... and ${symbols.length - 20} more`);\n }\n totalSymbols += symbols.length;\n symbolSections.push(`### ${relPath}\\n${symbolLines.join(\"\\n\")}`);\n } catch { /* skip */ }\n }\n if (symbolSections.length > 0) {\n sections.push(\"## Key Files\\n\\n\" + symbolSections.join(\"\\n\\n\"));\n }\n }\n\n // 4. Workspace index stats\n if (workspaceIndex.isBuilt) {\n const stats = workspaceIndex.getStats();\n sections.push(`## Index Stats\\n\\n- ${stats.files} indexed files\\n- ${stats.symbols} symbols`);\n }\n\n const output = sections.join(\"\\n\\n\");\n const truncation = truncateHead(output, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let text = truncation.content;\n if (truncation.truncated) {\n text += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text }],\n details: { files: totalFiles, symbols: totalSymbols },\n };\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"code_overview \"));\n if (args.path) text += theme.fg(\"accent\", args.path);\n else text += theme.fg(\"dim\", \"(project root)\");\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial) return new Text(theme.fg(\"warning\", \"Analyzing...\"), 0, 0);\n const d = result.details;\n if (!d) return new Text(theme.fg(\"dim\", \"No overview\"), 0, 0);\n return new Text(theme.fg(\"success\", `${d.files} files, ${d.symbols} symbols`), 0, 0);\n },\n };\n}\n\n/** Build a directory tree representation */\nasync function buildTree(\n dir: string,\n prefix: string,\n depth: number,\n maxDepth: number,\n lines: string[],\n): Promise<void> {\n if (depth > maxDepth || lines.length > MAX_TREE_ENTRIES) return;\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n // Sort: directories first, then files\n const sorted = entries\n .filter((e) => !e.name.startsWith(\".\") || e.name === \".github\")\n .sort((a, b) => {\n if (a.isDirectory() && !b.isDirectory()) return -1;\n if (!a.isDirectory() && b.isDirectory()) return 1;\n return a.name.localeCompare(b.name);\n });\n\n for (let i = 0; i < sorted.length; i++) {\n if (lines.length > MAX_TREE_ENTRIES) {\n lines.push(`${prefix}... (truncated)`);\n return;\n }\n\n const entry = sorted[i];\n const isLast = i === sorted.length - 1;\n const connector = isLast ? \"└── \" : \"├── \";\n const childPrefix = isLast ? \" \" : \"│ \";\n\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) {\n lines.push(`${prefix}${connector}${entry.name}/ (skipped)`);\n continue;\n }\n lines.push(`${prefix}${connector}${entry.name}/`);\n await buildTree(\n resolve(dir, entry.name),\n prefix + childPrefix,\n depth + 1,\n maxDepth,\n lines,\n );\n } else {\n lines.push(`${prefix}${connector}${entry.name}`);\n }\n }\n } catch { /* permission denied */ }\n}\n\n/** Find key/entry-point files in the project */\nasync function findKeyFiles(dir: string): Promise<string[]> {\n const found: string[] = [];\n\n // Check common entry point locations\n const searchDirs = [dir, resolve(dir, \"src\"), resolve(dir, \"lib\"), resolve(dir, \"app\")];\n\n for (const searchDir of searchDirs) {\n for (const pattern of ENTRY_PATTERNS) {\n const fullPath = resolve(searchDir, pattern);\n if (existsSync(fullPath)) {\n found.push(fullPath);\n }\n }\n }\n\n return [...new Set(found)]; // deduplicate\n}\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* template that can reference captured metavariables. Supports dry-run preview.
|
|
6
6
|
*/
|
|
7
7
|
import { Type } from "@sinclair/typebox";
|
|
8
|
-
import type { ToolDefinition } from "@
|
|
8
|
+
import type { ToolDefinition } from "@ashx-j/lunr";
|
|
9
9
|
import type { TreeSitterManager } from "../tree-sitter/parser-manager.js";
|
|
10
10
|
/** Callback to notify when files are modified by rewrites */
|
|
11
11
|
export interface RewriteFileChangeCallback {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-rewrite.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAK1E,6DAA6D;AAC7D,MAAM,WAAW,yBAAyB;IACxC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,QAAA,MAAM,aAAa;;;;;;EAMjB,CAAC;AAQH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EACxC,UAAU,EAAE,iBAAiB,EAC7B,kBAAkB,CAAC,EAAE,yBAAyB,GAC7C,cAAc,CAAC,OAAO,aAAa,CAAC,CAgItC","sourcesContent":["// @ts-nocheck\n/**\n * code_rewrite — Transform code matching a structural pattern into a replacement.\n *\n * Matches code by AST structure (like ast_search), then applies a replacement\n * template that can reference captured metavariables. Supports dry-run preview.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@
|
|
1
|
+
{"version":3,"file":"code-rewrite.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAK1E,6DAA6D;AAC7D,MAAM,WAAW,yBAAyB;IACxC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,QAAA,MAAM,aAAa;;;;;;EAMjB,CAAC;AAQH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EACxC,UAAU,EAAE,iBAAiB,EAC7B,kBAAkB,CAAC,EAAE,yBAAyB,GAC7C,cAAc,CAAC,OAAO,aAAa,CAAC,CAgItC","sourcesContent":["// @ts-nocheck\n/**\n * code_rewrite — Transform code matching a structural pattern into a replacement.\n *\n * Matches code by AST structure (like ast_search), then applies a replacement\n * template that can reference captured metavariables. Supports dry-run preview.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { relative } from \"node:path\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { compilePattern } from \"../tree-sitter/pattern-compiler.js\";\nimport { searchFiles } from \"../tree-sitter/search-engine.js\";\nimport { computeRewrites, applyRewrites } from \"../tree-sitter/rewrite-engine.js\";\n\n/** Callback to notify when files are modified by rewrites */\nexport interface RewriteFileChangeCallback {\n onFileModified(filePath: string): void;\n}\n\nconst RewriteParams = Type.Object({\n pattern: Type.String({ description: \"Structural pattern to match (with $NAME / $$$NAME metavariables)\" }),\n replacement: Type.String({ description: \"Replacement template using the same metavariables\" }),\n language: Type.String({ description: \"Target language (typescript, python, rust, java, etc.)\" }),\n path: Type.Optional(Type.String({ description: \"File or directory scope (default: workspace root)\" })),\n dry_run: Type.Optional(Type.Boolean({ description: \"Preview changes without applying (default: true)\" })),\n});\n\ninterface RewriteDetails {\n matchCount: number;\n filesModified: number;\n dryRun: boolean;\n}\n\nexport function createCodeRewriteTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n fileChangeCallback?: RewriteFileChangeCallback,\n): ToolDefinition<typeof RewriteParams> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_rewrite\",\n label: \"Code Rewrite\",\n description:\n \"Transform code matching a structural pattern into a replacement. \" +\n \"Use $NAME to capture and reuse single nodes, $$$NAME for sequences. \" +\n \"Defaults to dry-run mode (preview only). Set dry_run=false to apply changes. \" +\n \"For symbol renames, prefer lsp_rename instead (semantically correct).\",\n parameters: RewriteParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const { pattern: patternStr, replacement, language, path, dry_run } = params;\n const isDryRun = dry_run !== false; // default true\n\n // Compile the pattern\n let compiled;\n try {\n compiled = await compilePattern(patternStr, language, treeSitter);\n } catch (e: any) {\n return {\n content: [{ type: \"text\", text: `Error: ${e.message}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n // Validate that replacement references only known metavars\n const knownVars = new Set(compiled.metavars);\n const refRe = /\\$\\$\\$([A-Z_][A-Z0-9_]*)|\\$([A-Z_][A-Z0-9_]*)/g;\n let refMatch;\n while ((refMatch = refRe.exec(replacement)) !== null) {\n const name = refMatch[1] ?? refMatch[2];\n if (!knownVars.has(name)) {\n return {\n content: [{ type: \"text\", text: `Error: Replacement references $${name} but pattern doesn't capture it. Pattern captures: ${compiled.metavars.join(\", \") || \"(none)\"}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n }\n\n // Find matches\n const matches = await searchFiles(compiled, rootDir, treeSitter, {\n path,\n maxResults: 500,\n });\n\n if (matches.length === 0) {\n return {\n content: [{ type: \"text\", text: \"No matches found. No changes to make.\" }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n if (isDryRun) {\n // Preview mode\n const changes = computeRewrites(matches, replacement);\n const lines: string[] = [];\n lines.push(`Dry run: ${changes.length} change${changes.length !== 1 ? \"s\" : \"\"} would be made:\\n`);\n\n for (const c of changes) {\n const relPath = relative(rootDir, c.file);\n lines.push(`${relPath}:${c.line}:${c.column}`);\n\n const beforeLines = c.before.split(\"\\n\");\n const afterLines = c.after.split(\"\\n\");\n\n for (const l of beforeLines) {\n lines.push(` - ${l}`);\n }\n for (const l of afterLines) {\n lines.push(` + ${l}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"Run with dry_run=false to apply these changes.\");\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n const uniqueFiles = new Set(changes.map((c) => c.file));\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: uniqueFiles.size, dryRun: true },\n };\n }\n\n // Apply mode\n const result = await applyRewrites(matches, replacement);\n\n // Notify FileSync about modified files so LSP servers get updated\n if (fileChangeCallback && result.filesModified > 0) {\n const modifiedFiles = new Set(result.changes.map((c) => c.file));\n for (const file of modifiedFiles) {\n fileChangeCallback.onFileModified(file);\n }\n }\n\n const lines: string[] = [];\n lines.push(`Applied ${result.changes.length} change${result.changes.length !== 1 ? \"s\" : \"\"} across ${result.filesModified} file${result.filesModified !== 1 ? \"s\" : \"\"}:\\n`);\n\n for (const c of result.changes) {\n const relPath = relative(rootDir, c.file);\n const beforeShort = c.before.length > 80 ? c.before.slice(0, 80) + \"...\" : c.before;\n const afterShort = c.after.length > 80 ? c.after.slice(0, 80) + \"...\" : c.after;\n lines.push(`${relPath}:${c.line} — ${beforeShort} → ${afterShort}`);\n }\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: result.filesModified, dryRun: false },\n };\n },\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-rewrite.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * code_rewrite — Transform code matching a structural pattern into a replacement.\n *\n * Matches code by AST structure (like ast_search), then applies a replacement\n * template that can reference captured metavariables. Supports dry-run preview.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@earendil-works/pi-coding-agent\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { relative } from \"node:path\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { compilePattern } from \"../tree-sitter/pattern-compiler.js\";\nimport { searchFiles } from \"../tree-sitter/search-engine.js\";\nimport { computeRewrites, applyRewrites } from \"../tree-sitter/rewrite-engine.js\";\n\n/** Callback to notify when files are modified by rewrites */\nexport interface RewriteFileChangeCallback {\n onFileModified(filePath: string): void;\n}\n\nconst RewriteParams = Type.Object({\n pattern: Type.String({ description: \"Structural pattern to match (with $NAME / $$$NAME metavariables)\" }),\n replacement: Type.String({ description: \"Replacement template using the same metavariables\" }),\n language: Type.String({ description: \"Target language (typescript, python, rust, java, etc.)\" }),\n path: Type.Optional(Type.String({ description: \"File or directory scope (default: workspace root)\" })),\n dry_run: Type.Optional(Type.Boolean({ description: \"Preview changes without applying (default: true)\" })),\n});\n\ninterface RewriteDetails {\n matchCount: number;\n filesModified: number;\n dryRun: boolean;\n}\n\nexport function createCodeRewriteTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n fileChangeCallback?: RewriteFileChangeCallback,\n): ToolDefinition<typeof RewriteParams> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_rewrite\",\n label: \"Code Rewrite\",\n description:\n \"Transform code matching a structural pattern into a replacement. \" +\n \"Use $NAME to capture and reuse single nodes, $$$NAME for sequences. \" +\n \"Defaults to dry-run mode (preview only). Set dry_run=false to apply changes. \" +\n \"For symbol renames, prefer lsp_rename instead (semantically correct).\",\n parameters: RewriteParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const { pattern: patternStr, replacement, language, path, dry_run } = params;\n const isDryRun = dry_run !== false; // default true\n\n // Compile the pattern\n let compiled;\n try {\n compiled = await compilePattern(patternStr, language, treeSitter);\n } catch (e: any) {\n return {\n content: [{ type: \"text\", text: `Error: ${e.message}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n // Validate that replacement references only known metavars\n const knownVars = new Set(compiled.metavars);\n const refRe = /\\$\\$\\$([A-Z_][A-Z0-9_]*)|\\$([A-Z_][A-Z0-9_]*)/g;\n let refMatch;\n while ((refMatch = refRe.exec(replacement)) !== null) {\n const name = refMatch[1] ?? refMatch[2];\n if (!knownVars.has(name)) {\n return {\n content: [{ type: \"text\", text: `Error: Replacement references $${name} but pattern doesn't capture it. Pattern captures: ${compiled.metavars.join(\", \") || \"(none)\"}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n }\n\n // Find matches\n const matches = await searchFiles(compiled, rootDir, treeSitter, {\n path,\n maxResults: 500,\n });\n\n if (matches.length === 0) {\n return {\n content: [{ type: \"text\", text: \"No matches found. No changes to make.\" }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n if (isDryRun) {\n // Preview mode\n const changes = computeRewrites(matches, replacement);\n const lines: string[] = [];\n lines.push(`Dry run: ${changes.length} change${changes.length !== 1 ? \"s\" : \"\"} would be made:\\n`);\n\n for (const c of changes) {\n const relPath = relative(rootDir, c.file);\n lines.push(`${relPath}:${c.line}:${c.column}`);\n\n const beforeLines = c.before.split(\"\\n\");\n const afterLines = c.after.split(\"\\n\");\n\n for (const l of beforeLines) {\n lines.push(` - ${l}`);\n }\n for (const l of afterLines) {\n lines.push(` + ${l}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"Run with dry_run=false to apply these changes.\");\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n const uniqueFiles = new Set(changes.map((c) => c.file));\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: uniqueFiles.size, dryRun: true },\n };\n }\n\n // Apply mode\n const result = await applyRewrites(matches, replacement);\n\n // Notify FileSync about modified files so LSP servers get updated\n if (fileChangeCallback && result.filesModified > 0) {\n const modifiedFiles = new Set(result.changes.map((c) => c.file));\n for (const file of modifiedFiles) {\n fileChangeCallback.onFileModified(file);\n }\n }\n\n const lines: string[] = [];\n lines.push(`Applied ${result.changes.length} change${result.changes.length !== 1 ? \"s\" : \"\"} across ${result.filesModified} file${result.filesModified !== 1 ? \"s\" : \"\"}:\\n`);\n\n for (const c of result.changes) {\n const relPath = relative(rootDir, c.file);\n const beforeShort = c.before.length > 80 ? c.before.slice(0, 80) + \"...\" : c.before;\n const afterShort = c.after.length > 80 ? c.after.slice(0, 80) + \"...\" : c.after;\n lines.push(`${relPath}:${c.line} — ${beforeShort} → ${afterShort}`);\n }\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: result.filesModified, dryRun: false },\n };\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"code-rewrite.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * code_rewrite — Transform code matching a structural pattern into a replacement.\n *\n * Matches code by AST structure (like ast_search), then applies a replacement\n * template that can reference captured metavariables. Supports dry-run preview.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { relative } from \"node:path\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { compilePattern } from \"../tree-sitter/pattern-compiler.js\";\nimport { searchFiles } from \"../tree-sitter/search-engine.js\";\nimport { computeRewrites, applyRewrites } from \"../tree-sitter/rewrite-engine.js\";\n\n/** Callback to notify when files are modified by rewrites */\nexport interface RewriteFileChangeCallback {\n onFileModified(filePath: string): void;\n}\n\nconst RewriteParams = Type.Object({\n pattern: Type.String({ description: \"Structural pattern to match (with $NAME / $$$NAME metavariables)\" }),\n replacement: Type.String({ description: \"Replacement template using the same metavariables\" }),\n language: Type.String({ description: \"Target language (typescript, python, rust, java, etc.)\" }),\n path: Type.Optional(Type.String({ description: \"File or directory scope (default: workspace root)\" })),\n dry_run: Type.Optional(Type.Boolean({ description: \"Preview changes without applying (default: true)\" })),\n});\n\ninterface RewriteDetails {\n matchCount: number;\n filesModified: number;\n dryRun: boolean;\n}\n\nexport function createCodeRewriteTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n fileChangeCallback?: RewriteFileChangeCallback,\n): ToolDefinition<typeof RewriteParams> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"code_rewrite\",\n label: \"Code Rewrite\",\n description:\n \"Transform code matching a structural pattern into a replacement. \" +\n \"Use $NAME to capture and reuse single nodes, $$$NAME for sequences. \" +\n \"Defaults to dry-run mode (preview only). Set dry_run=false to apply changes. \" +\n \"For symbol renames, prefer lsp_rename instead (semantically correct).\",\n parameters: RewriteParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const { pattern: patternStr, replacement, language, path, dry_run } = params;\n const isDryRun = dry_run !== false; // default true\n\n // Compile the pattern\n let compiled;\n try {\n compiled = await compilePattern(patternStr, language, treeSitter);\n } catch (e: any) {\n return {\n content: [{ type: \"text\", text: `Error: ${e.message}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n // Validate that replacement references only known metavars\n const knownVars = new Set(compiled.metavars);\n const refRe = /\\$\\$\\$([A-Z_][A-Z0-9_]*)|\\$([A-Z_][A-Z0-9_]*)/g;\n let refMatch;\n while ((refMatch = refRe.exec(replacement)) !== null) {\n const name = refMatch[1] ?? refMatch[2];\n if (!knownVars.has(name)) {\n return {\n content: [{ type: \"text\", text: `Error: Replacement references $${name} but pattern doesn't capture it. Pattern captures: ${compiled.metavars.join(\", \") || \"(none)\"}` }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n }\n\n // Find matches\n const matches = await searchFiles(compiled, rootDir, treeSitter, {\n path,\n maxResults: 500,\n });\n\n if (matches.length === 0) {\n return {\n content: [{ type: \"text\", text: \"No matches found. No changes to make.\" }],\n details: { matchCount: 0, filesModified: 0, dryRun: isDryRun },\n };\n }\n\n if (isDryRun) {\n // Preview mode\n const changes = computeRewrites(matches, replacement);\n const lines: string[] = [];\n lines.push(`Dry run: ${changes.length} change${changes.length !== 1 ? \"s\" : \"\"} would be made:\\n`);\n\n for (const c of changes) {\n const relPath = relative(rootDir, c.file);\n lines.push(`${relPath}:${c.line}:${c.column}`);\n\n const beforeLines = c.before.split(\"\\n\");\n const afterLines = c.after.split(\"\\n\");\n\n for (const l of beforeLines) {\n lines.push(` - ${l}`);\n }\n for (const l of afterLines) {\n lines.push(` + ${l}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"Run with dry_run=false to apply these changes.\");\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n const uniqueFiles = new Set(changes.map((c) => c.file));\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: uniqueFiles.size, dryRun: true },\n };\n }\n\n // Apply mode\n const result = await applyRewrites(matches, replacement);\n\n // Notify FileSync about modified files so LSP servers get updated\n if (fileChangeCallback && result.filesModified > 0) {\n const modifiedFiles = new Set(result.changes.map((c) => c.file));\n for (const file of modifiedFiles) {\n fileChangeCallback.onFileModified(file);\n }\n }\n\n const lines: string[] = [];\n lines.push(`Applied ${result.changes.length} change${result.changes.length !== 1 ? \"s\" : \"\"} across ${result.filesModified} file${result.filesModified !== 1 ? \"s\" : \"\"}:\\n`);\n\n for (const c of result.changes) {\n const relPath = relative(rootDir, c.file);\n const beforeShort = c.before.length > 80 ? c.before.slice(0, 80) + \"...\" : c.before;\n const afterShort = c.after.length > 80 ? c.after.slice(0, 80) + \"...\" : c.after;\n lines.push(`${relPath}:${c.line} — ${beforeShort} → ${afterShort}`);\n }\n\n const text = lines.join(\"\\n\");\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesModified: result.filesModified, dryRun: false },\n };\n },\n };\n}\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Supports `$NAME` for single-node wildcards and `$$$NAME` for variadic.
|
|
6
6
|
*/
|
|
7
7
|
import { Type } from "@sinclair/typebox";
|
|
8
|
-
import type { ToolDefinition } from "@
|
|
8
|
+
import type { ToolDefinition } from "@ashx-j/lunr";
|
|
9
9
|
import type { TreeSitterManager } from "../tree-sitter/parser-manager.js";
|
|
10
10
|
declare const SearchParams: Type.TObject<{
|
|
11
11
|
pattern: Type.TString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-search.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-search.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAI1E,QAAA,MAAM,YAAY;;;;;EAKhB,CAAC;AAOH,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EACxC,UAAU,EAAE,iBAAiB,GAC5B,cAAc,CAAC,OAAO,YAAY,CAAC,CA+ErC","sourcesContent":["// @ts-nocheck\n/**\n * ast_search — Find code matching a structural pattern with metavariables.\n *\n * Uses tree-sitter AST matching to find code by structure, not text.\n * Supports `$NAME` for single-node wildcards and `$$$NAME` for variadic.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@
|
|
1
|
+
{"version":3,"file":"code-search.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-search.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAI1E,QAAA,MAAM,YAAY;;;;;EAKhB,CAAC;AAOH,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,EACxC,UAAU,EAAE,iBAAiB,GAC5B,cAAc,CAAC,OAAO,YAAY,CAAC,CA+ErC","sourcesContent":["// @ts-nocheck\n/**\n * ast_search — Find code matching a structural pattern with metavariables.\n *\n * Uses tree-sitter AST matching to find code by structure, not text.\n * Supports `$NAME` for single-node wildcards and `$$$NAME` for variadic.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { relative } from \"node:path\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { compilePattern } from \"../tree-sitter/pattern-compiler.js\";\nimport { searchFiles } from \"../tree-sitter/search-engine.js\";\n\nconst SearchParams = Type.Object({\n pattern: Type.String({ description: \"Structural pattern with metavariables ($NAME for single node, $$$NAME for variadic)\" }),\n language: Type.String({ description: \"Target language (typescript, python, rust, java, etc.)\" }),\n path: Type.Optional(Type.String({ description: \"File or directory to search (default: workspace root)\" })),\n max_results: Type.Optional(Type.Number({ description: \"Maximum results to return (default: 50)\" })),\n});\n\ninterface SearchDetails {\n matchCount: number;\n filesSearched: number;\n}\n\nexport function createCodeSearchTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n): ToolDefinition<typeof SearchParams> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"ast_search\",\n label: \"Code Search\",\n description:\n \"Find code matching a structural pattern using AST matching. \" +\n \"Use $NAME to match any single node, $$$NAME to match zero-or-more nodes. \" +\n \"More precise than grep — matches code structure, not text.\",\n parameters: SearchParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const { pattern: patternStr, language, path, max_results } = params;\n\n // Compile the pattern\n let compiled;\n try {\n compiled = await compilePattern(patternStr, language, treeSitter);\n } catch (e: any) {\n return {\n content: [{ type: \"text\", text: `Error: ${e.message}` }],\n details: { matchCount: 0, filesSearched: 0 },\n };\n }\n\n // Run the search\n const matches = await searchFiles(compiled, rootDir, treeSitter, {\n path,\n maxResults: max_results ?? 50,\n });\n\n if (matches.length === 0) {\n return {\n content: [{ type: \"text\", text: \"No matches found.\" }],\n details: { matchCount: 0, filesSearched: 0 },\n };\n }\n\n // Format results\n const lines: string[] = [];\n lines.push(`Found ${matches.length} match${matches.length !== 1 ? \"es\" : \"\"}:\\n`);\n\n for (const m of matches) {\n const relPath = relative(rootDir, m.file);\n const matchText = m.matchedText.length > 200\n ? m.matchedText.slice(0, 200) + \"...\"\n : m.matchedText;\n\n lines.push(`${relPath}:${m.line}:${m.column}`);\n lines.push(` ${matchText.replace(/\\n/g, \"\\n \")}`);\n\n // Show captures\n const captureEntries = Object.entries(m.captures);\n if (captureEntries.length > 0) {\n for (const [name, value] of captureEntries) {\n const displayValue = value.length > 100 ? value.slice(0, 100) + \"...\" : value;\n lines.push(` $${name} = ${displayValue}`);\n }\n }\n lines.push(\"\");\n }\n\n const text = lines.join(\"\\n\");\n const uniqueFiles = new Set(matches.map((m) => m.file));\n\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesSearched: uniqueFiles.size },\n };\n },\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-search.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-search.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * ast_search — Find code matching a structural pattern with metavariables.\n *\n * Uses tree-sitter AST matching to find code by structure, not text.\n * Supports `$NAME` for single-node wildcards and `$$$NAME` for variadic.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@
|
|
1
|
+
{"version":3,"file":"code-search.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/code-search.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * ast_search — Find code matching a structural pattern with metavariables.\n *\n * Uses tree-sitter AST matching to find code by structure, not text.\n * Supports `$NAME` for single-node wildcards and `$$$NAME` for variadic.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { truncateHead, DEFAULT_MAX_LINES, DEFAULT_MAX_BYTES } from \"../../../../core/tools/truncate.js\";\nimport { relative } from \"node:path\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { compilePattern } from \"../tree-sitter/pattern-compiler.js\";\nimport { searchFiles } from \"../tree-sitter/search-engine.js\";\n\nconst SearchParams = Type.Object({\n pattern: Type.String({ description: \"Structural pattern with metavariables ($NAME for single node, $$$NAME for variadic)\" }),\n language: Type.String({ description: \"Target language (typescript, python, rust, java, etc.)\" }),\n path: Type.Optional(Type.String({ description: \"File or directory to search (default: workspace root)\" })),\n max_results: Type.Optional(Type.Number({ description: \"Maximum results to return (default: 50)\" })),\n});\n\ninterface SearchDetails {\n matchCount: number;\n filesSearched: number;\n}\n\nexport function createCodeSearchTool(\n rootDirOrGetter: string | (() => string),\n treeSitter: TreeSitterManager,\n): ToolDefinition<typeof SearchParams> {\n const getRootDir = typeof rootDirOrGetter === \"function\" ? rootDirOrGetter : () => rootDirOrGetter;\n\n return {\n name: \"ast_search\",\n label: \"Code Search\",\n description:\n \"Find code matching a structural pattern using AST matching. \" +\n \"Use $NAME to match any single node, $$$NAME to match zero-or-more nodes. \" +\n \"More precise than grep — matches code structure, not text.\",\n parameters: SearchParams,\n\n async execute(_toolCallId, params) {\n const rootDir = getRootDir();\n const { pattern: patternStr, language, path, max_results } = params;\n\n // Compile the pattern\n let compiled;\n try {\n compiled = await compilePattern(patternStr, language, treeSitter);\n } catch (e: any) {\n return {\n content: [{ type: \"text\", text: `Error: ${e.message}` }],\n details: { matchCount: 0, filesSearched: 0 },\n };\n }\n\n // Run the search\n const matches = await searchFiles(compiled, rootDir, treeSitter, {\n path,\n maxResults: max_results ?? 50,\n });\n\n if (matches.length === 0) {\n return {\n content: [{ type: \"text\", text: \"No matches found.\" }],\n details: { matchCount: 0, filesSearched: 0 },\n };\n }\n\n // Format results\n const lines: string[] = [];\n lines.push(`Found ${matches.length} match${matches.length !== 1 ? \"es\" : \"\"}:\\n`);\n\n for (const m of matches) {\n const relPath = relative(rootDir, m.file);\n const matchText = m.matchedText.length > 200\n ? m.matchedText.slice(0, 200) + \"...\"\n : m.matchedText;\n\n lines.push(`${relPath}:${m.line}:${m.column}`);\n lines.push(` ${matchText.replace(/\\n/g, \"\\n \")}`);\n\n // Show captures\n const captureEntries = Object.entries(m.captures);\n if (captureEntries.length > 0) {\n for (const [name, value] of captureEntries) {\n const displayValue = value.length > 100 ? value.slice(0, 100) + \"...\" : value;\n lines.push(` $${name} = ${displayValue}`);\n }\n }\n lines.push(\"\");\n }\n\n const text = lines.join(\"\\n\");\n const uniqueFiles = new Set(matches.map((m) => m.file));\n\n const truncation = truncateHead(text, { maxLines: DEFAULT_MAX_LINES, maxBytes: DEFAULT_MAX_BYTES });\n let output = truncation.content;\n if (truncation.truncated) {\n output += `\\n\\n[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines]`;\n }\n\n return {\n content: [{ type: \"text\", text: output }],\n details: { matchCount: matches.length, filesSearched: uniqueFiles.size },\n };\n },\n };\n}\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* letting the LLM discover available methods, properties, and APIs.
|
|
6
6
|
*/
|
|
7
7
|
import { Type } from "@sinclair/typebox";
|
|
8
|
-
import type { ToolDefinition } from "@
|
|
8
|
+
import type { ToolDefinition } from "@ashx-j/lunr";
|
|
9
9
|
import type { LspManager } from "../lsp-manager.js";
|
|
10
10
|
import type { TreeSitterManager } from "../tree-sitter/parser-manager.js";
|
|
11
11
|
declare const CompletionParams: Type.TObject<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completions.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/completions.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAOzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA2E1E,QAAA,MAAM,gBAAgB;;;;;;;EAcpB,CAAC;AAEH,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAyCD,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9C,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,kEAAkE;IAClE,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5C;AAED,6FAA6F;AAC7F,eAAO,MAAM,iBAAiB,aAAoB,CAAC;AAEnD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,EACnB,cAAc,CAAC,EAAE,cAAc,EAC/B,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACpC,cAAc,CAAC,OAAO,gBAAgB,EAAE,iBAAiB,CAAC,CA6P5D","sourcesContent":["// @ts-nocheck\n/**\n * lsp_completions — Get completion suggestions at a position.\n *\n * Returns ranked completion items with type signatures and documentation,\n * letting the LLM discover available methods, properties, and APIs.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type {\n CompletionItem,\n CompletionList,\n CompletionItemKind,\n MarkupContent,\n} from \"vscode-languageserver-protocol\";\nimport type { ToolDefinition } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveSymbolPosition } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { SYNTHETIC_DOT_SETTLE_DELAY_MS } from \"../shared/timing.js\";\n\n/** Map CompletionItemKind to human-readable labels */\nconst KIND_LABELS: Record<number, string> = {\n 1: \"text\",\n 2: \"method\",\n 3: \"function\",\n 4: \"constructor\",\n 5: \"field\",\n 6: \"variable\",\n 7: \"class\",\n 8: \"interface\",\n 9: \"module\",\n 10: \"property\",\n 11: \"unit\",\n 12: \"value\",\n 13: \"enum\",\n 14: \"keyword\",\n 15: \"snippet\",\n 16: \"color\",\n 17: \"file\",\n 18: \"reference\",\n 19: \"folder\",\n 20: \"enum member\",\n 21: \"constant\",\n 22: \"struct\",\n 23: \"event\",\n 24: \"operator\",\n 25: \"type param\",\n};\n\nfunction kindLabel(kind?: CompletionItemKind): string {\n if (!kind) return \"unknown\";\n return KIND_LABELS[kind] ?? \"unknown\";\n}\n\n/** Extract a short doc summary (first 1-2 lines) from documentation */\nfunction docSummary(doc?: string | MarkupContent): string | undefined {\n if (!doc) return undefined;\n const text = typeof doc === \"string\" ? doc : doc.value;\n if (!text) return undefined;\n // Strip markdown code fences and take first 2 non-empty lines\n const lines = text\n .replace(/```[\\s\\S]*?```/g, \"\")\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n const summary = lines.slice(0, 2).join(\" \");\n // Cap at 120 chars\n return summary.length > 120 ? summary.slice(0, 117) + \"...\" : summary;\n}\n\n/** Format a single completion item as a compact line */\nfunction formatItem(item: CompletionItem): string {\n const kind = kindLabel(item.kind);\n const label = item.label;\n const detail = item.detail ? ` ${item.detail}` : \"\";\n const labelDetail =\n item.labelDetails?.detail ? item.labelDetails.detail : \"\";\n const labelDesc =\n item.labelDetails?.description ? ` — ${item.labelDetails.description}` : \"\";\n\n let line = `${kind.padEnd(12)} ${label}${labelDetail}${detail}${labelDesc}`;\n const doc = docSummary(item.documentation);\n if (doc) {\n line += `\\n${\"\".padEnd(13)}${doc}`;\n }\n return line;\n}\n\ntype CompletionResponse = CompletionList | CompletionItem[] | null;\n\nconst CompletionParams = Type.Object({\n path: Type.String({ description: \"File path\" }),\n line: Type.Optional(Type.Number({ description: \"Line number (1-indexed). Required unless query is provided.\" })),\n character: Type.Optional(Type.Number({ description: \"Column number (1-indexed). Required unless query is provided.\" })),\n query: Type.Optional(Type.String({ description: \"Symbol name to find in the file. Alternative to line/character — resolves the symbol's position automatically.\" })),\n limit: Type.Optional(\n Type.Number({ description: \"Max results to return (default: 20)\" })\n ),\n trigger: Type.Optional(\n Type.Union([Type.Literal(\"auto\"), Type.Literal(\"none\")], {\n description:\n 'Synthetic trigger mode (default: \"auto\"). When \"auto\", if the position is at the end of an identifier (no trailing dot), a dot is temporarily inserted to trigger member completions. Use \"none\" to skip this.',\n })\n ),\n});\n\ninterface CompletionDetails {\n count: number;\n total: number;\n}\n\n/**\n * Check if the position is at the end of an identifier (suitable for synthetic dot insertion).\n * Returns the position after the identifier where the dot should be inserted, or null.\n */\nfunction shouldSyntheticTrigger(\n content: string,\n line: number, // 0-indexed\n character: number // 0-indexed\n): { insertLine: number; insertChar: number } | null {\n const lines = content.split(\"\\n\");\n if (line < 0 || line >= lines.length) return null;\n const lineText = lines[line];\n if (character < 0 || character > lineText.length) return null;\n\n // The character at `character` (0-indexed) should NOT be a dot already\n if (lineText[character] === \".\") return null;\n\n // The character before `character` should be an identifier char (or closing paren/bracket)\n const charBefore = character > 0 ? lineText[character - 1] : \"\";\n if (!charBefore) return null;\n\n // Accept identifier chars, closing parens/brackets (for chained calls like foo().bar)\n if (/[\\w\\d_\\)\\]]/.test(charBefore)) {\n return { insertLine: line, insertChar: character };\n }\n\n return null;\n}\n\n/**\n * Insert a dot at the given position in the content string.\n */\nfunction insertDot(content: string, line: number, character: number): string {\n const lines = content.split(\"\\n\");\n const lineText = lines[line];\n lines[line] = lineText.slice(0, character) + \".\" + lineText.slice(character);\n return lines.join(\"\\n\");\n}\n\n/** Interface for coordinating document versions with FileSync */\nexport interface VersionTracker {\n getTrackedVersion(uri: string): number | null;\n setTrackedVersion(uri: string, version: number): void;\n /** Check if a synthetic dot operation is in progress for a URI */\n isSyntheticDotActive(uri: string): boolean;\n}\n\n/** Simple per-URI lock to prevent concurrent synthetic dot + file write version conflicts */\nexport const syntheticDotLocks = new Set<string>();\n\nexport function createCompletionsTool(\n manager: LspManager,\n versionTracker?: VersionTracker,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof CompletionParams, CompletionDetails> {\n return {\n name: \"lsp_completions\",\n label: \"LSP Completions\",\n description:\n 'Get completion suggestions at a specific position in a file. Returns methods, properties, and other symbols available at that point. Useful for discovering APIs and verifying method names. Line and character are 1-indexed. When trigger is \"auto\" (default), a dot is temporarily inserted if the position is at the end of an identifier, enabling member completion without editing the file.',\n promptSnippet:\n 'Get code completion suggestions at a file position via LSP. Use to discover available methods, properties, and APIs on objects. Supports automatic dot insertion for exploring members on identifiers.',\n parameters: CompletionParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n const limit = params.limit ?? 20;\n const trigger = params.trigger ?? \"auto\";\n let line = params.line;\n let character = params.character;\n let resolvedFrom: string | undefined;\n\n // Resolve position from query if line/character not provided\n if ((line === undefined || character === undefined) && params.query) {\n const resolved = await resolveSymbolPosition(filePath, params.query, manager, treeSitter);\n if (resolved) {\n line = resolved.line + 1;\n character = resolved.character + 1;\n resolvedFrom = `Resolved \"${params.query}\" → ${resolved.symbolName} at ${line}:${character} [${resolved.source}]`;\n } else {\n return { content: [{ type: \"text\", text: `Could not find symbol \"${params.query}\" in ${filePath}` }], details: { count: 0, total: 0 } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { count: 0, total: 0 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n if (!client) {\n return {\n content: [\n { type: \"text\", text: manager.getUnavailableReason(filePath) },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n // Check if server supports completions\n const caps = client.serverCapabilities;\n if (caps && !caps.completionProvider) {\n return {\n content: [\n {\n type: \"text\",\n text: `LSP server for this file does not support completions.`,\n },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n const uri = manager.getFileUri(filePath);\n const position = {\n line: line - 1,\n character: character - 1,\n };\n\n try {\n // Synthetic trigger: if position is at end of identifier, temporarily insert \".\"\n let syntheticDot = false;\n let originalContent: string | null = null;\n let revertVersion = 99991;\n let completionPosition = position;\n\n if (trigger === \"auto\") {\n // Acquire per-URI lock to prevent concurrent version mutations\n if (syntheticDotLocks.has(uri)) {\n // Another synthetic dot operation is in progress — skip synthetic trigger\n } else {\n try {\n syntheticDotLocks.add(uri);\n const absPath = manager.resolvePath(filePath);\n const fileContent = await readFile(absPath, \"utf-8\");\n const triggerPos = shouldSyntheticTrigger(fileContent, position.line, position.character);\n\n if (triggerPos) {\n originalContent = fileContent;\n const modifiedContent = insertDot(fileContent, triggerPos.insertLine, triggerPos.insertChar);\n\n // Coordinate version with FileSync to avoid desync\n const currentVersion = versionTracker?.getTrackedVersion(uri);\n const insertVersion = currentVersion != null ? currentVersion + 1 : 99990;\n revertVersion = currentVersion != null ? currentVersion + 2 : 99991;\n\n // Send the modified content to the LSP server\n client.didChange(uri, insertVersion, modifiedContent);\n\n // Update FileSync so it knows about the version bump\n if (versionTracker && currentVersion != null) {\n versionTracker.setTrackedVersion(uri, insertVersion);\n }\n\n // The completion position is right after the inserted dot\n completionPosition = {\n line: triggerPos.insertLine,\n character: triggerPos.insertChar + 1,\n };\n syntheticDot = true;\n\n // Brief delay to let the LSP process the change\n await new Promise((r) => setTimeout(r, SYNTHETIC_DOT_SETTLE_DELAY_MS));\n }\n } catch {\n // If reading file or inserting dot fails, fall through to normal completion\n } finally {\n syntheticDotLocks.delete(uri);\n }\n }\n }\n\n let response: CompletionResponse;\n try {\n response = await client.sendRequest<CompletionResponse>(\n \"textDocument/completion\",\n { textDocument: { uri }, position: completionPosition }\n );\n } finally {\n // Always revert synthetic dot, even on error\n if (syntheticDot && originalContent !== null) {\n try {\n client.didChange(uri, revertVersion, originalContent);\n // Update FileSync with the final version after revert\n if (versionTracker) {\n versionTracker.setTrackedVersion(uri, revertVersion);\n }\n } catch {\n // Best effort revert\n }\n }\n }\n\n if (!response) {\n return {\n content: [\n { type: \"text\", text: \"No completions available at this position.\" },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n // Normalize to array\n const allItems: CompletionItem[] = Array.isArray(response)\n ? response\n : response.items;\n\n if (allItems.length === 0) {\n return {\n content: [\n { type: \"text\", text: \"No completions available at this position.\" },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n const total = allItems.length;\n\n // Sort by sortText (LSP ranking), then take top N\n const sorted = [...allItems].sort((a, b) => {\n const sa = a.sortText ?? a.label;\n const sb = b.sortText ?? b.label;\n return sa.localeCompare(sb);\n });\n const topItems = sorted.slice(0, limit);\n\n // Resolve items in parallel for full details (documentation, signatures)\n const resolveSupported = caps?.completionProvider?.resolveProvider;\n let resolvedItems: CompletionItem[];\n\n if (resolveSupported) {\n const resolveResults = await Promise.allSettled(\n topItems.map((item) =>\n Promise.race([\n client.sendRequest<CompletionItem>(\n \"completionItem/resolve\",\n item\n ),\n // Timeout per item: 2 seconds\n new Promise<CompletionItem>((_, reject) =>\n setTimeout(() => reject(new Error(\"resolve timeout\")), 2000)\n ),\n ])\n )\n );\n\n resolvedItems = resolveResults.map((result, i) =>\n result.status === \"fulfilled\" ? result.value : topItems[i]\n );\n } else {\n resolvedItems = topItems;\n }\n\n // Format output\n const triggerNote = syntheticDot ? \" (synthetic dot trigger)\" : \"\";\n let header = `${resolvedItems.length} of ${total} completions at ${filePath}:${line}:${character}${triggerNote}\\n`;\n if (resolvedFrom) header = `${resolvedFrom}\\n\\n${header}`;\n const lines = resolvedItems.map(formatItem);\n const text = header + lines.join(\"\\n\");\n\n return {\n content: [{ type: \"text\", text }],\n details: { count: resolvedItems.length, total },\n };\n } catch (err: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `LSP completion request failed: ${err.message}`,\n },\n ],\n details: { count: 0, total: 0 },\n };\n }\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_completions \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n const extras: string[] = [];\n if (args.limit) extras.push(`limit: ${args.limit}`);\n if (args.trigger === \"none\") extras.push(\"trigger: none\");\n if (extras.length > 0) {\n text += theme.fg(\"dim\", ` (${extras.join(\", \")})`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial)\n return new Text(theme.fg(\"warning\", \"Loading completions...\"), 0, 0);\n if (!result.details || result.details.count === 0) {\n const content = result.content[0];\n if (content?.type === \"text\")\n return new Text(theme.fg(\"dim\", content.text), 0, 0);\n return new Text(theme.fg(\"dim\", \"No completions\"), 0, 0);\n }\n const { count, total } = result.details;\n const summary = `${count} of ${total} completions`;\n return new Text(theme.fg(\"dim\", summary), 0, 0);\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"completions.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/completions.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAOzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA2E1E,QAAA,MAAM,gBAAgB;;;;;;;EAcpB,CAAC;AAEH,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAyCD,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9C,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,kEAAkE;IAClE,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5C;AAED,6FAA6F;AAC7F,eAAO,MAAM,iBAAiB,aAAoB,CAAC;AAEnD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,UAAU,EACnB,cAAc,CAAC,EAAE,cAAc,EAC/B,UAAU,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACpC,cAAc,CAAC,OAAO,gBAAgB,EAAE,iBAAiB,CAAC,CA6P5D","sourcesContent":["// @ts-nocheck\n/**\n * lsp_completions — Get completion suggestions at a position.\n *\n * Returns ranked completion items with type signatures and documentation,\n * letting the LLM discover available methods, properties, and APIs.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type {\n CompletionItem,\n CompletionList,\n CompletionItemKind,\n MarkupContent,\n} from \"vscode-languageserver-protocol\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { Text } from \"@ashx-j/lunr-tui\";\nimport type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveSymbolPosition } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { SYNTHETIC_DOT_SETTLE_DELAY_MS } from \"../shared/timing.js\";\n\n/** Map CompletionItemKind to human-readable labels */\nconst KIND_LABELS: Record<number, string> = {\n 1: \"text\",\n 2: \"method\",\n 3: \"function\",\n 4: \"constructor\",\n 5: \"field\",\n 6: \"variable\",\n 7: \"class\",\n 8: \"interface\",\n 9: \"module\",\n 10: \"property\",\n 11: \"unit\",\n 12: \"value\",\n 13: \"enum\",\n 14: \"keyword\",\n 15: \"snippet\",\n 16: \"color\",\n 17: \"file\",\n 18: \"reference\",\n 19: \"folder\",\n 20: \"enum member\",\n 21: \"constant\",\n 22: \"struct\",\n 23: \"event\",\n 24: \"operator\",\n 25: \"type param\",\n};\n\nfunction kindLabel(kind?: CompletionItemKind): string {\n if (!kind) return \"unknown\";\n return KIND_LABELS[kind] ?? \"unknown\";\n}\n\n/** Extract a short doc summary (first 1-2 lines) from documentation */\nfunction docSummary(doc?: string | MarkupContent): string | undefined {\n if (!doc) return undefined;\n const text = typeof doc === \"string\" ? doc : doc.value;\n if (!text) return undefined;\n // Strip markdown code fences and take first 2 non-empty lines\n const lines = text\n .replace(/```[\\s\\S]*?```/g, \"\")\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n const summary = lines.slice(0, 2).join(\" \");\n // Cap at 120 chars\n return summary.length > 120 ? summary.slice(0, 117) + \"...\" : summary;\n}\n\n/** Format a single completion item as a compact line */\nfunction formatItem(item: CompletionItem): string {\n const kind = kindLabel(item.kind);\n const label = item.label;\n const detail = item.detail ? ` ${item.detail}` : \"\";\n const labelDetail =\n item.labelDetails?.detail ? item.labelDetails.detail : \"\";\n const labelDesc =\n item.labelDetails?.description ? ` — ${item.labelDetails.description}` : \"\";\n\n let line = `${kind.padEnd(12)} ${label}${labelDetail}${detail}${labelDesc}`;\n const doc = docSummary(item.documentation);\n if (doc) {\n line += `\\n${\"\".padEnd(13)}${doc}`;\n }\n return line;\n}\n\ntype CompletionResponse = CompletionList | CompletionItem[] | null;\n\nconst CompletionParams = Type.Object({\n path: Type.String({ description: \"File path\" }),\n line: Type.Optional(Type.Number({ description: \"Line number (1-indexed). Required unless query is provided.\" })),\n character: Type.Optional(Type.Number({ description: \"Column number (1-indexed). Required unless query is provided.\" })),\n query: Type.Optional(Type.String({ description: \"Symbol name to find in the file. Alternative to line/character — resolves the symbol's position automatically.\" })),\n limit: Type.Optional(\n Type.Number({ description: \"Max results to return (default: 20)\" })\n ),\n trigger: Type.Optional(\n Type.Union([Type.Literal(\"auto\"), Type.Literal(\"none\")], {\n description:\n 'Synthetic trigger mode (default: \"auto\"). When \"auto\", if the position is at the end of an identifier (no trailing dot), a dot is temporarily inserted to trigger member completions. Use \"none\" to skip this.',\n })\n ),\n});\n\ninterface CompletionDetails {\n count: number;\n total: number;\n}\n\n/**\n * Check if the position is at the end of an identifier (suitable for synthetic dot insertion).\n * Returns the position after the identifier where the dot should be inserted, or null.\n */\nfunction shouldSyntheticTrigger(\n content: string,\n line: number, // 0-indexed\n character: number // 0-indexed\n): { insertLine: number; insertChar: number } | null {\n const lines = content.split(\"\\n\");\n if (line < 0 || line >= lines.length) return null;\n const lineText = lines[line];\n if (character < 0 || character > lineText.length) return null;\n\n // The character at `character` (0-indexed) should NOT be a dot already\n if (lineText[character] === \".\") return null;\n\n // The character before `character` should be an identifier char (or closing paren/bracket)\n const charBefore = character > 0 ? lineText[character - 1] : \"\";\n if (!charBefore) return null;\n\n // Accept identifier chars, closing parens/brackets (for chained calls like foo().bar)\n if (/[\\w\\d_\\)\\]]/.test(charBefore)) {\n return { insertLine: line, insertChar: character };\n }\n\n return null;\n}\n\n/**\n * Insert a dot at the given position in the content string.\n */\nfunction insertDot(content: string, line: number, character: number): string {\n const lines = content.split(\"\\n\");\n const lineText = lines[line];\n lines[line] = lineText.slice(0, character) + \".\" + lineText.slice(character);\n return lines.join(\"\\n\");\n}\n\n/** Interface for coordinating document versions with FileSync */\nexport interface VersionTracker {\n getTrackedVersion(uri: string): number | null;\n setTrackedVersion(uri: string, version: number): void;\n /** Check if a synthetic dot operation is in progress for a URI */\n isSyntheticDotActive(uri: string): boolean;\n}\n\n/** Simple per-URI lock to prevent concurrent synthetic dot + file write version conflicts */\nexport const syntheticDotLocks = new Set<string>();\n\nexport function createCompletionsTool(\n manager: LspManager,\n versionTracker?: VersionTracker,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof CompletionParams, CompletionDetails> {\n return {\n name: \"lsp_completions\",\n label: \"LSP Completions\",\n description:\n 'Get completion suggestions at a specific position in a file. Returns methods, properties, and other symbols available at that point. Useful for discovering APIs and verifying method names. Line and character are 1-indexed. When trigger is \"auto\" (default), a dot is temporarily inserted if the position is at the end of an identifier, enabling member completion without editing the file.',\n promptSnippet:\n 'Get code completion suggestions at a file position via LSP. Use to discover available methods, properties, and APIs on objects. Supports automatic dot insertion for exploring members on identifiers.',\n parameters: CompletionParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n const limit = params.limit ?? 20;\n const trigger = params.trigger ?? \"auto\";\n let line = params.line;\n let character = params.character;\n let resolvedFrom: string | undefined;\n\n // Resolve position from query if line/character not provided\n if ((line === undefined || character === undefined) && params.query) {\n const resolved = await resolveSymbolPosition(filePath, params.query, manager, treeSitter);\n if (resolved) {\n line = resolved.line + 1;\n character = resolved.character + 1;\n resolvedFrom = `Resolved \"${params.query}\" → ${resolved.symbolName} at ${line}:${character} [${resolved.source}]`;\n } else {\n return { content: [{ type: \"text\", text: `Could not find symbol \"${params.query}\" in ${filePath}` }], details: { count: 0, total: 0 } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { count: 0, total: 0 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n if (!client) {\n return {\n content: [\n { type: \"text\", text: manager.getUnavailableReason(filePath) },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n // Check if server supports completions\n const caps = client.serverCapabilities;\n if (caps && !caps.completionProvider) {\n return {\n content: [\n {\n type: \"text\",\n text: `LSP server for this file does not support completions.`,\n },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n const uri = manager.getFileUri(filePath);\n const position = {\n line: line - 1,\n character: character - 1,\n };\n\n try {\n // Synthetic trigger: if position is at end of identifier, temporarily insert \".\"\n let syntheticDot = false;\n let originalContent: string | null = null;\n let revertVersion = 99991;\n let completionPosition = position;\n\n if (trigger === \"auto\") {\n // Acquire per-URI lock to prevent concurrent version mutations\n if (syntheticDotLocks.has(uri)) {\n // Another synthetic dot operation is in progress — skip synthetic trigger\n } else {\n try {\n syntheticDotLocks.add(uri);\n const absPath = manager.resolvePath(filePath);\n const fileContent = await readFile(absPath, \"utf-8\");\n const triggerPos = shouldSyntheticTrigger(fileContent, position.line, position.character);\n\n if (triggerPos) {\n originalContent = fileContent;\n const modifiedContent = insertDot(fileContent, triggerPos.insertLine, triggerPos.insertChar);\n\n // Coordinate version with FileSync to avoid desync\n const currentVersion = versionTracker?.getTrackedVersion(uri);\n const insertVersion = currentVersion != null ? currentVersion + 1 : 99990;\n revertVersion = currentVersion != null ? currentVersion + 2 : 99991;\n\n // Send the modified content to the LSP server\n client.didChange(uri, insertVersion, modifiedContent);\n\n // Update FileSync so it knows about the version bump\n if (versionTracker && currentVersion != null) {\n versionTracker.setTrackedVersion(uri, insertVersion);\n }\n\n // The completion position is right after the inserted dot\n completionPosition = {\n line: triggerPos.insertLine,\n character: triggerPos.insertChar + 1,\n };\n syntheticDot = true;\n\n // Brief delay to let the LSP process the change\n await new Promise((r) => setTimeout(r, SYNTHETIC_DOT_SETTLE_DELAY_MS));\n }\n } catch {\n // If reading file or inserting dot fails, fall through to normal completion\n } finally {\n syntheticDotLocks.delete(uri);\n }\n }\n }\n\n let response: CompletionResponse;\n try {\n response = await client.sendRequest<CompletionResponse>(\n \"textDocument/completion\",\n { textDocument: { uri }, position: completionPosition }\n );\n } finally {\n // Always revert synthetic dot, even on error\n if (syntheticDot && originalContent !== null) {\n try {\n client.didChange(uri, revertVersion, originalContent);\n // Update FileSync with the final version after revert\n if (versionTracker) {\n versionTracker.setTrackedVersion(uri, revertVersion);\n }\n } catch {\n // Best effort revert\n }\n }\n }\n\n if (!response) {\n return {\n content: [\n { type: \"text\", text: \"No completions available at this position.\" },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n // Normalize to array\n const allItems: CompletionItem[] = Array.isArray(response)\n ? response\n : response.items;\n\n if (allItems.length === 0) {\n return {\n content: [\n { type: \"text\", text: \"No completions available at this position.\" },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n const total = allItems.length;\n\n // Sort by sortText (LSP ranking), then take top N\n const sorted = [...allItems].sort((a, b) => {\n const sa = a.sortText ?? a.label;\n const sb = b.sortText ?? b.label;\n return sa.localeCompare(sb);\n });\n const topItems = sorted.slice(0, limit);\n\n // Resolve items in parallel for full details (documentation, signatures)\n const resolveSupported = caps?.completionProvider?.resolveProvider;\n let resolvedItems: CompletionItem[];\n\n if (resolveSupported) {\n const resolveResults = await Promise.allSettled(\n topItems.map((item) =>\n Promise.race([\n client.sendRequest<CompletionItem>(\n \"completionItem/resolve\",\n item\n ),\n // Timeout per item: 2 seconds\n new Promise<CompletionItem>((_, reject) =>\n setTimeout(() => reject(new Error(\"resolve timeout\")), 2000)\n ),\n ])\n )\n );\n\n resolvedItems = resolveResults.map((result, i) =>\n result.status === \"fulfilled\" ? result.value : topItems[i]\n );\n } else {\n resolvedItems = topItems;\n }\n\n // Format output\n const triggerNote = syntheticDot ? \" (synthetic dot trigger)\" : \"\";\n let header = `${resolvedItems.length} of ${total} completions at ${filePath}:${line}:${character}${triggerNote}\\n`;\n if (resolvedFrom) header = `${resolvedFrom}\\n\\n${header}`;\n const lines = resolvedItems.map(formatItem);\n const text = header + lines.join(\"\\n\");\n\n return {\n content: [{ type: \"text\", text }],\n details: { count: resolvedItems.length, total },\n };\n } catch (err: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `LSP completion request failed: ${err.message}`,\n },\n ],\n details: { count: 0, total: 0 },\n };\n }\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_completions \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n const extras: string[] = [];\n if (args.limit) extras.push(`limit: ${args.limit}`);\n if (args.trigger === \"none\") extras.push(\"trigger: none\");\n if (extras.length > 0) {\n text += theme.fg(\"dim\", ` (${extras.join(\", \")})`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial)\n return new Text(theme.fg(\"warning\", \"Loading completions...\"), 0, 0);\n if (!result.details || result.details.count === 0) {\n const content = result.content[0];\n if (content?.type === \"text\")\n return new Text(theme.fg(\"dim\", content.text), 0, 0);\n return new Text(theme.fg(\"dim\", \"No completions\"), 0, 0);\n }\n const { count, total } = result.details;\n const summary = `${count} of ${total} completions`;\n return new Text(theme.fg(\"dim\", summary), 0, 0);\n },\n };\n}\n"]}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* letting the LLM discover available methods, properties, and APIs.
|
|
7
7
|
*/
|
|
8
8
|
import { Type } from "@sinclair/typebox";
|
|
9
|
-
import { Text } from "@
|
|
9
|
+
import { Text } from "@ashx-j/lunr-tui";
|
|
10
10
|
import { resolveSymbolPosition } from "../shared/resolve-position.js";
|
|
11
11
|
import { readFile } from "node:fs/promises";
|
|
12
12
|
import { SYNTHETIC_DOT_SETTLE_DELAY_MS } from "../shared/timing.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completions.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/completions.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * lsp_completions — Get completion suggestions at a position.\n *\n * Returns ranked completion items with type signatures and documentation,\n * letting the LLM discover available methods, properties, and APIs.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type {\n CompletionItem,\n CompletionList,\n CompletionItemKind,\n MarkupContent,\n} from \"vscode-languageserver-protocol\";\nimport type { ToolDefinition } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveSymbolPosition } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { SYNTHETIC_DOT_SETTLE_DELAY_MS } from \"../shared/timing.js\";\n\n/** Map CompletionItemKind to human-readable labels */\nconst KIND_LABELS: Record<number, string> = {\n 1: \"text\",\n 2: \"method\",\n 3: \"function\",\n 4: \"constructor\",\n 5: \"field\",\n 6: \"variable\",\n 7: \"class\",\n 8: \"interface\",\n 9: \"module\",\n 10: \"property\",\n 11: \"unit\",\n 12: \"value\",\n 13: \"enum\",\n 14: \"keyword\",\n 15: \"snippet\",\n 16: \"color\",\n 17: \"file\",\n 18: \"reference\",\n 19: \"folder\",\n 20: \"enum member\",\n 21: \"constant\",\n 22: \"struct\",\n 23: \"event\",\n 24: \"operator\",\n 25: \"type param\",\n};\n\nfunction kindLabel(kind?: CompletionItemKind): string {\n if (!kind) return \"unknown\";\n return KIND_LABELS[kind] ?? \"unknown\";\n}\n\n/** Extract a short doc summary (first 1-2 lines) from documentation */\nfunction docSummary(doc?: string | MarkupContent): string | undefined {\n if (!doc) return undefined;\n const text = typeof doc === \"string\" ? doc : doc.value;\n if (!text) return undefined;\n // Strip markdown code fences and take first 2 non-empty lines\n const lines = text\n .replace(/```[\\s\\S]*?```/g, \"\")\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n const summary = lines.slice(0, 2).join(\" \");\n // Cap at 120 chars\n return summary.length > 120 ? summary.slice(0, 117) + \"...\" : summary;\n}\n\n/** Format a single completion item as a compact line */\nfunction formatItem(item: CompletionItem): string {\n const kind = kindLabel(item.kind);\n const label = item.label;\n const detail = item.detail ? ` ${item.detail}` : \"\";\n const labelDetail =\n item.labelDetails?.detail ? item.labelDetails.detail : \"\";\n const labelDesc =\n item.labelDetails?.description ? ` — ${item.labelDetails.description}` : \"\";\n\n let line = `${kind.padEnd(12)} ${label}${labelDetail}${detail}${labelDesc}`;\n const doc = docSummary(item.documentation);\n if (doc) {\n line += `\\n${\"\".padEnd(13)}${doc}`;\n }\n return line;\n}\n\ntype CompletionResponse = CompletionList | CompletionItem[] | null;\n\nconst CompletionParams = Type.Object({\n path: Type.String({ description: \"File path\" }),\n line: Type.Optional(Type.Number({ description: \"Line number (1-indexed). Required unless query is provided.\" })),\n character: Type.Optional(Type.Number({ description: \"Column number (1-indexed). Required unless query is provided.\" })),\n query: Type.Optional(Type.String({ description: \"Symbol name to find in the file. Alternative to line/character — resolves the symbol's position automatically.\" })),\n limit: Type.Optional(\n Type.Number({ description: \"Max results to return (default: 20)\" })\n ),\n trigger: Type.Optional(\n Type.Union([Type.Literal(\"auto\"), Type.Literal(\"none\")], {\n description:\n 'Synthetic trigger mode (default: \"auto\"). When \"auto\", if the position is at the end of an identifier (no trailing dot), a dot is temporarily inserted to trigger member completions. Use \"none\" to skip this.',\n })\n ),\n});\n\ninterface CompletionDetails {\n count: number;\n total: number;\n}\n\n/**\n * Check if the position is at the end of an identifier (suitable for synthetic dot insertion).\n * Returns the position after the identifier where the dot should be inserted, or null.\n */\nfunction shouldSyntheticTrigger(\n content: string,\n line: number, // 0-indexed\n character: number // 0-indexed\n): { insertLine: number; insertChar: number } | null {\n const lines = content.split(\"\\n\");\n if (line < 0 || line >= lines.length) return null;\n const lineText = lines[line];\n if (character < 0 || character > lineText.length) return null;\n\n // The character at `character` (0-indexed) should NOT be a dot already\n if (lineText[character] === \".\") return null;\n\n // The character before `character` should be an identifier char (or closing paren/bracket)\n const charBefore = character > 0 ? lineText[character - 1] : \"\";\n if (!charBefore) return null;\n\n // Accept identifier chars, closing parens/brackets (for chained calls like foo().bar)\n if (/[\\w\\d_\\)\\]]/.test(charBefore)) {\n return { insertLine: line, insertChar: character };\n }\n\n return null;\n}\n\n/**\n * Insert a dot at the given position in the content string.\n */\nfunction insertDot(content: string, line: number, character: number): string {\n const lines = content.split(\"\\n\");\n const lineText = lines[line];\n lines[line] = lineText.slice(0, character) + \".\" + lineText.slice(character);\n return lines.join(\"\\n\");\n}\n\n/** Interface for coordinating document versions with FileSync */\nexport interface VersionTracker {\n getTrackedVersion(uri: string): number | null;\n setTrackedVersion(uri: string, version: number): void;\n /** Check if a synthetic dot operation is in progress for a URI */\n isSyntheticDotActive(uri: string): boolean;\n}\n\n/** Simple per-URI lock to prevent concurrent synthetic dot + file write version conflicts */\nexport const syntheticDotLocks = new Set<string>();\n\nexport function createCompletionsTool(\n manager: LspManager,\n versionTracker?: VersionTracker,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof CompletionParams, CompletionDetails> {\n return {\n name: \"lsp_completions\",\n label: \"LSP Completions\",\n description:\n 'Get completion suggestions at a specific position in a file. Returns methods, properties, and other symbols available at that point. Useful for discovering APIs and verifying method names. Line and character are 1-indexed. When trigger is \"auto\" (default), a dot is temporarily inserted if the position is at the end of an identifier, enabling member completion without editing the file.',\n promptSnippet:\n 'Get code completion suggestions at a file position via LSP. Use to discover available methods, properties, and APIs on objects. Supports automatic dot insertion for exploring members on identifiers.',\n parameters: CompletionParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n const limit = params.limit ?? 20;\n const trigger = params.trigger ?? \"auto\";\n let line = params.line;\n let character = params.character;\n let resolvedFrom: string | undefined;\n\n // Resolve position from query if line/character not provided\n if ((line === undefined || character === undefined) && params.query) {\n const resolved = await resolveSymbolPosition(filePath, params.query, manager, treeSitter);\n if (resolved) {\n line = resolved.line + 1;\n character = resolved.character + 1;\n resolvedFrom = `Resolved \"${params.query}\" → ${resolved.symbolName} at ${line}:${character} [${resolved.source}]`;\n } else {\n return { content: [{ type: \"text\", text: `Could not find symbol \"${params.query}\" in ${filePath}` }], details: { count: 0, total: 0 } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { count: 0, total: 0 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n if (!client) {\n return {\n content: [\n { type: \"text\", text: manager.getUnavailableReason(filePath) },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n // Check if server supports completions\n const caps = client.serverCapabilities;\n if (caps && !caps.completionProvider) {\n return {\n content: [\n {\n type: \"text\",\n text: `LSP server for this file does not support completions.`,\n },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n const uri = manager.getFileUri(filePath);\n const position = {\n line: line - 1,\n character: character - 1,\n };\n\n try {\n // Synthetic trigger: if position is at end of identifier, temporarily insert \".\"\n let syntheticDot = false;\n let originalContent: string | null = null;\n let revertVersion = 99991;\n let completionPosition = position;\n\n if (trigger === \"auto\") {\n // Acquire per-URI lock to prevent concurrent version mutations\n if (syntheticDotLocks.has(uri)) {\n // Another synthetic dot operation is in progress — skip synthetic trigger\n } else {\n try {\n syntheticDotLocks.add(uri);\n const absPath = manager.resolvePath(filePath);\n const fileContent = await readFile(absPath, \"utf-8\");\n const triggerPos = shouldSyntheticTrigger(fileContent, position.line, position.character);\n\n if (triggerPos) {\n originalContent = fileContent;\n const modifiedContent = insertDot(fileContent, triggerPos.insertLine, triggerPos.insertChar);\n\n // Coordinate version with FileSync to avoid desync\n const currentVersion = versionTracker?.getTrackedVersion(uri);\n const insertVersion = currentVersion != null ? currentVersion + 1 : 99990;\n revertVersion = currentVersion != null ? currentVersion + 2 : 99991;\n\n // Send the modified content to the LSP server\n client.didChange(uri, insertVersion, modifiedContent);\n\n // Update FileSync so it knows about the version bump\n if (versionTracker && currentVersion != null) {\n versionTracker.setTrackedVersion(uri, insertVersion);\n }\n\n // The completion position is right after the inserted dot\n completionPosition = {\n line: triggerPos.insertLine,\n character: triggerPos.insertChar + 1,\n };\n syntheticDot = true;\n\n // Brief delay to let the LSP process the change\n await new Promise((r) => setTimeout(r, SYNTHETIC_DOT_SETTLE_DELAY_MS));\n }\n } catch {\n // If reading file or inserting dot fails, fall through to normal completion\n } finally {\n syntheticDotLocks.delete(uri);\n }\n }\n }\n\n let response: CompletionResponse;\n try {\n response = await client.sendRequest<CompletionResponse>(\n \"textDocument/completion\",\n { textDocument: { uri }, position: completionPosition }\n );\n } finally {\n // Always revert synthetic dot, even on error\n if (syntheticDot && originalContent !== null) {\n try {\n client.didChange(uri, revertVersion, originalContent);\n // Update FileSync with the final version after revert\n if (versionTracker) {\n versionTracker.setTrackedVersion(uri, revertVersion);\n }\n } catch {\n // Best effort revert\n }\n }\n }\n\n if (!response) {\n return {\n content: [\n { type: \"text\", text: \"No completions available at this position.\" },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n // Normalize to array\n const allItems: CompletionItem[] = Array.isArray(response)\n ? response\n : response.items;\n\n if (allItems.length === 0) {\n return {\n content: [\n { type: \"text\", text: \"No completions available at this position.\" },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n const total = allItems.length;\n\n // Sort by sortText (LSP ranking), then take top N\n const sorted = [...allItems].sort((a, b) => {\n const sa = a.sortText ?? a.label;\n const sb = b.sortText ?? b.label;\n return sa.localeCompare(sb);\n });\n const topItems = sorted.slice(0, limit);\n\n // Resolve items in parallel for full details (documentation, signatures)\n const resolveSupported = caps?.completionProvider?.resolveProvider;\n let resolvedItems: CompletionItem[];\n\n if (resolveSupported) {\n const resolveResults = await Promise.allSettled(\n topItems.map((item) =>\n Promise.race([\n client.sendRequest<CompletionItem>(\n \"completionItem/resolve\",\n item\n ),\n // Timeout per item: 2 seconds\n new Promise<CompletionItem>((_, reject) =>\n setTimeout(() => reject(new Error(\"resolve timeout\")), 2000)\n ),\n ])\n )\n );\n\n resolvedItems = resolveResults.map((result, i) =>\n result.status === \"fulfilled\" ? result.value : topItems[i]\n );\n } else {\n resolvedItems = topItems;\n }\n\n // Format output\n const triggerNote = syntheticDot ? \" (synthetic dot trigger)\" : \"\";\n let header = `${resolvedItems.length} of ${total} completions at ${filePath}:${line}:${character}${triggerNote}\\n`;\n if (resolvedFrom) header = `${resolvedFrom}\\n\\n${header}`;\n const lines = resolvedItems.map(formatItem);\n const text = header + lines.join(\"\\n\");\n\n return {\n content: [{ type: \"text\", text }],\n details: { count: resolvedItems.length, total },\n };\n } catch (err: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `LSP completion request failed: ${err.message}`,\n },\n ],\n details: { count: 0, total: 0 },\n };\n }\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_completions \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n const extras: string[] = [];\n if (args.limit) extras.push(`limit: ${args.limit}`);\n if (args.trigger === \"none\") extras.push(\"trigger: none\");\n if (extras.length > 0) {\n text += theme.fg(\"dim\", ` (${extras.join(\", \")})`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial)\n return new Text(theme.fg(\"warning\", \"Loading completions...\"), 0, 0);\n if (!result.details || result.details.count === 0) {\n const content = result.content[0];\n if (content?.type === \"text\")\n return new Text(theme.fg(\"dim\", content.text), 0, 0);\n return new Text(theme.fg(\"dim\", \"No completions\"), 0, 0);\n }\n const { count, total } = result.details;\n const summary = `${count} of ${total} completions`;\n return new Text(theme.fg(\"dim\", summary), 0, 0);\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"completions.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-lsp-extension/src/tools/completions.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * lsp_completions — Get completion suggestions at a position.\n *\n * Returns ranked completion items with type signatures and documentation,\n * letting the LLM discover available methods, properties, and APIs.\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type {\n CompletionItem,\n CompletionList,\n CompletionItemKind,\n MarkupContent,\n} from \"vscode-languageserver-protocol\";\nimport type { ToolDefinition } from \"@ashx-j/lunr\";\nimport { Text } from \"@ashx-j/lunr-tui\";\nimport type { LspManager } from \"../lsp-manager.js\";\nimport type { TreeSitterManager } from \"../tree-sitter/parser-manager.js\";\nimport { resolveSymbolPosition } from \"../shared/resolve-position.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { SYNTHETIC_DOT_SETTLE_DELAY_MS } from \"../shared/timing.js\";\n\n/** Map CompletionItemKind to human-readable labels */\nconst KIND_LABELS: Record<number, string> = {\n 1: \"text\",\n 2: \"method\",\n 3: \"function\",\n 4: \"constructor\",\n 5: \"field\",\n 6: \"variable\",\n 7: \"class\",\n 8: \"interface\",\n 9: \"module\",\n 10: \"property\",\n 11: \"unit\",\n 12: \"value\",\n 13: \"enum\",\n 14: \"keyword\",\n 15: \"snippet\",\n 16: \"color\",\n 17: \"file\",\n 18: \"reference\",\n 19: \"folder\",\n 20: \"enum member\",\n 21: \"constant\",\n 22: \"struct\",\n 23: \"event\",\n 24: \"operator\",\n 25: \"type param\",\n};\n\nfunction kindLabel(kind?: CompletionItemKind): string {\n if (!kind) return \"unknown\";\n return KIND_LABELS[kind] ?? \"unknown\";\n}\n\n/** Extract a short doc summary (first 1-2 lines) from documentation */\nfunction docSummary(doc?: string | MarkupContent): string | undefined {\n if (!doc) return undefined;\n const text = typeof doc === \"string\" ? doc : doc.value;\n if (!text) return undefined;\n // Strip markdown code fences and take first 2 non-empty lines\n const lines = text\n .replace(/```[\\s\\S]*?```/g, \"\")\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n const summary = lines.slice(0, 2).join(\" \");\n // Cap at 120 chars\n return summary.length > 120 ? summary.slice(0, 117) + \"...\" : summary;\n}\n\n/** Format a single completion item as a compact line */\nfunction formatItem(item: CompletionItem): string {\n const kind = kindLabel(item.kind);\n const label = item.label;\n const detail = item.detail ? ` ${item.detail}` : \"\";\n const labelDetail =\n item.labelDetails?.detail ? item.labelDetails.detail : \"\";\n const labelDesc =\n item.labelDetails?.description ? ` — ${item.labelDetails.description}` : \"\";\n\n let line = `${kind.padEnd(12)} ${label}${labelDetail}${detail}${labelDesc}`;\n const doc = docSummary(item.documentation);\n if (doc) {\n line += `\\n${\"\".padEnd(13)}${doc}`;\n }\n return line;\n}\n\ntype CompletionResponse = CompletionList | CompletionItem[] | null;\n\nconst CompletionParams = Type.Object({\n path: Type.String({ description: \"File path\" }),\n line: Type.Optional(Type.Number({ description: \"Line number (1-indexed). Required unless query is provided.\" })),\n character: Type.Optional(Type.Number({ description: \"Column number (1-indexed). Required unless query is provided.\" })),\n query: Type.Optional(Type.String({ description: \"Symbol name to find in the file. Alternative to line/character — resolves the symbol's position automatically.\" })),\n limit: Type.Optional(\n Type.Number({ description: \"Max results to return (default: 20)\" })\n ),\n trigger: Type.Optional(\n Type.Union([Type.Literal(\"auto\"), Type.Literal(\"none\")], {\n description:\n 'Synthetic trigger mode (default: \"auto\"). When \"auto\", if the position is at the end of an identifier (no trailing dot), a dot is temporarily inserted to trigger member completions. Use \"none\" to skip this.',\n })\n ),\n});\n\ninterface CompletionDetails {\n count: number;\n total: number;\n}\n\n/**\n * Check if the position is at the end of an identifier (suitable for synthetic dot insertion).\n * Returns the position after the identifier where the dot should be inserted, or null.\n */\nfunction shouldSyntheticTrigger(\n content: string,\n line: number, // 0-indexed\n character: number // 0-indexed\n): { insertLine: number; insertChar: number } | null {\n const lines = content.split(\"\\n\");\n if (line < 0 || line >= lines.length) return null;\n const lineText = lines[line];\n if (character < 0 || character > lineText.length) return null;\n\n // The character at `character` (0-indexed) should NOT be a dot already\n if (lineText[character] === \".\") return null;\n\n // The character before `character` should be an identifier char (or closing paren/bracket)\n const charBefore = character > 0 ? lineText[character - 1] : \"\";\n if (!charBefore) return null;\n\n // Accept identifier chars, closing parens/brackets (for chained calls like foo().bar)\n if (/[\\w\\d_\\)\\]]/.test(charBefore)) {\n return { insertLine: line, insertChar: character };\n }\n\n return null;\n}\n\n/**\n * Insert a dot at the given position in the content string.\n */\nfunction insertDot(content: string, line: number, character: number): string {\n const lines = content.split(\"\\n\");\n const lineText = lines[line];\n lines[line] = lineText.slice(0, character) + \".\" + lineText.slice(character);\n return lines.join(\"\\n\");\n}\n\n/** Interface for coordinating document versions with FileSync */\nexport interface VersionTracker {\n getTrackedVersion(uri: string): number | null;\n setTrackedVersion(uri: string, version: number): void;\n /** Check if a synthetic dot operation is in progress for a URI */\n isSyntheticDotActive(uri: string): boolean;\n}\n\n/** Simple per-URI lock to prevent concurrent synthetic dot + file write version conflicts */\nexport const syntheticDotLocks = new Set<string>();\n\nexport function createCompletionsTool(\n manager: LspManager,\n versionTracker?: VersionTracker,\n treeSitter?: TreeSitterManager | null,\n): ToolDefinition<typeof CompletionParams, CompletionDetails> {\n return {\n name: \"lsp_completions\",\n label: \"LSP Completions\",\n description:\n 'Get completion suggestions at a specific position in a file. Returns methods, properties, and other symbols available at that point. Useful for discovering APIs and verifying method names. Line and character are 1-indexed. When trigger is \"auto\" (default), a dot is temporarily inserted if the position is at the end of an identifier, enabling member completion without editing the file.',\n promptSnippet:\n 'Get code completion suggestions at a file position via LSP. Use to discover available methods, properties, and APIs on objects. Supports automatic dot insertion for exploring members on identifiers.',\n parameters: CompletionParams,\n\n async execute(_toolCallId, params) {\n const filePath = params.path.replace(/^@/, \"\");\n const limit = params.limit ?? 20;\n const trigger = params.trigger ?? \"auto\";\n let line = params.line;\n let character = params.character;\n let resolvedFrom: string | undefined;\n\n // Resolve position from query if line/character not provided\n if ((line === undefined || character === undefined) && params.query) {\n const resolved = await resolveSymbolPosition(filePath, params.query, manager, treeSitter);\n if (resolved) {\n line = resolved.line + 1;\n character = resolved.character + 1;\n resolvedFrom = `Resolved \"${params.query}\" → ${resolved.symbolName} at ${line}:${character} [${resolved.source}]`;\n } else {\n return { content: [{ type: \"text\", text: `Could not find symbol \"${params.query}\" in ${filePath}` }], details: { count: 0, total: 0 } };\n }\n }\n\n if (line === undefined || character === undefined) {\n return { content: [{ type: \"text\", text: \"Either line/character or query is required.\" }], details: { count: 0, total: 0 } };\n }\n\n const client = await manager.getClientForFile(filePath).catch(() => null);\n if (!client) {\n return {\n content: [\n { type: \"text\", text: manager.getUnavailableReason(filePath) },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n // Check if server supports completions\n const caps = client.serverCapabilities;\n if (caps && !caps.completionProvider) {\n return {\n content: [\n {\n type: \"text\",\n text: `LSP server for this file does not support completions.`,\n },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n const uri = manager.getFileUri(filePath);\n const position = {\n line: line - 1,\n character: character - 1,\n };\n\n try {\n // Synthetic trigger: if position is at end of identifier, temporarily insert \".\"\n let syntheticDot = false;\n let originalContent: string | null = null;\n let revertVersion = 99991;\n let completionPosition = position;\n\n if (trigger === \"auto\") {\n // Acquire per-URI lock to prevent concurrent version mutations\n if (syntheticDotLocks.has(uri)) {\n // Another synthetic dot operation is in progress — skip synthetic trigger\n } else {\n try {\n syntheticDotLocks.add(uri);\n const absPath = manager.resolvePath(filePath);\n const fileContent = await readFile(absPath, \"utf-8\");\n const triggerPos = shouldSyntheticTrigger(fileContent, position.line, position.character);\n\n if (triggerPos) {\n originalContent = fileContent;\n const modifiedContent = insertDot(fileContent, triggerPos.insertLine, triggerPos.insertChar);\n\n // Coordinate version with FileSync to avoid desync\n const currentVersion = versionTracker?.getTrackedVersion(uri);\n const insertVersion = currentVersion != null ? currentVersion + 1 : 99990;\n revertVersion = currentVersion != null ? currentVersion + 2 : 99991;\n\n // Send the modified content to the LSP server\n client.didChange(uri, insertVersion, modifiedContent);\n\n // Update FileSync so it knows about the version bump\n if (versionTracker && currentVersion != null) {\n versionTracker.setTrackedVersion(uri, insertVersion);\n }\n\n // The completion position is right after the inserted dot\n completionPosition = {\n line: triggerPos.insertLine,\n character: triggerPos.insertChar + 1,\n };\n syntheticDot = true;\n\n // Brief delay to let the LSP process the change\n await new Promise((r) => setTimeout(r, SYNTHETIC_DOT_SETTLE_DELAY_MS));\n }\n } catch {\n // If reading file or inserting dot fails, fall through to normal completion\n } finally {\n syntheticDotLocks.delete(uri);\n }\n }\n }\n\n let response: CompletionResponse;\n try {\n response = await client.sendRequest<CompletionResponse>(\n \"textDocument/completion\",\n { textDocument: { uri }, position: completionPosition }\n );\n } finally {\n // Always revert synthetic dot, even on error\n if (syntheticDot && originalContent !== null) {\n try {\n client.didChange(uri, revertVersion, originalContent);\n // Update FileSync with the final version after revert\n if (versionTracker) {\n versionTracker.setTrackedVersion(uri, revertVersion);\n }\n } catch {\n // Best effort revert\n }\n }\n }\n\n if (!response) {\n return {\n content: [\n { type: \"text\", text: \"No completions available at this position.\" },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n // Normalize to array\n const allItems: CompletionItem[] = Array.isArray(response)\n ? response\n : response.items;\n\n if (allItems.length === 0) {\n return {\n content: [\n { type: \"text\", text: \"No completions available at this position.\" },\n ],\n details: { count: 0, total: 0 },\n };\n }\n\n const total = allItems.length;\n\n // Sort by sortText (LSP ranking), then take top N\n const sorted = [...allItems].sort((a, b) => {\n const sa = a.sortText ?? a.label;\n const sb = b.sortText ?? b.label;\n return sa.localeCompare(sb);\n });\n const topItems = sorted.slice(0, limit);\n\n // Resolve items in parallel for full details (documentation, signatures)\n const resolveSupported = caps?.completionProvider?.resolveProvider;\n let resolvedItems: CompletionItem[];\n\n if (resolveSupported) {\n const resolveResults = await Promise.allSettled(\n topItems.map((item) =>\n Promise.race([\n client.sendRequest<CompletionItem>(\n \"completionItem/resolve\",\n item\n ),\n // Timeout per item: 2 seconds\n new Promise<CompletionItem>((_, reject) =>\n setTimeout(() => reject(new Error(\"resolve timeout\")), 2000)\n ),\n ])\n )\n );\n\n resolvedItems = resolveResults.map((result, i) =>\n result.status === \"fulfilled\" ? result.value : topItems[i]\n );\n } else {\n resolvedItems = topItems;\n }\n\n // Format output\n const triggerNote = syntheticDot ? \" (synthetic dot trigger)\" : \"\";\n let header = `${resolvedItems.length} of ${total} completions at ${filePath}:${line}:${character}${triggerNote}\\n`;\n if (resolvedFrom) header = `${resolvedFrom}\\n\\n${header}`;\n const lines = resolvedItems.map(formatItem);\n const text = header + lines.join(\"\\n\");\n\n return {\n content: [{ type: \"text\", text }],\n details: { count: resolvedItems.length, total },\n };\n } catch (err: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `LSP completion request failed: ${err.message}`,\n },\n ],\n details: { count: 0, total: 0 },\n };\n }\n },\n\n renderCall(args, theme) {\n let text = theme.fg(\"toolTitle\", theme.bold(\"lsp_completions \"));\n if (args.query && !args.line) {\n text += theme.fg(\"accent\", `${args.path}`);\n text += theme.fg(\"muted\", ` query=\"${args.query}\"`);\n } else {\n text += theme.fg(\"accent\", `${args.path}:${args.line}:${args.character}`);\n }\n const extras: string[] = [];\n if (args.limit) extras.push(`limit: ${args.limit}`);\n if (args.trigger === \"none\") extras.push(\"trigger: none\");\n if (extras.length > 0) {\n text += theme.fg(\"dim\", ` (${extras.join(\", \")})`);\n }\n return new Text(text, 0, 0);\n },\n\n renderResult(result, { isPartial }, theme) {\n if (isPartial)\n return new Text(theme.fg(\"warning\", \"Loading completions...\"), 0, 0);\n if (!result.details || result.details.count === 0) {\n const content = result.content[0];\n if (content?.type === \"text\")\n return new Text(theme.fg(\"dim\", content.text), 0, 0);\n return new Text(theme.fg(\"dim\", \"No completions\"), 0, 0);\n }\n const { count, total } = result.details;\n const summary = `${count} of ${total} completions`;\n return new Text(theme.fg(\"dim\", summary), 0, 0);\n },\n };\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* lsp_definition — Go to the definition of a symbol.
|
|
3
3
|
*/
|
|
4
4
|
import { Type } from "@sinclair/typebox";
|
|
5
|
-
import type { ToolDefinition } from "@
|
|
5
|
+
import type { ToolDefinition } from "@ashx-j/lunr";
|
|
6
6
|
import type { LspManager } from "../lsp-manager.js";
|
|
7
7
|
import type { TreeSitterManager } from "../tree-sitter/parser-manager.js";
|
|
8
8
|
import type { WorkspaceIndex } from "../tree-sitter/workspace-index.js";
|