@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":"openai-search.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/openai-search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAgB,MAAM,iBAAiB,CAAC;AAiBnF,UAAU,UAAU;IACnB,QAAQ,EAAE,cAAc,GAAG,QAAQ,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AA4FD,wBAAsB,iBAAiB,CAAC,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA2B/F;AAED,wBAAsB,uBAAuB,CAAC,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAEtF;AA6KD,wBAAsB,gBAAgB,CACrC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,EAC3B,GAAG,CAAC,EAAE,gBAAgB,GACpB,OAAO,CAAC,cAAc,CAAC,CAyEzB","sourcesContent":["// @ts-nocheck\nimport { existsSync, readFileSync } from \"node:fs\";\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { SearchOptions, SearchResponse, SearchResult } from \"./perplexity.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst OPENAI_RESPONSES_URL = \"https://api.openai.com/v1/responses\";\nconst CODEX_RESPONSES_URL = \"https://chatgpt.com/backend-api/codex/responses\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\nconst AUTH_MODEL_CANDIDATES = [\n\t{ provider: \"openai-codex\", models: [\"gpt-5.4\", \"gpt-5.3-codex\", \"gpt-5.3-codex-spark\", \"gpt-5.2\", \"gpt-5.2-codex\"] },\n\t{ provider: \"openai\", models: [\"gpt-5.4\", \"gpt-5.2\", \"gpt-4.1-mini\", \"gpt-4o\"] },\n] as const;\n\ninterface WebSearchConfig {\n\topenaiApiKey?: unknown;\n}\n\ninterface OpenAIAuth {\n\tprovider: \"openai-codex\" | \"openai\";\n\tapiKey: string;\n\tmodel: string;\n\theaders: Record<string, string>;\n}\n\ninterface NormalizedDomainFilters {\n\tallowedDomains?: string[];\n\tblockedDomains?: string[];\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nfunction normalizeApiKey(value: unknown): string | null {\n\tif (typeof value !== \"string\") return null;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction normalizeDomainFilters(domainFilter: string[] | undefined): NormalizedDomainFilters | null {\n\tif (!domainFilter?.length) return null;\n\n\tconst allowedDomains: string[] = [];\n\tconst blockedDomains: string[] = [];\n\tfor (const raw of domainFilter) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? blockedDomains : allowedDomains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\n\treturn allowedDomains.length > 0 || blockedDomains.length > 0\n\t\t? {\n\t\t\t...(allowedDomains.length > 0 ? { allowedDomains: allowedDomains.slice(0, 100) } : {}),\n\t\t\t...(blockedDomains.length > 0 ? { blockedDomains: blockedDomains.slice(0, 100) } : {}),\n\t\t}\n\t\t: null;\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n\tconst parts = token.split(\".\");\n\tif (parts.length !== 3 || !parts[1]) return null;\n\ttry {\n\t\tconst padded = parts[1].replace(/-/g, \"+\").replace(/_/g, \"/\").padEnd(Math.ceil(parts[1].length / 4) * 4, \"=\");\n\t\tconst parsed = JSON.parse(Buffer.from(padded, \"base64\").toString(\"utf8\"));\n\t\treturn parsed && typeof parsed === \"object\" ? parsed as Record<string, unknown> : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isCodexJwt(token: string): boolean {\n\tconst payload = decodeJwtPayload(token);\n\treturn !!payload?.[\"https://api.openai.com/auth\"];\n}\n\nfunction extractAccountId(token: string): string | undefined {\n\tconst payload = decodeJwtPayload(token);\n\tconst auth = payload?.[\"https://api.openai.com/auth\"];\n\tif (!auth || typeof auth !== \"object\") return undefined;\n\tconst id = (auth as Record<string, unknown>).chatgpt_account_id;\n\treturn typeof id === \"string\" && id.trim().length > 0 ? id.trim() : undefined;\n}\n\nexport async function resolveOpenAIAuth(ctx?: ExtensionContext): Promise<OpenAIAuth | undefined> {\n\tif (ctx) {\n\t\tconst { getModel } = await import(\"@earendil-works/pi-ai/compat\");\n\t\tfor (const candidate of AUTH_MODEL_CANDIDATES) {\n\t\t\tfor (const modelId of candidate.models) {\n\t\t\t\tconst model = getModel(candidate.provider, modelId);\n\t\t\t\tif (!model) continue;\n\t\t\t\ttry {\n\t\t\t\t\tconst resolved = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\t\tif (resolved.ok && resolved.apiKey) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tprovider: candidate.provider,\n\t\t\t\t\t\t\tapiKey: resolved.apiKey,\n\t\t\t\t\t\t\tmodel: modelId,\n\t\t\t\t\t\t\theaders: resolved.headers ?? {},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst apiKey = normalizeApiKey(process.env.OPENAI_API_KEY) ?? normalizeApiKey(loadConfig().openaiApiKey);\n\treturn apiKey\n\t\t? { provider: \"openai\", apiKey, model: \"gpt-5.4\", headers: {} }\n\t\t: undefined;\n}\n\nexport async function isOpenAISearchAvailable(ctx?: ExtensionContext): Promise<boolean> {\n\treturn !!(await resolveOpenAIAuth(ctx));\n}\n\nfunction buildInstructions(options: SearchOptions): string {\n\tconst lines = [\n\t\t\"Search the web and return a concise answer grounded only in the web results.\",\n\t\t\"Include clickable source citations in the response text when possible.\",\n\t];\n\n\tif (options.recencyFilter) {\n\t\tconst labels: Record<string, string> = {\n\t\t\tday: \"past 24 hours\",\n\t\t\tweek: \"past week\",\n\t\t\tmonth: \"past month\",\n\t\t\tyear: \"past year\",\n\t\t};\n\t\tlines.push(`Prefer sources from the ${labels[options.recencyFilter]}.`);\n\t}\n\n\tif (typeof options.numResults === \"number\" && Number.isFinite(options.numResults) && options.numResults > 0) {\n\t\tlines.push(`Prefer around ${Math.min(Math.floor(options.numResults), 20)} distinct sources.`);\n\t}\n\n\tconst filters = normalizeDomainFilters(options.domainFilter);\n\tif (filters?.allowedDomains?.length) lines.push(`Only use sources from: ${filters.allowedDomains.join(\", \")}.`);\n\tif (filters?.blockedDomains?.length) lines.push(`Do not use sources from: ${filters.blockedDomains.join(\", \")}.`);\n\n\treturn lines.join(\" \");\n}\n\nfunction buildWebSearchTool(options: SearchOptions): Record<string, unknown> {\n\tconst tool: Record<string, unknown> = { type: \"web_search\" };\n\tconst filters = normalizeDomainFilters(options.domainFilter);\n\tif (filters) {\n\t\ttool.filters = {\n\t\t\t...(filters.allowedDomains ? { allowed_domains: filters.allowedDomains } : {}),\n\t\t\t...(filters.blockedDomains ? { blocked_domains: filters.blockedDomains } : {}),\n\t\t};\n\t}\n\treturn tool;\n}\n\nasync function parseOpenAIResponse(response: Response): Promise<Record<string, unknown>> {\n\tconst text = await response.text();\n\tconst trimmed = text.trim();\n\tif (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(trimmed);\n\t\t\tif (Array.isArray(parsed)) return { output: parsed };\n\t\t\treturn parsed && typeof parsed === \"object\" ? parsed as Record<string, unknown> : { output: [] };\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(`OpenAI API returned invalid JSON: ${message}`);\n\t\t}\n\t}\n\n\tconst outputItems: unknown[] = [];\n\tlet completedResponse: Record<string, unknown> | null = null;\n\tfor (const line of text.split(\"\\n\")) {\n\t\tif (!line.startsWith(\"data: \")) continue;\n\t\tconst data = line.slice(6).trim();\n\t\tif (!data || data === \"[DONE]\") continue;\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(data) as Record<string, unknown>;\n\t\t\tif (parsed.type === \"response.output_item.done\" && parsed.item) outputItems.push(parsed.item);\n\t\t\tif ((parsed.type === \"response.done\" || parsed.type === \"response.completed\") && parsed.response && typeof parsed.response === \"object\") {\n\t\t\t\tcompletedResponse = parsed.response as Record<string, unknown>;\n\t\t\t}\n\t\t} catch {\n\t\t}\n\t}\n\n\tif (completedResponse) {\n\t\tconst output = Array.isArray(completedResponse.output) ? completedResponse.output : [];\n\t\treturn output.length > 0 ? completedResponse : { ...completedResponse, output: outputItems };\n\t}\n\tif (outputItems.length > 0) return { output: outputItems };\n\tthrow new Error(\"OpenAI API returned no parseable response output\");\n}\n\nfunction cleanSourceUrl(rawUrl: string): string {\n\ttry {\n\t\tconst url = new URL(rawUrl);\n\t\tif (url.searchParams.get(\"utm_source\") === \"openai\") url.searchParams.delete(\"utm_source\");\n\t\treturn url.toString();\n\t} catch {\n\t\treturn rawUrl.replace(/[?&]utm_source=openai$/, \"\");\n\t}\n}\n\nfunction extractSnippetAround(text: string, start: unknown, end: unknown): string {\n\tif (typeof start !== \"number\" || typeof end !== \"number\" || !text) return \"\";\n\tconst before = Math.max(0, start - 100);\n\tconst after = Math.min(text.length, end + 100);\n\tconst snippet = text.slice(before, after).replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\").trim();\n\treturn snippet.length > 300 ? `${snippet.slice(0, 297)}...` : snippet;\n}\n\nfunction addResult(results: SearchResult[], seen: Set<string>, url: unknown, title: unknown, snippet = \"\"): void {\n\tif (typeof url !== \"string\" || url.trim().length === 0) return;\n\tconst cleanUrl = cleanSourceUrl(url);\n\tif (seen.has(cleanUrl)) return;\n\tseen.add(cleanUrl);\n\tresults.push({\n\t\ttitle: typeof title === \"string\" && title.trim().length > 0 ? title : cleanUrl,\n\t\turl: cleanUrl,\n\t\tsnippet,\n\t});\n}\n\nfunction extractSearchResults(output: unknown[], numResults: number | undefined): SearchResult[] {\n\tconst results: SearchResult[] = [];\n\tconst seenUrls = new Set<string>();\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = typeof (part as { text?: unknown }).text === \"string\" ? (part as { text: string }).text : \"\";\n\t\t\tconst annotations = (part as { annotations?: unknown }).annotations;\n\t\t\tif (!Array.isArray(annotations)) continue;\n\t\t\tfor (const annotation of annotations) {\n\t\t\t\tif (!annotation || typeof annotation !== \"object\" || (annotation as { type?: unknown }).type !== \"url_citation\") continue;\n\t\t\t\taddResult(\n\t\t\t\t\tresults,\n\t\t\t\t\tseenUrls,\n\t\t\t\t\t(annotation as { url?: unknown }).url,\n\t\t\t\t\t(annotation as { title?: unknown }).title,\n\t\t\t\t\textractSnippetAround(text, (annotation as { start_index?: unknown }).start_index, (annotation as { end_index?: unknown }).end_index),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"web_search_call\") continue;\n\t\tconst value = item as { action?: unknown; sources?: unknown; results?: unknown };\n\t\tconst actionSources = value.action && typeof value.action === \"object\"\n\t\t\t? (value.action as { sources?: unknown }).sources\n\t\t\t: undefined;\n\t\tconst sourceGroups = [actionSources, value.sources, value.results];\n\t\tfor (const group of sourceGroups) {\n\t\t\tif (!Array.isArray(group)) continue;\n\t\t\tfor (const source of group) {\n\t\t\t\tif (!source || typeof source !== \"object\") continue;\n\t\t\t\tconst record = source as Record<string, unknown>;\n\t\t\t\taddResult(results, seenUrls, record.url ?? record.source_website_url, record.title ?? record.caption);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof numResults === \"number\" && Number.isFinite(numResults) && numResults > 0) {\n\t\treturn results.slice(0, Math.min(Math.floor(numResults), 20));\n\t}\n\treturn results;\n}\n\nfunction extractAnswer(output: unknown[]): string {\n\tconst parts: string[] = [];\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = (part as { text?: unknown }).text;\n\t\t\tif (typeof text === \"string\" && text.trim().length > 0) parts.push(text);\n\t\t}\n\t}\n\treturn parts.join(\"\\n\").trim();\n}\n\nexport async function searchWithOpenAI(\n\tquery: string,\n\toptions: SearchOptions = {},\n\tctx?: ExtensionContext,\n): Promise<SearchResponse> {\n\tconst auth = await resolveOpenAIAuth(ctx);\n\tif (!auth) {\n\t\tthrow new Error(\n\t\t\t\"OpenAI web search unavailable. Either:\\n\" +\n\t\t\t\" 1. Use /login to sign in with a Codex subscription\\n\" +\n\t\t\t` 2. Create ${CONFIG_PATH} with { \"openaiApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 3. Set OPENAI_API_KEY environment variable\",\n\t\t);\n\t}\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tconst headers: Record<string, string> = {\n\t\t...auth.headers,\n\t\tAuthorization: `Bearer ${auth.apiKey}`,\n\t\t\"Content-Type\": \"application/json\",\n\t\t\"OpenAI-Beta\": \"responses=experimental\",\n\t};\n\tconst useCodexEndpoint = auth.provider === \"openai-codex\" || isCodexJwt(auth.apiKey);\n\tif (useCodexEndpoint) {\n\t\tconst accountId = extractAccountId(auth.apiKey);\n\t\tif (accountId) headers[\"chatgpt-account-id\"] = accountId;\n\t\theaders.originator = \"pi\";\n\t}\n\n\tconst body = {\n\t\tmodel: auth.model,\n\t\tinstructions: buildInstructions(options),\n\t\tinput: [{ role: \"user\", content: [{ type: \"input_text\", text: query }] }],\n\t\ttools: [buildWebSearchTool(options)],\n\t\tinclude: [\"web_search_call.action.sources\"],\n\t\tstore: false,\n\t\tstream: true,\n\t\ttool_choice: \"required\" as const,\n\t\tparallel_tool_calls: true,\n\t};\n\n\ttry {\n\t\tconst response = await fetch(useCodexEndpoint ? CODEX_RESPONSES_URL : OPENAI_RESPONSES_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: options.signal\n\t\t\t\t? AbortSignal.any([AbortSignal.timeout(SEARCH_TIMEOUT_MS), options.signal])\n\t\t\t\t: AbortSignal.timeout(SEARCH_TIMEOUT_MS),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tactivityMonitor.logError(activityId, `HTTP ${response.status}`);\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(`OpenAI API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t\t}\n\n\t\tconst parsed = await parseOpenAIResponse(response);\n\t\tconst output = Array.isArray(parsed.output) ? parsed.output : [];\n\t\tconst answer = extractAnswer(output);\n\t\tconst results = extractSearchResults(output, options.numResults);\n\n\t\tif (!answer && results.length === 0) {\n\t\t\tthrow new Error(\"OpenAI web_search returned no answer or sources\");\n\t\t}\n\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\treturn { answer, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\tthrow err;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"openai-search.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/openai-search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAgB,MAAM,iBAAiB,CAAC;AAiBnF,UAAU,UAAU;IACnB,QAAQ,EAAE,cAAc,GAAG,QAAQ,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AA4FD,wBAAsB,iBAAiB,CAAC,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA2B/F;AAED,wBAAsB,uBAAuB,CAAC,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAEtF;AA6KD,wBAAsB,gBAAgB,CACrC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,EAC3B,GAAG,CAAC,EAAE,gBAAgB,GACpB,OAAO,CAAC,cAAc,CAAC,CAyEzB","sourcesContent":["// @ts-nocheck\nimport { existsSync, readFileSync } from \"node:fs\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { SearchOptions, SearchResponse, SearchResult } from \"./perplexity.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst OPENAI_RESPONSES_URL = \"https://api.openai.com/v1/responses\";\nconst CODEX_RESPONSES_URL = \"https://chatgpt.com/backend-api/codex/responses\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\nconst AUTH_MODEL_CANDIDATES = [\n\t{ provider: \"openai-codex\", models: [\"gpt-5.4\", \"gpt-5.3-codex\", \"gpt-5.3-codex-spark\", \"gpt-5.2\", \"gpt-5.2-codex\"] },\n\t{ provider: \"openai\", models: [\"gpt-5.4\", \"gpt-5.2\", \"gpt-4.1-mini\", \"gpt-4o\"] },\n] as const;\n\ninterface WebSearchConfig {\n\topenaiApiKey?: unknown;\n}\n\ninterface OpenAIAuth {\n\tprovider: \"openai-codex\" | \"openai\";\n\tapiKey: string;\n\tmodel: string;\n\theaders: Record<string, string>;\n}\n\ninterface NormalizedDomainFilters {\n\tallowedDomains?: string[];\n\tblockedDomains?: string[];\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nfunction normalizeApiKey(value: unknown): string | null {\n\tif (typeof value !== \"string\") return null;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction normalizeDomainFilters(domainFilter: string[] | undefined): NormalizedDomainFilters | null {\n\tif (!domainFilter?.length) return null;\n\n\tconst allowedDomains: string[] = [];\n\tconst blockedDomains: string[] = [];\n\tfor (const raw of domainFilter) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? blockedDomains : allowedDomains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\n\treturn allowedDomains.length > 0 || blockedDomains.length > 0\n\t\t? {\n\t\t\t...(allowedDomains.length > 0 ? { allowedDomains: allowedDomains.slice(0, 100) } : {}),\n\t\t\t...(blockedDomains.length > 0 ? { blockedDomains: blockedDomains.slice(0, 100) } : {}),\n\t\t}\n\t\t: null;\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n\tconst parts = token.split(\".\");\n\tif (parts.length !== 3 || !parts[1]) return null;\n\ttry {\n\t\tconst padded = parts[1].replace(/-/g, \"+\").replace(/_/g, \"/\").padEnd(Math.ceil(parts[1].length / 4) * 4, \"=\");\n\t\tconst parsed = JSON.parse(Buffer.from(padded, \"base64\").toString(\"utf8\"));\n\t\treturn parsed && typeof parsed === \"object\" ? parsed as Record<string, unknown> : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isCodexJwt(token: string): boolean {\n\tconst payload = decodeJwtPayload(token);\n\treturn !!payload?.[\"https://api.openai.com/auth\"];\n}\n\nfunction extractAccountId(token: string): string | undefined {\n\tconst payload = decodeJwtPayload(token);\n\tconst auth = payload?.[\"https://api.openai.com/auth\"];\n\tif (!auth || typeof auth !== \"object\") return undefined;\n\tconst id = (auth as Record<string, unknown>).chatgpt_account_id;\n\treturn typeof id === \"string\" && id.trim().length > 0 ? id.trim() : undefined;\n}\n\nexport async function resolveOpenAIAuth(ctx?: ExtensionContext): Promise<OpenAIAuth | undefined> {\n\tif (ctx) {\n\t\tconst { getModel } = await import(\"@ashx-j/lunr-ai/compat\");\n\t\tfor (const candidate of AUTH_MODEL_CANDIDATES) {\n\t\t\tfor (const modelId of candidate.models) {\n\t\t\t\tconst model = getModel(candidate.provider, modelId);\n\t\t\t\tif (!model) continue;\n\t\t\t\ttry {\n\t\t\t\t\tconst resolved = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\t\tif (resolved.ok && resolved.apiKey) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tprovider: candidate.provider,\n\t\t\t\t\t\t\tapiKey: resolved.apiKey,\n\t\t\t\t\t\t\tmodel: modelId,\n\t\t\t\t\t\t\theaders: resolved.headers ?? {},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst apiKey = normalizeApiKey(process.env.OPENAI_API_KEY) ?? normalizeApiKey(loadConfig().openaiApiKey);\n\treturn apiKey\n\t\t? { provider: \"openai\", apiKey, model: \"gpt-5.4\", headers: {} }\n\t\t: undefined;\n}\n\nexport async function isOpenAISearchAvailable(ctx?: ExtensionContext): Promise<boolean> {\n\treturn !!(await resolveOpenAIAuth(ctx));\n}\n\nfunction buildInstructions(options: SearchOptions): string {\n\tconst lines = [\n\t\t\"Search the web and return a concise answer grounded only in the web results.\",\n\t\t\"Include clickable source citations in the response text when possible.\",\n\t];\n\n\tif (options.recencyFilter) {\n\t\tconst labels: Record<string, string> = {\n\t\t\tday: \"past 24 hours\",\n\t\t\tweek: \"past week\",\n\t\t\tmonth: \"past month\",\n\t\t\tyear: \"past year\",\n\t\t};\n\t\tlines.push(`Prefer sources from the ${labels[options.recencyFilter]}.`);\n\t}\n\n\tif (typeof options.numResults === \"number\" && Number.isFinite(options.numResults) && options.numResults > 0) {\n\t\tlines.push(`Prefer around ${Math.min(Math.floor(options.numResults), 20)} distinct sources.`);\n\t}\n\n\tconst filters = normalizeDomainFilters(options.domainFilter);\n\tif (filters?.allowedDomains?.length) lines.push(`Only use sources from: ${filters.allowedDomains.join(\", \")}.`);\n\tif (filters?.blockedDomains?.length) lines.push(`Do not use sources from: ${filters.blockedDomains.join(\", \")}.`);\n\n\treturn lines.join(\" \");\n}\n\nfunction buildWebSearchTool(options: SearchOptions): Record<string, unknown> {\n\tconst tool: Record<string, unknown> = { type: \"web_search\" };\n\tconst filters = normalizeDomainFilters(options.domainFilter);\n\tif (filters) {\n\t\ttool.filters = {\n\t\t\t...(filters.allowedDomains ? { allowed_domains: filters.allowedDomains } : {}),\n\t\t\t...(filters.blockedDomains ? { blocked_domains: filters.blockedDomains } : {}),\n\t\t};\n\t}\n\treturn tool;\n}\n\nasync function parseOpenAIResponse(response: Response): Promise<Record<string, unknown>> {\n\tconst text = await response.text();\n\tconst trimmed = text.trim();\n\tif (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(trimmed);\n\t\t\tif (Array.isArray(parsed)) return { output: parsed };\n\t\t\treturn parsed && typeof parsed === \"object\" ? parsed as Record<string, unknown> : { output: [] };\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(`OpenAI API returned invalid JSON: ${message}`);\n\t\t}\n\t}\n\n\tconst outputItems: unknown[] = [];\n\tlet completedResponse: Record<string, unknown> | null = null;\n\tfor (const line of text.split(\"\\n\")) {\n\t\tif (!line.startsWith(\"data: \")) continue;\n\t\tconst data = line.slice(6).trim();\n\t\tif (!data || data === \"[DONE]\") continue;\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(data) as Record<string, unknown>;\n\t\t\tif (parsed.type === \"response.output_item.done\" && parsed.item) outputItems.push(parsed.item);\n\t\t\tif ((parsed.type === \"response.done\" || parsed.type === \"response.completed\") && parsed.response && typeof parsed.response === \"object\") {\n\t\t\t\tcompletedResponse = parsed.response as Record<string, unknown>;\n\t\t\t}\n\t\t} catch {\n\t\t}\n\t}\n\n\tif (completedResponse) {\n\t\tconst output = Array.isArray(completedResponse.output) ? completedResponse.output : [];\n\t\treturn output.length > 0 ? completedResponse : { ...completedResponse, output: outputItems };\n\t}\n\tif (outputItems.length > 0) return { output: outputItems };\n\tthrow new Error(\"OpenAI API returned no parseable response output\");\n}\n\nfunction cleanSourceUrl(rawUrl: string): string {\n\ttry {\n\t\tconst url = new URL(rawUrl);\n\t\tif (url.searchParams.get(\"utm_source\") === \"openai\") url.searchParams.delete(\"utm_source\");\n\t\treturn url.toString();\n\t} catch {\n\t\treturn rawUrl.replace(/[?&]utm_source=openai$/, \"\");\n\t}\n}\n\nfunction extractSnippetAround(text: string, start: unknown, end: unknown): string {\n\tif (typeof start !== \"number\" || typeof end !== \"number\" || !text) return \"\";\n\tconst before = Math.max(0, start - 100);\n\tconst after = Math.min(text.length, end + 100);\n\tconst snippet = text.slice(before, after).replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\").trim();\n\treturn snippet.length > 300 ? `${snippet.slice(0, 297)}...` : snippet;\n}\n\nfunction addResult(results: SearchResult[], seen: Set<string>, url: unknown, title: unknown, snippet = \"\"): void {\n\tif (typeof url !== \"string\" || url.trim().length === 0) return;\n\tconst cleanUrl = cleanSourceUrl(url);\n\tif (seen.has(cleanUrl)) return;\n\tseen.add(cleanUrl);\n\tresults.push({\n\t\ttitle: typeof title === \"string\" && title.trim().length > 0 ? title : cleanUrl,\n\t\turl: cleanUrl,\n\t\tsnippet,\n\t});\n}\n\nfunction extractSearchResults(output: unknown[], numResults: number | undefined): SearchResult[] {\n\tconst results: SearchResult[] = [];\n\tconst seenUrls = new Set<string>();\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = typeof (part as { text?: unknown }).text === \"string\" ? (part as { text: string }).text : \"\";\n\t\t\tconst annotations = (part as { annotations?: unknown }).annotations;\n\t\t\tif (!Array.isArray(annotations)) continue;\n\t\t\tfor (const annotation of annotations) {\n\t\t\t\tif (!annotation || typeof annotation !== \"object\" || (annotation as { type?: unknown }).type !== \"url_citation\") continue;\n\t\t\t\taddResult(\n\t\t\t\t\tresults,\n\t\t\t\t\tseenUrls,\n\t\t\t\t\t(annotation as { url?: unknown }).url,\n\t\t\t\t\t(annotation as { title?: unknown }).title,\n\t\t\t\t\textractSnippetAround(text, (annotation as { start_index?: unknown }).start_index, (annotation as { end_index?: unknown }).end_index),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"web_search_call\") continue;\n\t\tconst value = item as { action?: unknown; sources?: unknown; results?: unknown };\n\t\tconst actionSources = value.action && typeof value.action === \"object\"\n\t\t\t? (value.action as { sources?: unknown }).sources\n\t\t\t: undefined;\n\t\tconst sourceGroups = [actionSources, value.sources, value.results];\n\t\tfor (const group of sourceGroups) {\n\t\t\tif (!Array.isArray(group)) continue;\n\t\t\tfor (const source of group) {\n\t\t\t\tif (!source || typeof source !== \"object\") continue;\n\t\t\t\tconst record = source as Record<string, unknown>;\n\t\t\t\taddResult(results, seenUrls, record.url ?? record.source_website_url, record.title ?? record.caption);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof numResults === \"number\" && Number.isFinite(numResults) && numResults > 0) {\n\t\treturn results.slice(0, Math.min(Math.floor(numResults), 20));\n\t}\n\treturn results;\n}\n\nfunction extractAnswer(output: unknown[]): string {\n\tconst parts: string[] = [];\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = (part as { text?: unknown }).text;\n\t\t\tif (typeof text === \"string\" && text.trim().length > 0) parts.push(text);\n\t\t}\n\t}\n\treturn parts.join(\"\\n\").trim();\n}\n\nexport async function searchWithOpenAI(\n\tquery: string,\n\toptions: SearchOptions = {},\n\tctx?: ExtensionContext,\n): Promise<SearchResponse> {\n\tconst auth = await resolveOpenAIAuth(ctx);\n\tif (!auth) {\n\t\tthrow new Error(\n\t\t\t\"OpenAI web search unavailable. Either:\\n\" +\n\t\t\t\" 1. Use /login to sign in with a Codex subscription\\n\" +\n\t\t\t` 2. Create ${CONFIG_PATH} with { \"openaiApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 3. Set OPENAI_API_KEY environment variable\",\n\t\t);\n\t}\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tconst headers: Record<string, string> = {\n\t\t...auth.headers,\n\t\tAuthorization: `Bearer ${auth.apiKey}`,\n\t\t\"Content-Type\": \"application/json\",\n\t\t\"OpenAI-Beta\": \"responses=experimental\",\n\t};\n\tconst useCodexEndpoint = auth.provider === \"openai-codex\" || isCodexJwt(auth.apiKey);\n\tif (useCodexEndpoint) {\n\t\tconst accountId = extractAccountId(auth.apiKey);\n\t\tif (accountId) headers[\"chatgpt-account-id\"] = accountId;\n\t\theaders.originator = \"pi\";\n\t}\n\n\tconst body = {\n\t\tmodel: auth.model,\n\t\tinstructions: buildInstructions(options),\n\t\tinput: [{ role: \"user\", content: [{ type: \"input_text\", text: query }] }],\n\t\ttools: [buildWebSearchTool(options)],\n\t\tinclude: [\"web_search_call.action.sources\"],\n\t\tstore: false,\n\t\tstream: true,\n\t\ttool_choice: \"required\" as const,\n\t\tparallel_tool_calls: true,\n\t};\n\n\ttry {\n\t\tconst response = await fetch(useCodexEndpoint ? CODEX_RESPONSES_URL : OPENAI_RESPONSES_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: options.signal\n\t\t\t\t? AbortSignal.any([AbortSignal.timeout(SEARCH_TIMEOUT_MS), options.signal])\n\t\t\t\t: AbortSignal.timeout(SEARCH_TIMEOUT_MS),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tactivityMonitor.logError(activityId, `HTTP ${response.status}`);\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(`OpenAI API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t\t}\n\n\t\tconst parsed = await parseOpenAIResponse(response);\n\t\tconst output = Array.isArray(parsed.output) ? parsed.output : [];\n\t\tconst answer = extractAnswer(output);\n\t\tconst results = extractSearchResults(output, options.numResults);\n\n\t\tif (!answer && results.length === 0) {\n\t\t\tthrow new Error(\"OpenAI web_search returned no answer or sources\");\n\t\t}\n\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\treturn { answer, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\tthrow err;\n\t}\n}\n"]}
|
|
@@ -99,7 +99,7 @@ function extractAccountId(token) {
|
|
|
99
99
|
}
|
|
100
100
|
export async function resolveOpenAIAuth(ctx) {
|
|
101
101
|
if (ctx) {
|
|
102
|
-
const { getModel } = await import("@
|
|
102
|
+
const { getModel } = await import("@ashx-j/lunr-ai/compat");
|
|
103
103
|
for (const candidate of AUTH_MODEL_CANDIDATES) {
|
|
104
104
|
for (const modelId of candidate.models) {
|
|
105
105
|
const model = getModel(candidate.provider, modelId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-search.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/openai-search.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { existsSync, readFileSync } from \"node:fs\";\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { SearchOptions, SearchResponse, SearchResult } from \"./perplexity.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst OPENAI_RESPONSES_URL = \"https://api.openai.com/v1/responses\";\nconst CODEX_RESPONSES_URL = \"https://chatgpt.com/backend-api/codex/responses\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\nconst AUTH_MODEL_CANDIDATES = [\n\t{ provider: \"openai-codex\", models: [\"gpt-5.4\", \"gpt-5.3-codex\", \"gpt-5.3-codex-spark\", \"gpt-5.2\", \"gpt-5.2-codex\"] },\n\t{ provider: \"openai\", models: [\"gpt-5.4\", \"gpt-5.2\", \"gpt-4.1-mini\", \"gpt-4o\"] },\n] as const;\n\ninterface WebSearchConfig {\n\topenaiApiKey?: unknown;\n}\n\ninterface OpenAIAuth {\n\tprovider: \"openai-codex\" | \"openai\";\n\tapiKey: string;\n\tmodel: string;\n\theaders: Record<string, string>;\n}\n\ninterface NormalizedDomainFilters {\n\tallowedDomains?: string[];\n\tblockedDomains?: string[];\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nfunction normalizeApiKey(value: unknown): string | null {\n\tif (typeof value !== \"string\") return null;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction normalizeDomainFilters(domainFilter: string[] | undefined): NormalizedDomainFilters | null {\n\tif (!domainFilter?.length) return null;\n\n\tconst allowedDomains: string[] = [];\n\tconst blockedDomains: string[] = [];\n\tfor (const raw of domainFilter) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? blockedDomains : allowedDomains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\n\treturn allowedDomains.length > 0 || blockedDomains.length > 0\n\t\t? {\n\t\t\t...(allowedDomains.length > 0 ? { allowedDomains: allowedDomains.slice(0, 100) } : {}),\n\t\t\t...(blockedDomains.length > 0 ? { blockedDomains: blockedDomains.slice(0, 100) } : {}),\n\t\t}\n\t\t: null;\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n\tconst parts = token.split(\".\");\n\tif (parts.length !== 3 || !parts[1]) return null;\n\ttry {\n\t\tconst padded = parts[1].replace(/-/g, \"+\").replace(/_/g, \"/\").padEnd(Math.ceil(parts[1].length / 4) * 4, \"=\");\n\t\tconst parsed = JSON.parse(Buffer.from(padded, \"base64\").toString(\"utf8\"));\n\t\treturn parsed && typeof parsed === \"object\" ? parsed as Record<string, unknown> : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isCodexJwt(token: string): boolean {\n\tconst payload = decodeJwtPayload(token);\n\treturn !!payload?.[\"https://api.openai.com/auth\"];\n}\n\nfunction extractAccountId(token: string): string | undefined {\n\tconst payload = decodeJwtPayload(token);\n\tconst auth = payload?.[\"https://api.openai.com/auth\"];\n\tif (!auth || typeof auth !== \"object\") return undefined;\n\tconst id = (auth as Record<string, unknown>).chatgpt_account_id;\n\treturn typeof id === \"string\" && id.trim().length > 0 ? id.trim() : undefined;\n}\n\nexport async function resolveOpenAIAuth(ctx?: ExtensionContext): Promise<OpenAIAuth | undefined> {\n\tif (ctx) {\n\t\tconst { getModel } = await import(\"@earendil-works/pi-ai/compat\");\n\t\tfor (const candidate of AUTH_MODEL_CANDIDATES) {\n\t\t\tfor (const modelId of candidate.models) {\n\t\t\t\tconst model = getModel(candidate.provider, modelId);\n\t\t\t\tif (!model) continue;\n\t\t\t\ttry {\n\t\t\t\t\tconst resolved = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\t\tif (resolved.ok && resolved.apiKey) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tprovider: candidate.provider,\n\t\t\t\t\t\t\tapiKey: resolved.apiKey,\n\t\t\t\t\t\t\tmodel: modelId,\n\t\t\t\t\t\t\theaders: resolved.headers ?? {},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst apiKey = normalizeApiKey(process.env.OPENAI_API_KEY) ?? normalizeApiKey(loadConfig().openaiApiKey);\n\treturn apiKey\n\t\t? { provider: \"openai\", apiKey, model: \"gpt-5.4\", headers: {} }\n\t\t: undefined;\n}\n\nexport async function isOpenAISearchAvailable(ctx?: ExtensionContext): Promise<boolean> {\n\treturn !!(await resolveOpenAIAuth(ctx));\n}\n\nfunction buildInstructions(options: SearchOptions): string {\n\tconst lines = [\n\t\t\"Search the web and return a concise answer grounded only in the web results.\",\n\t\t\"Include clickable source citations in the response text when possible.\",\n\t];\n\n\tif (options.recencyFilter) {\n\t\tconst labels: Record<string, string> = {\n\t\t\tday: \"past 24 hours\",\n\t\t\tweek: \"past week\",\n\t\t\tmonth: \"past month\",\n\t\t\tyear: \"past year\",\n\t\t};\n\t\tlines.push(`Prefer sources from the ${labels[options.recencyFilter]}.`);\n\t}\n\n\tif (typeof options.numResults === \"number\" && Number.isFinite(options.numResults) && options.numResults > 0) {\n\t\tlines.push(`Prefer around ${Math.min(Math.floor(options.numResults), 20)} distinct sources.`);\n\t}\n\n\tconst filters = normalizeDomainFilters(options.domainFilter);\n\tif (filters?.allowedDomains?.length) lines.push(`Only use sources from: ${filters.allowedDomains.join(\", \")}.`);\n\tif (filters?.blockedDomains?.length) lines.push(`Do not use sources from: ${filters.blockedDomains.join(\", \")}.`);\n\n\treturn lines.join(\" \");\n}\n\nfunction buildWebSearchTool(options: SearchOptions): Record<string, unknown> {\n\tconst tool: Record<string, unknown> = { type: \"web_search\" };\n\tconst filters = normalizeDomainFilters(options.domainFilter);\n\tif (filters) {\n\t\ttool.filters = {\n\t\t\t...(filters.allowedDomains ? { allowed_domains: filters.allowedDomains } : {}),\n\t\t\t...(filters.blockedDomains ? { blocked_domains: filters.blockedDomains } : {}),\n\t\t};\n\t}\n\treturn tool;\n}\n\nasync function parseOpenAIResponse(response: Response): Promise<Record<string, unknown>> {\n\tconst text = await response.text();\n\tconst trimmed = text.trim();\n\tif (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(trimmed);\n\t\t\tif (Array.isArray(parsed)) return { output: parsed };\n\t\t\treturn parsed && typeof parsed === \"object\" ? parsed as Record<string, unknown> : { output: [] };\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(`OpenAI API returned invalid JSON: ${message}`);\n\t\t}\n\t}\n\n\tconst outputItems: unknown[] = [];\n\tlet completedResponse: Record<string, unknown> | null = null;\n\tfor (const line of text.split(\"\\n\")) {\n\t\tif (!line.startsWith(\"data: \")) continue;\n\t\tconst data = line.slice(6).trim();\n\t\tif (!data || data === \"[DONE]\") continue;\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(data) as Record<string, unknown>;\n\t\t\tif (parsed.type === \"response.output_item.done\" && parsed.item) outputItems.push(parsed.item);\n\t\t\tif ((parsed.type === \"response.done\" || parsed.type === \"response.completed\") && parsed.response && typeof parsed.response === \"object\") {\n\t\t\t\tcompletedResponse = parsed.response as Record<string, unknown>;\n\t\t\t}\n\t\t} catch {\n\t\t}\n\t}\n\n\tif (completedResponse) {\n\t\tconst output = Array.isArray(completedResponse.output) ? completedResponse.output : [];\n\t\treturn output.length > 0 ? completedResponse : { ...completedResponse, output: outputItems };\n\t}\n\tif (outputItems.length > 0) return { output: outputItems };\n\tthrow new Error(\"OpenAI API returned no parseable response output\");\n}\n\nfunction cleanSourceUrl(rawUrl: string): string {\n\ttry {\n\t\tconst url = new URL(rawUrl);\n\t\tif (url.searchParams.get(\"utm_source\") === \"openai\") url.searchParams.delete(\"utm_source\");\n\t\treturn url.toString();\n\t} catch {\n\t\treturn rawUrl.replace(/[?&]utm_source=openai$/, \"\");\n\t}\n}\n\nfunction extractSnippetAround(text: string, start: unknown, end: unknown): string {\n\tif (typeof start !== \"number\" || typeof end !== \"number\" || !text) return \"\";\n\tconst before = Math.max(0, start - 100);\n\tconst after = Math.min(text.length, end + 100);\n\tconst snippet = text.slice(before, after).replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\").trim();\n\treturn snippet.length > 300 ? `${snippet.slice(0, 297)}...` : snippet;\n}\n\nfunction addResult(results: SearchResult[], seen: Set<string>, url: unknown, title: unknown, snippet = \"\"): void {\n\tif (typeof url !== \"string\" || url.trim().length === 0) return;\n\tconst cleanUrl = cleanSourceUrl(url);\n\tif (seen.has(cleanUrl)) return;\n\tseen.add(cleanUrl);\n\tresults.push({\n\t\ttitle: typeof title === \"string\" && title.trim().length > 0 ? title : cleanUrl,\n\t\turl: cleanUrl,\n\t\tsnippet,\n\t});\n}\n\nfunction extractSearchResults(output: unknown[], numResults: number | undefined): SearchResult[] {\n\tconst results: SearchResult[] = [];\n\tconst seenUrls = new Set<string>();\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = typeof (part as { text?: unknown }).text === \"string\" ? (part as { text: string }).text : \"\";\n\t\t\tconst annotations = (part as { annotations?: unknown }).annotations;\n\t\t\tif (!Array.isArray(annotations)) continue;\n\t\t\tfor (const annotation of annotations) {\n\t\t\t\tif (!annotation || typeof annotation !== \"object\" || (annotation as { type?: unknown }).type !== \"url_citation\") continue;\n\t\t\t\taddResult(\n\t\t\t\t\tresults,\n\t\t\t\t\tseenUrls,\n\t\t\t\t\t(annotation as { url?: unknown }).url,\n\t\t\t\t\t(annotation as { title?: unknown }).title,\n\t\t\t\t\textractSnippetAround(text, (annotation as { start_index?: unknown }).start_index, (annotation as { end_index?: unknown }).end_index),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"web_search_call\") continue;\n\t\tconst value = item as { action?: unknown; sources?: unknown; results?: unknown };\n\t\tconst actionSources = value.action && typeof value.action === \"object\"\n\t\t\t? (value.action as { sources?: unknown }).sources\n\t\t\t: undefined;\n\t\tconst sourceGroups = [actionSources, value.sources, value.results];\n\t\tfor (const group of sourceGroups) {\n\t\t\tif (!Array.isArray(group)) continue;\n\t\t\tfor (const source of group) {\n\t\t\t\tif (!source || typeof source !== \"object\") continue;\n\t\t\t\tconst record = source as Record<string, unknown>;\n\t\t\t\taddResult(results, seenUrls, record.url ?? record.source_website_url, record.title ?? record.caption);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof numResults === \"number\" && Number.isFinite(numResults) && numResults > 0) {\n\t\treturn results.slice(0, Math.min(Math.floor(numResults), 20));\n\t}\n\treturn results;\n}\n\nfunction extractAnswer(output: unknown[]): string {\n\tconst parts: string[] = [];\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = (part as { text?: unknown }).text;\n\t\t\tif (typeof text === \"string\" && text.trim().length > 0) parts.push(text);\n\t\t}\n\t}\n\treturn parts.join(\"\\n\").trim();\n}\n\nexport async function searchWithOpenAI(\n\tquery: string,\n\toptions: SearchOptions = {},\n\tctx?: ExtensionContext,\n): Promise<SearchResponse> {\n\tconst auth = await resolveOpenAIAuth(ctx);\n\tif (!auth) {\n\t\tthrow new Error(\n\t\t\t\"OpenAI web search unavailable. Either:\\n\" +\n\t\t\t\" 1. Use /login to sign in with a Codex subscription\\n\" +\n\t\t\t` 2. Create ${CONFIG_PATH} with { \"openaiApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 3. Set OPENAI_API_KEY environment variable\",\n\t\t);\n\t}\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tconst headers: Record<string, string> = {\n\t\t...auth.headers,\n\t\tAuthorization: `Bearer ${auth.apiKey}`,\n\t\t\"Content-Type\": \"application/json\",\n\t\t\"OpenAI-Beta\": \"responses=experimental\",\n\t};\n\tconst useCodexEndpoint = auth.provider === \"openai-codex\" || isCodexJwt(auth.apiKey);\n\tif (useCodexEndpoint) {\n\t\tconst accountId = extractAccountId(auth.apiKey);\n\t\tif (accountId) headers[\"chatgpt-account-id\"] = accountId;\n\t\theaders.originator = \"pi\";\n\t}\n\n\tconst body = {\n\t\tmodel: auth.model,\n\t\tinstructions: buildInstructions(options),\n\t\tinput: [{ role: \"user\", content: [{ type: \"input_text\", text: query }] }],\n\t\ttools: [buildWebSearchTool(options)],\n\t\tinclude: [\"web_search_call.action.sources\"],\n\t\tstore: false,\n\t\tstream: true,\n\t\ttool_choice: \"required\" as const,\n\t\tparallel_tool_calls: true,\n\t};\n\n\ttry {\n\t\tconst response = await fetch(useCodexEndpoint ? CODEX_RESPONSES_URL : OPENAI_RESPONSES_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: options.signal\n\t\t\t\t? AbortSignal.any([AbortSignal.timeout(SEARCH_TIMEOUT_MS), options.signal])\n\t\t\t\t: AbortSignal.timeout(SEARCH_TIMEOUT_MS),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tactivityMonitor.logError(activityId, `HTTP ${response.status}`);\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(`OpenAI API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t\t}\n\n\t\tconst parsed = await parseOpenAIResponse(response);\n\t\tconst output = Array.isArray(parsed.output) ? parsed.output : [];\n\t\tconst answer = extractAnswer(output);\n\t\tconst results = extractSearchResults(output, options.numResults);\n\n\t\tif (!answer && results.length === 0) {\n\t\t\tthrow new Error(\"OpenAI web_search returned no answer or sources\");\n\t\t}\n\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\treturn { answer, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\tthrow err;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"openai-search.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/openai-search.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { existsSync, readFileSync } from \"node:fs\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { SearchOptions, SearchResponse, SearchResult } from \"./perplexity.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst OPENAI_RESPONSES_URL = \"https://api.openai.com/v1/responses\";\nconst CODEX_RESPONSES_URL = \"https://chatgpt.com/backend-api/codex/responses\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\nconst AUTH_MODEL_CANDIDATES = [\n\t{ provider: \"openai-codex\", models: [\"gpt-5.4\", \"gpt-5.3-codex\", \"gpt-5.3-codex-spark\", \"gpt-5.2\", \"gpt-5.2-codex\"] },\n\t{ provider: \"openai\", models: [\"gpt-5.4\", \"gpt-5.2\", \"gpt-4.1-mini\", \"gpt-4o\"] },\n] as const;\n\ninterface WebSearchConfig {\n\topenaiApiKey?: unknown;\n}\n\ninterface OpenAIAuth {\n\tprovider: \"openai-codex\" | \"openai\";\n\tapiKey: string;\n\tmodel: string;\n\theaders: Record<string, string>;\n}\n\ninterface NormalizedDomainFilters {\n\tallowedDomains?: string[];\n\tblockedDomains?: string[];\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nfunction normalizeApiKey(value: unknown): string | null {\n\tif (typeof value !== \"string\") return null;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : null;\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction normalizeDomainFilters(domainFilter: string[] | undefined): NormalizedDomainFilters | null {\n\tif (!domainFilter?.length) return null;\n\n\tconst allowedDomains: string[] = [];\n\tconst blockedDomains: string[] = [];\n\tfor (const raw of domainFilter) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? blockedDomains : allowedDomains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\n\treturn allowedDomains.length > 0 || blockedDomains.length > 0\n\t\t? {\n\t\t\t...(allowedDomains.length > 0 ? { allowedDomains: allowedDomains.slice(0, 100) } : {}),\n\t\t\t...(blockedDomains.length > 0 ? { blockedDomains: blockedDomains.slice(0, 100) } : {}),\n\t\t}\n\t\t: null;\n}\n\nfunction decodeJwtPayload(token: string): Record<string, unknown> | null {\n\tconst parts = token.split(\".\");\n\tif (parts.length !== 3 || !parts[1]) return null;\n\ttry {\n\t\tconst padded = parts[1].replace(/-/g, \"+\").replace(/_/g, \"/\").padEnd(Math.ceil(parts[1].length / 4) * 4, \"=\");\n\t\tconst parsed = JSON.parse(Buffer.from(padded, \"base64\").toString(\"utf8\"));\n\t\treturn parsed && typeof parsed === \"object\" ? parsed as Record<string, unknown> : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isCodexJwt(token: string): boolean {\n\tconst payload = decodeJwtPayload(token);\n\treturn !!payload?.[\"https://api.openai.com/auth\"];\n}\n\nfunction extractAccountId(token: string): string | undefined {\n\tconst payload = decodeJwtPayload(token);\n\tconst auth = payload?.[\"https://api.openai.com/auth\"];\n\tif (!auth || typeof auth !== \"object\") return undefined;\n\tconst id = (auth as Record<string, unknown>).chatgpt_account_id;\n\treturn typeof id === \"string\" && id.trim().length > 0 ? id.trim() : undefined;\n}\n\nexport async function resolveOpenAIAuth(ctx?: ExtensionContext): Promise<OpenAIAuth | undefined> {\n\tif (ctx) {\n\t\tconst { getModel } = await import(\"@ashx-j/lunr-ai/compat\");\n\t\tfor (const candidate of AUTH_MODEL_CANDIDATES) {\n\t\t\tfor (const modelId of candidate.models) {\n\t\t\t\tconst model = getModel(candidate.provider, modelId);\n\t\t\t\tif (!model) continue;\n\t\t\t\ttry {\n\t\t\t\t\tconst resolved = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\t\tif (resolved.ok && resolved.apiKey) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tprovider: candidate.provider,\n\t\t\t\t\t\t\tapiKey: resolved.apiKey,\n\t\t\t\t\t\t\tmodel: modelId,\n\t\t\t\t\t\t\theaders: resolved.headers ?? {},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst apiKey = normalizeApiKey(process.env.OPENAI_API_KEY) ?? normalizeApiKey(loadConfig().openaiApiKey);\n\treturn apiKey\n\t\t? { provider: \"openai\", apiKey, model: \"gpt-5.4\", headers: {} }\n\t\t: undefined;\n}\n\nexport async function isOpenAISearchAvailable(ctx?: ExtensionContext): Promise<boolean> {\n\treturn !!(await resolveOpenAIAuth(ctx));\n}\n\nfunction buildInstructions(options: SearchOptions): string {\n\tconst lines = [\n\t\t\"Search the web and return a concise answer grounded only in the web results.\",\n\t\t\"Include clickable source citations in the response text when possible.\",\n\t];\n\n\tif (options.recencyFilter) {\n\t\tconst labels: Record<string, string> = {\n\t\t\tday: \"past 24 hours\",\n\t\t\tweek: \"past week\",\n\t\t\tmonth: \"past month\",\n\t\t\tyear: \"past year\",\n\t\t};\n\t\tlines.push(`Prefer sources from the ${labels[options.recencyFilter]}.`);\n\t}\n\n\tif (typeof options.numResults === \"number\" && Number.isFinite(options.numResults) && options.numResults > 0) {\n\t\tlines.push(`Prefer around ${Math.min(Math.floor(options.numResults), 20)} distinct sources.`);\n\t}\n\n\tconst filters = normalizeDomainFilters(options.domainFilter);\n\tif (filters?.allowedDomains?.length) lines.push(`Only use sources from: ${filters.allowedDomains.join(\", \")}.`);\n\tif (filters?.blockedDomains?.length) lines.push(`Do not use sources from: ${filters.blockedDomains.join(\", \")}.`);\n\n\treturn lines.join(\" \");\n}\n\nfunction buildWebSearchTool(options: SearchOptions): Record<string, unknown> {\n\tconst tool: Record<string, unknown> = { type: \"web_search\" };\n\tconst filters = normalizeDomainFilters(options.domainFilter);\n\tif (filters) {\n\t\ttool.filters = {\n\t\t\t...(filters.allowedDomains ? { allowed_domains: filters.allowedDomains } : {}),\n\t\t\t...(filters.blockedDomains ? { blocked_domains: filters.blockedDomains } : {}),\n\t\t};\n\t}\n\treturn tool;\n}\n\nasync function parseOpenAIResponse(response: Response): Promise<Record<string, unknown>> {\n\tconst text = await response.text();\n\tconst trimmed = text.trim();\n\tif (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(trimmed);\n\t\t\tif (Array.isArray(parsed)) return { output: parsed };\n\t\t\treturn parsed && typeof parsed === \"object\" ? parsed as Record<string, unknown> : { output: [] };\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(`OpenAI API returned invalid JSON: ${message}`);\n\t\t}\n\t}\n\n\tconst outputItems: unknown[] = [];\n\tlet completedResponse: Record<string, unknown> | null = null;\n\tfor (const line of text.split(\"\\n\")) {\n\t\tif (!line.startsWith(\"data: \")) continue;\n\t\tconst data = line.slice(6).trim();\n\t\tif (!data || data === \"[DONE]\") continue;\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(data) as Record<string, unknown>;\n\t\t\tif (parsed.type === \"response.output_item.done\" && parsed.item) outputItems.push(parsed.item);\n\t\t\tif ((parsed.type === \"response.done\" || parsed.type === \"response.completed\") && parsed.response && typeof parsed.response === \"object\") {\n\t\t\t\tcompletedResponse = parsed.response as Record<string, unknown>;\n\t\t\t}\n\t\t} catch {\n\t\t}\n\t}\n\n\tif (completedResponse) {\n\t\tconst output = Array.isArray(completedResponse.output) ? completedResponse.output : [];\n\t\treturn output.length > 0 ? completedResponse : { ...completedResponse, output: outputItems };\n\t}\n\tif (outputItems.length > 0) return { output: outputItems };\n\tthrow new Error(\"OpenAI API returned no parseable response output\");\n}\n\nfunction cleanSourceUrl(rawUrl: string): string {\n\ttry {\n\t\tconst url = new URL(rawUrl);\n\t\tif (url.searchParams.get(\"utm_source\") === \"openai\") url.searchParams.delete(\"utm_source\");\n\t\treturn url.toString();\n\t} catch {\n\t\treturn rawUrl.replace(/[?&]utm_source=openai$/, \"\");\n\t}\n}\n\nfunction extractSnippetAround(text: string, start: unknown, end: unknown): string {\n\tif (typeof start !== \"number\" || typeof end !== \"number\" || !text) return \"\";\n\tconst before = Math.max(0, start - 100);\n\tconst after = Math.min(text.length, end + 100);\n\tconst snippet = text.slice(before, after).replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\").trim();\n\treturn snippet.length > 300 ? `${snippet.slice(0, 297)}...` : snippet;\n}\n\nfunction addResult(results: SearchResult[], seen: Set<string>, url: unknown, title: unknown, snippet = \"\"): void {\n\tif (typeof url !== \"string\" || url.trim().length === 0) return;\n\tconst cleanUrl = cleanSourceUrl(url);\n\tif (seen.has(cleanUrl)) return;\n\tseen.add(cleanUrl);\n\tresults.push({\n\t\ttitle: typeof title === \"string\" && title.trim().length > 0 ? title : cleanUrl,\n\t\turl: cleanUrl,\n\t\tsnippet,\n\t});\n}\n\nfunction extractSearchResults(output: unknown[], numResults: number | undefined): SearchResult[] {\n\tconst results: SearchResult[] = [];\n\tconst seenUrls = new Set<string>();\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = typeof (part as { text?: unknown }).text === \"string\" ? (part as { text: string }).text : \"\";\n\t\t\tconst annotations = (part as { annotations?: unknown }).annotations;\n\t\t\tif (!Array.isArray(annotations)) continue;\n\t\t\tfor (const annotation of annotations) {\n\t\t\t\tif (!annotation || typeof annotation !== \"object\" || (annotation as { type?: unknown }).type !== \"url_citation\") continue;\n\t\t\t\taddResult(\n\t\t\t\t\tresults,\n\t\t\t\t\tseenUrls,\n\t\t\t\t\t(annotation as { url?: unknown }).url,\n\t\t\t\t\t(annotation as { title?: unknown }).title,\n\t\t\t\t\textractSnippetAround(text, (annotation as { start_index?: unknown }).start_index, (annotation as { end_index?: unknown }).end_index),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"web_search_call\") continue;\n\t\tconst value = item as { action?: unknown; sources?: unknown; results?: unknown };\n\t\tconst actionSources = value.action && typeof value.action === \"object\"\n\t\t\t? (value.action as { sources?: unknown }).sources\n\t\t\t: undefined;\n\t\tconst sourceGroups = [actionSources, value.sources, value.results];\n\t\tfor (const group of sourceGroups) {\n\t\t\tif (!Array.isArray(group)) continue;\n\t\t\tfor (const source of group) {\n\t\t\t\tif (!source || typeof source !== \"object\") continue;\n\t\t\t\tconst record = source as Record<string, unknown>;\n\t\t\t\taddResult(results, seenUrls, record.url ?? record.source_website_url, record.title ?? record.caption);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof numResults === \"number\" && Number.isFinite(numResults) && numResults > 0) {\n\t\treturn results.slice(0, Math.min(Math.floor(numResults), 20));\n\t}\n\treturn results;\n}\n\nfunction extractAnswer(output: unknown[]): string {\n\tconst parts: string[] = [];\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = (part as { text?: unknown }).text;\n\t\t\tif (typeof text === \"string\" && text.trim().length > 0) parts.push(text);\n\t\t}\n\t}\n\treturn parts.join(\"\\n\").trim();\n}\n\nexport async function searchWithOpenAI(\n\tquery: string,\n\toptions: SearchOptions = {},\n\tctx?: ExtensionContext,\n): Promise<SearchResponse> {\n\tconst auth = await resolveOpenAIAuth(ctx);\n\tif (!auth) {\n\t\tthrow new Error(\n\t\t\t\"OpenAI web search unavailable. Either:\\n\" +\n\t\t\t\" 1. Use /login to sign in with a Codex subscription\\n\" +\n\t\t\t` 2. Create ${CONFIG_PATH} with { \"openaiApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 3. Set OPENAI_API_KEY environment variable\",\n\t\t);\n\t}\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tconst headers: Record<string, string> = {\n\t\t...auth.headers,\n\t\tAuthorization: `Bearer ${auth.apiKey}`,\n\t\t\"Content-Type\": \"application/json\",\n\t\t\"OpenAI-Beta\": \"responses=experimental\",\n\t};\n\tconst useCodexEndpoint = auth.provider === \"openai-codex\" || isCodexJwt(auth.apiKey);\n\tif (useCodexEndpoint) {\n\t\tconst accountId = extractAccountId(auth.apiKey);\n\t\tif (accountId) headers[\"chatgpt-account-id\"] = accountId;\n\t\theaders.originator = \"pi\";\n\t}\n\n\tconst body = {\n\t\tmodel: auth.model,\n\t\tinstructions: buildInstructions(options),\n\t\tinput: [{ role: \"user\", content: [{ type: \"input_text\", text: query }] }],\n\t\ttools: [buildWebSearchTool(options)],\n\t\tinclude: [\"web_search_call.action.sources\"],\n\t\tstore: false,\n\t\tstream: true,\n\t\ttool_choice: \"required\" as const,\n\t\tparallel_tool_calls: true,\n\t};\n\n\ttry {\n\t\tconst response = await fetch(useCodexEndpoint ? CODEX_RESPONSES_URL : OPENAI_RESPONSES_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: options.signal\n\t\t\t\t? AbortSignal.any([AbortSignal.timeout(SEARCH_TIMEOUT_MS), options.signal])\n\t\t\t\t: AbortSignal.timeout(SEARCH_TIMEOUT_MS),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tactivityMonitor.logError(activityId, `HTTP ${response.status}`);\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(`OpenAI API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t\t}\n\n\t\tconst parsed = await parseOpenAIResponse(response);\n\t\tconst output = Array.isArray(parsed.output) ? parsed.output : [];\n\t\tconst answer = extractAnswer(output);\n\t\tconst results = extractSearchResults(output, options.numResults);\n\n\t\tif (!answer && results.length === 0) {\n\t\t\tthrow new Error(\"OpenAI web_search returned no answer or sources\");\n\t\t}\n\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\treturn { answer, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\tthrow err;\n\t}\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ExtensionContext } from "@
|
|
1
|
+
import type { ExtensionContext } from "@ashx-j/lunr";
|
|
2
2
|
import type { ExtractedContent } from "./extract.ts";
|
|
3
3
|
import type { SearchResult } from "./perplexity.ts";
|
|
4
4
|
export interface QueryResultData {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC1B;AAID,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAEpE;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAE7D;AAED,wBAAgB,aAAa,IAAI,gBAAgB,EAAE,CAElD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAaD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAY9D","sourcesContent":["// @ts-nocheck\nimport type { ExtensionContext } from \"@
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC1B;AAID,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAEpE;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAE7D;AAED,wBAAgB,aAAa,IAAI,gBAAgB,EAAE,CAElD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAaD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAY9D","sourcesContent":["// @ts-nocheck\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\n\nconst CACHE_TTL_MS = 60 * 60 * 1000;\n\nexport interface QueryResultData {\n\tquery: string;\n\tanswer: string;\n\tresults: SearchResult[];\n\terror: string | null;\n\tprovider?: string;\n}\n\nexport interface StoredSearchData {\n\tid: string;\n\ttype: \"search\" | \"fetch\";\n\ttimestamp: number;\n\tqueries?: QueryResultData[];\n\turls?: ExtractedContent[];\n}\n\nconst storedResults = new Map<string, StoredSearchData>();\n\nexport function generateId(): string {\n\treturn Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nexport function storeResult(id: string, data: StoredSearchData): void {\n\tstoredResults.set(id, data);\n}\n\nexport function getResult(id: string): StoredSearchData | null {\n\treturn storedResults.get(id) ?? null;\n}\n\nexport function getAllResults(): StoredSearchData[] {\n\treturn Array.from(storedResults.values());\n}\n\nexport function deleteResult(id: string): boolean {\n\treturn storedResults.delete(id);\n}\n\nexport function clearResults(): void {\n\tstoredResults.clear();\n}\n\nfunction isValidStoredData(data: unknown): data is StoredSearchData {\n\tif (!data || typeof data !== \"object\") return false;\n\tconst d = data as Record<string, unknown>;\n\tif (typeof d.id !== \"string\" || !d.id) return false;\n\tif (d.type !== \"search\" && d.type !== \"fetch\") return false;\n\tif (typeof d.timestamp !== \"number\") return false;\n\tif (d.type === \"search\" && !Array.isArray(d.queries)) return false;\n\tif (d.type === \"fetch\" && !Array.isArray(d.urls)) return false;\n\treturn true;\n}\n\nexport function restoreFromSession(ctx: ExtensionContext): void {\n\tstoredResults.clear();\n\tconst now = Date.now();\n\n\tfor (const entry of ctx.sessionManager.getBranch()) {\n\t\tif (entry.type === \"custom\" && entry.customType === \"web-search-results\") {\n\t\t\tconst data = entry.data;\n\t\t\tif (isValidStoredData(data) && now - data.timestamp < CACHE_TTL_MS) {\n\t\t\t\tstoredResults.set(data.id, data);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/storage.ts"],"names":[],"mappings":"AAKA,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAkBpC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA4B,CAAC;AAE1D,MAAM,UAAU,UAAU,GAAW;IACpC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,CACxE;AAED,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,IAAsB,EAAQ;IACrE,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAAA,CAC5B;AAED,MAAM,UAAU,SAAS,CAAC,EAAU,EAA2B;IAC9D,OAAO,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;AAAA,CACrC;AAED,MAAM,UAAU,aAAa,GAAuB;IACnD,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAAA,CAC1C;AAED,MAAM,UAAU,YAAY,CAAC,EAAU,EAAW;IACjD,OAAO,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAAA,CAChC;AAED,MAAM,UAAU,YAAY,GAAS;IACpC,aAAa,CAAC,KAAK,EAAE,CAAC;AAAA,CACtB;AAED,SAAS,iBAAiB,CAAC,IAAa,EAA4B;IACnE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/D,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAqB,EAAQ;IAC/D,aAAa,CAAC,KAAK,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC;QACpD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,oBAAoB,EAAE,CAAC;YAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;gBACpE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;IACF,CAAC;AAAA,CACD","sourcesContent":["// @ts-nocheck\nimport type { ExtensionContext } from \"@
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/storage.ts"],"names":[],"mappings":"AAKA,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAkBpC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA4B,CAAC;AAE1D,MAAM,UAAU,UAAU,GAAW;IACpC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,CACxE;AAED,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,IAAsB,EAAQ;IACrE,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAAA,CAC5B;AAED,MAAM,UAAU,SAAS,CAAC,EAAU,EAA2B;IAC9D,OAAO,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;AAAA,CACrC;AAED,MAAM,UAAU,aAAa,GAAuB;IACnD,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAAA,CAC1C;AAED,MAAM,UAAU,YAAY,CAAC,EAAU,EAAW;IACjD,OAAO,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAAA,CAChC;AAED,MAAM,UAAU,YAAY,GAAS;IACpC,aAAa,CAAC,KAAK,EAAE,CAAC;AAAA,CACtB;AAED,SAAS,iBAAiB,CAAC,IAAa,EAA4B;IACnE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/D,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAqB,EAAQ;IAC/D,aAAa,CAAC,KAAK,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC;QACpD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,oBAAoB,EAAE,CAAC;YAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;gBACpE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;IACF,CAAC;AAAA,CACD","sourcesContent":["// @ts-nocheck\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\n\nconst CACHE_TTL_MS = 60 * 60 * 1000;\n\nexport interface QueryResultData {\n\tquery: string;\n\tanswer: string;\n\tresults: SearchResult[];\n\terror: string | null;\n\tprovider?: string;\n}\n\nexport interface StoredSearchData {\n\tid: string;\n\ttype: \"search\" | \"fetch\";\n\ttimestamp: number;\n\tqueries?: QueryResultData[];\n\turls?: ExtractedContent[];\n}\n\nconst storedResults = new Map<string, StoredSearchData>();\n\nexport function generateId(): string {\n\treturn Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nexport function storeResult(id: string, data: StoredSearchData): void {\n\tstoredResults.set(id, data);\n}\n\nexport function getResult(id: string): StoredSearchData | null {\n\treturn storedResults.get(id) ?? null;\n}\n\nexport function getAllResults(): StoredSearchData[] {\n\treturn Array.from(storedResults.values());\n}\n\nexport function deleteResult(id: string): boolean {\n\treturn storedResults.delete(id);\n}\n\nexport function clearResults(): void {\n\tstoredResults.clear();\n}\n\nfunction isValidStoredData(data: unknown): data is StoredSearchData {\n\tif (!data || typeof data !== \"object\") return false;\n\tconst d = data as Record<string, unknown>;\n\tif (typeof d.id !== \"string\" || !d.id) return false;\n\tif (d.type !== \"search\" && d.type !== \"fetch\") return false;\n\tif (typeof d.timestamp !== \"number\") return false;\n\tif (d.type === \"search\" && !Array.isArray(d.queries)) return false;\n\tif (d.type === \"fetch\" && !Array.isArray(d.urls)) return false;\n\treturn true;\n}\n\nexport function restoreFromSession(ctx: ExtensionContext): void {\n\tstoredResults.clear();\n\tconst now = Date.now();\n\n\tfor (const entry of ctx.sessionManager.getBranch()) {\n\t\tif (entry.type === \"custom\" && entry.customType === \"web-search-results\") {\n\t\t\tconst data = entry.data;\n\t\t\tif (isValidStoredData(data) && now - data.timestamp < CACHE_TTL_MS) {\n\t\t\t\tstoredResults.set(data.id, data);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary-review.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/summary-review.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAOpD,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,kBAAkB,CAAC,CAAC;AAiCtH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAkCxF;AA2ED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAiB5G;AAkFD,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,eAAe,EAAE,EAC1B,GAAG,EAAE,wBAAwB,EAC7B,MAAM,CAAC,EAAE,WAAW,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CA2DjD","sourcesContent":["// @ts-nocheck\nimport { complete, type Message, type Model } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { loadEnabledModelPatterns, modelMatchesEnabledPatterns } from \"./summary-model-scope.ts\";\nimport type { QueryResultData } from \"./storage.ts\";\n\nconst PREFERRED_SUMMARY_MODELS = [\n\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.3-codex-spark\" },\n] as const;\n\nexport interface SummaryMeta {\n\tmodel: string | null;\n\tdurationMs: number;\n\ttokenEstimate: number;\n\tfallbackUsed: boolean;\n\tfallbackReason?: string;\n\tedited?: boolean;\n}\n\nexport type SummaryGenerationContext = Pick<ExtensionContext, \"model\" | \"modelRegistry\" | \"cwd\" | \"isProjectTrusted\">;\n\nfunction estimateTokens(text: string): number {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return 0;\n\treturn Math.max(1, Math.ceil(trimmed.length / 4));\n}\n\nfunction summarizeQueryResult(result: QueryResultData): string {\n\tif (result.error) {\n\t\treturn `Query: ${result.query}\\nStatus: Error\\nError: ${result.error}`;\n\t}\n\n\tconst lines = [\n\t\t`Query: ${result.query}`,\n\t\t`Provider: ${result.provider ?? \"unknown\"}`,\n\t\t`Answer: ${result.answer || \"(no answer text returned)\"}`,\n\t];\n\n\tif (result.results.length === 0) {\n\t\tlines.push(\"Sources: none\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tlines.push(\"Sources:\");\n\tfor (let i = 0; i < result.results.length; i++) {\n\t\tconst source = result.results[i];\n\t\tlines.push(`${i + 1}. ${source.title} — ${source.url}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string {\n\tconst sections = [\n\t\t\"You are writing the final web search summary for a coding assistant.\",\n\t\t\"Write a concise, factual summary using only the provided search results.\",\n\t\t\"Requirements:\",\n\t\t\"- Keep it readable and skimmable.\",\n\t\t\"- Include key findings and caveats.\",\n\t\t\"- Do not invent sources or claims.\",\n\t\t\"- If evidence is weak or conflicting, say so explicitly.\",\n\t\t\"- End with a short \\\"Sources\\\" section listing the most relevant URLs.\",\n\t];\n\n\tif (feedback) {\n\t\tsections.push(\"- Incorporate the user feedback provided below into the summary.\");\n\t}\n\n\tsections.push(\"\");\n\tsections.push(\"<search_results>\");\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tsections.push(`\\n[Result ${i + 1}]`);\n\t\tsections.push(summarizeQueryResult(results[i]));\n\t}\n\n\tsections.push(\"\\n</search_results>\");\n\n\tif (feedback) {\n\t\tsections.push(\"\");\n\t\tsections.push(\"<user_feedback>\");\n\t\tsections.push(feedback);\n\t\tsections.push(\"</user_feedback>\");\n\t}\n\n\treturn sections.join(\"\\n\");\n}\n\nfunction buildDeterministicAnswerPreview(answer: string): string {\n\tlet text = answer.replace(/\\s+/g, \" \").trim();\n\tif (text.length === 0) return \"\";\n\n\tconst sourceMarker = text.search(/\\bSources?\\s*:/i);\n\tif (sourceMarker >= 0) text = text.slice(0, sourceMarker).trim();\n\tif (text.length === 0) return \"\";\n\n\treturn text.length > 240 ? `${text.slice(0, 237)}...` : text;\n}\n\nfunction buildDeterministicSummaryLines(results: QueryResultData[]): string[] {\n\tif (results.length === 0) {\n\t\treturn [\n\t\t\t\"No completed search results were available when the curator session finished.\",\n\t\t\t\"\",\n\t\t\t\"Sources\",\n\t\t\t\"- None\",\n\t\t];\n\t}\n\n\tconst lines: string[] = [\n\t\t\"Summary based on the currently selected search results.\",\n\t\t\"\",\n\t];\n\n\tconst sourceUrls: string[] = [];\n\tlet successful = 0;\n\tlet failed = 0;\n\n\tfor (const result of results) {\n\t\tif (result.error) {\n\t\t\tfailed += 1;\n\t\t\tlines.push(`- ${result.query}: failed (${result.error})`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsuccessful += 1;\n\t\tconst preview = buildDeterministicAnswerPreview(result.answer);\n\t\tif (preview.length > 0) {\n\t\t\tlines.push(`- ${result.query}: ${preview}`);\n\t\t} else {\n\t\t\tlines.push(`- ${result.query}: returned ${result.results.length} source${result.results.length === 1 ? \"\" : \"s\"} without answer text.`);\n\t\t}\n\n\t\tfor (const source of result.results) {\n\t\t\tif (!sourceUrls.includes(source.url)) {\n\t\t\t\tsourceUrls.push(source.url);\n\t\t\t}\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(`Completed queries: ${results.length}`);\n\tlines.push(`Successful: ${successful}`);\n\tlines.push(`Failed: ${failed}`);\n\tlines.push(\"\");\n\tlines.push(\"Sources\");\n\n\tif (sourceUrls.length === 0) {\n\t\tlines.push(\"- None\");\n\t} else {\n\t\tfor (const url of sourceUrls.slice(0, 12)) {\n\t\t\tlines.push(`- ${url}`);\n\t\t}\n\t\tif (sourceUrls.length > 12) {\n\t\t\tlines.push(`- ... and ${sourceUrls.length - 12} more`);\n\t\t}\n\t}\n\n\treturn lines;\n}\n\nexport function buildDeterministicSummary(results: QueryResultData[]): { summary: string; meta: SummaryMeta } {\n\tconst summary = buildDeterministicSummaryLines(results).join(\"\\n\").trim();\n\tconst nonEmptySummary = summary.length > 0\n\t\t? summary\n\t\t: \"No completed search results were available when the curator session finished.\\n\\nSources\\n- None\";\n\n\treturn {\n\t\tsummary: nonEmptySummary,\n\t\tmeta: {\n\t\t\tmodel: null,\n\t\t\tdurationMs: 0,\n\t\t\ttokenEstimate: estimateTokens(nonEmptySummary),\n\t\t\tfallbackUsed: true,\n\t\t\tfallbackReason: \"deterministic-submit-fallback\",\n\t\t\tedited: false,\n\t\t},\n\t};\n}\n\nfunction parseModelSelector(value: string): { provider: string; id: string } {\n\tconst slashIndex = value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex >= value.length - 1) {\n\t\tthrow new Error(`Invalid summary model: ${value}. Use provider/model-id.`);\n\t}\n\treturn {\n\t\tprovider: value.slice(0, slashIndex),\n\t\tid: value.slice(slashIndex + 1),\n\t};\n}\n\nasync function resolveSummaryModelCandidates(\n\tctx: SummaryGenerationContext,\n\tmodelOverride?: string,\n): Promise<{ candidates: Array<{ model: Model; apiKey: string; headers?: Record<string, string> }>; errors: string[] }> {\n\tconst enabledModelPatterns = loadEnabledModelPatterns(ctx);\n\tconst specs: Array<{ provider: string; id: string }> = [];\n\tconst normalizedOverride = typeof modelOverride === \"string\" ? modelOverride.trim() : \"\";\n\tif (normalizedOverride.length > 0) specs.push(parseModelSelector(normalizedOverride));\n\tspecs.push(...PREFERRED_SUMMARY_MODELS);\n\n\tconst candidates: Array<{ model: Model; apiKey: string; headers?: Record<string, string> }> = [];\n\tconst errors: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const spec of specs) {\n\t\tconst value = `${spec.provider}/${spec.id}`;\n\t\tif (seen.has(value)) continue;\n\t\tseen.add(value);\n\n\t\tconst model = ctx.modelRegistry.find(spec.provider, spec.id);\n\t\tif (!model) {\n\t\t\terrors.push(`Summary model not found: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) {\n\t\t\terrors.push(`Summary model is not enabled: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok || !auth.apiKey) {\n\t\t\terrors.push(`No API key available for summary model ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ model, apiKey: auth.apiKey, headers: auth.headers });\n\t}\n\treturn { candidates, errors };\n}\n\nfunction buildFallbackSummary(results: QueryResultData[], fallbackReason: string): { summary: string; meta: SummaryMeta } {\n\tconst deterministic = buildDeterministicSummary(results);\n\treturn {\n\t\tsummary: deterministic.summary,\n\t\tmeta: {\n\t\t\t...deterministic.meta,\n\t\t\tfallbackReason,\n\t\t},\n\t};\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tconst name = (err as { name?: unknown }).name;\n\tconst message = (err as { message?: unknown }).message;\n\treturn name === \"AbortError\" || (typeof message === \"string\" && message.toLowerCase().includes(\"abort\"));\n}\n\nfunction getTextFromContentPart(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"\";\n\tconst value = part as Record<string, unknown>;\n\tif (typeof value.text === \"string\") return value.text;\n\tif (typeof value.refusal === \"string\") return value.refusal;\n\treturn \"\";\n}\n\nfunction getContentPartType(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"unknown\";\n\tconst value = part as Record<string, unknown>;\n\treturn typeof value.type === \"string\" ? value.type : \"unknown\";\n}\n\nexport async function generateSummaryDraft(\n\tresults: QueryResultData[],\n\tctx: SummaryGenerationContext,\n\tsignal?: AbortSignal,\n\tmodelOverride?: string,\n\tfeedback?: string,\n): Promise<{ summary: string; meta: SummaryMeta }> {\n\tif (!ctx || !ctx.modelRegistry) {\n\t\tthrow new Error(\"Summary generation context unavailable\");\n\t}\n\n\tconst prompt = buildSummaryPrompt(results, feedback);\n\tlet resolved: Awaited<ReturnType<typeof resolveSummaryModelCandidates>>;\n\ttry {\n\t\tresolved = await resolveSummaryModelCandidates(ctx, modelOverride);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn buildFallbackSummary(results, `summary-model-settings-error: ${message}`);\n\t}\n\n\tlet lastError = resolved.errors.at(-1);\n\tfor (const { model, apiKey, headers } of resolved.candidates) {\n\t\tconst startedAt = Date.now();\n\t\ttry {\n\t\t\tconst userMessage: Message = {\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: [{ type: \"text\", text: prompt }],\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\n\t\t\tconst response = await complete(model, { messages: [userMessage] }, { apiKey, headers, signal });\n\t\t\tif (response.stopReason === \"aborted\") {\n\t\t\t\tthrow new Error(\"Aborted\");\n\t\t\t}\n\n\t\t\tconst contentParts = Array.isArray(response.content) ? response.content : [];\n\t\t\tconst summary = contentParts\n\t\t\t\t.map(part => getTextFromContentPart(part))\n\t\t\t\t.filter(text => text.trim().length > 0)\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.trim();\n\n\t\t\tif (summary.length === 0) {\n\t\t\t\tconst partTypes = contentParts.map(part => getContentPartType(part));\n\t\t\t\tconst typesLabel = partTypes.length > 0 ? partTypes.join(\", \") : \"none\";\n\t\t\t\tthrow new Error(`Summary model returned empty response (content parts: ${typesLabel})`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsummary,\n\t\t\t\tmeta: {\n\t\t\t\t\tmodel: `${model.provider}/${model.id}`,\n\t\t\t\t\tdurationMs: Math.max(0, Date.now() - startedAt),\n\t\t\t\t\ttokenEstimate: estimateTokens(summary),\n\t\t\t\t\tfallbackUsed: false,\n\t\t\t\t\tedited: false,\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tlastError = err instanceof Error ? err.message : String(err);\n\t\t}\n\t}\n\n\treturn buildFallbackSummary(results, lastError ? `summary-model-unavailable: ${lastError}` : \"summary-model-unavailable\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"summary-review.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/summary-review.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAOpD,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,kBAAkB,CAAC,CAAC;AAiCtH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAkCxF;AA2ED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAiB5G;AAkFD,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,eAAe,EAAE,EAC1B,GAAG,EAAE,wBAAwB,EAC7B,MAAM,CAAC,EAAE,WAAW,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CA2DjD","sourcesContent":["// @ts-nocheck\nimport { complete, type Message, type Model } from \"@ashx-j/lunr-ai/compat\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { loadEnabledModelPatterns, modelMatchesEnabledPatterns } from \"./summary-model-scope.ts\";\nimport type { QueryResultData } from \"./storage.ts\";\n\nconst PREFERRED_SUMMARY_MODELS = [\n\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.3-codex-spark\" },\n] as const;\n\nexport interface SummaryMeta {\n\tmodel: string | null;\n\tdurationMs: number;\n\ttokenEstimate: number;\n\tfallbackUsed: boolean;\n\tfallbackReason?: string;\n\tedited?: boolean;\n}\n\nexport type SummaryGenerationContext = Pick<ExtensionContext, \"model\" | \"modelRegistry\" | \"cwd\" | \"isProjectTrusted\">;\n\nfunction estimateTokens(text: string): number {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return 0;\n\treturn Math.max(1, Math.ceil(trimmed.length / 4));\n}\n\nfunction summarizeQueryResult(result: QueryResultData): string {\n\tif (result.error) {\n\t\treturn `Query: ${result.query}\\nStatus: Error\\nError: ${result.error}`;\n\t}\n\n\tconst lines = [\n\t\t`Query: ${result.query}`,\n\t\t`Provider: ${result.provider ?? \"unknown\"}`,\n\t\t`Answer: ${result.answer || \"(no answer text returned)\"}`,\n\t];\n\n\tif (result.results.length === 0) {\n\t\tlines.push(\"Sources: none\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tlines.push(\"Sources:\");\n\tfor (let i = 0; i < result.results.length; i++) {\n\t\tconst source = result.results[i];\n\t\tlines.push(`${i + 1}. ${source.title} — ${source.url}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string {\n\tconst sections = [\n\t\t\"You are writing the final web search summary for a coding assistant.\",\n\t\t\"Write a concise, factual summary using only the provided search results.\",\n\t\t\"Requirements:\",\n\t\t\"- Keep it readable and skimmable.\",\n\t\t\"- Include key findings and caveats.\",\n\t\t\"- Do not invent sources or claims.\",\n\t\t\"- If evidence is weak or conflicting, say so explicitly.\",\n\t\t\"- End with a short \\\"Sources\\\" section listing the most relevant URLs.\",\n\t];\n\n\tif (feedback) {\n\t\tsections.push(\"- Incorporate the user feedback provided below into the summary.\");\n\t}\n\n\tsections.push(\"\");\n\tsections.push(\"<search_results>\");\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tsections.push(`\\n[Result ${i + 1}]`);\n\t\tsections.push(summarizeQueryResult(results[i]));\n\t}\n\n\tsections.push(\"\\n</search_results>\");\n\n\tif (feedback) {\n\t\tsections.push(\"\");\n\t\tsections.push(\"<user_feedback>\");\n\t\tsections.push(feedback);\n\t\tsections.push(\"</user_feedback>\");\n\t}\n\n\treturn sections.join(\"\\n\");\n}\n\nfunction buildDeterministicAnswerPreview(answer: string): string {\n\tlet text = answer.replace(/\\s+/g, \" \").trim();\n\tif (text.length === 0) return \"\";\n\n\tconst sourceMarker = text.search(/\\bSources?\\s*:/i);\n\tif (sourceMarker >= 0) text = text.slice(0, sourceMarker).trim();\n\tif (text.length === 0) return \"\";\n\n\treturn text.length > 240 ? `${text.slice(0, 237)}...` : text;\n}\n\nfunction buildDeterministicSummaryLines(results: QueryResultData[]): string[] {\n\tif (results.length === 0) {\n\t\treturn [\n\t\t\t\"No completed search results were available when the curator session finished.\",\n\t\t\t\"\",\n\t\t\t\"Sources\",\n\t\t\t\"- None\",\n\t\t];\n\t}\n\n\tconst lines: string[] = [\n\t\t\"Summary based on the currently selected search results.\",\n\t\t\"\",\n\t];\n\n\tconst sourceUrls: string[] = [];\n\tlet successful = 0;\n\tlet failed = 0;\n\n\tfor (const result of results) {\n\t\tif (result.error) {\n\t\t\tfailed += 1;\n\t\t\tlines.push(`- ${result.query}: failed (${result.error})`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsuccessful += 1;\n\t\tconst preview = buildDeterministicAnswerPreview(result.answer);\n\t\tif (preview.length > 0) {\n\t\t\tlines.push(`- ${result.query}: ${preview}`);\n\t\t} else {\n\t\t\tlines.push(`- ${result.query}: returned ${result.results.length} source${result.results.length === 1 ? \"\" : \"s\"} without answer text.`);\n\t\t}\n\n\t\tfor (const source of result.results) {\n\t\t\tif (!sourceUrls.includes(source.url)) {\n\t\t\t\tsourceUrls.push(source.url);\n\t\t\t}\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(`Completed queries: ${results.length}`);\n\tlines.push(`Successful: ${successful}`);\n\tlines.push(`Failed: ${failed}`);\n\tlines.push(\"\");\n\tlines.push(\"Sources\");\n\n\tif (sourceUrls.length === 0) {\n\t\tlines.push(\"- None\");\n\t} else {\n\t\tfor (const url of sourceUrls.slice(0, 12)) {\n\t\t\tlines.push(`- ${url}`);\n\t\t}\n\t\tif (sourceUrls.length > 12) {\n\t\t\tlines.push(`- ... and ${sourceUrls.length - 12} more`);\n\t\t}\n\t}\n\n\treturn lines;\n}\n\nexport function buildDeterministicSummary(results: QueryResultData[]): { summary: string; meta: SummaryMeta } {\n\tconst summary = buildDeterministicSummaryLines(results).join(\"\\n\").trim();\n\tconst nonEmptySummary = summary.length > 0\n\t\t? summary\n\t\t: \"No completed search results were available when the curator session finished.\\n\\nSources\\n- None\";\n\n\treturn {\n\t\tsummary: nonEmptySummary,\n\t\tmeta: {\n\t\t\tmodel: null,\n\t\t\tdurationMs: 0,\n\t\t\ttokenEstimate: estimateTokens(nonEmptySummary),\n\t\t\tfallbackUsed: true,\n\t\t\tfallbackReason: \"deterministic-submit-fallback\",\n\t\t\tedited: false,\n\t\t},\n\t};\n}\n\nfunction parseModelSelector(value: string): { provider: string; id: string } {\n\tconst slashIndex = value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex >= value.length - 1) {\n\t\tthrow new Error(`Invalid summary model: ${value}. Use provider/model-id.`);\n\t}\n\treturn {\n\t\tprovider: value.slice(0, slashIndex),\n\t\tid: value.slice(slashIndex + 1),\n\t};\n}\n\nasync function resolveSummaryModelCandidates(\n\tctx: SummaryGenerationContext,\n\tmodelOverride?: string,\n): Promise<{ candidates: Array<{ model: Model; apiKey: string; headers?: Record<string, string> }>; errors: string[] }> {\n\tconst enabledModelPatterns = loadEnabledModelPatterns(ctx);\n\tconst specs: Array<{ provider: string; id: string }> = [];\n\tconst normalizedOverride = typeof modelOverride === \"string\" ? modelOverride.trim() : \"\";\n\tif (normalizedOverride.length > 0) specs.push(parseModelSelector(normalizedOverride));\n\tspecs.push(...PREFERRED_SUMMARY_MODELS);\n\n\tconst candidates: Array<{ model: Model; apiKey: string; headers?: Record<string, string> }> = [];\n\tconst errors: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const spec of specs) {\n\t\tconst value = `${spec.provider}/${spec.id}`;\n\t\tif (seen.has(value)) continue;\n\t\tseen.add(value);\n\n\t\tconst model = ctx.modelRegistry.find(spec.provider, spec.id);\n\t\tif (!model) {\n\t\t\terrors.push(`Summary model not found: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) {\n\t\t\terrors.push(`Summary model is not enabled: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok || !auth.apiKey) {\n\t\t\terrors.push(`No API key available for summary model ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ model, apiKey: auth.apiKey, headers: auth.headers });\n\t}\n\treturn { candidates, errors };\n}\n\nfunction buildFallbackSummary(results: QueryResultData[], fallbackReason: string): { summary: string; meta: SummaryMeta } {\n\tconst deterministic = buildDeterministicSummary(results);\n\treturn {\n\t\tsummary: deterministic.summary,\n\t\tmeta: {\n\t\t\t...deterministic.meta,\n\t\t\tfallbackReason,\n\t\t},\n\t};\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tconst name = (err as { name?: unknown }).name;\n\tconst message = (err as { message?: unknown }).message;\n\treturn name === \"AbortError\" || (typeof message === \"string\" && message.toLowerCase().includes(\"abort\"));\n}\n\nfunction getTextFromContentPart(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"\";\n\tconst value = part as Record<string, unknown>;\n\tif (typeof value.text === \"string\") return value.text;\n\tif (typeof value.refusal === \"string\") return value.refusal;\n\treturn \"\";\n}\n\nfunction getContentPartType(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"unknown\";\n\tconst value = part as Record<string, unknown>;\n\treturn typeof value.type === \"string\" ? value.type : \"unknown\";\n}\n\nexport async function generateSummaryDraft(\n\tresults: QueryResultData[],\n\tctx: SummaryGenerationContext,\n\tsignal?: AbortSignal,\n\tmodelOverride?: string,\n\tfeedback?: string,\n): Promise<{ summary: string; meta: SummaryMeta }> {\n\tif (!ctx || !ctx.modelRegistry) {\n\t\tthrow new Error(\"Summary generation context unavailable\");\n\t}\n\n\tconst prompt = buildSummaryPrompt(results, feedback);\n\tlet resolved: Awaited<ReturnType<typeof resolveSummaryModelCandidates>>;\n\ttry {\n\t\tresolved = await resolveSummaryModelCandidates(ctx, modelOverride);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn buildFallbackSummary(results, `summary-model-settings-error: ${message}`);\n\t}\n\n\tlet lastError = resolved.errors.at(-1);\n\tfor (const { model, apiKey, headers } of resolved.candidates) {\n\t\tconst startedAt = Date.now();\n\t\ttry {\n\t\t\tconst userMessage: Message = {\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: [{ type: \"text\", text: prompt }],\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\n\t\t\tconst response = await complete(model, { messages: [userMessage] }, { apiKey, headers, signal });\n\t\t\tif (response.stopReason === \"aborted\") {\n\t\t\t\tthrow new Error(\"Aborted\");\n\t\t\t}\n\n\t\t\tconst contentParts = Array.isArray(response.content) ? response.content : [];\n\t\t\tconst summary = contentParts\n\t\t\t\t.map(part => getTextFromContentPart(part))\n\t\t\t\t.filter(text => text.trim().length > 0)\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.trim();\n\n\t\t\tif (summary.length === 0) {\n\t\t\t\tconst partTypes = contentParts.map(part => getContentPartType(part));\n\t\t\t\tconst typesLabel = partTypes.length > 0 ? partTypes.join(\", \") : \"none\";\n\t\t\t\tthrow new Error(`Summary model returned empty response (content parts: ${typesLabel})`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsummary,\n\t\t\t\tmeta: {\n\t\t\t\t\tmodel: `${model.provider}/${model.id}`,\n\t\t\t\t\tdurationMs: Math.max(0, Date.now() - startedAt),\n\t\t\t\t\ttokenEstimate: estimateTokens(summary),\n\t\t\t\t\tfallbackUsed: false,\n\t\t\t\t\tedited: false,\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tlastError = err instanceof Error ? err.message : String(err);\n\t\t}\n\t}\n\n\treturn buildFallbackSummary(results, lastError ? `summary-model-unavailable: ${lastError}` : \"summary-model-unavailable\");\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
|
-
import { complete } from "@
|
|
2
|
+
import { complete } from "@ashx-j/lunr-ai/compat";
|
|
3
3
|
import { loadEnabledModelPatterns, modelMatchesEnabledPatterns } from "./summary-model-scope.js";
|
|
4
4
|
const PREFERRED_SUMMARY_MODELS = [
|
|
5
5
|
{ provider: "anthropic", id: "claude-haiku-4-5" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summary-review.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/summary-review.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { complete, type Message, type Model } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { loadEnabledModelPatterns, modelMatchesEnabledPatterns } from \"./summary-model-scope.ts\";\nimport type { QueryResultData } from \"./storage.ts\";\n\nconst PREFERRED_SUMMARY_MODELS = [\n\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.3-codex-spark\" },\n] as const;\n\nexport interface SummaryMeta {\n\tmodel: string | null;\n\tdurationMs: number;\n\ttokenEstimate: number;\n\tfallbackUsed: boolean;\n\tfallbackReason?: string;\n\tedited?: boolean;\n}\n\nexport type SummaryGenerationContext = Pick<ExtensionContext, \"model\" | \"modelRegistry\" | \"cwd\" | \"isProjectTrusted\">;\n\nfunction estimateTokens(text: string): number {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return 0;\n\treturn Math.max(1, Math.ceil(trimmed.length / 4));\n}\n\nfunction summarizeQueryResult(result: QueryResultData): string {\n\tif (result.error) {\n\t\treturn `Query: ${result.query}\\nStatus: Error\\nError: ${result.error}`;\n\t}\n\n\tconst lines = [\n\t\t`Query: ${result.query}`,\n\t\t`Provider: ${result.provider ?? \"unknown\"}`,\n\t\t`Answer: ${result.answer || \"(no answer text returned)\"}`,\n\t];\n\n\tif (result.results.length === 0) {\n\t\tlines.push(\"Sources: none\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tlines.push(\"Sources:\");\n\tfor (let i = 0; i < result.results.length; i++) {\n\t\tconst source = result.results[i];\n\t\tlines.push(`${i + 1}. ${source.title} — ${source.url}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string {\n\tconst sections = [\n\t\t\"You are writing the final web search summary for a coding assistant.\",\n\t\t\"Write a concise, factual summary using only the provided search results.\",\n\t\t\"Requirements:\",\n\t\t\"- Keep it readable and skimmable.\",\n\t\t\"- Include key findings and caveats.\",\n\t\t\"- Do not invent sources or claims.\",\n\t\t\"- If evidence is weak or conflicting, say so explicitly.\",\n\t\t\"- End with a short \\\"Sources\\\" section listing the most relevant URLs.\",\n\t];\n\n\tif (feedback) {\n\t\tsections.push(\"- Incorporate the user feedback provided below into the summary.\");\n\t}\n\n\tsections.push(\"\");\n\tsections.push(\"<search_results>\");\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tsections.push(`\\n[Result ${i + 1}]`);\n\t\tsections.push(summarizeQueryResult(results[i]));\n\t}\n\n\tsections.push(\"\\n</search_results>\");\n\n\tif (feedback) {\n\t\tsections.push(\"\");\n\t\tsections.push(\"<user_feedback>\");\n\t\tsections.push(feedback);\n\t\tsections.push(\"</user_feedback>\");\n\t}\n\n\treturn sections.join(\"\\n\");\n}\n\nfunction buildDeterministicAnswerPreview(answer: string): string {\n\tlet text = answer.replace(/\\s+/g, \" \").trim();\n\tif (text.length === 0) return \"\";\n\n\tconst sourceMarker = text.search(/\\bSources?\\s*:/i);\n\tif (sourceMarker >= 0) text = text.slice(0, sourceMarker).trim();\n\tif (text.length === 0) return \"\";\n\n\treturn text.length > 240 ? `${text.slice(0, 237)}...` : text;\n}\n\nfunction buildDeterministicSummaryLines(results: QueryResultData[]): string[] {\n\tif (results.length === 0) {\n\t\treturn [\n\t\t\t\"No completed search results were available when the curator session finished.\",\n\t\t\t\"\",\n\t\t\t\"Sources\",\n\t\t\t\"- None\",\n\t\t];\n\t}\n\n\tconst lines: string[] = [\n\t\t\"Summary based on the currently selected search results.\",\n\t\t\"\",\n\t];\n\n\tconst sourceUrls: string[] = [];\n\tlet successful = 0;\n\tlet failed = 0;\n\n\tfor (const result of results) {\n\t\tif (result.error) {\n\t\t\tfailed += 1;\n\t\t\tlines.push(`- ${result.query}: failed (${result.error})`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsuccessful += 1;\n\t\tconst preview = buildDeterministicAnswerPreview(result.answer);\n\t\tif (preview.length > 0) {\n\t\t\tlines.push(`- ${result.query}: ${preview}`);\n\t\t} else {\n\t\t\tlines.push(`- ${result.query}: returned ${result.results.length} source${result.results.length === 1 ? \"\" : \"s\"} without answer text.`);\n\t\t}\n\n\t\tfor (const source of result.results) {\n\t\t\tif (!sourceUrls.includes(source.url)) {\n\t\t\t\tsourceUrls.push(source.url);\n\t\t\t}\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(`Completed queries: ${results.length}`);\n\tlines.push(`Successful: ${successful}`);\n\tlines.push(`Failed: ${failed}`);\n\tlines.push(\"\");\n\tlines.push(\"Sources\");\n\n\tif (sourceUrls.length === 0) {\n\t\tlines.push(\"- None\");\n\t} else {\n\t\tfor (const url of sourceUrls.slice(0, 12)) {\n\t\t\tlines.push(`- ${url}`);\n\t\t}\n\t\tif (sourceUrls.length > 12) {\n\t\t\tlines.push(`- ... and ${sourceUrls.length - 12} more`);\n\t\t}\n\t}\n\n\treturn lines;\n}\n\nexport function buildDeterministicSummary(results: QueryResultData[]): { summary: string; meta: SummaryMeta } {\n\tconst summary = buildDeterministicSummaryLines(results).join(\"\\n\").trim();\n\tconst nonEmptySummary = summary.length > 0\n\t\t? summary\n\t\t: \"No completed search results were available when the curator session finished.\\n\\nSources\\n- None\";\n\n\treturn {\n\t\tsummary: nonEmptySummary,\n\t\tmeta: {\n\t\t\tmodel: null,\n\t\t\tdurationMs: 0,\n\t\t\ttokenEstimate: estimateTokens(nonEmptySummary),\n\t\t\tfallbackUsed: true,\n\t\t\tfallbackReason: \"deterministic-submit-fallback\",\n\t\t\tedited: false,\n\t\t},\n\t};\n}\n\nfunction parseModelSelector(value: string): { provider: string; id: string } {\n\tconst slashIndex = value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex >= value.length - 1) {\n\t\tthrow new Error(`Invalid summary model: ${value}. Use provider/model-id.`);\n\t}\n\treturn {\n\t\tprovider: value.slice(0, slashIndex),\n\t\tid: value.slice(slashIndex + 1),\n\t};\n}\n\nasync function resolveSummaryModelCandidates(\n\tctx: SummaryGenerationContext,\n\tmodelOverride?: string,\n): Promise<{ candidates: Array<{ model: Model; apiKey: string; headers?: Record<string, string> }>; errors: string[] }> {\n\tconst enabledModelPatterns = loadEnabledModelPatterns(ctx);\n\tconst specs: Array<{ provider: string; id: string }> = [];\n\tconst normalizedOverride = typeof modelOverride === \"string\" ? modelOverride.trim() : \"\";\n\tif (normalizedOverride.length > 0) specs.push(parseModelSelector(normalizedOverride));\n\tspecs.push(...PREFERRED_SUMMARY_MODELS);\n\n\tconst candidates: Array<{ model: Model; apiKey: string; headers?: Record<string, string> }> = [];\n\tconst errors: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const spec of specs) {\n\t\tconst value = `${spec.provider}/${spec.id}`;\n\t\tif (seen.has(value)) continue;\n\t\tseen.add(value);\n\n\t\tconst model = ctx.modelRegistry.find(spec.provider, spec.id);\n\t\tif (!model) {\n\t\t\terrors.push(`Summary model not found: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) {\n\t\t\terrors.push(`Summary model is not enabled: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok || !auth.apiKey) {\n\t\t\terrors.push(`No API key available for summary model ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ model, apiKey: auth.apiKey, headers: auth.headers });\n\t}\n\treturn { candidates, errors };\n}\n\nfunction buildFallbackSummary(results: QueryResultData[], fallbackReason: string): { summary: string; meta: SummaryMeta } {\n\tconst deterministic = buildDeterministicSummary(results);\n\treturn {\n\t\tsummary: deterministic.summary,\n\t\tmeta: {\n\t\t\t...deterministic.meta,\n\t\t\tfallbackReason,\n\t\t},\n\t};\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tconst name = (err as { name?: unknown }).name;\n\tconst message = (err as { message?: unknown }).message;\n\treturn name === \"AbortError\" || (typeof message === \"string\" && message.toLowerCase().includes(\"abort\"));\n}\n\nfunction getTextFromContentPart(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"\";\n\tconst value = part as Record<string, unknown>;\n\tif (typeof value.text === \"string\") return value.text;\n\tif (typeof value.refusal === \"string\") return value.refusal;\n\treturn \"\";\n}\n\nfunction getContentPartType(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"unknown\";\n\tconst value = part as Record<string, unknown>;\n\treturn typeof value.type === \"string\" ? value.type : \"unknown\";\n}\n\nexport async function generateSummaryDraft(\n\tresults: QueryResultData[],\n\tctx: SummaryGenerationContext,\n\tsignal?: AbortSignal,\n\tmodelOverride?: string,\n\tfeedback?: string,\n): Promise<{ summary: string; meta: SummaryMeta }> {\n\tif (!ctx || !ctx.modelRegistry) {\n\t\tthrow new Error(\"Summary generation context unavailable\");\n\t}\n\n\tconst prompt = buildSummaryPrompt(results, feedback);\n\tlet resolved: Awaited<ReturnType<typeof resolveSummaryModelCandidates>>;\n\ttry {\n\t\tresolved = await resolveSummaryModelCandidates(ctx, modelOverride);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn buildFallbackSummary(results, `summary-model-settings-error: ${message}`);\n\t}\n\n\tlet lastError = resolved.errors.at(-1);\n\tfor (const { model, apiKey, headers } of resolved.candidates) {\n\t\tconst startedAt = Date.now();\n\t\ttry {\n\t\t\tconst userMessage: Message = {\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: [{ type: \"text\", text: prompt }],\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\n\t\t\tconst response = await complete(model, { messages: [userMessage] }, { apiKey, headers, signal });\n\t\t\tif (response.stopReason === \"aborted\") {\n\t\t\t\tthrow new Error(\"Aborted\");\n\t\t\t}\n\n\t\t\tconst contentParts = Array.isArray(response.content) ? response.content : [];\n\t\t\tconst summary = contentParts\n\t\t\t\t.map(part => getTextFromContentPart(part))\n\t\t\t\t.filter(text => text.trim().length > 0)\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.trim();\n\n\t\t\tif (summary.length === 0) {\n\t\t\t\tconst partTypes = contentParts.map(part => getContentPartType(part));\n\t\t\t\tconst typesLabel = partTypes.length > 0 ? partTypes.join(\", \") : \"none\";\n\t\t\t\tthrow new Error(`Summary model returned empty response (content parts: ${typesLabel})`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsummary,\n\t\t\t\tmeta: {\n\t\t\t\t\tmodel: `${model.provider}/${model.id}`,\n\t\t\t\t\tdurationMs: Math.max(0, Date.now() - startedAt),\n\t\t\t\t\ttokenEstimate: estimateTokens(summary),\n\t\t\t\t\tfallbackUsed: false,\n\t\t\t\t\tedited: false,\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tlastError = err instanceof Error ? err.message : String(err);\n\t\t}\n\t}\n\n\treturn buildFallbackSummary(results, lastError ? `summary-model-unavailable: ${lastError}` : \"summary-model-unavailable\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"summary-review.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-web-access/summary-review.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { complete, type Message, type Model } from \"@ashx-j/lunr-ai/compat\";\nimport type { ExtensionContext } from \"@ashx-j/lunr\";\nimport { loadEnabledModelPatterns, modelMatchesEnabledPatterns } from \"./summary-model-scope.ts\";\nimport type { QueryResultData } from \"./storage.ts\";\n\nconst PREFERRED_SUMMARY_MODELS = [\n\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.3-codex-spark\" },\n] as const;\n\nexport interface SummaryMeta {\n\tmodel: string | null;\n\tdurationMs: number;\n\ttokenEstimate: number;\n\tfallbackUsed: boolean;\n\tfallbackReason?: string;\n\tedited?: boolean;\n}\n\nexport type SummaryGenerationContext = Pick<ExtensionContext, \"model\" | \"modelRegistry\" | \"cwd\" | \"isProjectTrusted\">;\n\nfunction estimateTokens(text: string): number {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return 0;\n\treturn Math.max(1, Math.ceil(trimmed.length / 4));\n}\n\nfunction summarizeQueryResult(result: QueryResultData): string {\n\tif (result.error) {\n\t\treturn `Query: ${result.query}\\nStatus: Error\\nError: ${result.error}`;\n\t}\n\n\tconst lines = [\n\t\t`Query: ${result.query}`,\n\t\t`Provider: ${result.provider ?? \"unknown\"}`,\n\t\t`Answer: ${result.answer || \"(no answer text returned)\"}`,\n\t];\n\n\tif (result.results.length === 0) {\n\t\tlines.push(\"Sources: none\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tlines.push(\"Sources:\");\n\tfor (let i = 0; i < result.results.length; i++) {\n\t\tconst source = result.results[i];\n\t\tlines.push(`${i + 1}. ${source.title} — ${source.url}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string {\n\tconst sections = [\n\t\t\"You are writing the final web search summary for a coding assistant.\",\n\t\t\"Write a concise, factual summary using only the provided search results.\",\n\t\t\"Requirements:\",\n\t\t\"- Keep it readable and skimmable.\",\n\t\t\"- Include key findings and caveats.\",\n\t\t\"- Do not invent sources or claims.\",\n\t\t\"- If evidence is weak or conflicting, say so explicitly.\",\n\t\t\"- End with a short \\\"Sources\\\" section listing the most relevant URLs.\",\n\t];\n\n\tif (feedback) {\n\t\tsections.push(\"- Incorporate the user feedback provided below into the summary.\");\n\t}\n\n\tsections.push(\"\");\n\tsections.push(\"<search_results>\");\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tsections.push(`\\n[Result ${i + 1}]`);\n\t\tsections.push(summarizeQueryResult(results[i]));\n\t}\n\n\tsections.push(\"\\n</search_results>\");\n\n\tif (feedback) {\n\t\tsections.push(\"\");\n\t\tsections.push(\"<user_feedback>\");\n\t\tsections.push(feedback);\n\t\tsections.push(\"</user_feedback>\");\n\t}\n\n\treturn sections.join(\"\\n\");\n}\n\nfunction buildDeterministicAnswerPreview(answer: string): string {\n\tlet text = answer.replace(/\\s+/g, \" \").trim();\n\tif (text.length === 0) return \"\";\n\n\tconst sourceMarker = text.search(/\\bSources?\\s*:/i);\n\tif (sourceMarker >= 0) text = text.slice(0, sourceMarker).trim();\n\tif (text.length === 0) return \"\";\n\n\treturn text.length > 240 ? `${text.slice(0, 237)}...` : text;\n}\n\nfunction buildDeterministicSummaryLines(results: QueryResultData[]): string[] {\n\tif (results.length === 0) {\n\t\treturn [\n\t\t\t\"No completed search results were available when the curator session finished.\",\n\t\t\t\"\",\n\t\t\t\"Sources\",\n\t\t\t\"- None\",\n\t\t];\n\t}\n\n\tconst lines: string[] = [\n\t\t\"Summary based on the currently selected search results.\",\n\t\t\"\",\n\t];\n\n\tconst sourceUrls: string[] = [];\n\tlet successful = 0;\n\tlet failed = 0;\n\n\tfor (const result of results) {\n\t\tif (result.error) {\n\t\t\tfailed += 1;\n\t\t\tlines.push(`- ${result.query}: failed (${result.error})`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsuccessful += 1;\n\t\tconst preview = buildDeterministicAnswerPreview(result.answer);\n\t\tif (preview.length > 0) {\n\t\t\tlines.push(`- ${result.query}: ${preview}`);\n\t\t} else {\n\t\t\tlines.push(`- ${result.query}: returned ${result.results.length} source${result.results.length === 1 ? \"\" : \"s\"} without answer text.`);\n\t\t}\n\n\t\tfor (const source of result.results) {\n\t\t\tif (!sourceUrls.includes(source.url)) {\n\t\t\t\tsourceUrls.push(source.url);\n\t\t\t}\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(`Completed queries: ${results.length}`);\n\tlines.push(`Successful: ${successful}`);\n\tlines.push(`Failed: ${failed}`);\n\tlines.push(\"\");\n\tlines.push(\"Sources\");\n\n\tif (sourceUrls.length === 0) {\n\t\tlines.push(\"- None\");\n\t} else {\n\t\tfor (const url of sourceUrls.slice(0, 12)) {\n\t\t\tlines.push(`- ${url}`);\n\t\t}\n\t\tif (sourceUrls.length > 12) {\n\t\t\tlines.push(`- ... and ${sourceUrls.length - 12} more`);\n\t\t}\n\t}\n\n\treturn lines;\n}\n\nexport function buildDeterministicSummary(results: QueryResultData[]): { summary: string; meta: SummaryMeta } {\n\tconst summary = buildDeterministicSummaryLines(results).join(\"\\n\").trim();\n\tconst nonEmptySummary = summary.length > 0\n\t\t? summary\n\t\t: \"No completed search results were available when the curator session finished.\\n\\nSources\\n- None\";\n\n\treturn {\n\t\tsummary: nonEmptySummary,\n\t\tmeta: {\n\t\t\tmodel: null,\n\t\t\tdurationMs: 0,\n\t\t\ttokenEstimate: estimateTokens(nonEmptySummary),\n\t\t\tfallbackUsed: true,\n\t\t\tfallbackReason: \"deterministic-submit-fallback\",\n\t\t\tedited: false,\n\t\t},\n\t};\n}\n\nfunction parseModelSelector(value: string): { provider: string; id: string } {\n\tconst slashIndex = value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex >= value.length - 1) {\n\t\tthrow new Error(`Invalid summary model: ${value}. Use provider/model-id.`);\n\t}\n\treturn {\n\t\tprovider: value.slice(0, slashIndex),\n\t\tid: value.slice(slashIndex + 1),\n\t};\n}\n\nasync function resolveSummaryModelCandidates(\n\tctx: SummaryGenerationContext,\n\tmodelOverride?: string,\n): Promise<{ candidates: Array<{ model: Model; apiKey: string; headers?: Record<string, string> }>; errors: string[] }> {\n\tconst enabledModelPatterns = loadEnabledModelPatterns(ctx);\n\tconst specs: Array<{ provider: string; id: string }> = [];\n\tconst normalizedOverride = typeof modelOverride === \"string\" ? modelOverride.trim() : \"\";\n\tif (normalizedOverride.length > 0) specs.push(parseModelSelector(normalizedOverride));\n\tspecs.push(...PREFERRED_SUMMARY_MODELS);\n\n\tconst candidates: Array<{ model: Model; apiKey: string; headers?: Record<string, string> }> = [];\n\tconst errors: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const spec of specs) {\n\t\tconst value = `${spec.provider}/${spec.id}`;\n\t\tif (seen.has(value)) continue;\n\t\tseen.add(value);\n\n\t\tconst model = ctx.modelRegistry.find(spec.provider, spec.id);\n\t\tif (!model) {\n\t\t\terrors.push(`Summary model not found: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) {\n\t\t\terrors.push(`Summary model is not enabled: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok || !auth.apiKey) {\n\t\t\terrors.push(`No API key available for summary model ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ model, apiKey: auth.apiKey, headers: auth.headers });\n\t}\n\treturn { candidates, errors };\n}\n\nfunction buildFallbackSummary(results: QueryResultData[], fallbackReason: string): { summary: string; meta: SummaryMeta } {\n\tconst deterministic = buildDeterministicSummary(results);\n\treturn {\n\t\tsummary: deterministic.summary,\n\t\tmeta: {\n\t\t\t...deterministic.meta,\n\t\t\tfallbackReason,\n\t\t},\n\t};\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tconst name = (err as { name?: unknown }).name;\n\tconst message = (err as { message?: unknown }).message;\n\treturn name === \"AbortError\" || (typeof message === \"string\" && message.toLowerCase().includes(\"abort\"));\n}\n\nfunction getTextFromContentPart(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"\";\n\tconst value = part as Record<string, unknown>;\n\tif (typeof value.text === \"string\") return value.text;\n\tif (typeof value.refusal === \"string\") return value.refusal;\n\treturn \"\";\n}\n\nfunction getContentPartType(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"unknown\";\n\tconst value = part as Record<string, unknown>;\n\treturn typeof value.type === \"string\" ? value.type : \"unknown\";\n}\n\nexport async function generateSummaryDraft(\n\tresults: QueryResultData[],\n\tctx: SummaryGenerationContext,\n\tsignal?: AbortSignal,\n\tmodelOverride?: string,\n\tfeedback?: string,\n): Promise<{ summary: string; meta: SummaryMeta }> {\n\tif (!ctx || !ctx.modelRegistry) {\n\t\tthrow new Error(\"Summary generation context unavailable\");\n\t}\n\n\tconst prompt = buildSummaryPrompt(results, feedback);\n\tlet resolved: Awaited<ReturnType<typeof resolveSummaryModelCandidates>>;\n\ttry {\n\t\tresolved = await resolveSummaryModelCandidates(ctx, modelOverride);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn buildFallbackSummary(results, `summary-model-settings-error: ${message}`);\n\t}\n\n\tlet lastError = resolved.errors.at(-1);\n\tfor (const { model, apiKey, headers } of resolved.candidates) {\n\t\tconst startedAt = Date.now();\n\t\ttry {\n\t\t\tconst userMessage: Message = {\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: [{ type: \"text\", text: prompt }],\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\n\t\t\tconst response = await complete(model, { messages: [userMessage] }, { apiKey, headers, signal });\n\t\t\tif (response.stopReason === \"aborted\") {\n\t\t\t\tthrow new Error(\"Aborted\");\n\t\t\t}\n\n\t\t\tconst contentParts = Array.isArray(response.content) ? response.content : [];\n\t\t\tconst summary = contentParts\n\t\t\t\t.map(part => getTextFromContentPart(part))\n\t\t\t\t.filter(text => text.trim().length > 0)\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.trim();\n\n\t\t\tif (summary.length === 0) {\n\t\t\t\tconst partTypes = contentParts.map(part => getContentPartType(part));\n\t\t\t\tconst typesLabel = partTypes.length > 0 ? partTypes.join(\", \") : \"none\";\n\t\t\t\tthrow new Error(`Summary model returned empty response (content parts: ${typesLabel})`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsummary,\n\t\t\t\tmeta: {\n\t\t\t\t\tmodel: `${model.provider}/${model.id}`,\n\t\t\t\t\tdurationMs: Math.max(0, Date.now() - startedAt),\n\t\t\t\t\ttokenEstimate: estimateTokens(summary),\n\t\t\t\t\tfallbackUsed: false,\n\t\t\t\t\tedited: false,\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tlastError = err instanceof Error ? err.message : String(err);\n\t\t}\n\t}\n\n\treturn buildFallbackSummary(results, lastError ? `summary-model-unavailable: ${lastError}` : \"summary-model-unavailable\");\n}\n"]}
|
package/dist/bun/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bun/cli.ts"],"names":[],"mappings":"","sourcesContent":["#!/usr/bin/env node\nimport { registerBunOAuthFlows } from \"@
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bun/cli.ts"],"names":[],"mappings":"","sourcesContent":["#!/usr/bin/env node\nimport { registerBunOAuthFlows } from \"@ashx-j/lunr-ai/bun-oauth\";\nimport { APP_NAME } from \"../config.ts\";\n\nprocess.title = APP_NAME;\nprocess.emitWarning = (() => {}) as typeof process.emitWarning;\n\nregisterBunOAuthFlows();\n\nimport { restoreSandboxEnv } from \"./restore-sandbox-env.ts\";\n\nrestoreSandboxEnv();\n\nawait import(\"./register-bedrock.ts\");\nawait import(\"../cli.ts\");\n"]}
|
package/dist/bun/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { registerBunOAuthFlows } from "@
|
|
2
|
+
import { registerBunOAuthFlows } from "@ashx-j/lunr-ai/bun-oauth";
|
|
3
3
|
import { APP_NAME } from "../config.js";
|
|
4
4
|
process.title = APP_NAME;
|
|
5
5
|
process.emitWarning = (() => { });
|
package/dist/bun/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bun/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;AACzB,OAAO,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAA+B,CAAC;AAE/D,qBAAqB,EAAE,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,iBAAiB,EAAE,CAAC;AAEpB,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;AACtC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { registerBunOAuthFlows } from \"@
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bun/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC;AACzB,OAAO,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAA+B,CAAC;AAE/D,qBAAqB,EAAE,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,iBAAiB,EAAE,CAAC;AAEpB,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;AACtC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { registerBunOAuthFlows } from \"@ashx-j/lunr-ai/bun-oauth\";\nimport { APP_NAME } from \"../config.ts\";\n\nprocess.title = APP_NAME;\nprocess.emitWarning = (() => {}) as typeof process.emitWarning;\n\nregisterBunOAuthFlows();\n\nimport { restoreSandboxEnv } from \"./restore-sandbox-env.ts\";\n\nrestoreSandboxEnv();\n\nawait import(\"./register-bedrock.ts\");\nawait import(\"../cli.ts\");\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-bedrock.d.ts","sourceRoot":"","sources":["../../src/bun/register-bedrock.ts"],"names":[],"mappings":"","sourcesContent":["import { bedrockProviderModule } from \"@
|
|
1
|
+
{"version":3,"file":"register-bedrock.d.ts","sourceRoot":"","sources":["../../src/bun/register-bedrock.ts"],"names":[],"mappings":"","sourcesContent":["import { bedrockProviderModule } from \"@ashx-j/lunr-ai/bedrock-provider\";\nimport { setBedrockProviderModule } from \"@ashx-j/lunr-ai/compat\";\n\nsetBedrockProviderModule(bedrockProviderModule);\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { bedrockProviderModule } from "@
|
|
2
|
-
import { setBedrockProviderModule } from "@
|
|
1
|
+
import { bedrockProviderModule } from "@ashx-j/lunr-ai/bedrock-provider";
|
|
2
|
+
import { setBedrockProviderModule } from "@ashx-j/lunr-ai/compat";
|
|
3
3
|
setBedrockProviderModule(bedrockProviderModule);
|
|
4
4
|
//# sourceMappingURL=register-bedrock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-bedrock.js","sourceRoot":"","sources":["../../src/bun/register-bedrock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAExE,wBAAwB,CAAC,qBAAqB,CAAC,CAAC","sourcesContent":["import { bedrockProviderModule } from \"@
|
|
1
|
+
{"version":3,"file":"register-bedrock.js","sourceRoot":"","sources":["../../src/bun/register-bedrock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAExE,wBAAwB,CAAC,qBAAqB,CAAC,CAAC","sourcesContent":["import { bedrockProviderModule } from \"@ashx-j/lunr-ai/bedrock-provider\";\nimport { setBedrockProviderModule } from \"@ashx-j/lunr-ai/compat\";\n\nsetBedrockProviderModule(bedrockProviderModule);\n"]}
|