The relational-databases incident, diagnosed and fixed: TRIGGER — pi's estimator law, adopted exactly: anchor on the last assistant message's provider-reported usage (totalTokens || the field sum) and chars/4-estimate ONLY what was appended after it. The anchor scan skips aborted/zero-usage assistants and STOPS at the newest compaction marker (pre-cut usage described context the next request will not carry — pi's distrust rule). The old estimator (JSON.stringify of every message /4) tripled the true context (measured: 84,412 'tokens' estimated vs 38,799 provider-reported on the incident record) — scaffolding, escaped LaTeX, thinking blocks and app-side details all counted. estimateMessageTokens now counts wire text only (text + thinking + toolCall name/args; content text for user/toolResult/custom). The unanchored fallback runs the plain heuristic over the CUT-HONORED projection plus the additive prompt term; the anchored path adds nothing (usage already billed prompt and tools). OBSERVABILITY — compaction is a visible session-wide state (owner spec): the transcript-bottom placeholder register gains COMPACTING CONTEXT… (BrailleSpinner + Shimmer, the THINKING placeholder's twin, mutually exclusive by construction — the gate precedes beginTurn), and the sidebar row shows 'Compacting context · <ago>' with the spinner (sessionMeta outranks busy; compacting-changed joins turn-started/turn-settled as refresh triggers). Liveness rides the API like turn-busy: ChatListItem.compacting + compactionInFlight on both GET /api/chats and GET /api/chats/[id] (initiallyCompacting covers the navigate-back-mid-compaction mount — the event already fired), exported through the server barrel. Also: the relational-databases record rolled back to pre-compaction (marker, post-marker turns, tree reset; backup in /tmp) for a clean retest. The summarizer-usage 'gap' was a misread — steps[] was populated all along.
45 lines
2.0 KiB
TypeScript
45 lines
2.0 KiB
TypeScript
/**
|
|
* THE SERVER-SIDE SURFACE — the only src module (besides the core barrel)
|
|
* that app/ may import. Route handlers and server components come through
|
|
* here; nothing under app/ touches src/store or src/agent directly.
|
|
*/
|
|
|
|
export * from "./chat-handler.ts";
|
|
export * from "./events-stream.ts";
|
|
export * from "./chats.ts";
|
|
export * from "./graph.ts";
|
|
export * from "./commit-positions.ts";
|
|
export * from "./jobs.ts";
|
|
export * from "./stores.ts";
|
|
export { readRenderSettings, writeRenderSettings } from "../store/render-settings.ts";
|
|
// The settings record + prompt overrides (settings-storage wave, 2026-09-19).
|
|
// The *Record aliases keep the app/api/settings routes explicit about which
|
|
// seam they touch (the raw record, not the chat-section convenience view).
|
|
export {
|
|
readSettings as readSettingsRecord,
|
|
writeSettings as writeSettingsRecord,
|
|
settingsStore,
|
|
} from "../store/settings.ts";
|
|
export { promptOverrides } from "../store/prompt-overrides.ts";
|
|
export { isValidSegmentPath } from "../core/prompt-segments.ts";
|
|
// The canonical segment discovery/resolution lives in the agent layer
|
|
// (composition is an agent concern); the barrel re-exports it for the
|
|
// routes — server→agent is the lawful direction (chat-handler precedent).
|
|
export { effectivePromptSegments, allSegmentPaths, readPromptOverride } from "../agent/prompt-segments.ts";
|
|
|
|
// The auth/keys composition (auth-keys wave, 2026-09-19): the curated
|
|
// key catalog + the env-reflecting store behind GET/PUT/DELETE /api/keys.
|
|
// Importing this module runs the idempotent boot fill-gap — every consumer
|
|
// keeps its plain process.env reads (that seam is the point).
|
|
export * from "./keys.ts";
|
|
export * from "./search.ts";
|
|
export { authStore } from "../store/auth.ts";
|
|
export * from "./settings-body.ts";
|
|
export * from "./turn-liveness.ts";
|
|
export * from "./turn-runs.ts";
|
|
export * from "./dismissal-park.ts";
|
|
export * from "./compaction.ts";
|
|
export { runPiTurn, piTurnResponse, type PiTurnHandle, type PiTurnSpec } from "./pi/ui-stream.ts";
|
|
export * from "./observability.ts";
|
|
export * from "./model-catalog.ts";
|