@schlessera/brain-ui-server 0.29.0 → 0.30.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/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 +42 -16
- package/dist/routes/web-search.d.ts.map +1 -1
- package/dist/routes/web-search.js +103 -50
- 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 +140 -64
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":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,EAAE,UAAU,EAAiB,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AA2BxC;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAgC;IACnD,wBAAwB;IACxB;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,gDAAgD;QAC7D,OAAO,EAAE,aAAa;QACtB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,2EAA2E;QAC7E,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,mEAAmE;YACnE,iEAAiE;YACjE,yBAAyB;QAC3B,OAAO,EAAE,qCAAqC;QAC9C,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,uEAAuE;QACpF,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,WAAW,EACT,qEAAqE;YACrE,kEAAkE;YAClE,oCAAoC;QACtC,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,8DAA8D;YAC9D,mEAAmE;YACnE,oEAAoE;YACpE,+BAA+B;QACjC,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,uEAAuE;QACpF,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,gGAAgG;QAClG,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,0EAA0E;YAC1E,sEAAsE;YACtE,2EAA2E;YAC3E,wEAAwE;YACxE,2EAA2E;YAC3E,0EAA0E;YAC1E,yBAAyB;QAC3B,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,kEAAkE;YAClE,6BAA6B;QAC/B,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,wEAAwE;YACxE,mEAAmE;QACrE,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,uEAAuE;YACvE,sEAAsE;YACtE,uDAAuD;QACzD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,8DAA8D;QAC3E,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,uGAAuG;QACzG,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,6CAA6C;QAC1D,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,2IAA2I;QAC7I,OAAO,EAAE,qBAAqB;QAC9B,QAAQ,EAAE,KAAK;KAChB;IACD,OAAO;IACP;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,6HAA6H;QAC/H,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE,oDAAoD;QACjE,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,oBAAoB;KAC/B;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,oBAAoB;KAC/B;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,iHAAiH;QACnH,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,iBAAiB;KAC5B;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,uEAAuE;QACpF,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,wDAAwD;QACrE,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,mCAAmC;QACzC,WAAW,EACT,oGAAoG;QACtG,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,kGAAkG;QACpG,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,KAAK;KAChB;IACD,sBAAsB;IACtB;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,qDAAqD;QAClE,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,6CAA6C;QAC1D,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,6IAA6I;QAC/I,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,0DAA0D;QACvE,OAAO,EAAE,mCAAmC;QAC5C,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,gEAAgE;QAC7E,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,gCAAgC;QACtC,WAAW,EACT,oGAAoG;QACtG,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,KAAK;KAChB;IACD,gBAAgB;IAChB;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,oDAAoD;QACjE,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,gEAAgE;QAC7E,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,+BAA+B;QACrC,WAAW,EAAE,yDAAyD;QACtE,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,kIAAkI;QACpI,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,oFAAoF;YACpF,wEAAwE;YACxE,sEAAsE;YACtE,gEAAgE;QAClE,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,uEAAuE;YACvE,sEAAsE;YACtE,yEAAyE;YACzE,yEAAyE;QAC3E,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,qEAAqE;YACrE,qEAAqE;YACrE,kEAAkE;QACpE,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,8JAA8J;QAChK,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,0DAA0D;QACvE,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,WAAW,EACT,6NAA6N;QAC/N,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,+DAA+D;QAC5E,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EACT,8JAA8J;QAChK,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,KAAK;KAChB;IACD,QAAQ;IACR;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,6EAA6E;QAC1F,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,6EAA6E;KACxF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,mJAAmJ;QACrJ,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,gEAAgE;QAC7E,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,2CAA2C;QACxD,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,KAAK;KAChB;CACO,CAAC;AAoGX,SAAS,IAAI,CAAC,GAAuB;IACnC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;SACf,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,4EAA4E;AAC5E,SAAS,cAAc,CAAC,GAAuB,EAAE,QAAgB;IAC/D,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC5D,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAuB;IAC5C,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxC,OAAQ,UAAgC,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5D,CAAC,CAAE,KAAkB;QACrB,CAAC,CAAC,MAAM,CAAC;AACb,CAAC;AAED,MAAM,UAAU,GAA4B,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAEvF;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAiB,OAAO,CAAC,GAAG;IACpE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE;QAC1E,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,KAAK,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAAiB,OAAO,CAAC,GAAG;IAKzE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxD,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,OAAO,CAAC;QAC/D,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC;QACzE,KAAK,EACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;YACvC,CAAC,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;YAC3B,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;KAC1B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAiB,OAAO,CAAC,GAAG;IAC9D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,GAC/D,8BAA8B,CAAC,GAAG,CAAC,CAAC;IAEtC,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC;IAChE,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,IAAI,CAAC;IAE1E,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAEtF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAErE,OAAO;QACL,SAAS;QACT,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC;QACzD,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;QACpB,YAAY,EAAE,GAAG,CAAC,aAAa,IAAI,KAAK;QACxC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;QACzC,qBAAqB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC5E,yEAAyE;QACzE,wEAAwE;QACxE,aAAa,EACX,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACrD,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,GAAG,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAClD,CAAC,CAAC,IAAI;QACV,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW;YAC3C,YAAY,EAAE,GAAG,CAAC,sBAAsB,IAAI,IAAI;YAChD,YAAY,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI;YACvC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC;YAC3C,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC9D,eAAe,EAAE,CAAC,GAAG,CAAC,iBAAiB,IAAI,kBAAkB,CAAC,CAAC,WAAW,EAAE;YAC5E,sBAAsB,EAAE,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC;YAC7E,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,CAAC;SAC3D;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,GAAG,CAAC,gBAAgB,IAAI,UAAU;YAC1C,QAAQ,EAAE,GAAG,CAAC,kBAAkB,IAAI,OAAO;YAC3C,MAAM,EAAE,GAAG,CAAC,gBAAgB,IAAI,gBAAgB;YAChD,IAAI,EAAE,GAAG,CAAC,cAAc,IAAI,IAAI;YAChC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACnC,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,KAAK,CAAC;SACxE;QACD,KAAK,EAAE;YACL,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,IAAI;YACxD,mBAAmB,EAAE,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAC;YAChE,cAAc,EAAE,GAAG,CAAC,gBAAgB,IAAI,uBAAuB;YAC/D,YAAY,EAAE,GAAG,CAAC,6BAA6B,EAAE,IAAI,EAAE,IAAI,mBAAmB;YAC9E,YAAY,EAAE,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,IAAI,IAAI;YAC1D,cAAc,EAAE,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,IAAI,IAAI;YACxD,cAAc;YACd,UAAU,EAAE,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;YACrC,cAAc,EAAE,yBAAyB,CAAC,GAAG,CAAC;SAC/C;QACD,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC/C,MAAM,EAAE;YACN,aAAa,EAAE,cAAc,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC;YACvD,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC;SACjD;QACD,KAAK,EAAE;YACL,QAAQ,EAAE,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,IAAI;YAC1D,cAAc,EAAE,GAAG,CAAC,gBAAgB,IAAI,IAAI;YAC5C,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC;YACpD,QAAQ,EAAE,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;SAC9D;QACD,OAAO,EAAE;YACP,OAAO,EAAE,cAAc;YACvB,KAAK,EAAE,YAAY;SACpB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgC,EAAE;IAC9D,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAiB,OAAO,CAAC,GAAG;IAC7D,OAAO,GAAG,CAAC,4BAA4B,IAAI,GAAG,CAAC,YAAY,IAAI,SAAS,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAiB,OAAO,CAAC,GAAG;IAC7D,IAAI,GAAG,CAAC,mBAAmB;QAAE,OAAO,GAAG,CAAC,mBAAmB,CAAC;IAC5D,IAAI,GAAG,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,KAAK,CAAC,CAAC;AAC1C,CAAC"}
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +1,71 @@
|
|
|
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;
|
|
37
61
|
providers: WebSearchProviderView[];
|
|
38
62
|
}
|
|
39
63
|
export interface WebSearchRoutesDeps {
|
|
40
64
|
agent: AgentConfig;
|
|
41
65
|
/** Test seam — overrides the config file location. */
|
|
42
66
|
configPath?: string;
|
|
67
|
+
/** Test seam — overrides the environment credential lookup. */
|
|
68
|
+
env?: Record<string, string | undefined>;
|
|
43
69
|
/** Test seam — forwarded to loadBackendModule. */
|
|
44
70
|
importer?: (specifier: string) => Promise<unknown>;
|
|
45
71
|
}
|
|
@@ -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,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,CA4KrE"}
|
|
@@ -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 {
|
|
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";
|
|
23
34
|
import { loadBackendModule } from "../agent/backend.js";
|
|
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));
|
|
43
35
|
function readConfig(path) {
|
|
44
36
|
if (!existsSync(path))
|
|
45
37
|
return {};
|
|
@@ -62,26 +54,40 @@ 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";
|
|
69
70
|
function view() {
|
|
70
71
|
const config = readConfig(configPath());
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
const override = readWebSearchOverride(config);
|
|
73
|
+
const order = orderByCost(readWebSearchRouting(config));
|
|
74
|
+
const enabled = new Set(order);
|
|
74
75
|
return {
|
|
75
76
|
configured: true,
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
order,
|
|
78
|
+
overriddenBy: override,
|
|
79
|
+
providers: WEB_SEARCH_PROVIDERS.map((p) => ({
|
|
78
80
|
id: p.id,
|
|
79
81
|
label: p.label,
|
|
82
|
+
enabled: enabled.has(p.id),
|
|
80
83
|
hasKeyField: p.keyField !== null,
|
|
81
84
|
keyConfigured: p.keyField !== null &&
|
|
82
85
|
typeof config[p.keyField] === "string" &&
|
|
83
86
|
config[p.keyField].trim() !== "",
|
|
87
|
+
keyFromEnv: Boolean(p.envVar && (env[p.envVar] ?? "").trim() !== ""),
|
|
84
88
|
keyless: p.keyless,
|
|
89
|
+
costNote: p.costNote,
|
|
90
|
+
blurb: p.blurb,
|
|
85
91
|
})),
|
|
86
92
|
};
|
|
87
93
|
}
|
|
@@ -90,7 +96,7 @@ export function createWebSearchRoutes(deps) {
|
|
|
90
96
|
// Not-configured is a normal state, not an error: the client hides the
|
|
91
97
|
// whole card (same convention as /pi-auth/providers).
|
|
92
98
|
if (!piConfigured()) {
|
|
93
|
-
return c.json({ configured: false,
|
|
99
|
+
return c.json({ configured: false, order: [], overriddenBy: null, providers: [] });
|
|
94
100
|
}
|
|
95
101
|
return c.json(view());
|
|
96
102
|
})
|
|
@@ -114,23 +120,14 @@ export function createWebSearchRoutes(deps) {
|
|
|
114
120
|
}
|
|
115
121
|
}
|
|
116
122
|
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
|
-
}
|
|
123
|
+
// Keys first: enabling a provider in the same request as its key must
|
|
124
|
+
// see that key when the credential check runs.
|
|
128
125
|
if (body.apiKeys !== undefined) {
|
|
129
126
|
if (!body.apiKeys || typeof body.apiKeys !== "object" || Array.isArray(body.apiKeys)) {
|
|
130
127
|
return c.json({ error: "apiKeys must be an object." }, 400);
|
|
131
128
|
}
|
|
132
129
|
for (const [id, value] of Object.entries(body.apiKeys)) {
|
|
133
|
-
const spec =
|
|
130
|
+
const spec = webSearchProvider(id);
|
|
134
131
|
if (!spec || spec.keyField === null) {
|
|
135
132
|
return c.json({ error: `Provider "${id}" does not take an API key here.` }, 400);
|
|
136
133
|
}
|
|
@@ -149,6 +146,62 @@ export function createWebSearchRoutes(deps) {
|
|
|
149
146
|
}
|
|
150
147
|
}
|
|
151
148
|
}
|
|
149
|
+
if (body.enabled !== undefined) {
|
|
150
|
+
if (!body.enabled || typeof body.enabled !== "object" || Array.isArray(body.enabled)) {
|
|
151
|
+
return c.json({ error: "enabled must be an object." }, 400);
|
|
152
|
+
}
|
|
153
|
+
// A pre-toggle single-provider config is the starting set, so the
|
|
154
|
+
// first save after an upgrade keeps what the deployment was using.
|
|
155
|
+
const override = readWebSearchOverride(config);
|
|
156
|
+
const current = new Set(readWebSearchRouting(config).length > 0
|
|
157
|
+
? readWebSearchRouting(config)
|
|
158
|
+
: override
|
|
159
|
+
? override.split(",").map((s) => s.trim()).filter((id) => webSearchProvider(id))
|
|
160
|
+
: []);
|
|
161
|
+
for (const [id, value] of Object.entries(body.enabled)) {
|
|
162
|
+
const spec = webSearchProvider(id);
|
|
163
|
+
if (!spec)
|
|
164
|
+
return c.json({ error: `Unknown provider "${id}".` }, 400);
|
|
165
|
+
if (typeof value !== "boolean") {
|
|
166
|
+
return c.json({ error: `enabled.${id} must be a boolean.` }, 400);
|
|
167
|
+
}
|
|
168
|
+
if (value) {
|
|
169
|
+
// The extension skips a provider with no credential, leaving a
|
|
170
|
+
// chain entry that silently never runs. Refuse instead.
|
|
171
|
+
if (!hasWebSearchCredential(spec, config, env)) {
|
|
172
|
+
return c.json({ error: `${spec.label} needs an API key before it can be enabled.` }, 400);
|
|
173
|
+
}
|
|
174
|
+
current.add(id);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
current.delete(id);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const order = orderByCost(current);
|
|
181
|
+
if (order.length === 0) {
|
|
182
|
+
// Nothing enabled: hand the choice back to the extension's own auto
|
|
183
|
+
// chain rather than writing an empty (invalid) routing block.
|
|
184
|
+
delete config.searchRouting;
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
config.searchRouting = {
|
|
188
|
+
...(typeof config.searchRouting === "object" &&
|
|
189
|
+
config.searchRouting &&
|
|
190
|
+
!Array.isArray(config.searchRouting)
|
|
191
|
+
? config.searchRouting
|
|
192
|
+
: {}),
|
|
193
|
+
providers: order,
|
|
194
|
+
fallbackOn: [...WEB_SEARCH_FALLBACK_ON],
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Any single-provider key overrides searchRouting outright, so owning
|
|
199
|
+
// the chain means removing them — including the one pi's own /curator
|
|
200
|
+
// command writes back.
|
|
201
|
+
if (body.enabled !== undefined || body.clearOverride === true) {
|
|
202
|
+
for (const key of WEB_SEARCH_PROVIDER_KEYS)
|
|
203
|
+
delete config[key];
|
|
204
|
+
}
|
|
152
205
|
writeConfig(path, config);
|
|
153
206
|
// Extension modules cache their config per process; clearing pi's
|
|
154
207
|
// 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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schlessera/brain-ui-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.0",
|
|
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.0",
|
|
55
|
+
"@schlessera/brain-ui-sdk": "0.30.0",
|
|
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,89 @@
|
|
|
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 {
|
|
44
|
+
import { resolveWebSearchEnv } from "../config/env.js";
|
|
25
45
|
import { loadBackendModule } 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;
|
|
44
78
|
providers: WebSearchProviderView[];
|
|
45
79
|
}
|
|
46
80
|
|
|
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
81
|
export interface WebSearchRoutesDeps {
|
|
74
82
|
agent: AgentConfig;
|
|
75
83
|
/** Test seam — overrides the config file location. */
|
|
76
84
|
configPath?: string;
|
|
85
|
+
/** Test seam — overrides the environment credential lookup. */
|
|
86
|
+
env?: Record<string, string | undefined>;
|
|
77
87
|
/** Test seam — forwarded to loadBackendModule. */
|
|
78
88
|
importer?: (specifier: string) => Promise<unknown>;
|
|
79
89
|
}
|
|
@@ -102,31 +112,45 @@ function writeConfig(path: string, config: JsonRecord): void {
|
|
|
102
112
|
renameSync(tmp, path);
|
|
103
113
|
}
|
|
104
114
|
|
|
115
|
+
/** Cheapest first — the whole point of writing a chain rather than a fan-out. */
|
|
116
|
+
function orderByCost(ids: Iterable<string>): string[] {
|
|
117
|
+
return [...new Set(ids)]
|
|
118
|
+
.map((id) => webSearchProvider(id))
|
|
119
|
+
.filter((spec): spec is NonNullable<typeof spec> => Boolean(spec))
|
|
120
|
+
.sort((a, b) => a.costRank - b.costRank)
|
|
121
|
+
.map((spec) => spec.id);
|
|
122
|
+
}
|
|
123
|
+
|
|
105
124
|
export function createWebSearchRoutes(deps: WebSearchRoutesDeps): Hono {
|
|
106
125
|
const { agent } = deps;
|
|
107
|
-
const
|
|
126
|
+
const env = deps.env ?? resolveWebSearchEnv();
|
|
127
|
+
const configPath = () => deps.configPath ?? resolveWebSearchConfigPath(env);
|
|
108
128
|
|
|
109
129
|
const piConfigured = () =>
|
|
110
130
|
Boolean(agent.piProfilesJson) || (agent.backend || "claude") === "pi";
|
|
111
131
|
|
|
112
132
|
function view(): WebSearchConfigView {
|
|
113
133
|
const config = readConfig(configPath());
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
: "auto";
|
|
134
|
+
const override = readWebSearchOverride(config);
|
|
135
|
+
const order = orderByCost(readWebSearchRouting(config));
|
|
136
|
+
const enabled = new Set(order);
|
|
118
137
|
return {
|
|
119
138
|
configured: true,
|
|
120
|
-
|
|
121
|
-
|
|
139
|
+
order,
|
|
140
|
+
overriddenBy: override,
|
|
141
|
+
providers: WEB_SEARCH_PROVIDERS.map((p) => ({
|
|
122
142
|
id: p.id,
|
|
123
143
|
label: p.label,
|
|
144
|
+
enabled: enabled.has(p.id),
|
|
124
145
|
hasKeyField: p.keyField !== null,
|
|
125
146
|
keyConfigured:
|
|
126
147
|
p.keyField !== null &&
|
|
127
148
|
typeof config[p.keyField] === "string" &&
|
|
128
149
|
(config[p.keyField] as string).trim() !== "",
|
|
150
|
+
keyFromEnv: Boolean(p.envVar && (env[p.envVar] ?? "").trim() !== ""),
|
|
129
151
|
keyless: p.keyless,
|
|
152
|
+
costNote: p.costNote,
|
|
153
|
+
blurb: p.blurb,
|
|
130
154
|
})),
|
|
131
155
|
};
|
|
132
156
|
}
|
|
@@ -136,7 +160,7 @@ export function createWebSearchRoutes(deps: WebSearchRoutesDeps): Hono {
|
|
|
136
160
|
// Not-configured is a normal state, not an error: the client hides the
|
|
137
161
|
// whole card (same convention as /pi-auth/providers).
|
|
138
162
|
if (!piConfigured()) {
|
|
139
|
-
return c.json({ configured: false,
|
|
163
|
+
return c.json({ configured: false, order: [], overriddenBy: null, providers: [] });
|
|
140
164
|
}
|
|
141
165
|
return c.json(view());
|
|
142
166
|
})
|
|
@@ -145,8 +169,9 @@ export function createWebSearchRoutes(deps: WebSearchRoutesDeps): Hono {
|
|
|
145
169
|
return c.json({ error: "The pi backend is not configured." }, 409);
|
|
146
170
|
}
|
|
147
171
|
const body = (await c.req.json().catch(() => null)) as {
|
|
148
|
-
|
|
172
|
+
enabled?: unknown;
|
|
149
173
|
apiKeys?: unknown;
|
|
174
|
+
clearOverride?: unknown;
|
|
150
175
|
} | null;
|
|
151
176
|
if (!body || typeof body !== "object") {
|
|
152
177
|
return c.json({ error: "Invalid body." }, 400);
|
|
@@ -167,22 +192,14 @@ export function createWebSearchRoutes(deps: WebSearchRoutesDeps): Hono {
|
|
|
167
192
|
}
|
|
168
193
|
const config = readConfig(path);
|
|
169
194
|
|
|
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
|
-
|
|
195
|
+
// Keys first: enabling a provider in the same request as its key must
|
|
196
|
+
// see that key when the credential check runs.
|
|
180
197
|
if (body.apiKeys !== undefined) {
|
|
181
198
|
if (!body.apiKeys || typeof body.apiKeys !== "object" || Array.isArray(body.apiKeys)) {
|
|
182
199
|
return c.json({ error: "apiKeys must be an object." }, 400);
|
|
183
200
|
}
|
|
184
201
|
for (const [id, value] of Object.entries(body.apiKeys as JsonRecord)) {
|
|
185
|
-
const spec =
|
|
202
|
+
const spec = webSearchProvider(id);
|
|
186
203
|
if (!spec || spec.keyField === null) {
|
|
187
204
|
return c.json({ error: `Provider "${id}" does not take an API key here.` }, 400);
|
|
188
205
|
}
|
|
@@ -200,6 +217,65 @@ export function createWebSearchRoutes(deps: WebSearchRoutesDeps): Hono {
|
|
|
200
217
|
}
|
|
201
218
|
}
|
|
202
219
|
|
|
220
|
+
if (body.enabled !== undefined) {
|
|
221
|
+
if (!body.enabled || typeof body.enabled !== "object" || Array.isArray(body.enabled)) {
|
|
222
|
+
return c.json({ error: "enabled must be an object." }, 400);
|
|
223
|
+
}
|
|
224
|
+
// A pre-toggle single-provider config is the starting set, so the
|
|
225
|
+
// first save after an upgrade keeps what the deployment was using.
|
|
226
|
+
const override = readWebSearchOverride(config);
|
|
227
|
+
const current = new Set(
|
|
228
|
+
readWebSearchRouting(config).length > 0
|
|
229
|
+
? readWebSearchRouting(config)
|
|
230
|
+
: override
|
|
231
|
+
? override.split(",").map((s) => s.trim()).filter((id) => webSearchProvider(id))
|
|
232
|
+
: []
|
|
233
|
+
);
|
|
234
|
+
for (const [id, value] of Object.entries(body.enabled as JsonRecord)) {
|
|
235
|
+
const spec = webSearchProvider(id);
|
|
236
|
+
if (!spec) return c.json({ error: `Unknown provider "${id}".` }, 400);
|
|
237
|
+
if (typeof value !== "boolean") {
|
|
238
|
+
return c.json({ error: `enabled.${id} must be a boolean.` }, 400);
|
|
239
|
+
}
|
|
240
|
+
if (value) {
|
|
241
|
+
// The extension skips a provider with no credential, leaving a
|
|
242
|
+
// chain entry that silently never runs. Refuse instead.
|
|
243
|
+
if (!hasWebSearchCredential(spec, config, env)) {
|
|
244
|
+
return c.json(
|
|
245
|
+
{ error: `${spec.label} needs an API key before it can be enabled.` },
|
|
246
|
+
400
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
current.add(id);
|
|
250
|
+
} else {
|
|
251
|
+
current.delete(id);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const order = orderByCost(current);
|
|
255
|
+
if (order.length === 0) {
|
|
256
|
+
// Nothing enabled: hand the choice back to the extension's own auto
|
|
257
|
+
// chain rather than writing an empty (invalid) routing block.
|
|
258
|
+
delete config.searchRouting;
|
|
259
|
+
} else {
|
|
260
|
+
config.searchRouting = {
|
|
261
|
+
...(typeof config.searchRouting === "object" &&
|
|
262
|
+
config.searchRouting &&
|
|
263
|
+
!Array.isArray(config.searchRouting)
|
|
264
|
+
? config.searchRouting
|
|
265
|
+
: {}),
|
|
266
|
+
providers: order,
|
|
267
|
+
fallbackOn: [...WEB_SEARCH_FALLBACK_ON],
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Any single-provider key overrides searchRouting outright, so owning
|
|
273
|
+
// the chain means removing them — including the one pi's own /curator
|
|
274
|
+
// command writes back.
|
|
275
|
+
if (body.enabled !== undefined || body.clearOverride === true) {
|
|
276
|
+
for (const key of WEB_SEARCH_PROVIDER_KEYS) delete config[key];
|
|
277
|
+
}
|
|
278
|
+
|
|
203
279
|
writeConfig(path, config);
|
|
204
280
|
|
|
205
281
|
// Extension modules cache their config per process; clearing pi's
|