@astralyn/pi 0.84.12 → 0.84.13
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 +10 -0
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +2 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/web-search/auth.d.ts +12 -0
- package/dist/extensions/web-search/auth.d.ts.map +1 -0
- package/dist/extensions/web-search/auth.js +90 -0
- package/dist/extensions/web-search/auth.js.map +1 -0
- package/dist/extensions/web-search/constants.d.ts +13 -0
- package/dist/extensions/web-search/constants.d.ts.map +1 -0
- package/dist/extensions/web-search/constants.js +27 -0
- package/dist/extensions/web-search/constants.js.map +1 -0
- package/dist/extensions/web-search/fusion.d.ts +36 -0
- package/dist/extensions/web-search/fusion.d.ts.map +1 -0
- package/dist/extensions/web-search/fusion.js +272 -0
- package/dist/extensions/web-search/fusion.js.map +1 -0
- package/dist/extensions/web-search/index.d.ts +6 -0
- package/dist/extensions/web-search/index.d.ts.map +1 -0
- package/dist/extensions/web-search/index.js +70 -0
- package/dist/extensions/web-search/index.js.map +1 -0
- package/dist/extensions/web-search/providers/deepseek.d.ts +15 -0
- package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -0
- package/dist/extensions/web-search/providers/deepseek.js +63 -0
- package/dist/extensions/web-search/providers/deepseek.js.map +1 -0
- package/dist/extensions/web-search/providers/http.d.ts +9 -0
- package/dist/extensions/web-search/providers/http.d.ts.map +1 -0
- package/dist/extensions/web-search/providers/http.js +25 -0
- package/dist/extensions/web-search/providers/http.js.map +1 -0
- package/dist/extensions/web-search/providers/minimax.d.ts +14 -0
- package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -0
- package/dist/extensions/web-search/providers/minimax.js +69 -0
- package/dist/extensions/web-search/providers/minimax.js.map +1 -0
- package/dist/extensions/web-search/render.d.ts +11 -0
- package/dist/extensions/web-search/render.d.ts.map +1 -0
- package/dist/extensions/web-search/render.js +109 -0
- package/dist/extensions/web-search/render.js.map +1 -0
- package/dist/extensions/web-search/schema.d.ts +12 -0
- package/dist/extensions/web-search/schema.d.ts.map +1 -0
- package/dist/extensions/web-search/schema.js +57 -0
- package/dist/extensions/web-search/schema.js.map +1 -0
- package/dist/extensions/web-search/types.d.ts +111 -0
- package/dist/extensions/web-search/types.d.ts.map +1 -0
- package/dist/extensions/web-search/types.js +5 -0
- package/dist/extensions/web-search/types.js.map +1 -0
- package/docs/bundled/README.md +1 -0
- package/docs/bundled/extensions/web-search.md +50 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* types.ts — Type definitions for web_search extension providers and fusion engine.
|
|
3
|
+
*/
|
|
4
|
+
export type SearchEngineType = "minimax" | "deepseek" | "dual" | "none";
|
|
5
|
+
export type SearchEngineSource = "MiniMax" | "DeepSeek";
|
|
6
|
+
export interface WebSearchHit {
|
|
7
|
+
title: string;
|
|
8
|
+
url: string;
|
|
9
|
+
snippet?: string;
|
|
10
|
+
date?: string;
|
|
11
|
+
sources: SearchEngineSource[];
|
|
12
|
+
}
|
|
13
|
+
export interface WebSearchDetails {
|
|
14
|
+
query: string;
|
|
15
|
+
durationMs: number;
|
|
16
|
+
status: "success" | "error" | "disabled";
|
|
17
|
+
engine: SearchEngineType;
|
|
18
|
+
totalHits: number;
|
|
19
|
+
hits: WebSearchHit[];
|
|
20
|
+
relatedSearches?: string[];
|
|
21
|
+
deepseekSynthesis?: string;
|
|
22
|
+
errorMessage?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* MiniMax search credential. `host` is always present alongside `key` so
|
|
26
|
+
* callers never guard the two separately.
|
|
27
|
+
*/
|
|
28
|
+
export interface MiniMaxSearchCredential {
|
|
29
|
+
key: string;
|
|
30
|
+
host: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolved credentials: presence of a group means that engine is configured,
|
|
34
|
+
* so impossible states (mode without key, key without host) are unrepresentable.
|
|
35
|
+
* Use `configuredEngine()` from auth.ts to derive the SearchEngineType label.
|
|
36
|
+
*/
|
|
37
|
+
export interface ResolvedSearchCredentials {
|
|
38
|
+
minimax?: MiniMaxSearchCredential;
|
|
39
|
+
deepseek?: {
|
|
40
|
+
key: string;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export interface MiniMaxOrganicHit {
|
|
44
|
+
title: string;
|
|
45
|
+
link: string;
|
|
46
|
+
snippet?: string;
|
|
47
|
+
date?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface MiniMaxSearchResponse {
|
|
50
|
+
organic?: MiniMaxOrganicHit[];
|
|
51
|
+
related_searches?: {
|
|
52
|
+
query: string;
|
|
53
|
+
}[];
|
|
54
|
+
base_resp?: {
|
|
55
|
+
status_code: number;
|
|
56
|
+
status_msg: string;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export interface DeepSeekServerToolUseBlock {
|
|
60
|
+
type: "server_tool_use";
|
|
61
|
+
id: string;
|
|
62
|
+
name: "web_search";
|
|
63
|
+
input?: {
|
|
64
|
+
query?: string;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface DeepSeekWebSearchResultItem {
|
|
68
|
+
type: "web_search_result";
|
|
69
|
+
title: string;
|
|
70
|
+
url: string;
|
|
71
|
+
page_age?: string | null;
|
|
72
|
+
encrypted_content?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface DeepSeekWebSearchToolResultBlock {
|
|
75
|
+
type: "web_search_tool_result";
|
|
76
|
+
tool_use_id: string;
|
|
77
|
+
content?: DeepSeekWebSearchResultItem[];
|
|
78
|
+
}
|
|
79
|
+
export interface DeepSeekTextBlock {
|
|
80
|
+
type: "text";
|
|
81
|
+
text?: string;
|
|
82
|
+
citations?: {
|
|
83
|
+
type: string;
|
|
84
|
+
title?: string;
|
|
85
|
+
url?: string;
|
|
86
|
+
cited_text?: string;
|
|
87
|
+
}[];
|
|
88
|
+
}
|
|
89
|
+
export type DeepSeekContentBlock = DeepSeekServerToolUseBlock | DeepSeekWebSearchToolResultBlock | DeepSeekTextBlock | {
|
|
90
|
+
type: string;
|
|
91
|
+
[key: string]: unknown;
|
|
92
|
+
};
|
|
93
|
+
export interface DeepSeekMessagesResponse {
|
|
94
|
+
id?: string;
|
|
95
|
+
type?: string;
|
|
96
|
+
role?: string;
|
|
97
|
+
model?: string;
|
|
98
|
+
content?: DeepSeekContentBlock[];
|
|
99
|
+
stop_reason?: string;
|
|
100
|
+
error?: {
|
|
101
|
+
type?: string;
|
|
102
|
+
message?: string;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export interface ProviderSearchResult {
|
|
106
|
+
source: SearchEngineSource;
|
|
107
|
+
hits: WebSearchHit[];
|
|
108
|
+
relatedSearches?: string[];
|
|
109
|
+
synthesisText?: string;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/extensions/web-search/types.ts"],"names":[],"mappings":"AAAA;;GAEG","sourcesContent":["/**\n * types.ts — Type definitions for web_search extension providers and fusion engine.\n */\n\nexport type SearchEngineType = \"minimax\" | \"deepseek\" | \"dual\" | \"none\";\nexport type SearchEngineSource = \"MiniMax\" | \"DeepSeek\";\n\nexport interface WebSearchHit {\n\ttitle: string;\n\turl: string;\n\tsnippet?: string;\n\tdate?: string;\n\tsources: SearchEngineSource[];\n}\n\nexport interface WebSearchDetails {\n\tquery: string;\n\tdurationMs: number;\n\tstatus: \"success\" | \"error\" | \"disabled\";\n\tengine: SearchEngineType;\n\ttotalHits: number;\n\thits: WebSearchHit[];\n\trelatedSearches?: string[];\n\tdeepseekSynthesis?: string;\n\terrorMessage?: string;\n}\n\n/**\n * MiniMax search credential. `host` is always present alongside `key` so\n * callers never guard the two separately.\n */\nexport interface MiniMaxSearchCredential {\n\tkey: string;\n\thost: string;\n}\n\n/**\n * Resolved credentials: presence of a group means that engine is configured,\n * so impossible states (mode without key, key without host) are unrepresentable.\n * Use `configuredEngine()` from auth.ts to derive the SearchEngineType label.\n */\nexport interface ResolvedSearchCredentials {\n\tminimax?: MiniMaxSearchCredential;\n\tdeepseek?: { key: string };\n}\n\nexport interface MiniMaxOrganicHit {\n\ttitle: string;\n\tlink: string;\n\tsnippet?: string;\n\tdate?: string;\n}\n\nexport interface MiniMaxSearchResponse {\n\torganic?: MiniMaxOrganicHit[];\n\trelated_searches?: { query: string }[];\n\tbase_resp?: {\n\t\tstatus_code: number;\n\t\tstatus_msg: string;\n\t};\n}\n\nexport interface DeepSeekServerToolUseBlock {\n\ttype: \"server_tool_use\";\n\tid: string;\n\tname: \"web_search\";\n\tinput?: { query?: string };\n}\n\nexport interface DeepSeekWebSearchResultItem {\n\ttype: \"web_search_result\";\n\ttitle: string;\n\turl: string;\n\tpage_age?: string | null;\n\tencrypted_content?: string;\n}\n\nexport interface DeepSeekWebSearchToolResultBlock {\n\ttype: \"web_search_tool_result\";\n\ttool_use_id: string;\n\tcontent?: DeepSeekWebSearchResultItem[];\n}\n\nexport interface DeepSeekTextBlock {\n\ttype: \"text\";\n\ttext?: string;\n\tcitations?: {\n\t\ttype: string;\n\t\ttitle?: string;\n\t\turl?: string;\n\t\tcited_text?: string;\n\t}[];\n}\n\nexport type DeepSeekContentBlock =\n\t| DeepSeekServerToolUseBlock\n\t| DeepSeekWebSearchToolResultBlock\n\t| DeepSeekTextBlock\n\t| { type: string; [key: string]: unknown };\n\nexport interface DeepSeekMessagesResponse {\n\tid?: string;\n\ttype?: string;\n\trole?: string;\n\tmodel?: string;\n\tcontent?: DeepSeekContentBlock[];\n\tstop_reason?: string;\n\terror?: {\n\t\ttype?: string;\n\t\tmessage?: string;\n\t};\n}\n\nexport interface ProviderSearchResult {\n\tsource: SearchEngineSource;\n\thits: WebSearchHit[];\n\trelatedSearches?: string[];\n\tsynthesisText?: string;\n}\n"]}
|
package/docs/bundled/README.md
CHANGED
|
@@ -16,6 +16,7 @@ These hidden built-ins use the same public Extension API available to external e
|
|
|
16
16
|
| [Statusline](extensions/statusline.md) | Footer status | Show concise extension-managed activity state |
|
|
17
17
|
| [Subagent](extensions/subagent.md) | `subagent`, `/agents` | Delegate bounded work to isolated child Pi sessions |
|
|
18
18
|
| [Todo](extensions/todo.md) | `todo`, `/todos` | Track ordered multi-step work in a compact one-line widget |
|
|
19
|
+
| [Web Search](extensions/web-search.md) | `web_search` | Search the live web through MiniMax and DeepSeek with fused results |
|
|
19
20
|
|
|
20
21
|
## Context safety
|
|
21
22
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Web Search
|
|
2
|
+
|
|
3
|
+
`web_search` is a Pi-native tool for querying live web information through MiniMax and DeepSeek search engines.
|
|
4
|
+
|
|
5
|
+
When both engines are configured, searches run concurrently and results are fused: URLs are normalized (tracking parameters and fragments stripped), duplicates merged, and hits verified by both engines rank first.
|
|
6
|
+
|
|
7
|
+
| Engine mode | Requirement |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `dual` | Both MiniMax and DeepSeek keys configured |
|
|
10
|
+
| `minimax` | Only a MiniMax key configured |
|
|
11
|
+
| `deepseek` | Only a DeepSeek key configured |
|
|
12
|
+
| `none` | No key found — the tool reports itself disabled |
|
|
13
|
+
|
|
14
|
+
## Credentials
|
|
15
|
+
|
|
16
|
+
Keys are resolved per provider through the runtime's canonical auth chain (`ModelRuntime.getAuth`: runtime API key → `auth.json` → `models.json` → environment). When no runtime is available (or it does not know the provider), the extension falls back to reading `auth.json` directly (provider IDs `minimax-cn`, `minimax`, `deepseek`, including command-configured keys such as `"!op read ..."`) and then the environment variables `MINIMAX_CN_API_KEY`, `MINIMAX_API_KEY`, `DEEPSEEK_API_KEY`.
|
|
17
|
+
|
|
18
|
+
The MiniMax CN account (`minimax-cn`) is preferred over the global one (`minimax`) and selects the `api.minimaxi.com` search host; the global account uses `api.minimax.io`, overridable via `MINIMAX_API_HOST`.
|
|
19
|
+
|
|
20
|
+
Configure with `/login minimax-cn` or `/login deepseek`, or by exporting the environment variables above.
|
|
21
|
+
|
|
22
|
+
When no key is configured, `web_search` is removed from the model's tool set and system prompt entirely — the model never sees or calls it. This is re-evaluated on every session start (`startup`, `/new`, `/reload`, resume, fork), so a mid-session `/login` takes effect from the next session onward. The tool stays registered: it remains listed in `/tools` (where it can be force-enabled, in which case calls fail with the disabled message), and historical sessions render normally.
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
### Parameters
|
|
27
|
+
|
|
28
|
+
- `query`: the search query — 3–5 keywords work best.
|
|
29
|
+
- `allowed_domains`: optional list of domains to include (e.g. `["github.com", "react.dev"]`).
|
|
30
|
+
- `blocked_domains`: optional list of domains to exclude.
|
|
31
|
+
|
|
32
|
+
`allowed_domains` and `blocked_domains` are mutually exclusive; if both are supplied, `allowed_domains` wins. Domain filters apply both in the upstream query and as a local post-filter on result URLs (subdomains included).
|
|
33
|
+
|
|
34
|
+
### Output
|
|
35
|
+
|
|
36
|
+
The model-facing payload is Markdown containing up to 12 verified sources (snippets bounded to 200 characters each, dual-engine hits tagged), a DeepSeek synthesis section when available, and up to 8 related searches, followed by a requirement to cite a `Sources:` section.
|
|
37
|
+
|
|
38
|
+
## Limits
|
|
39
|
+
|
|
40
|
+
- With no configured key the tool is hidden from the model (see Credentials); the disabled message only appears when the tool was force-enabled via `/tools` without keys.
|
|
41
|
+
- Engine failures are independent: if one engine errors, the other's results are still returned; the tool errors only when every configured engine fails.
|
|
42
|
+
- MiniMax search uses the Coding Plan Search endpoint (`POST /v1/coding_plan/search`), which requires a Coding Plan key — a standard MiniMax API key may be rejected upstream.
|
|
43
|
+
- DeepSeek search goes through the Anthropic-compatible endpoint (`/anthropic/v1/messages`, model `claude-sonnet-search`) with the server-side `web_search_20250305` tool; the synthesis text is bounded by the request's `max_tokens` (1024).
|
|
44
|
+
- Requests time out after 60 seconds (MiniMax) or 90 seconds (DeepSeek) and surface as Pi tool errors; upstream error bodies are truncated to 200 characters.
|
|
45
|
+
|
|
46
|
+
## Implementation notes
|
|
47
|
+
|
|
48
|
+
The extension keeps presentation Pi-native: the call line shows the query and active domain filters, in-flight renders show the engine label with elapsed time past 2s, the collapsed result shows hit count, engines, duration, and a top-domain preview with the configured expand hint, and expanding renders the result sections from `details` — without the model-facing agent directives — falling back to the raw payload for legacy entries.
|
|
49
|
+
|
|
50
|
+
Credential resolution never inspects `getProviderAuthStatus` — that probe returns a truthy `AuthStatus` object even when nothing is configured and carries no key. Only `getAuth` returns usable key material.
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astralyn/pi",
|
|
3
|
-
"version": "0.84.
|
|
3
|
+
"version": "0.84.13",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@astralyn/pi",
|
|
9
|
-
"version": "0.84.
|
|
9
|
+
"version": "0.84.13",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@earendil-works/pi-agent-core": "0.84.4",
|