@schlessera/brain-ui-server 0.29.0 → 0.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/env.d.ts +9 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +18 -0
- package/dist/config/env.js.map +1 -1
- package/dist/routes/web-search.d.ts +48 -16
- package/dist/routes/web-search.d.ts.map +1 -1
- package/dist/routes/web-search.js +118 -51
- package/dist/routes/web-search.js.map +1 -1
- package/package.json +3 -3
- package/src/config/env.ts +21 -0
- package/src/routes/web-search.ts +163 -65
package/dist/config/env.d.ts
CHANGED
|
@@ -182,5 +182,14 @@ export declare function subprocessEnv(extra?: Record<string, string>): EnvRecord
|
|
|
182
182
|
*/
|
|
183
183
|
export declare function resolveGitHubToken(env?: EnvRecord): string | undefined;
|
|
184
184
|
export declare function resolvePiConfigDir(env?: EnvRecord): string;
|
|
185
|
+
/**
|
|
186
|
+
* The environment the web-search surface reads: the variables that locate the
|
|
187
|
+
* extension's `web-search.json`, plus each provider's API-key variable.
|
|
188
|
+
*
|
|
189
|
+
* PRESENCE is all anything does with the key values — they are never logged,
|
|
190
|
+
* returned over the API, or copied into the config file. Reading them here
|
|
191
|
+
* keeps the rest of the package taking configuration as a value.
|
|
192
|
+
*/
|
|
193
|
+
export declare function resolveWebSearchEnv(env?: NodeJS.ProcessEnv): Record<string, string | undefined>;
|
|
185
194
|
export {};
|
|
186
195
|
//# sourceMappingURL=env.d.ts.map
|
package/dist/config/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAErE,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|
package/dist/config/env.js
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import { join } from "path";
|
|
16
16
|
import { SEVERITIES } from "../observability/types.js";
|
|
17
17
|
import { envFlag } from "./env-core.js";
|
|
18
|
+
import { WEB_SEARCH_PROVIDERS } from "@schlessera/brain-ui-sdk/server";
|
|
18
19
|
/**
|
|
19
20
|
* Every environment variable this package reads. Order groups by concern.
|
|
20
21
|
* The env-parity gate (G4) asserts this list equals the package's env
|
|
@@ -511,4 +512,21 @@ export function resolvePiConfigDir(env = process.env) {
|
|
|
511
512
|
return join(env.XDG_CONFIG_HOME, "pi");
|
|
512
513
|
return join(env.HOME || "/root", ".pi");
|
|
513
514
|
}
|
|
515
|
+
/**
|
|
516
|
+
* The environment the web-search surface reads: the variables that locate the
|
|
517
|
+
* extension's `web-search.json`, plus each provider's API-key variable.
|
|
518
|
+
*
|
|
519
|
+
* PRESENCE is all anything does with the key values — they are never logged,
|
|
520
|
+
* returned over the API, or copied into the config file. Reading them here
|
|
521
|
+
* keeps the rest of the package taking configuration as a value.
|
|
522
|
+
*/
|
|
523
|
+
export function resolveWebSearchEnv(env = process.env) {
|
|
524
|
+
const names = [
|
|
525
|
+
"PI_CODING_AGENT_DIR",
|
|
526
|
+
"XDG_CONFIG_HOME",
|
|
527
|
+
"HOME",
|
|
528
|
+
...WEB_SEARCH_PROVIDERS.map((p) => p.envVar).filter((n) => Boolean(n)),
|
|
529
|
+
];
|
|
530
|
+
return Object.fromEntries(names.map((name) => [name, env[name]]));
|
|
531
|
+
}
|
|
514
532
|
//# sourceMappingURL=env.js.map
|
package/dist/config/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +1,77 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web-search configuration for the pi backend's `pi-web-access` extension —
|
|
3
|
-
* the Settings UI's way to
|
|
4
|
-
*
|
|
3
|
+
* the Settings UI's way to enable providers and store their API keys without
|
|
4
|
+
* a shell on the host.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
9
|
-
*
|
|
6
|
+
* Providers are TOGGLES, not a single choice. The enabled set is written as
|
|
7
|
+
* `searchRouting.providers`, ordered cheapest-first from the catalog's
|
|
8
|
+
* `costRank`, so an ordinary search is answered by a free provider and a paid
|
|
9
|
+
* one is reached only when the cheap ones fail. The model is told the same
|
|
10
|
+
* list (see `webSearchBrief`) and may override per call when a question
|
|
11
|
+
* warrants it.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* The catalog, the path resolver and the override rules live in
|
|
14
|
+
* `@schlessera/brain-ui-sdk/server` so this surface, the pi backend's system
|
|
15
|
+
* prompt and the client all read one table.
|
|
16
|
+
*
|
|
17
|
+
* Two hazards this file exists to handle:
|
|
18
|
+
*
|
|
19
|
+
* - `provider`/`searchProvider` OVERRIDE `searchRouting` in the extension, and
|
|
20
|
+
* pi's own `/curator` command writes `provider` back. Every write here
|
|
21
|
+
* deletes both; a GET that finds one reports it as an override instead of
|
|
22
|
+
* showing a chain that is not running.
|
|
23
|
+
* - A provider with no credential is skipped at search time. Enabling one is
|
|
24
|
+
* refused here rather than written into a chain that silently ignores it.
|
|
15
25
|
*
|
|
16
26
|
* Key VALUES never leave the server: GET reports only which providers have a
|
|
17
27
|
* key configured. Mount BEHIND the /api auth guard.
|
|
18
28
|
*/
|
|
19
29
|
import { Hono } from "hono";
|
|
20
30
|
import type { AgentConfig } from "../config/env.js";
|
|
21
|
-
/** One
|
|
31
|
+
/** One toggleable provider, as the Settings UI renders it. */
|
|
22
32
|
export interface WebSearchProviderView {
|
|
23
33
|
id: string;
|
|
24
34
|
label: string;
|
|
25
|
-
/**
|
|
35
|
+
/** In the active chain. */
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
/** Whether this provider accepts an API key. */
|
|
26
38
|
hasKeyField: boolean;
|
|
27
|
-
/**
|
|
39
|
+
/** A key for it is stored in the config file. */
|
|
28
40
|
keyConfigured: boolean;
|
|
29
|
-
/**
|
|
41
|
+
/** Its key comes from the environment instead — not editable here. */
|
|
42
|
+
keyFromEnv: boolean;
|
|
43
|
+
/** Works without any credential. */
|
|
30
44
|
keyless: boolean;
|
|
45
|
+
/** Qualitative cost, for the UI. */
|
|
46
|
+
costNote: string;
|
|
47
|
+
/** What it is good at. */
|
|
48
|
+
blurb: string;
|
|
31
49
|
}
|
|
32
50
|
export interface WebSearchConfigView {
|
|
33
51
|
/** False when the pi backend is not configured — the client hides the card. */
|
|
34
52
|
configured: boolean;
|
|
35
|
-
/** The active
|
|
36
|
-
|
|
53
|
+
/** The active chain, in the order it is tried. Empty = the extension picks. */
|
|
54
|
+
order: string[];
|
|
55
|
+
/**
|
|
56
|
+
* Set when a single-provider selection in the file is overriding the chain
|
|
57
|
+
* (a pre-toggle config, or pi's `/curator` command writing one back). The
|
|
58
|
+
* UI offers to clear it; until then the chain is not what runs.
|
|
59
|
+
*/
|
|
60
|
+
overriddenBy: string | null;
|
|
61
|
+
/**
|
|
62
|
+
* Labels of the models these providers actually reach — the pi profiles.
|
|
63
|
+
* Claude models use the Agent SDK's own Anthropic-hosted WebSearch, which
|
|
64
|
+
* has no provider setting, so the card has to say who it is talking about.
|
|
65
|
+
*/
|
|
66
|
+
appliesTo: string[];
|
|
37
67
|
providers: WebSearchProviderView[];
|
|
38
68
|
}
|
|
39
69
|
export interface WebSearchRoutesDeps {
|
|
40
70
|
agent: AgentConfig;
|
|
41
71
|
/** Test seam — overrides the config file location. */
|
|
42
72
|
configPath?: string;
|
|
73
|
+
/** Test seam — overrides the environment credential lookup. */
|
|
74
|
+
env?: Record<string, string | undefined>;
|
|
43
75
|
/** Test seam — forwarded to loadBackendModule. */
|
|
44
76
|
importer?: (specifier: string) => Promise<unknown>;
|
|
45
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/routes/web-search.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../src/routes/web-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,8DAA8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,WAAW,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,aAAa,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,UAAU,EAAE,OAAO,CAAC;IACpB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,+EAA+E;IAC/E,UAAU,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;OAIG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;OAIG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,qBAAqB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,WAAW,CAAC;IACnB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD;AAmCD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CA4LrE"}
|
|
@@ -1,45 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web-search configuration for the pi backend's `pi-web-access` extension —
|
|
3
|
-
* the Settings UI's way to
|
|
4
|
-
*
|
|
3
|
+
* the Settings UI's way to enable providers and store their API keys without
|
|
4
|
+
* a shell on the host.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
9
|
-
*
|
|
6
|
+
* Providers are TOGGLES, not a single choice. The enabled set is written as
|
|
7
|
+
* `searchRouting.providers`, ordered cheapest-first from the catalog's
|
|
8
|
+
* `costRank`, so an ordinary search is answered by a free provider and a paid
|
|
9
|
+
* one is reached only when the cheap ones fail. The model is told the same
|
|
10
|
+
* list (see `webSearchBrief`) and may override per call when a question
|
|
11
|
+
* warrants it.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* The catalog, the path resolver and the override rules live in
|
|
14
|
+
* `@schlessera/brain-ui-sdk/server` so this surface, the pi backend's system
|
|
15
|
+
* prompt and the client all read one table.
|
|
16
|
+
*
|
|
17
|
+
* Two hazards this file exists to handle:
|
|
18
|
+
*
|
|
19
|
+
* - `provider`/`searchProvider` OVERRIDE `searchRouting` in the extension, and
|
|
20
|
+
* pi's own `/curator` command writes `provider` back. Every write here
|
|
21
|
+
* deletes both; a GET that finds one reports it as an override instead of
|
|
22
|
+
* showing a chain that is not running.
|
|
23
|
+
* - A provider with no credential is skipped at search time. Enabling one is
|
|
24
|
+
* refused here rather than written into a chain that silently ignores it.
|
|
15
25
|
*
|
|
16
26
|
* Key VALUES never leave the server: GET reports only which providers have a
|
|
17
27
|
* key configured. Mount BEHIND the /api auth guard.
|
|
18
28
|
*/
|
|
19
29
|
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "fs";
|
|
20
|
-
import { dirname
|
|
30
|
+
import { dirname } from "path";
|
|
21
31
|
import { Hono } from "hono";
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
* The providers this surface manages. A curated subset of pi-web-access's
|
|
26
|
-
* catalog: the ones configurable by a single `<id>ApiKey` field. The
|
|
27
|
-
* extension itself accepts more (SearXNG endpoints, Ollama, …) — those stay
|
|
28
|
-
* hand-edited config, deliberately outside this UI.
|
|
29
|
-
*/
|
|
30
|
-
const MANAGED_PROVIDERS = [
|
|
31
|
-
{ id: "auto", label: "Auto — Exa (free) with fallbacks", keyField: null, keyless: true },
|
|
32
|
-
{ id: "exa", label: "Exa", keyField: "exaApiKey", keyless: true },
|
|
33
|
-
{ id: "openai", label: "OpenAI", keyField: "openaiApiKey", keyless: false },
|
|
34
|
-
{ id: "brave", label: "Brave", keyField: "braveApiKey", keyless: false },
|
|
35
|
-
{ id: "tavily", label: "Tavily", keyField: "tavilyApiKey", keyless: false },
|
|
36
|
-
{ id: "perplexity", label: "Perplexity", keyField: "perplexityApiKey", keyless: false },
|
|
37
|
-
{ id: "firecrawl", label: "Firecrawl", keyField: "firecrawlApiKey", keyless: false },
|
|
38
|
-
{ id: "jina", label: "Jina", keyField: "jinaApiKey", keyless: false },
|
|
39
|
-
{ id: "kagi", label: "Kagi", keyField: "kagiApiKey", keyless: false },
|
|
40
|
-
{ id: "gemini", label: "Gemini", keyField: "geminiApiKey", keyless: false },
|
|
41
|
-
];
|
|
42
|
-
const MANAGED_IDS = new Set(MANAGED_PROVIDERS.map((p) => p.id));
|
|
32
|
+
import { WEB_SEARCH_FALLBACK_ON, WEB_SEARCH_PROVIDER_KEYS, WEB_SEARCH_PROVIDERS, hasWebSearchCredential, readWebSearchOverride, readWebSearchRouting, resolveWebSearchConfigPath, webSearchProvider, } from "@schlessera/brain-ui-sdk/server";
|
|
33
|
+
import { resolveWebSearchEnv } from "../config/env.js";
|
|
34
|
+
import { loadBackendModule, parsePiProfiles } from "../agent/backend.js";
|
|
43
35
|
function readConfig(path) {
|
|
44
36
|
if (!existsSync(path))
|
|
45
37
|
return {};
|
|
@@ -62,26 +54,54 @@ function writeConfig(path, config) {
|
|
|
62
54
|
writeFileSync(tmp, JSON.stringify(config, null, 2) + "\n", { encoding: "utf-8", mode: 0o600 });
|
|
63
55
|
renameSync(tmp, path);
|
|
64
56
|
}
|
|
57
|
+
/** Cheapest first — the whole point of writing a chain rather than a fan-out. */
|
|
58
|
+
function orderByCost(ids) {
|
|
59
|
+
return [...new Set(ids)]
|
|
60
|
+
.map((id) => webSearchProvider(id))
|
|
61
|
+
.filter((spec) => Boolean(spec))
|
|
62
|
+
.sort((a, b) => a.costRank - b.costRank)
|
|
63
|
+
.map((spec) => spec.id);
|
|
64
|
+
}
|
|
65
65
|
export function createWebSearchRoutes(deps) {
|
|
66
66
|
const { agent } = deps;
|
|
67
|
-
const
|
|
67
|
+
const env = deps.env ?? resolveWebSearchEnv();
|
|
68
|
+
const configPath = () => deps.configPath ?? resolveWebSearchConfigPath(env);
|
|
68
69
|
const piConfigured = () => Boolean(agent.piProfilesJson) || (agent.backend || "claude") === "pi";
|
|
70
|
+
/**
|
|
71
|
+
* The pi models in the picker. Malformed config cannot reach here —
|
|
72
|
+
* createApp refuses to boot on it — but a throw would take the whole
|
|
73
|
+
* settings card down over a label, so it degrades to an empty list.
|
|
74
|
+
*/
|
|
75
|
+
const appliesTo = () => {
|
|
76
|
+
try {
|
|
77
|
+
return parsePiProfiles(agent.piProfilesJson ?? null, agent.profilesJson ?? null).map((p) => p.label);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
};
|
|
69
83
|
function view() {
|
|
70
84
|
const config = readConfig(configPath());
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
85
|
+
const override = readWebSearchOverride(config);
|
|
86
|
+
const order = orderByCost(readWebSearchRouting(config));
|
|
87
|
+
const enabled = new Set(order);
|
|
74
88
|
return {
|
|
75
89
|
configured: true,
|
|
76
|
-
|
|
77
|
-
|
|
90
|
+
order,
|
|
91
|
+
overriddenBy: override,
|
|
92
|
+
appliesTo: appliesTo(),
|
|
93
|
+
providers: WEB_SEARCH_PROVIDERS.map((p) => ({
|
|
78
94
|
id: p.id,
|
|
79
95
|
label: p.label,
|
|
96
|
+
enabled: enabled.has(p.id),
|
|
80
97
|
hasKeyField: p.keyField !== null,
|
|
81
98
|
keyConfigured: p.keyField !== null &&
|
|
82
99
|
typeof config[p.keyField] === "string" &&
|
|
83
100
|
config[p.keyField].trim() !== "",
|
|
101
|
+
keyFromEnv: Boolean(p.envVar && (env[p.envVar] ?? "").trim() !== ""),
|
|
84
102
|
keyless: p.keyless,
|
|
103
|
+
costNote: p.costNote,
|
|
104
|
+
blurb: p.blurb,
|
|
85
105
|
})),
|
|
86
106
|
};
|
|
87
107
|
}
|
|
@@ -90,7 +110,7 @@ export function createWebSearchRoutes(deps) {
|
|
|
90
110
|
// Not-configured is a normal state, not an error: the client hides the
|
|
91
111
|
// whole card (same convention as /pi-auth/providers).
|
|
92
112
|
if (!piConfigured()) {
|
|
93
|
-
return c.json({ configured: false,
|
|
113
|
+
return c.json({ configured: false, order: [], overriddenBy: null, appliesTo: [], providers: [] });
|
|
94
114
|
}
|
|
95
115
|
return c.json(view());
|
|
96
116
|
})
|
|
@@ -114,23 +134,14 @@ export function createWebSearchRoutes(deps) {
|
|
|
114
134
|
}
|
|
115
135
|
}
|
|
116
136
|
const config = readConfig(path);
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
return c.json({ error: "Unknown provider." }, 400);
|
|
120
|
-
}
|
|
121
|
-
// "auto" is the extension's default — store it as absence, so an
|
|
122
|
-
// untouched deployment and a reset-to-default one look identical.
|
|
123
|
-
if (body.provider === "auto")
|
|
124
|
-
delete config.provider;
|
|
125
|
-
else
|
|
126
|
-
config.provider = body.provider;
|
|
127
|
-
}
|
|
137
|
+
// Keys first: enabling a provider in the same request as its key must
|
|
138
|
+
// see that key when the credential check runs.
|
|
128
139
|
if (body.apiKeys !== undefined) {
|
|
129
140
|
if (!body.apiKeys || typeof body.apiKeys !== "object" || Array.isArray(body.apiKeys)) {
|
|
130
141
|
return c.json({ error: "apiKeys must be an object." }, 400);
|
|
131
142
|
}
|
|
132
143
|
for (const [id, value] of Object.entries(body.apiKeys)) {
|
|
133
|
-
const spec =
|
|
144
|
+
const spec = webSearchProvider(id);
|
|
134
145
|
if (!spec || spec.keyField === null) {
|
|
135
146
|
return c.json({ error: `Provider "${id}" does not take an API key here.` }, 400);
|
|
136
147
|
}
|
|
@@ -149,6 +160,62 @@ export function createWebSearchRoutes(deps) {
|
|
|
149
160
|
}
|
|
150
161
|
}
|
|
151
162
|
}
|
|
163
|
+
if (body.enabled !== undefined) {
|
|
164
|
+
if (!body.enabled || typeof body.enabled !== "object" || Array.isArray(body.enabled)) {
|
|
165
|
+
return c.json({ error: "enabled must be an object." }, 400);
|
|
166
|
+
}
|
|
167
|
+
// A pre-toggle single-provider config is the starting set, so the
|
|
168
|
+
// first save after an upgrade keeps what the deployment was using.
|
|
169
|
+
const override = readWebSearchOverride(config);
|
|
170
|
+
const current = new Set(readWebSearchRouting(config).length > 0
|
|
171
|
+
? readWebSearchRouting(config)
|
|
172
|
+
: override
|
|
173
|
+
? override.split(",").map((s) => s.trim()).filter((id) => webSearchProvider(id))
|
|
174
|
+
: []);
|
|
175
|
+
for (const [id, value] of Object.entries(body.enabled)) {
|
|
176
|
+
const spec = webSearchProvider(id);
|
|
177
|
+
if (!spec)
|
|
178
|
+
return c.json({ error: `Unknown provider "${id}".` }, 400);
|
|
179
|
+
if (typeof value !== "boolean") {
|
|
180
|
+
return c.json({ error: `enabled.${id} must be a boolean.` }, 400);
|
|
181
|
+
}
|
|
182
|
+
if (value) {
|
|
183
|
+
// The extension skips a provider with no credential, leaving a
|
|
184
|
+
// chain entry that silently never runs. Refuse instead.
|
|
185
|
+
if (!hasWebSearchCredential(spec, config, env)) {
|
|
186
|
+
return c.json({ error: `${spec.label} needs an API key before it can be enabled.` }, 400);
|
|
187
|
+
}
|
|
188
|
+
current.add(id);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
current.delete(id);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const order = orderByCost(current);
|
|
195
|
+
if (order.length === 0) {
|
|
196
|
+
// Nothing enabled: hand the choice back to the extension's own auto
|
|
197
|
+
// chain rather than writing an empty (invalid) routing block.
|
|
198
|
+
delete config.searchRouting;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
config.searchRouting = {
|
|
202
|
+
...(typeof config.searchRouting === "object" &&
|
|
203
|
+
config.searchRouting &&
|
|
204
|
+
!Array.isArray(config.searchRouting)
|
|
205
|
+
? config.searchRouting
|
|
206
|
+
: {}),
|
|
207
|
+
providers: order,
|
|
208
|
+
fallbackOn: [...WEB_SEARCH_FALLBACK_ON],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Any single-provider key overrides searchRouting outright, so owning
|
|
213
|
+
// the chain means removing them — including the one pi's own /curator
|
|
214
|
+
// command writes back.
|
|
215
|
+
if (body.enabled !== undefined || body.clearOverride === true) {
|
|
216
|
+
for (const key of WEB_SEARCH_PROVIDER_KEYS)
|
|
217
|
+
delete config[key];
|
|
218
|
+
}
|
|
152
219
|
writeConfig(path, config);
|
|
153
220
|
// Extension modules cache their config per process; clearing pi's
|
|
154
221
|
// extension cache makes NEW sessions re-read web-search.json. Best
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/routes/web-search.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../src/routes/web-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAsDzE,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAY,CAAC;QAClE,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACnE,CAAC,CAAE,MAAqB;YACxB,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;QACpE,mDAAmD;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,MAAkB;IACnD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,gFAAgF;IAChF,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACzC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/F,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,iFAAiF;AACjF,SAAS,WAAW,CAAC,GAAqB;IACxC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;SACrB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;SAClC,MAAM,CAAC,CAAC,IAAI,EAAoC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACjE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAE5E,MAAM,YAAY,GAAG,GAAG,EAAE,CACxB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC;IAExE;;;;OAIG;IACH,MAAM,SAAS,GAAG,GAAa,EAAE;QAC/B,IAAI,CAAC;YACH,OAAO,eAAe,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,GAAG,CAClF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CACf,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,IAAI;QACX,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,KAAK;YACL,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,SAAS,EAAE;YACtB,SAAS,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,WAAW,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI;gBAChC,aAAa,EACX,CAAC,CAAC,QAAQ,KAAK,IAAI;oBACnB,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;oBACrC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAY,CAAC,IAAI,EAAE,KAAK,EAAE;gBAC9C,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;gBACpE,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;aACf,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,IAAI,EAAE;SACd,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;QACxB,uEAAuE;QACvE,sDAAsD;QACtD,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC;SACD,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9B,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mCAAmC,EAAE,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAI1C,CAAC;QACT,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,qEAAqE;YACrE,+DAA+D;YAC/D,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,IAAI,yDAAyD,EAAE,EAC3E,GAAG,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAEhC,sEAAsE;QACtE,+CAA+C;QAC/C,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,GAAG,CAAC,CAAC;YAC9D,CAAC;YACD,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAqB,CAAC,EAAE,CAAC;gBACrE,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;oBACpC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,kCAAkC,EAAE,EAAE,GAAG,CAAC,CAAC;gBACnF,CAAC;gBACD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;oBACnC,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC/B,CAAC;qBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;oBAC7B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;oBAChE,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;gBAClC,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,GAAG,CAAC,CAAC;YAC9D,CAAC;YACD,kEAAkE;YAClE,mEAAmE;YACnE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,oBAAoB,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC;gBAC9B,CAAC,CAAC,QAAQ;oBACN,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;oBAChF,CAAC,CAAC,EAAE,CACX,CAAC;YACF,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAqB,CAAC,EAAE,CAAC;gBACrE,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,CAAC,IAAI;oBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;gBACtE,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC/B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,EAAE,GAAG,CAAC,CAAC;gBACpE,CAAC;gBACD,IAAI,KAAK,EAAE,CAAC;oBACV,+DAA+D;oBAC/D,wDAAwD;oBACxD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;wBAC/C,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,6CAA6C,EAAE,EACrE,GAAG,CACJ,CAAC;oBACJ,CAAC;oBACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,oEAAoE;gBACpE,8DAA8D;gBAC9D,OAAO,MAAM,CAAC,aAAa,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,aAAa,GAAG;oBACrB,GAAG,CAAC,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ;wBAC5C,MAAM,CAAC,aAAa;wBACpB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;wBAClC,CAAC,CAAC,MAAM,CAAC,aAAa;wBACtB,CAAC,CAAC,EAAE,CAAC;oBACP,SAAS,EAAE,KAAK;oBAChB,UAAU,EAAE,CAAC,GAAG,sBAAsB,CAAC;iBACxC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,sEAAsE;QACtE,uBAAuB;QACvB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAC9D,KAAK,MAAM,GAAG,IAAI,wBAAwB;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,CAAC;QAED,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE1B,kEAAkE;QAClE,mEAAmE;QACnE,qEAAqE;QACrE,8CAA8C;QAC9C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAExD,CAAC;YACF,MAAM,GAAG,CAAC,wBAAwB,EAAE,EAAE,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;QACzD,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schlessera/brain-ui-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.1",
|
|
4
4
|
"description": "brain-kit chat-UI server: Hono app factory, WebSocket turn coordinator, auth (password/passkeys/tailscale/proxy), session catalog, and brain/files/voice routes",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -51,8 +51,8 @@
|
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"@opentelemetry/api": "^1.9.1",
|
|
53
53
|
"@opentelemetry/api-logs": "0.221.0",
|
|
54
|
-
"@schlessera/brain-render-template": "0.
|
|
55
|
-
"@schlessera/brain-ui-sdk": "0.
|
|
54
|
+
"@schlessera/brain-render-template": "0.30.1",
|
|
55
|
+
"@schlessera/brain-ui-sdk": "0.30.1",
|
|
56
56
|
"@simplewebauthn/server": "^13.3.2",
|
|
57
57
|
"fflate": "^0.8.2",
|
|
58
58
|
"gray-matter": "^4.0.3",
|
package/src/config/env.ts
CHANGED
|
@@ -19,6 +19,7 @@ import type { BillingMode } from "@schlessera/brain-ui-sdk/protocol";
|
|
|
19
19
|
|
|
20
20
|
import { SEVERITIES, type Severity } from "../observability/types.js";
|
|
21
21
|
import { envFlag } from "./env-core.js";
|
|
22
|
+
import { WEB_SEARCH_PROVIDERS } from "@schlessera/brain-ui-sdk/server";
|
|
22
23
|
|
|
23
24
|
// --- descriptor -------------------------------------------------------------
|
|
24
25
|
|
|
@@ -680,3 +681,23 @@ export function resolvePiConfigDir(env: EnvRecord = process.env): string {
|
|
|
680
681
|
if (env.XDG_CONFIG_HOME) return join(env.XDG_CONFIG_HOME, "pi");
|
|
681
682
|
return join(env.HOME || "/root", ".pi");
|
|
682
683
|
}
|
|
684
|
+
|
|
685
|
+
/**
|
|
686
|
+
* The environment the web-search surface reads: the variables that locate the
|
|
687
|
+
* extension's `web-search.json`, plus each provider's API-key variable.
|
|
688
|
+
*
|
|
689
|
+
* PRESENCE is all anything does with the key values — they are never logged,
|
|
690
|
+
* returned over the API, or copied into the config file. Reading them here
|
|
691
|
+
* keeps the rest of the package taking configuration as a value.
|
|
692
|
+
*/
|
|
693
|
+
export function resolveWebSearchEnv(
|
|
694
|
+
env: NodeJS.ProcessEnv = process.env
|
|
695
|
+
): Record<string, string | undefined> {
|
|
696
|
+
const names = [
|
|
697
|
+
"PI_CODING_AGENT_DIR",
|
|
698
|
+
"XDG_CONFIG_HOME",
|
|
699
|
+
"HOME",
|
|
700
|
+
...WEB_SEARCH_PROVIDERS.map((p) => p.envVar).filter((n): n is string => Boolean(n)),
|
|
701
|
+
];
|
|
702
|
+
return Object.fromEntries(names.map((name) => [name, env[name]]));
|
|
703
|
+
}
|
package/src/routes/web-search.ts
CHANGED
|
@@ -1,79 +1,95 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Web-search configuration for the pi backend's `pi-web-access` extension —
|
|
3
|
-
* the Settings UI's way to
|
|
4
|
-
*
|
|
3
|
+
* the Settings UI's way to enable providers and store their API keys without
|
|
4
|
+
* a shell on the host.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
9
|
-
*
|
|
6
|
+
* Providers are TOGGLES, not a single choice. The enabled set is written as
|
|
7
|
+
* `searchRouting.providers`, ordered cheapest-first from the catalog's
|
|
8
|
+
* `costRank`, so an ordinary search is answered by a free provider and a paid
|
|
9
|
+
* one is reached only when the cheap ones fail. The model is told the same
|
|
10
|
+
* list (see `webSearchBrief`) and may override per call when a question
|
|
11
|
+
* warrants it.
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* The catalog, the path resolver and the override rules live in
|
|
14
|
+
* `@schlessera/brain-ui-sdk/server` so this surface, the pi backend's system
|
|
15
|
+
* prompt and the client all read one table.
|
|
16
|
+
*
|
|
17
|
+
* Two hazards this file exists to handle:
|
|
18
|
+
*
|
|
19
|
+
* - `provider`/`searchProvider` OVERRIDE `searchRouting` in the extension, and
|
|
20
|
+
* pi's own `/curator` command writes `provider` back. Every write here
|
|
21
|
+
* deletes both; a GET that finds one reports it as an override instead of
|
|
22
|
+
* showing a chain that is not running.
|
|
23
|
+
* - A provider with no credential is skipped at search time. Enabling one is
|
|
24
|
+
* refused here rather than written into a chain that silently ignores it.
|
|
15
25
|
*
|
|
16
26
|
* Key VALUES never leave the server: GET reports only which providers have a
|
|
17
27
|
* key configured. Mount BEHIND the /api auth guard.
|
|
18
28
|
*/
|
|
19
29
|
|
|
20
30
|
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "fs";
|
|
21
|
-
import { dirname
|
|
31
|
+
import { dirname } from "path";
|
|
22
32
|
import { Hono } from "hono";
|
|
33
|
+
import {
|
|
34
|
+
WEB_SEARCH_FALLBACK_ON,
|
|
35
|
+
WEB_SEARCH_PROVIDER_KEYS,
|
|
36
|
+
WEB_SEARCH_PROVIDERS,
|
|
37
|
+
hasWebSearchCredential,
|
|
38
|
+
readWebSearchOverride,
|
|
39
|
+
readWebSearchRouting,
|
|
40
|
+
resolveWebSearchConfigPath,
|
|
41
|
+
webSearchProvider,
|
|
42
|
+
} from "@schlessera/brain-ui-sdk/server";
|
|
23
43
|
import type { AgentConfig } from "../config/env.js";
|
|
24
|
-
import {
|
|
25
|
-
import { loadBackendModule } from "../agent/backend.js";
|
|
44
|
+
import { resolveWebSearchEnv } from "../config/env.js";
|
|
45
|
+
import { loadBackendModule, parsePiProfiles } from "../agent/backend.js";
|
|
26
46
|
|
|
27
|
-
/** One
|
|
47
|
+
/** One toggleable provider, as the Settings UI renders it. */
|
|
28
48
|
export interface WebSearchProviderView {
|
|
29
49
|
id: string;
|
|
30
50
|
label: string;
|
|
31
|
-
/**
|
|
51
|
+
/** In the active chain. */
|
|
52
|
+
enabled: boolean;
|
|
53
|
+
/** Whether this provider accepts an API key. */
|
|
32
54
|
hasKeyField: boolean;
|
|
33
|
-
/**
|
|
55
|
+
/** A key for it is stored in the config file. */
|
|
34
56
|
keyConfigured: boolean;
|
|
35
|
-
/**
|
|
57
|
+
/** Its key comes from the environment instead — not editable here. */
|
|
58
|
+
keyFromEnv: boolean;
|
|
59
|
+
/** Works without any credential. */
|
|
36
60
|
keyless: boolean;
|
|
61
|
+
/** Qualitative cost, for the UI. */
|
|
62
|
+
costNote: string;
|
|
63
|
+
/** What it is good at. */
|
|
64
|
+
blurb: string;
|
|
37
65
|
}
|
|
38
66
|
|
|
39
67
|
export interface WebSearchConfigView {
|
|
40
68
|
/** False when the pi backend is not configured — the client hides the card. */
|
|
41
69
|
configured: boolean;
|
|
42
|
-
/** The active
|
|
43
|
-
|
|
70
|
+
/** The active chain, in the order it is tried. Empty = the extension picks. */
|
|
71
|
+
order: string[];
|
|
72
|
+
/**
|
|
73
|
+
* Set when a single-provider selection in the file is overriding the chain
|
|
74
|
+
* (a pre-toggle config, or pi's `/curator` command writing one back). The
|
|
75
|
+
* UI offers to clear it; until then the chain is not what runs.
|
|
76
|
+
*/
|
|
77
|
+
overriddenBy: string | null;
|
|
78
|
+
/**
|
|
79
|
+
* Labels of the models these providers actually reach — the pi profiles.
|
|
80
|
+
* Claude models use the Agent SDK's own Anthropic-hosted WebSearch, which
|
|
81
|
+
* has no provider setting, so the card has to say who it is talking about.
|
|
82
|
+
*/
|
|
83
|
+
appliesTo: string[];
|
|
44
84
|
providers: WebSearchProviderView[];
|
|
45
85
|
}
|
|
46
86
|
|
|
47
|
-
/**
|
|
48
|
-
* The providers this surface manages. A curated subset of pi-web-access's
|
|
49
|
-
* catalog: the ones configurable by a single `<id>ApiKey` field. The
|
|
50
|
-
* extension itself accepts more (SearXNG endpoints, Ollama, …) — those stay
|
|
51
|
-
* hand-edited config, deliberately outside this UI.
|
|
52
|
-
*/
|
|
53
|
-
const MANAGED_PROVIDERS: ReadonlyArray<{
|
|
54
|
-
id: string;
|
|
55
|
-
label: string;
|
|
56
|
-
keyField: string | null;
|
|
57
|
-
keyless: boolean;
|
|
58
|
-
}> = [
|
|
59
|
-
{ id: "auto", label: "Auto — Exa (free) with fallbacks", keyField: null, keyless: true },
|
|
60
|
-
{ id: "exa", label: "Exa", keyField: "exaApiKey", keyless: true },
|
|
61
|
-
{ id: "openai", label: "OpenAI", keyField: "openaiApiKey", keyless: false },
|
|
62
|
-
{ id: "brave", label: "Brave", keyField: "braveApiKey", keyless: false },
|
|
63
|
-
{ id: "tavily", label: "Tavily", keyField: "tavilyApiKey", keyless: false },
|
|
64
|
-
{ id: "perplexity", label: "Perplexity", keyField: "perplexityApiKey", keyless: false },
|
|
65
|
-
{ id: "firecrawl", label: "Firecrawl", keyField: "firecrawlApiKey", keyless: false },
|
|
66
|
-
{ id: "jina", label: "Jina", keyField: "jinaApiKey", keyless: false },
|
|
67
|
-
{ id: "kagi", label: "Kagi", keyField: "kagiApiKey", keyless: false },
|
|
68
|
-
{ id: "gemini", label: "Gemini", keyField: "geminiApiKey", keyless: false },
|
|
69
|
-
];
|
|
70
|
-
|
|
71
|
-
const MANAGED_IDS = new Set(MANAGED_PROVIDERS.map((p) => p.id));
|
|
72
|
-
|
|
73
87
|
export interface WebSearchRoutesDeps {
|
|
74
88
|
agent: AgentConfig;
|
|
75
89
|
/** Test seam — overrides the config file location. */
|
|
76
90
|
configPath?: string;
|
|
91
|
+
/** Test seam — overrides the environment credential lookup. */
|
|
92
|
+
env?: Record<string, string | undefined>;
|
|
77
93
|
/** Test seam — forwarded to loadBackendModule. */
|
|
78
94
|
importer?: (specifier: string) => Promise<unknown>;
|
|
79
95
|
}
|
|
@@ -102,31 +118,61 @@ function writeConfig(path: string, config: JsonRecord): void {
|
|
|
102
118
|
renameSync(tmp, path);
|
|
103
119
|
}
|
|
104
120
|
|
|
121
|
+
/** Cheapest first — the whole point of writing a chain rather than a fan-out. */
|
|
122
|
+
function orderByCost(ids: Iterable<string>): string[] {
|
|
123
|
+
return [...new Set(ids)]
|
|
124
|
+
.map((id) => webSearchProvider(id))
|
|
125
|
+
.filter((spec): spec is NonNullable<typeof spec> => Boolean(spec))
|
|
126
|
+
.sort((a, b) => a.costRank - b.costRank)
|
|
127
|
+
.map((spec) => spec.id);
|
|
128
|
+
}
|
|
129
|
+
|
|
105
130
|
export function createWebSearchRoutes(deps: WebSearchRoutesDeps): Hono {
|
|
106
131
|
const { agent } = deps;
|
|
107
|
-
const
|
|
132
|
+
const env = deps.env ?? resolveWebSearchEnv();
|
|
133
|
+
const configPath = () => deps.configPath ?? resolveWebSearchConfigPath(env);
|
|
108
134
|
|
|
109
135
|
const piConfigured = () =>
|
|
110
136
|
Boolean(agent.piProfilesJson) || (agent.backend || "claude") === "pi";
|
|
111
137
|
|
|
138
|
+
/**
|
|
139
|
+
* The pi models in the picker. Malformed config cannot reach here —
|
|
140
|
+
* createApp refuses to boot on it — but a throw would take the whole
|
|
141
|
+
* settings card down over a label, so it degrades to an empty list.
|
|
142
|
+
*/
|
|
143
|
+
const appliesTo = (): string[] => {
|
|
144
|
+
try {
|
|
145
|
+
return parsePiProfiles(agent.piProfilesJson ?? null, agent.profilesJson ?? null).map(
|
|
146
|
+
(p) => p.label
|
|
147
|
+
);
|
|
148
|
+
} catch {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
112
153
|
function view(): WebSearchConfigView {
|
|
113
154
|
const config = readConfig(configPath());
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
: "auto";
|
|
155
|
+
const override = readWebSearchOverride(config);
|
|
156
|
+
const order = orderByCost(readWebSearchRouting(config));
|
|
157
|
+
const enabled = new Set(order);
|
|
118
158
|
return {
|
|
119
159
|
configured: true,
|
|
120
|
-
|
|
121
|
-
|
|
160
|
+
order,
|
|
161
|
+
overriddenBy: override,
|
|
162
|
+
appliesTo: appliesTo(),
|
|
163
|
+
providers: WEB_SEARCH_PROVIDERS.map((p) => ({
|
|
122
164
|
id: p.id,
|
|
123
165
|
label: p.label,
|
|
166
|
+
enabled: enabled.has(p.id),
|
|
124
167
|
hasKeyField: p.keyField !== null,
|
|
125
168
|
keyConfigured:
|
|
126
169
|
p.keyField !== null &&
|
|
127
170
|
typeof config[p.keyField] === "string" &&
|
|
128
171
|
(config[p.keyField] as string).trim() !== "",
|
|
172
|
+
keyFromEnv: Boolean(p.envVar && (env[p.envVar] ?? "").trim() !== ""),
|
|
129
173
|
keyless: p.keyless,
|
|
174
|
+
costNote: p.costNote,
|
|
175
|
+
blurb: p.blurb,
|
|
130
176
|
})),
|
|
131
177
|
};
|
|
132
178
|
}
|
|
@@ -136,7 +182,7 @@ export function createWebSearchRoutes(deps: WebSearchRoutesDeps): Hono {
|
|
|
136
182
|
// Not-configured is a normal state, not an error: the client hides the
|
|
137
183
|
// whole card (same convention as /pi-auth/providers).
|
|
138
184
|
if (!piConfigured()) {
|
|
139
|
-
return c.json({ configured: false,
|
|
185
|
+
return c.json({ configured: false, order: [], overriddenBy: null, appliesTo: [], providers: [] });
|
|
140
186
|
}
|
|
141
187
|
return c.json(view());
|
|
142
188
|
})
|
|
@@ -145,8 +191,9 @@ export function createWebSearchRoutes(deps: WebSearchRoutesDeps): Hono {
|
|
|
145
191
|
return c.json({ error: "The pi backend is not configured." }, 409);
|
|
146
192
|
}
|
|
147
193
|
const body = (await c.req.json().catch(() => null)) as {
|
|
148
|
-
|
|
194
|
+
enabled?: unknown;
|
|
149
195
|
apiKeys?: unknown;
|
|
196
|
+
clearOverride?: unknown;
|
|
150
197
|
} | null;
|
|
151
198
|
if (!body || typeof body !== "object") {
|
|
152
199
|
return c.json({ error: "Invalid body." }, 400);
|
|
@@ -167,22 +214,14 @@ export function createWebSearchRoutes(deps: WebSearchRoutesDeps): Hono {
|
|
|
167
214
|
}
|
|
168
215
|
const config = readConfig(path);
|
|
169
216
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
return c.json({ error: "Unknown provider." }, 400);
|
|
173
|
-
}
|
|
174
|
-
// "auto" is the extension's default — store it as absence, so an
|
|
175
|
-
// untouched deployment and a reset-to-default one look identical.
|
|
176
|
-
if (body.provider === "auto") delete config.provider;
|
|
177
|
-
else config.provider = body.provider;
|
|
178
|
-
}
|
|
179
|
-
|
|
217
|
+
// Keys first: enabling a provider in the same request as its key must
|
|
218
|
+
// see that key when the credential check runs.
|
|
180
219
|
if (body.apiKeys !== undefined) {
|
|
181
220
|
if (!body.apiKeys || typeof body.apiKeys !== "object" || Array.isArray(body.apiKeys)) {
|
|
182
221
|
return c.json({ error: "apiKeys must be an object." }, 400);
|
|
183
222
|
}
|
|
184
223
|
for (const [id, value] of Object.entries(body.apiKeys as JsonRecord)) {
|
|
185
|
-
const spec =
|
|
224
|
+
const spec = webSearchProvider(id);
|
|
186
225
|
if (!spec || spec.keyField === null) {
|
|
187
226
|
return c.json({ error: `Provider "${id}" does not take an API key here.` }, 400);
|
|
188
227
|
}
|
|
@@ -200,6 +239,65 @@ export function createWebSearchRoutes(deps: WebSearchRoutesDeps): Hono {
|
|
|
200
239
|
}
|
|
201
240
|
}
|
|
202
241
|
|
|
242
|
+
if (body.enabled !== undefined) {
|
|
243
|
+
if (!body.enabled || typeof body.enabled !== "object" || Array.isArray(body.enabled)) {
|
|
244
|
+
return c.json({ error: "enabled must be an object." }, 400);
|
|
245
|
+
}
|
|
246
|
+
// A pre-toggle single-provider config is the starting set, so the
|
|
247
|
+
// first save after an upgrade keeps what the deployment was using.
|
|
248
|
+
const override = readWebSearchOverride(config);
|
|
249
|
+
const current = new Set(
|
|
250
|
+
readWebSearchRouting(config).length > 0
|
|
251
|
+
? readWebSearchRouting(config)
|
|
252
|
+
: override
|
|
253
|
+
? override.split(",").map((s) => s.trim()).filter((id) => webSearchProvider(id))
|
|
254
|
+
: []
|
|
255
|
+
);
|
|
256
|
+
for (const [id, value] of Object.entries(body.enabled as JsonRecord)) {
|
|
257
|
+
const spec = webSearchProvider(id);
|
|
258
|
+
if (!spec) return c.json({ error: `Unknown provider "${id}".` }, 400);
|
|
259
|
+
if (typeof value !== "boolean") {
|
|
260
|
+
return c.json({ error: `enabled.${id} must be a boolean.` }, 400);
|
|
261
|
+
}
|
|
262
|
+
if (value) {
|
|
263
|
+
// The extension skips a provider with no credential, leaving a
|
|
264
|
+
// chain entry that silently never runs. Refuse instead.
|
|
265
|
+
if (!hasWebSearchCredential(spec, config, env)) {
|
|
266
|
+
return c.json(
|
|
267
|
+
{ error: `${spec.label} needs an API key before it can be enabled.` },
|
|
268
|
+
400
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
current.add(id);
|
|
272
|
+
} else {
|
|
273
|
+
current.delete(id);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const order = orderByCost(current);
|
|
277
|
+
if (order.length === 0) {
|
|
278
|
+
// Nothing enabled: hand the choice back to the extension's own auto
|
|
279
|
+
// chain rather than writing an empty (invalid) routing block.
|
|
280
|
+
delete config.searchRouting;
|
|
281
|
+
} else {
|
|
282
|
+
config.searchRouting = {
|
|
283
|
+
...(typeof config.searchRouting === "object" &&
|
|
284
|
+
config.searchRouting &&
|
|
285
|
+
!Array.isArray(config.searchRouting)
|
|
286
|
+
? config.searchRouting
|
|
287
|
+
: {}),
|
|
288
|
+
providers: order,
|
|
289
|
+
fallbackOn: [...WEB_SEARCH_FALLBACK_ON],
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Any single-provider key overrides searchRouting outright, so owning
|
|
295
|
+
// the chain means removing them — including the one pi's own /curator
|
|
296
|
+
// command writes back.
|
|
297
|
+
if (body.enabled !== undefined || body.clearOverride === true) {
|
|
298
|
+
for (const key of WEB_SEARCH_PROVIDER_KEYS) delete config[key];
|
|
299
|
+
}
|
|
300
|
+
|
|
203
301
|
writeConfig(path, config);
|
|
204
302
|
|
|
205
303
|
// Extension modules cache their config per process; clearing pi's
|