mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-06-03 19:25:19 +02:00
Folds the multi-`track:`-array model into one `live:` block per note: a single persistent objective the live-note agent maintains, plus an optional triggers object (`cronExpr` / `windows` / `eventMatchCriteria`, each independently optional). A note is now passive or live — no per-track scopes, no section ownership contract, no `once` trigger. The agent owns the whole body and makes patch-style incremental edits per run. Highlights: - Schema: `track:` array → single `live:` object (`packages/shared/src/live-note.ts`). - Runtime: scheduler / event processor / runner under `core/knowledge/live-note/`, with split `lastAttemptAt` (every run, drives 5-min backoff) vs `lastRunAt` (success only, anchors cycles). `throwOnError` on agent runs surfaces LLM / billing failures into `lastRunError`. - Today.md: regenerated by template v2 (single objective covering overview / calendar / emails / what-you-missed / priorities; existing files renamed to `Today.md.bkp.<stamp>`). - Renderer: `LiveNoteSidebar` mounts inside the editor row (no chat overlap, auto-closes on note switch); toolbar Radio button becomes a status pill; `LiveNotesView` replaces background-agents view. - Copilot: new `live-note` skill with act-first stance, default folder/cadence pickers, and a non-negotiable rule to extend an existing objective rather than add a second one. Shared `KNOWLEDGE_NOTE_STYLE_GUIDE` enforces terse-and-scannable writing across `doc-collab` and the live-note agent. - Analytics: `track_block` use-case → `live_note_agent`; trigger (`manual` / `cron` / `window` / `event`) becomes the Pass-2 sub-use-case, alongside `routing` for Pass 1. Legacy run files with the old value are read-mapped via `LegacyStartEvent` so they stay openable in the runs list. Hard cutover — no back-compat shims for legacy `track:` frontmatter arrays. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
26 lines
1,008 B
TypeScript
26 lines
1,008 B
TypeScript
import { z } from "zod";
|
|
|
|
export const LlmProvider = z.object({
|
|
flavor: z.enum(["openai", "anthropic", "google", "openrouter", "aigateway", "ollama", "openai-compatible", "rowboat"]),
|
|
apiKey: z.string().optional(),
|
|
baseURL: z.string().optional(),
|
|
headers: z.record(z.string(), z.string()).optional(),
|
|
});
|
|
|
|
export const LlmModelConfig = z.object({
|
|
provider: LlmProvider,
|
|
model: z.string(),
|
|
models: z.array(z.string()).optional(),
|
|
providers: z.record(z.string(), z.object({
|
|
apiKey: z.string().optional(),
|
|
baseURL: z.string().optional(),
|
|
headers: z.record(z.string(), z.string()).optional(),
|
|
model: z.string().optional(),
|
|
models: z.array(z.string()).optional(),
|
|
})).optional(),
|
|
// Per-category model overrides (BYOK only — signed-in users always get
|
|
// the curated gateway defaults). Read by helpers in core/models/defaults.ts.
|
|
knowledgeGraphModel: z.string().optional(),
|
|
meetingNotesModel: z.string().optional(),
|
|
liveNoteAgentModel: z.string().optional(),
|
|
});
|