@astralyn/pi 1.0.5 → 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 +37 -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-HDHRZ7GT.js → chunk-C2ARIVS3.js} +1 -1
- package/dist/bundle/chunks/{chunk-IE3Z7ESB.js → chunk-D3XW5X3Z.js} +371 -246
- 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 +2 -2
- 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-46MSJGKO.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 +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +13 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +12 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +146 -174
- 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 +11 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.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/sdk.d.ts +4 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +17 -5
- 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/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/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 +63 -7
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/tool.js +2 -2
- 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/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/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/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/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 +23 -3
- package/docs/docs.json +0 -4
- package/docs/environment-variables.md +1 -0
- package/docs/extensions.md +5 -1
- package/docs/json.md +2 -2
- package/docs/llama-cpp.md +8 -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 +3 -3
- package/docs/terminal-setup.md +14 -0
- package/docs/usage.md +5 -3
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/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 +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"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* web_search — Pi-native Web Search extension combining MiniMax and DeepSeek search engines.
|
|
3
|
-
*/
|
|
4
|
-
import { configuredEngine, resolveSearchCredentials } from "./auth.js";
|
|
5
|
-
import { getWebSearchPromptGuidelines, WEB_SEARCH_DESCRIPTION, WEB_SEARCH_LABEL, WEB_SEARCH_PROMPT_SNIPPET, WEB_SEARCH_TOOL_NAME, } from "./constants.js";
|
|
6
|
-
import { executeWebSearch } from "./execute.js";
|
|
7
|
-
import { formatSearchOutput } from "./format.js";
|
|
8
|
-
import { renderWebSearchCall, renderWebSearchResult } from "./render.js";
|
|
9
|
-
import { normalizeWebSearchParams, WebSearchParamsSchema } from "./schema.js";
|
|
10
|
-
export default function webSearch(pi) {
|
|
11
|
-
pi.registerTool({
|
|
12
|
-
name: WEB_SEARCH_TOOL_NAME,
|
|
13
|
-
label: WEB_SEARCH_LABEL,
|
|
14
|
-
description: WEB_SEARCH_DESCRIPTION,
|
|
15
|
-
promptSnippet: WEB_SEARCH_PROMPT_SNIPPET,
|
|
16
|
-
promptGuidelines: getWebSearchPromptGuidelines(),
|
|
17
|
-
parameters: WebSearchParamsSchema,
|
|
18
|
-
prepareArguments: normalizeWebSearchParams,
|
|
19
|
-
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
20
|
-
const credentials = await resolveSearchCredentials(ctx.modelRuntime);
|
|
21
|
-
const details = await executeWebSearch(params, credentials, signal, onUpdate);
|
|
22
|
-
return {
|
|
23
|
-
content: [{ type: "text", text: formatSearchOutput(details) }],
|
|
24
|
-
details,
|
|
25
|
-
};
|
|
26
|
-
},
|
|
27
|
-
renderCall: renderWebSearchCall,
|
|
28
|
-
renderResult: renderWebSearchResult,
|
|
29
|
-
});
|
|
30
|
-
// Keep the tool out of the model's tool set (and system prompt) when no search
|
|
31
|
-
// credentials are configured. Re-evaluated on every session start (startup,
|
|
32
|
-
// /new, /reload, resume, fork), so /login takes effect from the next session
|
|
33
|
-
// onward; the tool stays registered for /tools and historical rendering.
|
|
34
|
-
pi.on("session_start", async (_event, ctx) => {
|
|
35
|
-
const credentials = await resolveSearchCredentials(ctx.modelRuntime);
|
|
36
|
-
if (configuredEngine(credentials) !== "none")
|
|
37
|
-
return;
|
|
38
|
-
const active = new Set(pi.getActiveTools());
|
|
39
|
-
if (active.delete(WEB_SEARCH_TOOL_NAME))
|
|
40
|
-
pi.setActiveTools([...active]);
|
|
41
|
-
});
|
|
42
|
-
pi.on("tool_result", async (event) => {
|
|
43
|
-
if (event.toolName !== WEB_SEARCH_TOOL_NAME)
|
|
44
|
-
return;
|
|
45
|
-
const details = event.details;
|
|
46
|
-
if (details?.status === "error")
|
|
47
|
-
return { isError: true };
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/web-search/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EACN,4BAA4B,EAC5B,sBAAsB,EACtB,gBAAgB,EAChB,yBAAyB,EACzB,oBAAoB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAA6B,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAG9E,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAgB;IACjD,EAAE,CAAC,YAAY,CAAuE;QACrF,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,sBAAsB;QACnC,aAAa,EAAE,yBAAyB;QACxC,gBAAgB,EAAE,4BAA4B,EAAE;QAChD,UAAU,EAAE,qBAAqB;QACjC,gBAAgB,EAAE,wBAAwB;QAE1C,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG;YACvD,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAE9E,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9D,OAAO;aACP,CAAC;QACH,CAAC;QAED,UAAU,EAAE,mBAAmB;QAE/B,YAAY,EAAE,qBAAqB;KACnC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,4EAA4E;IAC5E,6EAA6E;IAC7E,yEAAyE;IACzE,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACrE,IAAI,gBAAgB,CAAC,WAAW,CAAC,KAAK,MAAM;YAAE,OAAO;QACrD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAAE,EAAE,CAAC,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACpC,IAAI,KAAK,CAAC,QAAQ,KAAK,oBAAoB;YAAE,OAAO;QACpD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAuC,CAAC;QAC9D,IAAI,OAAO,EAAE,MAAM,KAAK,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * web_search — Pi-native Web Search extension combining MiniMax and DeepSeek search engines.\n */\n\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { configuredEngine, resolveSearchCredentials } from \"./auth.ts\";\nimport {\n\tgetWebSearchPromptGuidelines,\n\tWEB_SEARCH_DESCRIPTION,\n\tWEB_SEARCH_LABEL,\n\tWEB_SEARCH_PROMPT_SNIPPET,\n\tWEB_SEARCH_TOOL_NAME,\n} from \"./constants.ts\";\nimport { executeWebSearch } from \"./execute.ts\";\nimport { formatSearchOutput } from \"./format.ts\";\nimport { renderWebSearchCall, renderWebSearchResult, type WebSearchRenderState } from \"./render.ts\";\nimport { normalizeWebSearchParams, WebSearchParamsSchema } from \"./schema.ts\";\nimport type { WebSearchDetails } from \"./types.ts\";\n\nexport default function webSearch(pi: ExtensionAPI): void {\n\tpi.registerTool<typeof WebSearchParamsSchema, WebSearchDetails, WebSearchRenderState>({\n\t\tname: WEB_SEARCH_TOOL_NAME,\n\t\tlabel: WEB_SEARCH_LABEL,\n\t\tdescription: WEB_SEARCH_DESCRIPTION,\n\t\tpromptSnippet: WEB_SEARCH_PROMPT_SNIPPET,\n\t\tpromptGuidelines: getWebSearchPromptGuidelines(),\n\t\tparameters: WebSearchParamsSchema,\n\t\tprepareArguments: normalizeWebSearchParams,\n\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tconst credentials = await resolveSearchCredentials(ctx.modelRuntime);\n\t\t\tconst details = await executeWebSearch(params, credentials, signal, onUpdate);\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: formatSearchOutput(details) }],\n\t\t\t\tdetails,\n\t\t\t};\n\t\t},\n\n\t\trenderCall: renderWebSearchCall,\n\n\t\trenderResult: renderWebSearchResult,\n\t});\n\n\t// Keep the tool out of the model's tool set (and system prompt) when no search\n\t// credentials are configured. Re-evaluated on every session start (startup,\n\t// /new, /reload, resume, fork), so /login takes effect from the next session\n\t// onward; the tool stays registered for /tools and historical rendering.\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tconst credentials = await resolveSearchCredentials(ctx.modelRuntime);\n\t\tif (configuredEngine(credentials) !== \"none\") return;\n\t\tconst active = new Set(pi.getActiveTools());\n\t\tif (active.delete(WEB_SEARCH_TOOL_NAME)) pi.setActiveTools([...active]);\n\t});\n\n\tpi.on(\"tool_result\", async (event) => {\n\t\tif (event.toolName !== WEB_SEARCH_TOOL_NAME) return;\n\t\tconst details = event.details as WebSearchDetails | undefined;\n\t\tif (details?.status === \"error\") return { isError: true };\n\t});\n}\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deepseek.ts — DeepSeek Messages API search provider (claude-sonnet-search model with web_search_20250305).
|
|
3
|
-
*/
|
|
4
|
-
import type { ProviderSearchResult } from "../types.ts";
|
|
5
|
-
export interface DeepSeekSearchOptions {
|
|
6
|
-
query: string;
|
|
7
|
-
apiKey: string;
|
|
8
|
-
baseUrl?: string;
|
|
9
|
-
model?: string;
|
|
10
|
-
signal?: AbortSignal;
|
|
11
|
-
}
|
|
12
|
-
export declare function searchDeepSeek(options: DeepSeekSearchOptions): Promise<ProviderSearchResult>;
|
|
13
|
-
//# sourceMappingURL=deepseek.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../../../src/extensions/web-search/providers/deepseek.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAG3E,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAkED,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoDlG"}
|