Files
learnharness/app/api/settings/route.ts
T
amosblomqvist cb4fe25c89 wave 2 (platform stream): settings storage & plumbing foundation (P2)
- src/core/settings.ts: versioned DELTA record schema + sanitizer (unknown keys preserved)
  — general/chat/agent{models,tools,prompts}/appearance/graph sections
- src/core/settings-resolution.ts: pure resolveSettings (factory defaults → user delta),
  extraction/graph-context channel predicates
- src/store/settings.ts + prompt-overrides.ts: SettingsStore/PromptOverrideStore adapters
  wired through stores.ts (effectiveSettings() fresh per call); lazy migration of
  default-settings.json into record.chat
- app/api/settings/** routes (record, section bodies, prompt overrides per segment)
- chat-handler: graph gates at trigger call-sites + toolToggles injection seam
- config.ts: SETTINGS_FILE + PROMPTS_OVERRIDE_DIR paths

587/587 tests; typecheck/lint/build clean
2026-09-19 18:05:30 +03:00

24 lines
951 B
TypeScript

/**
* GET /api/settings — THE user settings record (settings-storage wave,
* 2026-09-19): the whole delta record at data/settings.json (config.
* SETTINGS_FILE, via the SettingsStore port). Non-secret by construction —
* secrets live in auth.json / .env.local and never enter this record.
*
* GET → 200 {settings} (the sanitized delta record — absent keys mean
* "factory default", never guessed server-side) or 200
* {settings: null} on first boot.
*
* Section writes go through PUT /api/settings/[section]; the chat defaults
* also remain writable via the legacy /api/settings/defaults alias.
* Resolution to concrete values is the client's/core's job
* (core/settings-resolution.ts resolveSettings — browser-safe).
*/
import { settingsStore } from "@/src/server";
export const dynamic = "force-dynamic";
export async function GET() {
return Response.json({ settings: settingsStore.readSettings() });
}