Search port + model slots wave, chunk A (owner design, 2026-09-20):
- core/search.ts: SearchHit + SearchProvider port + SearchStatus —
pure, browser-safe; adapters arrive as injected dependencies.
- server/search.ts: Tavily + Brave adapters (wire shapes VERIFIED
against docs.tavily.com's OpenAPI + Brave's dashboard docs — Tavily
auth is the Bearer header, not the legacy body api_key; Brave is
X-Subscription-Token) + engine resolution per owner decisions: a key
ALONE activates its engine (no engine choice needed), explicit
agent.search.engine pins the preference (both keys: Tavily first),
a pinned engine with a missing key is honestly unavailable — no
silent fallback, no default engine.
- Curated keys catalog: GOOGLE_SEARCH_API_KEY/GOOGLE_CSE_ID retire
(CSE closed to new customers, dies Jan 2027 — stored values become
preserved unknown vars); TAVILY_API_KEY (tvly- shape) + BRAVE_API_KEY
(length guard) join. UI keys-section TOOL_IDS now derives from the
catalog — cannot drift.
- GET /api/search: {available, engine, reason} — the honest status for
the settings gray-out; researcher-disable semantics ride the same
signal (Teacher stream rewires the tool onto the port).
- agent.search settings field (schema + sanitizer + strict parser);
web.ts's WebSearchResult is now the core SearchHit (re-exported).
53 lines
2.3 KiB
TypeScript
53 lines
2.3 KiB
TypeScript
/**
|
|
* THE CORE PUBLIC API — the only module the shell (app/, components/) may
|
|
* import. Everything exported here is browser-safe: pure logic + types,
|
|
* no node builtins, no fs, no network.
|
|
*
|
|
* Server-side surfaces (chat streaming, store reads) live behind
|
|
* src/server's barrel instead — the import law (eslint.config.mjs):
|
|
*
|
|
* components/** → "@/src/core" (this barrel, ONLY)
|
|
* app/** → "@/src/core" + "@/src/server"
|
|
*
|
|
* Server-only core modules (core/graph.ts emission/derivation) are pure
|
|
* but need storage ports passed in by a server caller, so they are
|
|
* deliberately NOT re-exported here — the server imports them directly.
|
|
* The storage PORT TYPES are types-only and browser-safe, hence re-exported.
|
|
*/
|
|
|
|
export * from "./contracts.ts";
|
|
export * from "./ports.ts";
|
|
export * from "./render-settings.ts";
|
|
|
|
export * from "./question-core.ts";
|
|
// clusters.ts (Louvain) is deliberately NOT re-exported: nothing in the
|
|
// shell runs community detection — the snapshot carries the partition
|
|
// from the server. Keeping it out keeps the heavy clustering deps out of the
|
|
// client bundle (verified 2026-09-13: chunks contained it while this
|
|
// line existed). Same logic as layout-settle.ts below.
|
|
export * from "./layout.ts";
|
|
export * from "./plan-tree.ts";
|
|
export * from "./phases.ts";
|
|
export * from "./pending.ts";
|
|
export * from "./prompt-segments.ts";
|
|
export * from "./math-delims.ts";
|
|
export * from "./ui-message.ts";
|
|
export * from "./tool-parts.ts";
|
|
export * from "./prices.ts";
|
|
export * from "./cost-summary.ts";
|
|
export * from "./fuzzy.ts";
|
|
// settings.ts + settings-resolution.ts (settings-storage wave, 2026-09-19):
|
|
// the user-settings record's shape/sanitizer (pure) and its fully-resolved
|
|
// view. Browser-safe — the Wave-4 panel imports these directly.
|
|
export * from "./settings.ts";
|
|
export * from "./settings-resolution.ts";
|
|
export * from "./search.ts"; // search port (search wave, 2026-09-20)
|
|
// auth-keys.ts (auth-keys wave, 2026-09-19): the curated key catalog +
|
|
// shape rules + masking — pure, browser-safe (the auth page binds to the
|
|
// /api/keys routes built on it).
|
|
export * from "./auth-keys.ts";
|
|
// keyboard.ts: the shortcut registry + binding normalization (pure, browser-safe).
|
|
export * from "./keyboard.ts";
|
|
export * from "./coverage.ts";
|
|
export * from "./graph-context.ts";
|