@astralyn/pi 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +53 -0
- package/dist/bundle/chunks/{anthropic-messages-YIOJIMVL.js → anthropic-messages-3K3DWVY6.js} +1 -1
- package/dist/bundle/chunks/anthropic.js +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-LDW4FGAQ.js → azure-openai-responses-CH74HGP4.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
- package/dist/bundle/chunks/{chunk-UCXU7KLO.js → chunk-3MMB5I7J.js} +1 -1
- package/dist/bundle/chunks/{chunk-GIG5IHES.js → chunk-5KJH3GGH.js} +1 -1
- package/dist/bundle/chunks/chunk-6VYRLG5F.js +2 -0
- package/dist/bundle/chunks/{chunk-73WG7F7N.js → chunk-C2ARIVS3.js} +1 -1
- package/dist/bundle/chunks/{chunk-23OTKHCH.js → chunk-D3XW5X3Z.js} +490 -260
- package/dist/bundle/chunks/{chunk-IFELM7MW.js → chunk-EJEOEBSJ.js} +1 -1
- package/dist/bundle/chunks/chunk-H35KWBT5.js +11 -0
- package/dist/bundle/chunks/chunk-KAC2YPTW.js +2 -0
- package/dist/bundle/chunks/chunk-MAC4N3BW.js +2 -0
- package/dist/bundle/chunks/chunk-QLU3LESZ.js +2 -0
- package/dist/bundle/chunks/{chunk-A6ALEEY5.js → chunk-TEAAYBTS.js} +1 -1
- package/dist/bundle/chunks/cloudflare-workers-ai-system-one-XO45ZT3V.js +2 -0
- package/dist/bundle/chunks/codemode-worker.js +101 -5
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-S5A5IBU4.js → google-generative-ai-VVO64ZRQ.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-UBRQFDB4.js → google-vertex-LKS5NUHA.js} +1 -1
- package/dist/bundle/chunks/image-resize-worker.js +1 -1
- package/dist/bundle/chunks/{llama-cpp-classify-R7DQLTQN.js → llama-cpp-classify-H3IZDR5O.js} +2 -2
- package/dist/bundle/chunks/{mistral-conversations-A2N5FSOV.js → mistral-conversations-NJUOG4ET.js} +2 -2
- package/dist/bundle/chunks/openai-chatgpt.js +1 -1
- package/dist/bundle/chunks/{openai-codex-responses-Q6JHCWLE.js → openai-codex-responses-TZWBTTYM.js} +2 -2
- package/dist/bundle/chunks/openai-codex.js +1 -1
- package/dist/bundle/chunks/{openai-completions-H4VMO7AU.js → openai-completions-7HTTU6FH.js} +1 -1
- package/dist/bundle/chunks/openai-decisions-776H4VDZ.js +5 -0
- package/dist/bundle/chunks/{openai-responses-G4PGNM2H.js → openai-responses-7A6BAQ5X.js} +1 -1
- package/dist/bundle/chunks/{openrouter-images-YP3YVB54.js → openrouter-images-TDLJV5N4.js} +1 -1
- package/dist/bundle/chunks/{pi-messages-HZZ7GEEW.js → pi-messages-ZXNERWJG.js} +1 -1
- package/dist/bundle/chunks/typesafe-system-one-2DQLG4R2.js +2 -0
- package/dist/bundle/chunks/{virtual-modules-IJTAY26N.js → virtual-modules-2NHGQRS6.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts +2 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +24 -5
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +38 -10
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +190 -186
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +40 -45
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/context-snapshot.d.ts +4 -1
- package/dist/core/context-snapshot.d.ts.map +1 -1
- package/dist/core/context-snapshot.js +45 -0
- package/dist/core/context-snapshot.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +2 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/types.d.ts +13 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/mcp-servers.d.ts +8 -0
- package/dist/core/mcp-servers.d.ts.map +1 -1
- package/dist/core/mcp-servers.js +30 -7
- package/dist/core/mcp-servers.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +2 -1
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/nested-tool-calls.d.ts +1 -0
- package/dist/core/nested-tool-calls.d.ts.map +1 -1
- package/dist/core/nested-tool-calls.js +1 -0
- package/dist/core/nested-tool-calls.js.map +1 -1
- package/dist/core/resource-loader.d.ts +3 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +3 -3
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +13 -4
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +19 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +13 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +37 -13
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +4 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +6 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt.d.ts +6 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +9 -4
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tasks/session.d.ts +9 -0
- package/dist/core/tasks/session.d.ts.map +1 -1
- package/dist/core/tasks/session.js +21 -0
- package/dist/core/tasks/session.js.map +1 -1
- package/dist/core/tools/read.d.ts +13 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +18 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +8 -3
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/renderers/edit.js +1 -1
- package/dist/core/tools/renderers/edit.js.map +1 -1
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +65 -8
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/index.d.ts.map +1 -1
- package/dist/extensions/codemode/index.js +1 -0
- package/dist/extensions/codemode/index.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts +9 -2
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +14 -6
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/extensions/index.js +2 -2
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +34 -11
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/mcp/cli.js +17 -23
- package/dist/extensions/mcp/cli.js.map +1 -1
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +165 -64
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/oauth.d.ts +5 -3
- package/dist/extensions/mcp/oauth.d.ts.map +1 -1
- package/dist/extensions/mcp/oauth.js +36 -10
- package/dist/extensions/mcp/oauth.js.map +1 -1
- package/dist/extensions/mcp/resources.d.ts +3 -4
- package/dist/extensions/mcp/resources.d.ts.map +1 -1
- package/dist/extensions/mcp/resources.js +3 -4
- package/dist/extensions/mcp/resources.js.map +1 -1
- package/dist/extensions/mcp/runtime.d.ts +4 -1
- package/dist/extensions/mcp/runtime.d.ts.map +1 -1
- package/dist/extensions/mcp/runtime.js +22 -5
- package/dist/extensions/mcp/runtime.js.map +1 -1
- package/dist/extensions/mcp/tools.d.ts +2 -1
- package/dist/extensions/mcp/tools.d.ts.map +1 -1
- package/dist/extensions/mcp/tools.js +2 -1
- package/dist/extensions/mcp/tools.js.map +1 -1
- package/dist/extensions/mcp/ui.d.ts +3 -3
- package/dist/extensions/mcp/ui.d.ts.map +1 -1
- package/dist/extensions/mcp/ui.js +10 -2
- package/dist/extensions/mcp/ui.js.map +1 -1
- package/dist/extensions/search/code-search.d.ts +29 -0
- package/dist/extensions/search/code-search.d.ts.map +1 -0
- package/dist/extensions/search/code-search.js +120 -0
- package/dist/extensions/search/code-search.js.map +1 -0
- package/dist/extensions/search/command.d.ts +5 -0
- package/dist/extensions/search/command.d.ts.map +1 -0
- package/dist/extensions/search/command.js +69 -0
- package/dist/extensions/search/command.js.map +1 -0
- package/dist/extensions/search/credential.d.ts +25 -0
- package/dist/extensions/search/credential.d.ts.map +1 -0
- package/dist/extensions/search/credential.js +117 -0
- package/dist/extensions/search/credential.js.map +1 -0
- package/dist/extensions/search/devin.d.ts +34 -0
- package/dist/extensions/search/devin.d.ts.map +1 -0
- package/dist/extensions/search/devin.js +210 -0
- package/dist/extensions/search/devin.js.map +1 -0
- package/dist/extensions/search/index.d.ts +5 -0
- package/dist/extensions/search/index.d.ts.map +1 -0
- package/dist/extensions/search/index.js +110 -0
- package/dist/extensions/search/index.js.map +1 -0
- package/dist/extensions/search/panel.d.ts +53 -0
- package/dist/extensions/search/panel.d.ts.map +1 -0
- package/dist/extensions/search/panel.js +157 -0
- package/dist/extensions/search/panel.js.map +1 -0
- package/dist/extensions/search/prompt.d.ts +14 -0
- package/dist/extensions/search/prompt.d.ts.map +1 -0
- package/dist/extensions/search/prompt.js +221 -0
- package/dist/extensions/search/prompt.js.map +1 -0
- package/dist/extensions/search/render.d.ts +28 -0
- package/dist/extensions/search/render.d.ts.map +1 -0
- package/dist/extensions/search/render.js +86 -0
- package/dist/extensions/search/render.js.map +1 -0
- package/dist/extensions/search/workspace.d.ts +38 -0
- package/dist/extensions/search/workspace.d.ts.map +1 -0
- package/dist/extensions/search/workspace.js +245 -0
- package/dist/extensions/search/workspace.js.map +1 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +14 -14
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +5 -2
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +5 -2
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +7 -2
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -0
- package/dist/modes/interactive/components/custom-message.js.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/skill-invocation-message.d.ts +2 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +52 -59
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/program-status-reporter.d.ts +34 -0
- package/dist/modes/interactive/program-status-reporter.d.ts.map +1 -0
- package/dist/modes/interactive/program-status-reporter.js +107 -0
- package/dist/modes/interactive/program-status-reporter.js.map +1 -0
- package/dist/modes/interactive/tasks/host-hooks.d.ts +14 -0
- package/dist/modes/interactive/tasks/host-hooks.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/host-hooks.js +31 -0
- package/dist/modes/interactive/tasks/host-hooks.js.map +1 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +1 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tool-view/tool-execution.d.ts +5 -0
- package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/tool-view/tool-execution.js +7 -0
- package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +24 -0
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/ansi.d.ts +8 -0
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js +30 -11
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +12 -11
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts +12 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +5 -0
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.js +3 -2
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js +9 -10
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +6 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/docs/bundled/README.md +1 -1
- package/docs/bundled/extensions/provider.md +1 -1
- package/docs/bundled/extensions/question.md +1 -1
- package/docs/bundled/extensions/search.md +50 -0
- package/docs/bundled/extensions/statusline.md +15 -41
- package/docs/codemode.md +26 -5
- package/docs/docs.json +0 -4
- package/docs/environment-variables.md +1 -0
- package/docs/extensions.md +6 -2
- package/docs/json.md +2 -2
- package/docs/llama-cpp.md +8 -1
- package/docs/mcp.md +3 -1
- package/docs/models.md +4 -1
- package/docs/providers.md +17 -0
- package/docs/rpc.md +6 -3
- package/docs/session-format.md +1 -0
- package/docs/settings.md +4 -4
- package/docs/terminal-setup.md +14 -0
- package/docs/usage.md +19 -5
- 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/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +54 -54
- package/package.json +13 -11
- package/dist/bundle/chunks/chunk-57XI7YJH.js +0 -2
- package/dist/bundle/chunks/chunk-JI4WGISU.js +0 -2
- package/dist/bundle/chunks/chunk-TCQ4HHQD.js +0 -2
- package/dist/bundle/chunks/chunk-TXJO4AJ7.js +0 -11
- package/dist/bundle/chunks/cloudflare-workers-ai-system-one-OWU5SM6J.js +0 -2
- package/dist/bundle/chunks/typesafe-system-one-KYKKNU3E.js +0 -2
- package/dist/extensions/web-search/auth.d.ts +0 -12
- package/dist/extensions/web-search/auth.d.ts.map +0 -1
- package/dist/extensions/web-search/auth.js +0 -90
- package/dist/extensions/web-search/auth.js.map +0 -1
- package/dist/extensions/web-search/constants.d.ts +0 -13
- package/dist/extensions/web-search/constants.d.ts.map +0 -1
- package/dist/extensions/web-search/constants.js +0 -26
- package/dist/extensions/web-search/constants.js.map +0 -1
- package/dist/extensions/web-search/execute.d.ts +0 -9
- package/dist/extensions/web-search/execute.d.ts.map +0 -1
- package/dist/extensions/web-search/execute.js +0 -96
- package/dist/extensions/web-search/execute.js.map +0 -1
- package/dist/extensions/web-search/format.d.ts +0 -21
- package/dist/extensions/web-search/format.d.ts.map +0 -1
- package/dist/extensions/web-search/format.js +0 -117
- package/dist/extensions/web-search/format.js.map +0 -1
- package/dist/extensions/web-search/index.d.ts +0 -6
- package/dist/extensions/web-search/index.d.ts.map +0 -1
- package/dist/extensions/web-search/index.js +0 -50
- package/dist/extensions/web-search/index.js.map +0 -1
- package/dist/extensions/web-search/providers/deepseek.d.ts +0 -13
- package/dist/extensions/web-search/providers/deepseek.d.ts.map +0 -1
- package/dist/extensions/web-search/providers/deepseek.js +0 -110
- package/dist/extensions/web-search/providers/deepseek.js.map +0 -1
- package/dist/extensions/web-search/providers/http.d.ts +0 -4
- package/dist/extensions/web-search/providers/http.d.ts.map +0 -1
- package/dist/extensions/web-search/providers/http.js +0 -42
- package/dist/extensions/web-search/providers/http.js.map +0 -1
- package/dist/extensions/web-search/providers/minimax.d.ts +0 -12
- package/dist/extensions/web-search/providers/minimax.d.ts.map +0 -1
- package/dist/extensions/web-search/providers/minimax.js +0 -61
- package/dist/extensions/web-search/providers/minimax.js.map +0 -1
- package/dist/extensions/web-search/render.d.ts +0 -15
- package/dist/extensions/web-search/render.d.ts.map +0 -1
- package/dist/extensions/web-search/render.js +0 -142
- package/dist/extensions/web-search/render.js.map +0 -1
- package/dist/extensions/web-search/results.d.ts +0 -35
- package/dist/extensions/web-search/results.d.ts.map +0 -1
- package/dist/extensions/web-search/results.js +0 -167
- package/dist/extensions/web-search/results.js.map +0 -1
- package/dist/extensions/web-search/schema.d.ts +0 -10
- package/dist/extensions/web-search/schema.d.ts.map +0 -1
- package/dist/extensions/web-search/schema.js +0 -36
- package/dist/extensions/web-search/schema.js.map +0 -1
- package/dist/extensions/web-search/types.d.ts +0 -51
- package/dist/extensions/web-search/types.d.ts.map +0 -1
- package/dist/extensions/web-search/types.js +0 -5
- package/dist/extensions/web-search/types.js.map +0 -1
- package/docs/bundled/extensions/web-search.md +0 -46
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
-
import{formatProviderError,normalizeProviderError}from"./chunk-FEZ5RM2B.js";import{retryProviderRequest}from"./chunk-GIG5IHES.js";import{headersToRecord,providerHeadersToRecord}from"./chunk-GCKVOFWP.js";import{calculateCost}from"./chunk-TXJO4AJ7.js";function httpError(label,response,body){let error=new Error(`${label} returned ${response.status}`);return error.status=response.status,error.headers=response.headers,error.body=body,error}function timeoutError(timeoutMs){let error=new Error(`Request timed out after ${timeoutMs}ms`);return error.name="TimeoutError",error.status=void 0,error.headers=void 0,error.body="",error}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function requiredNumber(label,value,field){if(typeof value!="number"||!Number.isFinite(value))throw new Error(`${label} returned an invalid ${field}`);return value}function probabilities(label,value,id){if(!isRecord(value))throw new Error(`${label} returned invalid probabilities for ${id}`);return Object.fromEntries(Object.entries(value).map(([key,probability])=>[key,requiredNumber(label,probability,`probability for ${id}.${key}`)]))}function parseAnswers(label,value,context){if(!isRecord(value))throw new Error(`${label} returned an unexpected response`);let answers=[];for(let[id,question]of Object.entries(context.questions)){let answer=value[id];if(!isRecord(answer))throw new Error(`${label} did not return an answer for ${id}`);if(question.type==="choice"){if(answer.type!=="choice"||typeof answer.choice!="string")throw new Error(`${label} did not return a choice answer for ${id}`);answers.push([id,{type:"choice",choice:answer.choice,probabilities:probabilities(label,answer.probabilities,id),confidence:requiredNumber(label,answer.confidence,`confidence for ${id}`)}])}else if(question.type==="score"){if(answer.type!=="score")throw new Error(`${label} did not return a score answer for ${id}`);answers.push([id,{type:"score",score:requiredNumber(label,answer.score,`score for ${id}`),confidence:requiredNumber(label,answer.confidence,`confidence for ${id}`)}])}else{if(answer.type!=="noul")throw new Error(`${label} did not return a bool answer for ${id}`);answers.push([id,{type:"bool",probability:requiredNumber(label,answer.noul,`probability for ${id}`)}])}}return Object.fromEntries(answers)}function tokenCount(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?value:0}function parseUsage(value,model){if(!isRecord(value)||value.input_tokens===void 0&&value.output_tokens===void 0)return;let input=tokenCount(value.input_tokens),output=tokenCount(value.output_tokens),usage={input,output,cacheRead:0,cacheWrite:0,totalTokens:input+output,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return calculateCost(model,usage),usage}function wireRequest(context){return{state:context.state,questions:Object.fromEntries(Object.entries(context.questions).map(([id,question])=>[id,question.type==="bool"?{...question,type:"noul"}:question]))}}function requestHeaders(model,apiKey,optionsHeaders){return providerHeadersToRecord({authorization:`Bearer ${apiKey}`,"content-type":"application/json"},model.headers,optionsHeaders)??{}}async function classifySystemOne(transport,model,context,options){let output={api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:"stop",timestamp:Date.now()};try{if(model.api!==transport.api)throw new Error(`Unsupported classifier API: ${model.api}`);if(!options?.apiKey)throw new Error(`No API key for provider: ${model.provider}`);let apiKey=options.apiKey,payload=transport.payload(model,wireRequest(context)),transformed=await options.onPayload?.(payload,model);transformed!==void 0&&(payload=transformed);let requestFetch=options.fetch??globalThis.fetch,{response,body}=await retryProviderRequest(async()=>{let timeoutSignal=options.timeoutMs!==void 0?AbortSignal.timeout(options.timeoutMs):void 0,signal=options.signal&&timeoutSignal?AbortSignal.any([options.signal,timeoutSignal]):options.signal??timeoutSignal;try{let next=await requestFetch(transport.url(model),{method:"POST",headers:requestHeaders(model,apiKey,options.headers),body:JSON.stringify(payload),signal});if(!next.ok)throw httpError(transport.label,next,await next.text());return{response:next,body:await next.json()}}catch(error){throw timeoutSignal?.aborted&&!options.signal?.aborted?timeoutError(options.timeoutMs):error}},{maxRetries:options.maxRetries??2,maxRetryDelayMs:options.maxRetryDelayMs,signal:options.signal});await options.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model);let result=transport.output(body),usage=parseUsage(result.usage,model);return usage&&(output.usage=usage),output.answers=parseAnswers(transport.label,result.answers,context),output}catch(error){return output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error),`${transport.label} error`),output}}export{isRecord,classifySystemOne};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
-
import{AssistantMessageEventStream,formatThrownValue}from"./chunk-JI4WGISU.js";function contentText(content,separator=`
|
|
3
|
-
`){return typeof content=="string"?content:content.filter(block=>block.type==="text").map(block=>block.text).join(separator)}function getSystemMessageText(message){let parts=[contentText(message.content)];for(let text of Object.values(message.sections??{}))text!==null&&parts.push(text);return parts.filter(part=>part.length>0).join(`
|
|
4
|
-
|
|
5
|
-
`)}function renderSystemMessageUpdate(message){let parts=[],text=contentText(message.content);text.length>0&&parts.push(text);for(let[name,value]of Object.entries(message.sections??{}))parts.push(value===null?`Removed system prompt section "${name}".`:`Updated system prompt section "${name}":
|
|
6
|
-
|
|
7
|
-
${value}`);return parts.join(`
|
|
8
|
-
|
|
9
|
-
`)}function createInitialSystemMessage(systemPrompt,tools){let hasSystemPrompt=systemPrompt!==void 0&&systemPrompt.length>0,hasTools=tools!==void 0&&tools.length>0;if(!(!hasSystemPrompt&&!hasTools))return{role:"system",content:systemPrompt??"",...hasTools?{toolsAdded:tools}:{},timestamp:0}}function normalizeContext(context){let initialMessage=createInitialSystemMessage(context.systemPrompt,context.tools);return{messages:initialMessage?[initialMessage,...context.messages]:context.messages}}function isSystemMessage(message){return message.role==="system"}function getInitialSystemMessage(messages){let first=messages[0];return first&&isSystemMessage(first)?first:void 0}function withoutInitialSystemMessage(messages){return getInitialSystemMessage(messages)?messages.slice(1):messages}function getCurrentTools(messages){let tools=new Map;for(let message of messages)if(isSystemMessage(message)){for(let tool of message.toolsRemoved??[])tools.delete(tool.name);for(let tool of message.toolsAdded??[])tools.set(tool.name,tool)}return[...tools.values()]}function getCurrentSystemMessage(messages){let content=[],sections=new Map,timestamp;for(let message of messages){if(!isSystemMessage(message))continue;timestamp??=message.timestamp;let text=contentText(message.content);text.length>0&&content.push(text);for(let[name,value]of Object.entries(message.sections??{}))value===null?sections.delete(name):sections.set(name,value)}let tools=getCurrentTools(messages);if(!(timestamp===void 0&&tools.length===0))return{role:"system",content:content.join(`
|
|
10
|
-
|
|
11
|
-
`),...sections.size>0?{sections:Object.fromEntries(sections)}:{},...tools.length>0?{toolsAdded:tools}:{},timestamp:timestamp??0}}function getCurrentSystemPrompt(messages){let message=getCurrentSystemMessage(messages);return message?getSystemMessageText(message):""}function collapseSystemMessages(context){let head=getCurrentSystemMessage(context.messages),messages=context.messages.filter(message=>message.role!=="system");return{messages:head?[head,...messages]:messages}}function resolveTranscript(context,supportsMidConvoSystemMessages){return supportsMidConvoSystemMessages?context:collapseSystemMessages(context)}function toToolDeclaration(tool){return{name:tool.name,description:tool.description,parameters:JSON.parse(JSON.stringify(tool.parameters)),...tool.constrainedSampling===void 0?{}:{constrainedSampling:tool.constrainedSampling}}}function declarationsEqual(left,right){return JSON.stringify(toToolDeclaration(left))===JSON.stringify(toToolDeclaration(right))}function getToolStateChanges(previous,current){let previousTools=new Map(previous.map(tool=>[tool.name,tool])),currentTools=new Map(current.map(tool=>[tool.name,tool]));return{toolsAdded:current.filter(tool=>{let previousTool=previousTools.get(tool.name);return previousTool===void 0||!declarationsEqual(previousTool,tool)}).map(toToolDeclaration),toolsRemoved:previous.filter(tool=>{let currentTool=currentTools.get(tool.name);return currentTool===void 0||!declarationsEqual(tool,currentTool)}).map(tool=>({name:tool.name}))}}function getDeclaredTools(messages){let definitions=new Map;for(let message of messages)if(isSystemMessage(message))for(let tool of message.toolsAdded??[])definitions.set(tool.name,tool);return[...definitions.values()]}function hasToolRedefinitions(messages){let declared=new Map;for(let message of messages)if(isSystemMessage(message))for(let tool of message.toolsAdded??[]){let previous=declared.get(tool.name);if(previous!==void 0&&!declarationsEqual(previous,tool))return!0;declared.set(tool.name,tool)}return!1}function hasNonAdditiveToolChanges(messages){let declared=new Set;for(let message of messages)if(isSystemMessage(message)){if((message.toolsRemoved?.length??0)>0)return!0;for(let tool of message.toolsAdded??[]){if(declared.has(tool.name))return!0;declared.add(tool.name)}}return!1}function resolveTranscriptTools(messages,supportsToolAdditions){let anchorsAdditions=supportsToolAdditions&&!hasNonAdditiveToolChanges(messages);return{requestTools:anchorsAdditions?getInitialSystemMessage(messages)?.toolsAdded??[]:getCurrentTools(messages),anchorsAdditions}}function createSetupErrorMessage(model,error){return{role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}function hasResult(source){return typeof source.result=="function"}async function forwardStream(target,source){for await(let event of source)target.push(event);target.end(hasResult(source)?await source.result():void 0)}function lazyStream(model,setup){let outer=new AssistantMessageEventStream;return setup().then(inner=>forwardStream(outer,inner)).catch(error=>{let message=createSetupErrorMessage(model,error);outer.push({type:"error",reason:"error",error:message}),outer.end(message)}),outer}function lazyApi(load,capabilities){let api={stream:(model,context,options)=>lazyStream(model,async()=>(await load()).stream(model,context,options)),streamSimple:(model,context,options)=>lazyStream(model,async()=>(await load()).streamSimple(model,context,options))};return capabilities?.fetchDeferred&&(api.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=await load();if(!implementation.fetchDeferred)throw new Error("API does not support deferred responses");return implementation.fetchDeferred(model,handle,options)})),capabilities?.cancelDeferred&&(api.cancelDeferred=async(model,handle,options)=>{let implementation=await load();if(!implementation.cancelDeferred)throw new Error("API cannot cancel deferred responses");await implementation.cancelDeferred(model,handle,options)}),api}var __rewriteRelativeImportExtension=function(path,preserveJsx){return typeof path=="string"&&/^\.\.?\//.test(path)?path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(m,tsx,d,ext,cm){return tsx?preserveJsx?".jsx":".js":d&&(!ext||!cm)?m:d+ext+"."+cm.toLowerCase()+"js"}):path},importNodeModule=specifier=>import(__rewriteRelativeImportExtension(specifier));function getProcessEnv(){return globalThis.process?.env}function defaultProviderAuthContext(){return{async env(name){let value=getProcessEnv()?.[name];return typeof value=="string"&&value.trim().length>0?value:void 0},async fileExists(path){try{let fs=await importNodeModule("node:fs/promises"),resolved=path;return resolved.startsWith("~")&&(resolved=(await importNodeModule("node:os")).homedir()+resolved.slice(1)),await fs.access(resolved),!0}catch{return!1}}}}function abortReason(signal){if(signal.reason!==void 0)return signal.reason;let error=new Error("The operation was aborted");return error.name="AbortError",error}function operationSignal(signal){return signal??new AbortController().signal}function raceWithAbortSignal(operation,signal){return signal.aborted?(operation.catch(()=>{}),Promise.reject(abortReason(signal))):new Promise((resolve,reject)=>{let settled=!1,cleanup=()=>signal.removeEventListener("abort",onAbort),onAbort=()=>{settled||(settled=!0,cleanup(),reject(abortReason(signal)))};signal.addEventListener("abort",onAbort,{once:!0}),operation.then(value=>{settled||(settled=!0,cleanup(),resolve(value))},error=>{settled||(settled=!0,cleanup(),reject(error))}),signal.aborted&&onAbort()})}var InMemoryCredentialStore=class{credentials=new Map;chains=new Map;enqueue(providerId,task,options){let signal=operationSignal(options?.signal),previous=this.chains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),task()))(),tail=queued.catch(()=>{});return this.chains.set(providerId,tail),tail.then(()=>{this.chains.get(providerId)===tail&&this.chains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async read(providerId,options){return options?.signal?.throwIfAborted(),this.credentials.get(providerId)}async list(options){return options?.signal?.throwIfAborted(),[...this.credentials].map(([providerId,credential])=>({providerId,type:credential.type}))}modify(providerId,fn,options){return this.enqueue(providerId,async()=>{let current=this.credentials.get(providerId),next=await fn(current);return options?.signal?.throwIfAborted(),next!==void 0&&this.credentials.set(providerId,next),next??current},options)}delete(providerId,options){return this.enqueue(providerId,async()=>{this.credentials.delete(providerId)},options)}};var ModelsError=class extends Error{code;constructor(code,message,options){super(withCauseDetail(message,options?.cause),options),this.name="ModelsError",this.code=code}};function withCauseDetail(message,cause){if(cause==null)return message;let detail=formatThrownValue(cause).trim();return!detail||message.includes(detail)?message:`${message}: ${detail}`}function resolveProviderAuth(provider,credentials,authContext,overrides){let signal=operationSignal(overrides?.signal);return raceWithAbortSignal(resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal),signal)}async function resolveProviderAuthWithSignal(provider,credentials,authContext,overrides,signal){signal.throwIfAborted();let requestAuthContext=overrides?.env?overlayEnvAuthContext(authContext,overrides.env):authContext;if(overrides?.apiKey!==void 0&&provider.auth.apiKey)return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,{type:"api_key",key:overrides.apiKey,env:overrides.env},signal);let stored=await readCredential(credentials,provider.id,signal);if(stored){if(stored.type==="oauth"&&provider.auth.oauth)return resolveStoredOAuth(credentials,provider.id,provider.auth.oauth,stored,signal,overrides?.minOAuthValidityMs);if(stored.type==="api_key"&&provider.auth.apiKey){let credential=overrides?.env?{...stored,env:{...stored.env,...overrides.env}}:stored;return resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,credential,signal)}return}return provider.auth.apiKey?resolveApiKey(requestAuthContext,provider.auth.apiKey,provider.id,void 0,signal):void 0}function overlayEnvAuthContext(base,env){return{env:async name=>env[name]||await base.env(name),fileExists:path=>base.fileExists(path)}}var DEFAULT_OAUTH_MINIMUM_VALIDITY_MS=300*1e3,DEFAULT_OAUTH_REFRESH_TIMEOUT_MS=15e3;async function refreshStoredOAuthCredential(credentials,providerId,oauth,needsRefresh,signal){let post,lockWait=new AbortController,cancelLockWait=()=>lockWait.abort(signal.reason);signal.addEventListener("abort",cancelLockWait,{once:!0}),signal.aborted&&cancelLockWait();try{post=await credentials.modify(providerId,async current=>{if(signal.removeEventListener("abort",cancelLockWait),signal.throwIfAborted(),current?.type==="oauth"&&needsRefresh(current))try{return await oauth.refresh(current,AbortSignal.timeout(DEFAULT_OAUTH_REFRESH_TIMEOUT_MS))}catch(error){throw new ModelsError("oauth",`OAuth refresh failed for ${providerId}`,{cause:error})}},{signal:lockWait.signal})}catch(error){throw error instanceof ModelsError?error:(signal.throwIfAborted(),new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error}))}finally{signal.removeEventListener("abort",cancelLockWait)}return post?.type==="oauth"?post:void 0}async function resolveStoredOAuth(credentials,providerId,oauth,stored,signal,minOAuthValidityMs){let minimumValidityMs=Math.max(DEFAULT_OAUTH_MINIMUM_VALIDITY_MS,minOAuthValidityMs??0),expiresSoon=credential2=>Date.now()+minimumValidityMs>=credential2.expires,credential=stored;if(expiresSoon(credential)){let post=await refreshStoredOAuthCredential(credentials,providerId,oauth,expiresSoon,signal);if(!post)return;if(credential=post,minOAuthValidityMs!==void 0&&expiresSoon(credential))throw new ModelsError("oauth",`OAuth refresh returned a token that expires too soon for ${providerId}`)}try{return{auth:await oauth.toAuth(credential),source:"OAuth"}}catch(error){throw new ModelsError("oauth",`OAuth auth derivation failed for ${providerId}`,{cause:error})}}async function resolveApiKey(authContext,apiKey,providerId,credential,signal){try{return await apiKey.resolve({ctx:authContext,credential,signal})}catch(error){throw new ModelsError("auth",`API key auth failed for provider ${providerId}`,{cause:error})}}async function readCredential(credentials,providerId,signal){try{return await credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}var InMemoryModelsStore=class{entries=new Map;async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}};function getModelType(model){return model.type??"chat"}function isModelType(model,type){return getModelType(model)===type}function assertChatModel(model){if(!isModelType(model,"chat"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not a chat model`)}function assertImageModel(model){if(!isModelType(model,"image"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not an image model`)}function assertClassifierModel(model){if(!isModelType(model,"classifier"))throw new ModelsError("provider",`Model ${model.provider}/${model.id} is not a classifier model`)}function imageErrorResult(model,error,aborted=!1){return{api:model.api,provider:model.provider,model:model.id,output:[],stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}function classifierErrorResult(model,error,aborted=!1){return{api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:aborted?"aborted":"error",errorMessage:error instanceof Error?error.message:String(error),timestamp:Date.now()}}var KNOWN_MODEL_TYPES={chat:!0,image:!0,classifier:!0};function hasKnownModelType(model){return Object.hasOwn(KNOWN_MODEL_TYPES,getModelType(model))}function withKnownModelTypes(entry){return{...entry,models:entry.models.filter(hasKnownModelType)}}function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value}return merged}var ModelsImpl=class{providers=new Map;credentials;modelsStore;authContext;refreshGenerations=new Map;refreshControllers=new Map;publicationChains=new Map;constructor(options){this.credentials=options?.credentials??new InMemoryCredentialStore,this.modelsStore=options?.modelsStore??new InMemoryModelsStore,this.authContext=options?.authContext??defaultProviderAuthContext()}setProvider(provider){this.supersedeProviderRefresh(provider.id),this.providers.set(provider.id,provider)}deleteProvider(id){this.supersedeProviderRefresh(id),this.providers.delete(id)}clearProviders(){for(let id of new Set([...this.providers.keys(),...this.refreshControllers.keys()]))this.supersedeProviderRefresh(id);this.providers.clear()}getProviders(){return Array.from(this.providers.values())}getProvider(id){return this.providers.get(id)}getModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getModels())}catch{}return models}getAllModels(provider){if(provider!==void 0){let entry=this.providers.get(provider);if(!entry)return[];try{return entry.getAllModels?.()??entry.getModels()}catch{return[]}}let models=[];for(let entry of this.providers.values())try{models.push(...entry.getAllModels?.()??entry.getModels())}catch{}return models}getModelsOfType(type,provider){return this.getAllModels(provider).filter(model=>isModelType(model,type))}getModel(provider,id){return this.getModels(provider).find(model=>model.id===id)}getModelOfType(type,provider,id){return this.getModelsOfType(type,provider).find(model=>model.id===id)}supersedeProviderRefresh(providerId){let generation=(this.refreshGenerations.get(providerId)??0)+1;this.refreshGenerations.set(providerId,generation);let previous=this.refreshControllers.get(providerId);return previous&&(this.refreshControllers.delete(providerId),previous.abort()),generation}beginProviderRefresh(providerId){let generation=this.supersedeProviderRefresh(providerId),controller=new AbortController;return this.refreshControllers.set(providerId,controller),{generation,controller}}publishProviderModels(providerId,generation,signal,publication){let previous=this.publicationChains.get(providerId)??Promise.resolve(),queued=(async()=>(await previous.catch(()=>{}),signal.aborted||this.refreshGenerations.get(providerId)!==generation||(publication.persist===null?await this.modelsStore.delete(providerId,{signal}):publication.persist!==void 0&&await this.modelsStore.write(providerId,structuredClone(publication.persist),{signal}),signal.aborted||this.refreshGenerations.get(providerId)!==generation)?!1:(publication.update?.(),!0)))(),tail=queued.catch(()=>{});return this.publicationChains.set(providerId,tail),tail.then(()=>{this.publicationChains.get(providerId)===tail&&this.publicationChains.delete(providerId)}),raceWithAbortSignal(queued,signal)}async runProviderRefreshPhase(provider,credential,allowNetwork,force,generation,signal){let stored=await this.modelsStore.read(provider.id,{signal});await provider.refreshModels({credential,stored:stored?withKnownModelTypes(structuredClone(stored)):void 0,publish:publication=>this.publishProviderModels(provider.id,generation,signal,publication),allowNetwork,force:allowNetwork?force:void 0,signal})}async refresh(options={}){let allowNetwork=options.allowNetwork??!0,callerSignal=operationSignal(options.signal),errors=new Map;if(callerSignal.aborted)return{aborted:!0,errors};let selected=options.providers?new Set(options.providers):void 0,refreshable=Array.from(this.providers.values()).filter(provider=>provider.refreshModels!==void 0&&(!selected||selected.has(provider.id))),refresh=Promise.all(refreshable.map(async provider=>{let{generation,controller}=this.beginProviderRefresh(provider.id),signal=AbortSignal.any([callerSignal,controller.signal]),operation=(async()=>{let storedCredential,credentialError;try{storedCredential=await this.readCredential(provider.id,signal)}catch(error){credentialError=error}if(await this.runProviderRefreshPhase(provider,storedCredential,!1,void 0,generation,signal),credentialError!==void 0)throw credentialError;if(!allowNetwork||signal.aborted)return;let credential=await this.resolveRefreshCredential(provider,storedCredential,signal);credential&&await this.runProviderRefreshPhase(provider,credential,!0,options.force,generation,signal)})();try{await raceWithAbortSignal(operation,signal)}catch(error){signal.aborted||errors.set(provider.id,error instanceof Error?error:new ModelsError("model_source",`Model refresh failed for ${provider.id}`,{cause:error}))}finally{this.refreshControllers.get(provider.id)===controller&&this.refreshControllers.delete(provider.id)}}));try{await raceWithAbortSignal(refresh,callerSignal)}catch(error){if(!callerSignal.aborted)throw error}return{aborted:callerSignal.aborted,errors:new Map(errors)}}async resolveRefreshCredential(provider,stored,signal){if(stored?.type==="oauth"){let oauth=provider.auth.oauth;return oauth?Date.now()<stored.expires?stored:signal.aborted?void 0:refreshStoredOAuthCredential(this.credentials,provider.id,oauth,current=>Date.now()>=current.expires,signal):void 0}let apiKey=provider.auth.apiKey;if(!apiKey)return;let credential=stored?.type==="api_key"?stored:void 0,result=await apiKey.resolve({ctx:this.authContext,credential,signal});if(result)return{type:"api_key",key:result.auth.apiKey,env:result.env}}async readCredential(providerId,signal){try{return await this.credentials.read(providerId,{signal})}catch(error){throw new ModelsError("auth",`Credential store read failed for ${providerId}`,{cause:error})}}async checkProviderAuth(provider,credential,signal){if(credential?.type==="oauth")return provider.auth.oauth?{source:"OAuth",type:"oauth"}:void 0;let apiKey=provider.auth.apiKey;if(!apiKey)return;if(apiKey.check)try{return await apiKey.check({ctx:this.authContext,credential:credential?.type==="api_key"?credential:void 0,signal})}catch(error){throw new ModelsError("auth",`API key auth check failed for provider ${provider.id}`,{cause:error})}let resolution=await resolveProviderAuth(provider,this.credentials,this.authContext,{signal});return resolution?{source:resolution.source,type:"api_key"}:void 0}checkAuth(providerId,options){let signal=operationSignal(options?.signal),check=(async()=>{signal.throwIfAborted();let provider=this.providers.get(providerId);if(provider)return this.checkProviderAuth(provider,await this.readCredential(providerId,signal),signal)})();return raceWithAbortSignal(check,signal)}async getAuthenticatedProviders(providerId,signal){signal.throwIfAborted();let providers=providerId?[this.providers.get(providerId)].filter(entry=>entry!==void 0):this.getProviders();return(await Promise.all(providers.map(async provider=>{let credential=await this.readCredential(provider.id,signal);return{provider,credential,auth:await this.checkProviderAuth(provider,credential,signal)}}))).filter(entry=>entry.auth!==void 0)}getAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>(await this.getAuthenticatedProviders(providerId,signal)).flatMap(({provider,credential})=>{let models=provider.getModels();return provider.filterModels?.(models,credential)??models}))();return raceWithAbortSignal(available,signal)}async getAvailableOfType(type,providerId,options){return(await this.getAllAvailable(providerId,options)).filter(model=>isModelType(model,type))}getAllAvailable(providerId,options){let signal=operationSignal(options?.signal),available=(async()=>(await this.getAuthenticatedProviders(providerId,signal)).flatMap(({provider,credential})=>{let models=provider.getAllModels?.()??provider.getModels();if(provider.filterAllModels)return provider.filterAllModels(models,credential);if(!provider.filterModels)return models;let availableChatIds=new Set(provider.filterModels(provider.getModels(),credential).map(model=>model.id));return models.filter(model=>!isModelType(model,"chat")||availableChatIds.has(model.id))}))();return raceWithAbortSignal(available,signal)}async getAuth(providerOrModel,overrides){let signal=operationSignal(overrides?.signal),providerId=typeof providerOrModel=="string"?providerOrModel:providerOrModel.provider,provider=this.providers.get(providerId);if(!provider)return;let result=await resolveProviderAuth(provider,this.credentials,this.authContext,{...overrides,signal});return!result||typeof providerOrModel=="string"||!providerOrModel.headers?result:{...result,auth:{...result.auth,headers:mergeHeaders(result.auth.headers,providerOrModel.headers)}}}async login(providerId,type,interaction,options){let signal=operationSignal(interaction.signal);signal.throwIfAborted();let provider=this.providers.get(providerId);if(!provider)throw new ModelsError("provider",`Unknown provider: ${providerId}`);let method=type==="oauth"?provider.auth.oauth:provider.auth.apiKey;if(!method?.login)throw new ModelsError("auth",`${provider.name} does not support ${type} login`);let loginOperation=method.login({...interaction,signal},options),credential=await raceWithAbortSignal(loginOperation,signal),mutationStarted=!1,markMutationStarted,started=new Promise(resolve=>{markMutationStarted=resolve}),mutation=this.credentials.modify(providerId,async()=>(mutationStarted=!0,markMutationStarted?.(),credential),{signal});mutation.catch(()=>{});try{await new Promise((resolve,reject)=>{let onAbort=()=>{mutationStarted||reject(signal.reason)};signal.addEventListener("abort",onAbort,{once:!0}),Promise.race([started,mutation]).then(()=>{signal.removeEventListener("abort",onAbort),resolve()},error=>{signal.removeEventListener("abort",onAbort),reject(error)}),signal.aborted&&onAbort()}),await mutation}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store modify failed for ${providerId}`,{cause:error})}return credential}async logout(providerId,options){let signal=operationSignal(options?.signal);signal.throwIfAborted();try{await this.credentials.delete(providerId,{signal})}catch(error){throw signal.throwIfAborted(),new ModelsError("auth",`Credential store delete failed for ${providerId}`,{cause:error})}}requireProvider(model){let provider=this.providers.get(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);return provider}requireChatProvider(model){return assertChatModel(model),this.requireProvider(model)}async applyAuth(model,options){this.requireProvider(model);let resolution=await this.getAuth(model,{apiKey:options?.apiKey,env:options?.env,signal:options?.signal});if(!resolution)throw new ModelsError("auth",`Provider is not configured: ${model.provider}`);let auth=resolution.auth,apiKey=options?.apiKey??auth.apiKey,headers=mergeHeaders(auth.headers,options?.headers);options?.transformHeaders&&(headers=await options.transformHeaders(headers??{}));let env=resolution.env||options?.env?{...resolution.env??{},...options?.env??{}}:void 0,requestModel=auth.baseUrl?{...model,baseUrl:auth.baseUrl}:model,{transformHeaders:_transformHeaders,...providerOptions}=options??{},requestOptions={...providerOptions,apiKey,headers,env};return{requestModel,requestOptions}}stream(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{let provider=this.requireChatProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.stream(requestModel,transcript,requestOptions)})}async complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){let transcript=normalizeContext(context);return lazyStream(model,async()=>{let provider=this.requireChatProvider(model),{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.streamSimple(requestModel,transcript,requestOptions)})}async completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}streamDeferred(model,handle,options){return lazyStream(model,async()=>{let provider=this.requireChatProvider(model);if(!provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return provider.fetchDeferred(requestModel,handle,requestOptions)})}async fetchDeferred(model,handle,options){return this.streamDeferred(model,handle,options).result()}async cancelDeferred(model,handle,options){let provider=this.requireChatProvider(model);if(!provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);let{requestModel,requestOptions}=await this.applyAuth(model,options);await provider.cancelDeferred(requestModel,handle,requestOptions)}async generateImages(model,context,options){try{assertImageModel(model);let provider=this.requireProvider(model);if(!provider.generateImages)throw new ModelsError("provider",`Provider ${model.provider} does not support image generation`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return await provider.generateImages(requestModel,context,requestOptions)}catch(error){return imageErrorResult(model,error,options?.signal?.aborted)}}async classify(model,context,options){try{assertClassifierModel(model);let provider=this.requireProvider(model);if(!provider.classify)throw new ModelsError("provider",`Provider ${model.provider} does not support classification`);let{requestModel,requestOptions}=await this.applyAuth(model,options);return await provider.classify(requestModel,context,requestOptions)}catch(error){return classifierErrorResult(model,error,options?.signal?.aborted)}}};function createModels(options){return new ModelsImpl(options)}function createProvider(input){let single=input.api&&typeof input.api.stream=="function"?input.api:void 0,byApi=single||!input.api?void 0:input.api,images=input.images,classifiers=input.classifiers,streams=single?[single]:Object.values(byApi??{}).filter(entry=>entry!==void 0),imageImplementations=Object.values(images??{}).filter(entry=>entry!==void 0),classifierImplementations=Object.values(classifiers??{}).filter(entry=>entry!==void 0);if(streams.length===0&&imageImplementations.length===0&&classifierImplementations.length===0)throw new Error(`Provider ${input.id}: at least one of "api", "images", or "classifiers" is required.`);let baselineModels=input.models,dynamicModels=[],fetchModels=input.fetchModels,currentModels=()=>{let merged=[...baselineModels];for(let model of dynamicModels){let index=merged.findIndex(entry=>getModelType(entry)===getModelType(model)&&entry.id===model.id);index>=0?merged[index]=model:merged.push(model)}return merged},apiFor=model=>single??byApi?.[model.api],dispatch=(model,run)=>{let streams2=apiFor(model);return streams2?run(streams2):lazyStream(model,async()=>{throw new ModelsError("stream",`Provider ${input.id} has no API implementation for "${model.api}"`)})},provider={id:input.id,name:input.name??input.id,baseUrl:input.baseUrl,headers:input.headers,auth:input.auth,getModels:()=>currentModels().filter(model=>isModelType(model,"chat")),getAllModels:currentModels,refreshModels:fetchModels?async context=>{if(context.stored){let restored=context.stored.models.filter(model=>model.provider===input.id).map(model=>model);if(!await context.publish({update:()=>{dynamicModels=restored}}))return}if(!context.allowNetwork||context.signal.aborted)return;let fetched=await fetchModels(context);if(context.signal.aborted)return;let refreshed=fetched.filter(hasKnownModelType);await context.publish({persist:{models:refreshed,checkedAt:Date.now()},update:()=>{dynamicModels=refreshed}})}:void 0,filterModels:input.filterModels,filterAllModels:input.filterAllModels,stream:(model,context,options)=>dispatch(model,streams2=>streams2.stream(model,context,options)),streamSimple:(model,context,options)=>dispatch(model,streams2=>streams2.streamSimple(model,context,options))};return streams.some(entry=>entry.fetchDeferred!==void 0)&&(provider.fetchDeferred=(model,handle,options)=>lazyStream(model,async()=>{let implementation=apiFor(model);if(!implementation?.fetchDeferred)throw new ModelsError("provider",`Provider ${input.id} does not support deferred responses for "${model.api}"`);return implementation.fetchDeferred(model,handle,options)})),streams.some(entry=>entry.cancelDeferred!==void 0)&&(provider.cancelDeferred=async(model,handle,options)=>{let implementation=apiFor(model);if(!implementation?.cancelDeferred)throw new ModelsError("provider",`Provider ${input.id} cannot cancel deferred responses for "${model.api}"`);await implementation.cancelDeferred(model,handle,options)}),images&&imageImplementations.length>0&&(provider.generateImages=async(model,context,options)=>{let implementation=images[model.api];return implementation?implementation.generateImages(model,context,options):imageErrorResult(model,new ModelsError("provider",`Provider ${input.id} has no image generation implementation for "${model.api}"`))}),classifiers&&classifierImplementations.length>0&&(provider.classify=async(model,context,options)=>{let implementation=classifiers[model.api];return implementation?implementation.classify(model,context,options):classifierErrorResult(model,new ModelsError("provider",`Provider ${input.id} has no classifier implementation for "${model.api}"`))}),provider}function hasApi(model,api){return isModelType(model,"chat")&&model.api===api}function calculateCost(model,usage){let inputTokens=usage.input+usage.cacheRead+usage.cacheWrite,rates=model.cost,matchedThreshold=-1;for(let tier of model.cost.tiers??[])inputTokens>tier.inputTokensAbove&&tier.inputTokensAbove>matchedThreshold&&(rates=tier,matchedThreshold=tier.inputTokensAbove);let longWrite=usage.cacheWrite1h??0,shortWrite=usage.cacheWrite-longWrite;return usage.cost.input=rates.input/1e6*usage.input,usage.cost.output=rates.output/1e6*usage.output,usage.cost.cacheRead=rates.cacheRead/1e6*usage.cacheRead,usage.cost.cacheWrite=(rates.cacheWrite*shortWrite+rates.input*2*longWrite)/1e6,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite,usage.cost}var EXTENDED_THINKING_LEVELS=["off","minimal","low","medium","high","xhigh","max"];function getSupportedThinkingLevels(model){return model.reasoning?EXTENDED_THINKING_LEVELS.filter(level=>{let mapped=model.thinkingLevelMap?.[level];return mapped===null?!1:level==="xhigh"||level==="max"?mapped!==void 0:!0}):["off"]}function clampThinkingLevel(model,level){let availableLevels=getSupportedThinkingLevels(model);if(availableLevels.includes(level))return level;let requestedIndex=EXTENDED_THINKING_LEVELS.indexOf(level);if(requestedIndex===-1)return availableLevels[0]??"off";for(let i=requestedIndex;i<EXTENDED_THINKING_LEVELS.length;i++){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}for(let i=requestedIndex-1;i>=0;i--){let candidate=EXTENDED_THINKING_LEVELS[i];if(availableLevels.includes(candidate))return candidate}return availableLevels[0]??"off"}function modelsAreEqual(a,b){return!a||!b?!1:getModelType(a)===getModelType(b)&&a.id===b.id&&a.provider===b.provider}export{lazyStream,lazyApi,defaultProviderAuthContext,InMemoryCredentialStore,ModelsError,InMemoryModelsStore,getModelType,isModelType,assertChatModel,assertImageModel,assertClassifierModel,imageErrorResult,classifierErrorResult,contentText,getSystemMessageText,renderSystemMessageUpdate,createInitialSystemMessage,normalizeContext,getInitialSystemMessage,withoutInitialSystemMessage,getCurrentTools,getCurrentSystemMessage,getCurrentSystemPrompt,collapseSystemMessages,resolveTranscript,toToolDeclaration,declarationsEqual,getToolStateChanges,getDeclaredTools,hasToolRedefinitions,hasNonAdditiveToolChanges,resolveTranscriptTools,createModels,createProvider,hasApi,calculateCost,getSupportedThinkingLevels,clampThinkingLevel,modelsAreEqual};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
-
import{classifySystemOne,isRecord}from"./chunk-TCQ4HHQD.js";import"./chunk-FEZ5RM2B.js";import"./chunk-GIG5IHES.js";import"./chunk-GCKVOFWP.js";import"./chunk-TXJO4AJ7.js";import"./chunk-JI4WGISU.js";import"./chunk-4L3WN2XY.js";var LABEL="Cloudflare Workers AI";function cloudflareErrorMessage(errors){if(Array.isArray(errors)){let messages=errors.map(error=>isRecord(error)&&typeof error.message=="string"?error.message:void 0).filter(message=>message!==void 0);if(messages.length>0)return`${LABEL} error: ${messages.join("; ")}`}return`${LABEL} request failed`}var transport={api:"cloudflare-workers-ai-system-one",label:LABEL,url:model=>new URL("run",`${model.baseUrl.replace(/\/+$/u,"")}/`),payload:(model,request)=>({model:model.id,input:request}),output:body=>{if(!isRecord(body))throw new Error(`${LABEL} returned an unexpected response`);if(body.success===!1)throw new Error(cloudflareErrorMessage(body.errors));let result=body.result;if(!isRecord(result))throw new Error(`${LABEL} returned an unexpected response`);if("answers"in result)return result;if(result.state!=="Completed")throw new Error(`${LABEL} run did not complete (state: ${String(result.state)})`);if(!isRecord(result.result))throw new Error(`${LABEL} returned an unexpected response`);return result.result}},classify=(model,context,options)=>classifySystemOne(transport,model,context,options);export{classify};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
|
|
2
|
-
import{classifySystemOne,isRecord}from"./chunk-TCQ4HHQD.js";import"./chunk-FEZ5RM2B.js";import"./chunk-GIG5IHES.js";import"./chunk-GCKVOFWP.js";import"./chunk-TXJO4AJ7.js";import"./chunk-JI4WGISU.js";import"./chunk-4L3WN2XY.js";var transport={api:"typesafe-system-one",label:"System One API",url:model=>new URL("systemone",`${model.baseUrl.replace(/\/+$/u,"")}/`),payload:(model,request)=>({model:model.id,...request}),output:body=>{if(!isRecord(body))throw new Error("System One API returned an unexpected response");return body}},classify=(model,context,options)=>classifySystemOne(transport,model,context,options);export{classify};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* auth.ts — Credential discovery for web_search, plus the engine label derived from it.
|
|
3
|
-
*/
|
|
4
|
-
import type { ModelRuntime } from "../../core/model-runtime.ts";
|
|
5
|
-
import type { ResolvedSearchCredentials, SearchEngineType } from "./types.ts";
|
|
6
|
-
/** The engine set implied by the configured credentials. */
|
|
7
|
-
export declare function configuredEngine(credentials: ResolvedSearchCredentials): SearchEngineType;
|
|
8
|
-
/**
|
|
9
|
-
* Discover and resolve current active search engine credentials.
|
|
10
|
-
*/
|
|
11
|
-
export declare function resolveSearchCredentials(modelRuntime?: ModelRuntime, authPath?: string): Promise<ResolvedSearchCredentials>;
|
|
12
|
-
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAA2B,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkFvG,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,yBAAyB,GAAG,gBAAgB,CAKzF;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,YAAY,CAAC,EAAE,YAAY,EAC3B,QAAQ,GAAE,MAAsB,GAC9B,OAAO,CAAC,yBAAyB,CAAC,CAMpC"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* auth.ts — Credential discovery for web_search, plus the engine label derived from it.
|
|
3
|
-
*/
|
|
4
|
-
import { getAuthPath } from "../../config.js";
|
|
5
|
-
import { readStoredCredential } from "../../core/auth-storage.js";
|
|
6
|
-
import { isCommandConfigValue, resolveConfigValue } from "../../core/resolve-config-value.js";
|
|
7
|
-
const MINIMAX_CN_HOST = "https://api.minimaxi.com";
|
|
8
|
-
const MINIMAX_GLOBAL_HOST = "https://api.minimax.io";
|
|
9
|
-
function trimValue(value) {
|
|
10
|
-
const trimmed = value?.trim();
|
|
11
|
-
return trimmed || undefined;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Resolve a provider API key through the runtime's canonical auth chain
|
|
15
|
-
* (runtime key → auth.json → models.json → environment). Returns undefined
|
|
16
|
-
* when the provider is unknown to the runtime or nothing is configured.
|
|
17
|
-
*/
|
|
18
|
-
async function runtimeApiKey(modelRuntime, providerId) {
|
|
19
|
-
if (!modelRuntime)
|
|
20
|
-
return undefined;
|
|
21
|
-
try {
|
|
22
|
-
return trimValue((await modelRuntime.getAuth(providerId))?.auth.apiKey);
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
return undefined;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Direct auth.json read for contexts without a ModelRuntime. Resolves
|
|
30
|
-
* command-configured keys (e.g. "!op read ...") like AuthStorage does.
|
|
31
|
-
*/
|
|
32
|
-
function storedApiKey(providerId, authPath) {
|
|
33
|
-
const credential = readStoredCredential(providerId, authPath);
|
|
34
|
-
if (!credential || credential.type !== "api_key" || typeof credential.key !== "string")
|
|
35
|
-
return undefined;
|
|
36
|
-
const key = isCommandConfigValue(credential.key)
|
|
37
|
-
? resolveConfigValue(credential.key, credential.env)
|
|
38
|
-
: credential.key;
|
|
39
|
-
return trimValue(key);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Resolve one provider's API key. The runtime chain already covers auth.json,
|
|
43
|
-
* models.json, and environment variables; the direct file/env read is the
|
|
44
|
-
* fallback for contexts without a ModelRuntime (or a provider it doesn't know).
|
|
45
|
-
*/
|
|
46
|
-
async function resolveProviderKey(modelRuntime, authPath, providerId, envVar) {
|
|
47
|
-
return ((await runtimeApiKey(modelRuntime, providerId)) ??
|
|
48
|
-
storedApiKey(providerId, authPath) ??
|
|
49
|
-
trimValue(process.env[envVar]));
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Resolve MiniMax search credentials, preferring the CN account over global.
|
|
53
|
-
*/
|
|
54
|
-
async function resolveMiniMaxCredential(modelRuntime, authPath) {
|
|
55
|
-
const cnKey = await resolveProviderKey(modelRuntime, authPath, "minimax-cn", "MINIMAX_CN_API_KEY");
|
|
56
|
-
if (cnKey)
|
|
57
|
-
return { key: cnKey, host: MINIMAX_CN_HOST };
|
|
58
|
-
const globalKey = await resolveProviderKey(modelRuntime, authPath, "minimax", "MINIMAX_API_KEY");
|
|
59
|
-
if (globalKey)
|
|
60
|
-
return { key: globalKey, host: trimValue(process.env.MINIMAX_API_HOST) ?? MINIMAX_GLOBAL_HOST };
|
|
61
|
-
return undefined;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Resolve DeepSeek search credentials.
|
|
65
|
-
*/
|
|
66
|
-
async function resolveDeepSeekCredential(modelRuntime, authPath) {
|
|
67
|
-
const key = await resolveProviderKey(modelRuntime, authPath, "deepseek", "DEEPSEEK_API_KEY");
|
|
68
|
-
return key ? { key } : undefined;
|
|
69
|
-
}
|
|
70
|
-
/** The engine set implied by the configured credentials. */
|
|
71
|
-
export function configuredEngine(credentials) {
|
|
72
|
-
if (credentials.minimax && credentials.deepseek)
|
|
73
|
-
return "dual";
|
|
74
|
-
if (credentials.minimax)
|
|
75
|
-
return "minimax";
|
|
76
|
-
if (credentials.deepseek)
|
|
77
|
-
return "deepseek";
|
|
78
|
-
return "none";
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Discover and resolve current active search engine credentials.
|
|
82
|
-
*/
|
|
83
|
-
export async function resolveSearchCredentials(modelRuntime, authPath = getAuthPath()) {
|
|
84
|
-
const [minimax, deepseek] = await Promise.all([
|
|
85
|
-
resolveMiniMaxCredential(modelRuntime, authPath),
|
|
86
|
-
resolveDeepSeekCredential(modelRuntime, authPath),
|
|
87
|
-
]);
|
|
88
|
-
return { minimax, deepseek };
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/extensions/web-search/auth.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * auth.ts — Credential discovery for web_search, plus the engine label derived from it.\n */\n\nimport { getAuthPath } from \"../../config.ts\";\nimport { readStoredCredential } from \"../../core/auth-storage.ts\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { isCommandConfigValue, resolveConfigValue } from \"../../core/resolve-config-value.ts\";\nimport type { MiniMaxSearchCredential, ResolvedSearchCredentials, SearchEngineType } from \"./types.ts\";\n\nconst MINIMAX_CN_HOST = \"https://api.minimaxi.com\";\nconst MINIMAX_GLOBAL_HOST = \"https://api.minimax.io\";\n\nfunction trimValue(value: string | undefined): string | undefined {\n\tconst trimmed = value?.trim();\n\treturn trimmed || undefined;\n}\n\n/**\n * Resolve a provider API key through the runtime's canonical auth chain\n * (runtime key → auth.json → models.json → environment). Returns undefined\n * when the provider is unknown to the runtime or nothing is configured.\n */\nasync function runtimeApiKey(modelRuntime: ModelRuntime | undefined, providerId: string): Promise<string | undefined> {\n\tif (!modelRuntime) return undefined;\n\ttry {\n\t\treturn trimValue((await modelRuntime.getAuth(providerId))?.auth.apiKey);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Direct auth.json read for contexts without a ModelRuntime. Resolves\n * command-configured keys (e.g. \"!op read ...\") like AuthStorage does.\n */\nfunction storedApiKey(providerId: string, authPath: string): string | undefined {\n\tconst credential = readStoredCredential(providerId, authPath);\n\tif (!credential || credential.type !== \"api_key\" || typeof credential.key !== \"string\") return undefined;\n\tconst key = isCommandConfigValue(credential.key)\n\t\t? resolveConfigValue(credential.key, credential.env)\n\t\t: credential.key;\n\treturn trimValue(key);\n}\n\n/**\n * Resolve one provider's API key. The runtime chain already covers auth.json,\n * models.json, and environment variables; the direct file/env read is the\n * fallback for contexts without a ModelRuntime (or a provider it doesn't know).\n */\nasync function resolveProviderKey(\n\tmodelRuntime: ModelRuntime | undefined,\n\tauthPath: string,\n\tproviderId: string,\n\tenvVar: string,\n): Promise<string | undefined> {\n\treturn (\n\t\t(await runtimeApiKey(modelRuntime, providerId)) ??\n\t\tstoredApiKey(providerId, authPath) ??\n\t\ttrimValue(process.env[envVar])\n\t);\n}\n\n/**\n * Resolve MiniMax search credentials, preferring the CN account over global.\n */\nasync function resolveMiniMaxCredential(\n\tmodelRuntime: ModelRuntime | undefined,\n\tauthPath: string,\n): Promise<MiniMaxSearchCredential | undefined> {\n\tconst cnKey = await resolveProviderKey(modelRuntime, authPath, \"minimax-cn\", \"MINIMAX_CN_API_KEY\");\n\tif (cnKey) return { key: cnKey, host: MINIMAX_CN_HOST };\n\n\tconst globalKey = await resolveProviderKey(modelRuntime, authPath, \"minimax\", \"MINIMAX_API_KEY\");\n\tif (globalKey) return { key: globalKey, host: trimValue(process.env.MINIMAX_API_HOST) ?? MINIMAX_GLOBAL_HOST };\n\n\treturn undefined;\n}\n\n/**\n * Resolve DeepSeek search credentials.\n */\nasync function resolveDeepSeekCredential(\n\tmodelRuntime: ModelRuntime | undefined,\n\tauthPath: string,\n): Promise<{ key: string } | undefined> {\n\tconst key = await resolveProviderKey(modelRuntime, authPath, \"deepseek\", \"DEEPSEEK_API_KEY\");\n\treturn key ? { key } : undefined;\n}\n\n/** The engine set implied by the configured credentials. */\nexport function configuredEngine(credentials: ResolvedSearchCredentials): SearchEngineType {\n\tif (credentials.minimax && credentials.deepseek) return \"dual\";\n\tif (credentials.minimax) return \"minimax\";\n\tif (credentials.deepseek) return \"deepseek\";\n\treturn \"none\";\n}\n\n/**\n * Discover and resolve current active search engine credentials.\n */\nexport async function resolveSearchCredentials(\n\tmodelRuntime?: ModelRuntime,\n\tauthPath: string = getAuthPath(),\n): Promise<ResolvedSearchCredentials> {\n\tconst [minimax, deepseek] = await Promise.all([\n\t\tresolveMiniMaxCredential(modelRuntime, authPath),\n\t\tresolveDeepSeekCredential(modelRuntime, authPath),\n\t]);\n\treturn { minimax, deepseek };\n}\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* constants.ts — web_search tool identity, descriptions, and model-facing guidelines.
|
|
3
|
-
*/
|
|
4
|
-
import type { SearchEngineType } from "./types.ts";
|
|
5
|
-
export declare const WEB_SEARCH_TOOL_NAME = "web_search";
|
|
6
|
-
export declare const WEB_SEARCH_LABEL = "Web Search";
|
|
7
|
-
export declare const WEB_SEARCH_DESCRIPTION = "Search the live web through configured MiniMax and DeepSeek providers. When both are available, searches run concurrently and results are deduplicated and fused. Returns up to 12 source URLs with bounded titles and snippets, plus related searches and optional synthesis; partial provider failures still return successful results.";
|
|
8
|
-
export declare const WEB_SEARCH_PROMPT_SNIPPET = "Search the live web for current information";
|
|
9
|
-
export declare const WEB_SEARCH_DISABLED_MESSAGE = "Web search is disabled: Neither MiniMax nor DeepSeek API Key was found in auth.json or environment variables. Please add credentials via auth.json or environment variables (MINIMAX_API_KEY, DEEPSEEK_API_KEY).";
|
|
10
|
-
/** Canonical display label for the contributing engine set ("" when none). */
|
|
11
|
-
export declare function getEngineLabel(engine: SearchEngineType | undefined): string;
|
|
12
|
-
export declare function getWebSearchPromptGuidelines(): string[];
|
|
13
|
-
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAE7C,eAAO,MAAM,sBAAsB,8UACyS,CAAC;AAE7U,eAAO,MAAM,yBAAyB,gDAAgD,CAAC;AAEvF,eAAO,MAAM,2BAA2B,qNAC2K,CAAC;AAEpN,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,GAAG,MAAM,CAK3E;AAED,wBAAgB,4BAA4B,IAAI,MAAM,EAAE,CAMvD"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* constants.ts — web_search tool identity, descriptions, and model-facing guidelines.
|
|
3
|
-
*/
|
|
4
|
-
export const WEB_SEARCH_TOOL_NAME = "web_search";
|
|
5
|
-
export const WEB_SEARCH_LABEL = "Web Search";
|
|
6
|
-
export const WEB_SEARCH_DESCRIPTION = "Search the live web through configured MiniMax and DeepSeek providers. When both are available, searches run concurrently and results are deduplicated and fused. Returns up to 12 source URLs with bounded titles and snippets, plus related searches and optional synthesis; partial provider failures still return successful results.";
|
|
7
|
-
export const WEB_SEARCH_PROMPT_SNIPPET = "Search the live web for current information";
|
|
8
|
-
export const WEB_SEARCH_DISABLED_MESSAGE = "Web search is disabled: Neither MiniMax nor DeepSeek API Key was found in auth.json or environment variables. Please add credentials via auth.json or environment variables (MINIMAX_API_KEY, DEEPSEEK_API_KEY).";
|
|
9
|
-
/** Canonical display label for the contributing engine set ("" when none). */
|
|
10
|
-
export function getEngineLabel(engine) {
|
|
11
|
-
if (engine === "dual")
|
|
12
|
-
return "MiniMax & DeepSeek";
|
|
13
|
-
if (engine === "minimax")
|
|
14
|
-
return "MiniMax";
|
|
15
|
-
if (engine === "deepseek")
|
|
16
|
-
return "DeepSeek";
|
|
17
|
-
return "";
|
|
18
|
-
}
|
|
19
|
-
export function getWebSearchPromptGuidelines() {
|
|
20
|
-
const currentYearMonth = new Date().toISOString().slice(0, 7);
|
|
21
|
-
return [
|
|
22
|
-
"Use `web_search` for current information, recent releases, live documentation, and other freshness-sensitive facts beyond your training cutoff.",
|
|
23
|
-
`When using \`web_search\` for freshness-sensitive topics, account for the current date (${currentYearMonth}) and include the year in the query when useful.`,
|
|
24
|
-
];
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/web-search/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAE7C,MAAM,CAAC,MAAM,sBAAsB,GAClC,2UAA2U,CAAC;AAE7U,MAAM,CAAC,MAAM,yBAAyB,GAAG,6CAA6C,CAAC;AAEvF,MAAM,CAAC,MAAM,2BAA2B,GACvC,kNAAkN,CAAC;AAEpN,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,MAAoC;IAClE,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,oBAAoB,CAAC;IACnD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC7C,OAAO,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC3C,MAAM,gBAAgB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO;QACN,iJAAiJ;QACjJ,2FAA2F,gBAAgB,kDAAkD;KAC7J,CAAC;AACH,CAAC","sourcesContent":["/**\n * constants.ts — web_search tool identity, descriptions, and model-facing guidelines.\n */\n\nimport type { SearchEngineType } from \"./types.ts\";\n\nexport const WEB_SEARCH_TOOL_NAME = \"web_search\";\nexport const WEB_SEARCH_LABEL = \"Web Search\";\n\nexport const WEB_SEARCH_DESCRIPTION =\n\t\"Search the live web through configured MiniMax and DeepSeek providers. When both are available, searches run concurrently and results are deduplicated and fused. Returns up to 12 source URLs with bounded titles and snippets, plus related searches and optional synthesis; partial provider failures still return successful results.\";\n\nexport const WEB_SEARCH_PROMPT_SNIPPET = \"Search the live web for current information\";\n\nexport const WEB_SEARCH_DISABLED_MESSAGE =\n\t\"Web search is disabled: Neither MiniMax nor DeepSeek API Key was found in auth.json or environment variables. Please add credentials via auth.json or environment variables (MINIMAX_API_KEY, DEEPSEEK_API_KEY).\";\n\n/** Canonical display label for the contributing engine set (\"\" when none). */\nexport function getEngineLabel(engine: SearchEngineType | undefined): string {\n\tif (engine === \"dual\") return \"MiniMax & DeepSeek\";\n\tif (engine === \"minimax\") return \"MiniMax\";\n\tif (engine === \"deepseek\") return \"DeepSeek\";\n\treturn \"\";\n}\n\nexport function getWebSearchPromptGuidelines(): string[] {\n\tconst currentYearMonth = new Date().toISOString().slice(0, 7);\n\treturn [\n\t\t\"Use `web_search` for current information, recent releases, live documentation, and other freshness-sensitive facts beyond your training cutoff.\",\n\t\t`When using \\`web_search\\` for freshness-sensitive topics, account for the current date (${currentYearMonth}) and include the year in the query when useful.`,\n\t];\n}\n"]}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Provider orchestration and execution-state construction for web_search.
|
|
3
|
-
*/
|
|
4
|
-
import type { AgentToolUpdateCallback } from "../../core/extensions/types.ts";
|
|
5
|
-
import type { WebSearchParams } from "./schema.ts";
|
|
6
|
-
import type { ResolvedSearchCredentials, WebSearchDetails } from "./types.ts";
|
|
7
|
-
/** Execute all configured search providers and combine their successful results. */
|
|
8
|
-
export declare function executeWebSearch(params: WebSearchParams, credentials: ResolvedSearchCredentials, signal?: AbortSignal, onUpdate?: AgentToolUpdateCallback<WebSearchDetails>): Promise<WebSearchDetails>;
|
|
9
|
-
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/execute.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAM9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAwB,yBAAyB,EAAoB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtH,oFAAoF;AACpF,wBAAsB,gBAAgB,CACrC,MAAM,EAAE,eAAe,EACvB,WAAW,EAAE,yBAAyB,EACtC,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,GAClD,OAAO,CAAC,gBAAgB,CAAC,CA8F3B"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Provider orchestration and execution-state construction for web_search.
|
|
3
|
-
*/
|
|
4
|
-
import { configuredEngine } from "./auth.js";
|
|
5
|
-
import { getEngineLabel, WEB_SEARCH_DISABLED_MESSAGE } from "./constants.js";
|
|
6
|
-
import { searchDeepSeek } from "./providers/deepseek.js";
|
|
7
|
-
import { searchMiniMax } from "./providers/minimax.js";
|
|
8
|
-
import { boundSingleLineText, fuseSearchHits, MAX_ERROR_MESSAGE_LENGTH, MAX_QUERY_LENGTH } from "./results.js";
|
|
9
|
-
/** Execute all configured search providers and combine their successful results. */
|
|
10
|
-
export async function executeWebSearch(params, credentials, signal, onUpdate) {
|
|
11
|
-
const startTime = Date.now();
|
|
12
|
-
const query = boundSingleLineText(params.query, MAX_QUERY_LENGTH) ?? "";
|
|
13
|
-
const engine = configuredEngine(credentials);
|
|
14
|
-
if (!query) {
|
|
15
|
-
return {
|
|
16
|
-
query: "",
|
|
17
|
-
durationMs: 0,
|
|
18
|
-
status: "error",
|
|
19
|
-
engine,
|
|
20
|
-
totalHits: 0,
|
|
21
|
-
hits: [],
|
|
22
|
-
errorMessage: "Search query must not be empty.",
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
if (engine === "none") {
|
|
26
|
-
return {
|
|
27
|
-
query,
|
|
28
|
-
durationMs: 0,
|
|
29
|
-
status: "disabled",
|
|
30
|
-
engine: "none",
|
|
31
|
-
totalHits: 0,
|
|
32
|
-
hits: [],
|
|
33
|
-
errorMessage: WEB_SEARCH_DISABLED_MESSAGE,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
signal?.throwIfAborted();
|
|
37
|
-
onUpdate?.({
|
|
38
|
-
content: [{ type: "text", text: `Searching for "${query}" via ${getEngineLabel(engine)}...` }],
|
|
39
|
-
details: {
|
|
40
|
-
query,
|
|
41
|
-
durationMs: 0,
|
|
42
|
-
status: "success",
|
|
43
|
-
engine,
|
|
44
|
-
totalHits: 0,
|
|
45
|
-
hits: [],
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
const searches = [];
|
|
49
|
-
if (credentials.minimax) {
|
|
50
|
-
searches.push(searchMiniMax({
|
|
51
|
-
query,
|
|
52
|
-
apiKey: credentials.minimax.key,
|
|
53
|
-
apiHost: credentials.minimax.host,
|
|
54
|
-
signal,
|
|
55
|
-
}));
|
|
56
|
-
}
|
|
57
|
-
if (credentials.deepseek) {
|
|
58
|
-
searches.push(searchDeepSeek({ query, apiKey: credentials.deepseek.key, signal }));
|
|
59
|
-
}
|
|
60
|
-
const settledResults = await Promise.allSettled(searches);
|
|
61
|
-
signal?.throwIfAborted();
|
|
62
|
-
const durationMs = Date.now() - startTime;
|
|
63
|
-
const successfulResults = [];
|
|
64
|
-
const errors = [];
|
|
65
|
-
for (const result of settledResults) {
|
|
66
|
-
if (result.status === "fulfilled")
|
|
67
|
-
successfulResults.push(result.value);
|
|
68
|
-
else
|
|
69
|
-
errors.push(result.reason instanceof Error ? result.reason.message : String(result.reason));
|
|
70
|
-
}
|
|
71
|
-
if (successfulResults.length === 0) {
|
|
72
|
-
return {
|
|
73
|
-
query,
|
|
74
|
-
durationMs,
|
|
75
|
-
status: "error",
|
|
76
|
-
engine,
|
|
77
|
-
totalHits: 0,
|
|
78
|
-
hits: [],
|
|
79
|
-
errorMessage: boundSingleLineText(errors.join(" | "), MAX_ERROR_MESSAGE_LENGTH) ?? "All search engines failed",
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
const { hits, relatedSearches, deepseekSynthesis } = fuseSearchHits(successfulResults);
|
|
83
|
-
const respondedSources = new Set(successfulResults.map((result) => result.source));
|
|
84
|
-
const contributingEngine = respondedSources.size > 1 ? "dual" : respondedSources.has("MiniMax") ? "minimax" : "deepseek";
|
|
85
|
-
return {
|
|
86
|
-
query,
|
|
87
|
-
durationMs,
|
|
88
|
-
status: "success",
|
|
89
|
-
engine: contributingEngine,
|
|
90
|
-
totalHits: hits.length,
|
|
91
|
-
hits,
|
|
92
|
-
relatedSearches,
|
|
93
|
-
deepseekSynthesis,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=execute.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/web-search/execute.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Provider orchestration and execution-state construction for web_search.\n */\n\nimport type { AgentToolUpdateCallback } from \"../../core/extensions/types.ts\";\nimport { configuredEngine } from \"./auth.ts\";\nimport { getEngineLabel, WEB_SEARCH_DISABLED_MESSAGE } from \"./constants.ts\";\nimport { searchDeepSeek } from \"./providers/deepseek.ts\";\nimport { searchMiniMax } from \"./providers/minimax.ts\";\nimport { boundSingleLineText, fuseSearchHits, MAX_ERROR_MESSAGE_LENGTH, MAX_QUERY_LENGTH } from \"./results.ts\";\nimport type { WebSearchParams } from \"./schema.ts\";\nimport type { ProviderSearchResult, ResolvedSearchCredentials, SearchEngineType, WebSearchDetails } from \"./types.ts\";\n\n/** Execute all configured search providers and combine their successful results. */\nexport async function executeWebSearch(\n\tparams: WebSearchParams,\n\tcredentials: ResolvedSearchCredentials,\n\tsignal?: AbortSignal,\n\tonUpdate?: AgentToolUpdateCallback<WebSearchDetails>,\n): Promise<WebSearchDetails> {\n\tconst startTime = Date.now();\n\tconst query = boundSingleLineText(params.query, MAX_QUERY_LENGTH) ?? \"\";\n\tconst engine = configuredEngine(credentials);\n\n\tif (!query) {\n\t\treturn {\n\t\t\tquery: \"\",\n\t\t\tdurationMs: 0,\n\t\t\tstatus: \"error\",\n\t\t\tengine,\n\t\t\ttotalHits: 0,\n\t\t\thits: [],\n\t\t\terrorMessage: \"Search query must not be empty.\",\n\t\t};\n\t}\n\n\tif (engine === \"none\") {\n\t\treturn {\n\t\t\tquery,\n\t\t\tdurationMs: 0,\n\t\t\tstatus: \"disabled\",\n\t\t\tengine: \"none\",\n\t\t\ttotalHits: 0,\n\t\t\thits: [],\n\t\t\terrorMessage: WEB_SEARCH_DISABLED_MESSAGE,\n\t\t};\n\t}\n\n\tsignal?.throwIfAborted();\n\tonUpdate?.({\n\t\tcontent: [{ type: \"text\", text: `Searching for \"${query}\" via ${getEngineLabel(engine)}...` }],\n\t\tdetails: {\n\t\t\tquery,\n\t\t\tdurationMs: 0,\n\t\t\tstatus: \"success\",\n\t\t\tengine,\n\t\t\ttotalHits: 0,\n\t\t\thits: [],\n\t\t},\n\t});\n\n\tconst searches: Promise<ProviderSearchResult>[] = [];\n\tif (credentials.minimax) {\n\t\tsearches.push(\n\t\t\tsearchMiniMax({\n\t\t\t\tquery,\n\t\t\t\tapiKey: credentials.minimax.key,\n\t\t\t\tapiHost: credentials.minimax.host,\n\t\t\t\tsignal,\n\t\t\t}),\n\t\t);\n\t}\n\tif (credentials.deepseek) {\n\t\tsearches.push(searchDeepSeek({ query, apiKey: credentials.deepseek.key, signal }));\n\t}\n\n\tconst settledResults = await Promise.allSettled(searches);\n\tsignal?.throwIfAborted();\n\tconst durationMs = Date.now() - startTime;\n\tconst successfulResults: ProviderSearchResult[] = [];\n\tconst errors: string[] = [];\n\n\tfor (const result of settledResults) {\n\t\tif (result.status === \"fulfilled\") successfulResults.push(result.value);\n\t\telse errors.push(result.reason instanceof Error ? result.reason.message : String(result.reason));\n\t}\n\n\tif (successfulResults.length === 0) {\n\t\treturn {\n\t\t\tquery,\n\t\t\tdurationMs,\n\t\t\tstatus: \"error\",\n\t\t\tengine,\n\t\t\ttotalHits: 0,\n\t\t\thits: [],\n\t\t\terrorMessage: boundSingleLineText(errors.join(\" | \"), MAX_ERROR_MESSAGE_LENGTH) ?? \"All search engines failed\",\n\t\t};\n\t}\n\n\tconst { hits, relatedSearches, deepseekSynthesis } = fuseSearchHits(successfulResults);\n\tconst respondedSources = new Set(successfulResults.map((result) => result.source));\n\tconst contributingEngine: SearchEngineType =\n\t\trespondedSources.size > 1 ? \"dual\" : respondedSources.has(\"MiniMax\") ? \"minimax\" : \"deepseek\";\n\treturn {\n\t\tquery,\n\t\tdurationMs,\n\t\tstatus: \"success\",\n\t\tengine: contributingEngine,\n\t\ttotalHits: hits.length,\n\t\thits,\n\t\trelatedSearches,\n\t\tdeepseekSynthesis,\n\t};\n}\n"]}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Model-facing and expanded-TUI Markdown formatting for web_search results.
|
|
3
|
-
*/
|
|
4
|
-
import type { WebSearchDetails, WebSearchHit } from "./types.ts";
|
|
5
|
-
interface PreparedResults {
|
|
6
|
-
engine: WebSearchDetails["engine"];
|
|
7
|
-
hits: WebSearchHit[];
|
|
8
|
-
synthesis?: string;
|
|
9
|
-
relatedSearches: string[];
|
|
10
|
-
}
|
|
11
|
-
/** Historical details enter here; Markdown rendering only consumes bounded content. */
|
|
12
|
-
export declare function prepareResults(details: WebSearchDetails): PreparedResults;
|
|
13
|
-
/**
|
|
14
|
-
* Sources, synthesis, and related-search sections shared by model output and
|
|
15
|
-
* the expanded TUI. This function adds no model instructions.
|
|
16
|
-
*/
|
|
17
|
-
export declare function formatResultsMarkdown({ engine, hits, synthesis, relatedSearches }: PreparedResults): string;
|
|
18
|
-
/** Format a structured result payload for the main agent. */
|
|
19
|
-
export declare function formatSearchOutput(details: WebSearchDetails): string;
|
|
20
|
-
export {};
|
|
21
|
-
//# sourceMappingURL=format.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA8CjE,UAAU,eAAe;IACxB,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAczE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,eAAe,GAAG,MAAM,CA2B3G;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAyBpE"}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Model-facing and expanded-TUI Markdown formatting for web_search results.
|
|
3
|
-
*/
|
|
4
|
-
import { getEngineLabel, WEB_SEARCH_DISABLED_MESSAGE } from "./constants.js";
|
|
5
|
-
import { boundMultilineText, boundSingleLineText, MAX_ERROR_MESSAGE_LENGTH, MAX_HISTORICAL_HIT_SCAN, MAX_HISTORICAL_RELATED_SCAN, MAX_HISTORICAL_SOURCE_SCAN, MAX_OUTPUT_HITS, MAX_QUERY_LENGTH, MAX_RELATED_SEARCH_LENGTH, MAX_RELATED_SEARCHES, MAX_SNIPPET_LENGTH, MAX_SYNTHESIS_LENGTH, MAX_TITLE_LENGTH, normalizeUrl, } from "./results.js";
|
|
6
|
-
function escapeMarkdownText(text) {
|
|
7
|
-
return text
|
|
8
|
-
.replace(/\\/g, "\\\\")
|
|
9
|
-
.replace(/\[/g, "\\[")
|
|
10
|
-
.replace(/\]/g, "\\]")
|
|
11
|
-
.replace(/</g, "\\<")
|
|
12
|
-
.replace(/>/g, "\\>");
|
|
13
|
-
}
|
|
14
|
-
function canonicalSources(value) {
|
|
15
|
-
if (!Array.isArray(value))
|
|
16
|
-
return [];
|
|
17
|
-
const sources = [];
|
|
18
|
-
const scanLimit = Math.min(value.length, MAX_HISTORICAL_SOURCE_SCAN);
|
|
19
|
-
for (let index = 0; index < scanLimit && sources.length < 2; index++) {
|
|
20
|
-
const source = value[index];
|
|
21
|
-
if ((source === "MiniMax" || source === "DeepSeek") && !sources.includes(source))
|
|
22
|
-
sources.push(source);
|
|
23
|
-
}
|
|
24
|
-
return sources;
|
|
25
|
-
}
|
|
26
|
-
function prepareHit(value) {
|
|
27
|
-
if (!value || typeof value !== "object")
|
|
28
|
-
return undefined;
|
|
29
|
-
const hit = value;
|
|
30
|
-
const url = normalizeUrl(hit.url);
|
|
31
|
-
if (!url)
|
|
32
|
-
return undefined;
|
|
33
|
-
return {
|
|
34
|
-
title: boundSingleLineText(hit.title, MAX_TITLE_LENGTH) ?? url,
|
|
35
|
-
url,
|
|
36
|
-
snippet: boundSingleLineText(hit.snippet, MAX_SNIPPET_LENGTH),
|
|
37
|
-
sources: canonicalSources(hit.sources),
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
function usableHits(details) {
|
|
41
|
-
const hits = Array.isArray(details.hits) ? details.hits : [];
|
|
42
|
-
const prepared = [];
|
|
43
|
-
const scanLimit = Math.min(hits.length, MAX_HISTORICAL_HIT_SCAN);
|
|
44
|
-
for (let index = 0; index < scanLimit && prepared.length < MAX_OUTPUT_HITS; index++) {
|
|
45
|
-
const hit = prepareHit(hits[index]);
|
|
46
|
-
if (hit)
|
|
47
|
-
prepared.push(hit);
|
|
48
|
-
}
|
|
49
|
-
return prepared;
|
|
50
|
-
}
|
|
51
|
-
/** Historical details enter here; Markdown rendering only consumes bounded content. */
|
|
52
|
-
export function prepareResults(details) {
|
|
53
|
-
const relatedSearches = [];
|
|
54
|
-
const historicalRelated = Array.isArray(details.relatedSearches) ? details.relatedSearches : [];
|
|
55
|
-
const relatedScanLimit = Math.min(historicalRelated.length, MAX_HISTORICAL_RELATED_SCAN);
|
|
56
|
-
for (let index = 0; index < relatedScanLimit && relatedSearches.length < MAX_RELATED_SEARCHES; index++) {
|
|
57
|
-
const related = boundSingleLineText(historicalRelated[index], MAX_RELATED_SEARCH_LENGTH);
|
|
58
|
-
if (related)
|
|
59
|
-
relatedSearches.push(related);
|
|
60
|
-
}
|
|
61
|
-
return {
|
|
62
|
-
engine: details.engine,
|
|
63
|
-
hits: usableHits(details),
|
|
64
|
-
synthesis: boundMultilineText(details.deepseekSynthesis, MAX_SYNTHESIS_LENGTH),
|
|
65
|
-
relatedSearches,
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Sources, synthesis, and related-search sections shared by model output and
|
|
70
|
-
* the expanded TUI. This function adds no model instructions.
|
|
71
|
-
*/
|
|
72
|
-
export function formatResultsMarkdown({ engine, hits, synthesis, relatedSearches }) {
|
|
73
|
-
const parts = [];
|
|
74
|
-
if (hits.length > 0) {
|
|
75
|
-
parts.push(`## Web Sources (${hits.length} found via ${getEngineLabel(engine)})\n`);
|
|
76
|
-
hits.forEach((hit, index) => {
|
|
77
|
-
const sourceTag = hit.sources.length > 1 ? ` — *(found by ${hit.sources.join(" & ")})*` : "";
|
|
78
|
-
parts.push(`${index + 1}. **[${escapeMarkdownText(hit.title)}](<${hit.url}>)**${sourceTag}`);
|
|
79
|
-
if (hit.snippet)
|
|
80
|
-
parts.push(` - ${escapeMarkdownText(hit.snippet)}`);
|
|
81
|
-
});
|
|
82
|
-
parts.push("");
|
|
83
|
-
}
|
|
84
|
-
if (synthesis) {
|
|
85
|
-
parts.push("## DeepSeek Search Synthesis\n");
|
|
86
|
-
parts.push(escapeMarkdownText(synthesis));
|
|
87
|
-
parts.push("");
|
|
88
|
-
}
|
|
89
|
-
if (relatedSearches.length > 0) {
|
|
90
|
-
parts.push("## Related Searches\n");
|
|
91
|
-
parts.push(relatedSearches.map((related) => `- ${escapeMarkdownText(related)}`).join("\n"));
|
|
92
|
-
parts.push("");
|
|
93
|
-
}
|
|
94
|
-
return parts.join("\n");
|
|
95
|
-
}
|
|
96
|
-
/** Format a structured result payload for the main agent. */
|
|
97
|
-
export function formatSearchOutput(details) {
|
|
98
|
-
if (details.status === "disabled")
|
|
99
|
-
return WEB_SEARCH_DISABLED_MESSAGE;
|
|
100
|
-
const boundedQuery = boundSingleLineText(details.query, MAX_QUERY_LENGTH) ?? "";
|
|
101
|
-
if (details.status === "error") {
|
|
102
|
-
const errorMessage = boundSingleLineText(details.errorMessage, MAX_ERROR_MESSAGE_LENGTH) ?? "Unknown search error";
|
|
103
|
-
return `Web search failed for "${boundedQuery}": ${errorMessage}`;
|
|
104
|
-
}
|
|
105
|
-
const prepared = prepareResults(details);
|
|
106
|
-
const hasSources = prepared.hits.length > 0;
|
|
107
|
-
const hasSynthesis = prepared.synthesis !== undefined;
|
|
108
|
-
if (!hasSources && !hasSynthesis) {
|
|
109
|
-
return `No search results found for "${boundedQuery}". Try rephrasing with different keywords.`;
|
|
110
|
-
}
|
|
111
|
-
const parts = [`# Web Search Results for: "${boundedQuery}"\n`, formatResultsMarkdown(prepared)];
|
|
112
|
-
if (hasSources) {
|
|
113
|
-
parts.push("---", "Use these search results to answer the user, and cite the relevant source URLs in your response.");
|
|
114
|
-
}
|
|
115
|
-
return parts.join("\n");
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=format.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/extensions/web-search/format.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Model-facing and expanded-TUI Markdown formatting for web_search results.\n */\n\nimport { getEngineLabel, WEB_SEARCH_DISABLED_MESSAGE } from \"./constants.ts\";\nimport {\n\tboundMultilineText,\n\tboundSingleLineText,\n\tMAX_ERROR_MESSAGE_LENGTH,\n\tMAX_HISTORICAL_HIT_SCAN,\n\tMAX_HISTORICAL_RELATED_SCAN,\n\tMAX_HISTORICAL_SOURCE_SCAN,\n\tMAX_OUTPUT_HITS,\n\tMAX_QUERY_LENGTH,\n\tMAX_RELATED_SEARCH_LENGTH,\n\tMAX_RELATED_SEARCHES,\n\tMAX_SNIPPET_LENGTH,\n\tMAX_SYNTHESIS_LENGTH,\n\tMAX_TITLE_LENGTH,\n\tnormalizeUrl,\n} from \"./results.ts\";\nimport type { WebSearchDetails, WebSearchHit } from \"./types.ts\";\n\nfunction escapeMarkdownText(text: string): string {\n\treturn text\n\t\t.replace(/\\\\/g, \"\\\\\\\\\")\n\t\t.replace(/\\[/g, \"\\\\[\")\n\t\t.replace(/\\]/g, \"\\\\]\")\n\t\t.replace(/</g, \"\\\\<\")\n\t\t.replace(/>/g, \"\\\\>\");\n}\n\nfunction canonicalSources(value: unknown): WebSearchHit[\"sources\"] {\n\tif (!Array.isArray(value)) return [];\n\tconst sources: WebSearchHit[\"sources\"] = [];\n\tconst scanLimit = Math.min(value.length, MAX_HISTORICAL_SOURCE_SCAN);\n\tfor (let index = 0; index < scanLimit && sources.length < 2; index++) {\n\t\tconst source = value[index];\n\t\tif ((source === \"MiniMax\" || source === \"DeepSeek\") && !sources.includes(source)) sources.push(source);\n\t}\n\treturn sources;\n}\n\nfunction prepareHit(value: unknown): WebSearchHit | undefined {\n\tif (!value || typeof value !== \"object\") return undefined;\n\tconst hit = value as Record<string, unknown>;\n\tconst url = normalizeUrl(hit.url);\n\tif (!url) return undefined;\n\treturn {\n\t\ttitle: boundSingleLineText(hit.title, MAX_TITLE_LENGTH) ?? url,\n\t\turl,\n\t\tsnippet: boundSingleLineText(hit.snippet, MAX_SNIPPET_LENGTH),\n\t\tsources: canonicalSources(hit.sources),\n\t};\n}\n\nfunction usableHits(details: WebSearchDetails): WebSearchHit[] {\n\tconst hits = Array.isArray(details.hits) ? details.hits : [];\n\tconst prepared: WebSearchHit[] = [];\n\tconst scanLimit = Math.min(hits.length, MAX_HISTORICAL_HIT_SCAN);\n\tfor (let index = 0; index < scanLimit && prepared.length < MAX_OUTPUT_HITS; index++) {\n\t\tconst hit = prepareHit(hits[index]);\n\t\tif (hit) prepared.push(hit);\n\t}\n\treturn prepared;\n}\n\ninterface PreparedResults {\n\tengine: WebSearchDetails[\"engine\"];\n\thits: WebSearchHit[];\n\tsynthesis?: string;\n\trelatedSearches: string[];\n}\n\n/** Historical details enter here; Markdown rendering only consumes bounded content. */\nexport function prepareResults(details: WebSearchDetails): PreparedResults {\n\tconst relatedSearches: string[] = [];\n\tconst historicalRelated = Array.isArray(details.relatedSearches) ? details.relatedSearches : [];\n\tconst relatedScanLimit = Math.min(historicalRelated.length, MAX_HISTORICAL_RELATED_SCAN);\n\tfor (let index = 0; index < relatedScanLimit && relatedSearches.length < MAX_RELATED_SEARCHES; index++) {\n\t\tconst related = boundSingleLineText(historicalRelated[index], MAX_RELATED_SEARCH_LENGTH);\n\t\tif (related) relatedSearches.push(related);\n\t}\n\treturn {\n\t\tengine: details.engine,\n\t\thits: usableHits(details),\n\t\tsynthesis: boundMultilineText(details.deepseekSynthesis, MAX_SYNTHESIS_LENGTH),\n\t\trelatedSearches,\n\t};\n}\n\n/**\n * Sources, synthesis, and related-search sections shared by model output and\n * the expanded TUI. This function adds no model instructions.\n */\nexport function formatResultsMarkdown({ engine, hits, synthesis, relatedSearches }: PreparedResults): string {\n\tconst parts: string[] = [];\n\n\tif (hits.length > 0) {\n\t\tparts.push(`## Web Sources (${hits.length} found via ${getEngineLabel(engine)})\\n`);\n\n\t\thits.forEach((hit, index) => {\n\t\t\tconst sourceTag = hit.sources.length > 1 ? ` — *(found by ${hit.sources.join(\" & \")})*` : \"\";\n\t\t\tparts.push(`${index + 1}. **[${escapeMarkdownText(hit.title)}](<${hit.url}>)**${sourceTag}`);\n\t\t\tif (hit.snippet) parts.push(` - ${escapeMarkdownText(hit.snippet)}`);\n\t\t});\n\t\tparts.push(\"\");\n\t}\n\n\tif (synthesis) {\n\t\tparts.push(\"## DeepSeek Search Synthesis\\n\");\n\t\tparts.push(escapeMarkdownText(synthesis));\n\t\tparts.push(\"\");\n\t}\n\n\tif (relatedSearches.length > 0) {\n\t\tparts.push(\"## Related Searches\\n\");\n\t\tparts.push(relatedSearches.map((related) => `- ${escapeMarkdownText(related)}`).join(\"\\n\"));\n\t\tparts.push(\"\");\n\t}\n\n\treturn parts.join(\"\\n\");\n}\n\n/** Format a structured result payload for the main agent. */\nexport function formatSearchOutput(details: WebSearchDetails): string {\n\tif (details.status === \"disabled\") return WEB_SEARCH_DISABLED_MESSAGE;\n\n\tconst boundedQuery = boundSingleLineText(details.query, MAX_QUERY_LENGTH) ?? \"\";\n\tif (details.status === \"error\") {\n\t\tconst errorMessage =\n\t\t\tboundSingleLineText(details.errorMessage, MAX_ERROR_MESSAGE_LENGTH) ?? \"Unknown search error\";\n\t\treturn `Web search failed for \"${boundedQuery}\": ${errorMessage}`;\n\t}\n\n\tconst prepared = prepareResults(details);\n\tconst hasSources = prepared.hits.length > 0;\n\tconst hasSynthesis = prepared.synthesis !== undefined;\n\tif (!hasSources && !hasSynthesis) {\n\t\treturn `No search results found for \"${boundedQuery}\". Try rephrasing with different keywords.`;\n\t}\n\n\tconst parts = [`# Web Search Results for: \"${boundedQuery}\"\\n`, formatResultsMarkdown(prepared)];\n\tif (hasSources) {\n\t\tparts.push(\n\t\t\t\"---\",\n\t\t\t\"Use these search results to answer the user, and cite the relevant source URLs in your response.\",\n\t\t);\n\t}\n\treturn parts.join(\"\\n\");\n}\n"]}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* web_search — Pi-native Web Search extension combining MiniMax and DeepSeek search engines.
|
|
3
|
-
*/
|
|
4
|
-
import type { ExtensionAPI } from "../../core/extensions/types.ts";
|
|
5
|
-
export default function webSearch(pi: ExtensionAPI): void;
|
|
6
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAenE,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAyCxD"}
|