/** * `agent-bober research job add|list|remove` — manage recurring multi-model research jobs. * `agent-bober research run ` — execute a stored research job. * `agent-bober research tick [--watch]` — run every due job (idempotent). * * Subcommands: * research job add --question "..." [--cadence daily|weekly|monthly] [--tier ] * [--domain ] [--target-repo ] [--online-research] * research job list * research job remove * research run * research tick [--watch] [--interval ] * * Error handling: CLI handlers MUST NOT throw. They set process.exitCode=1 and * return on all errors. Pattern mirrors src/cli/commands/task.ts:360-367. * * Clock discipline: new Date().toISOString() is called ONLY at the .action() * boundary — never inside the store (mirrors task.ts:352 "stamp wall-clock time * at handler boundary"). * * fs boundary: ALL direct fs work (ensureDir, writeFile) happens inside runner.ts * and note-writer.ts. This file only calls readJob (JSON read) and opens FactStore. * This keeps the utils/fs.js import surface minimal (only findProjectRoot) so that * the research.test.ts whole-module vi.mock of utils/fs.js stays stable. */ import type { Command } from "commander"; import type { DigestRun } from "../../research/digest.js"; import type { QueryModel, FindingSink } from "../../research/runner.js"; /** * Optional overrides injected at registration time. * Allows tests to bypass the real LLM provider and hub store without * mocking additional modules beyond utils/fs.js. */ export interface ResearchRunOverrides { queryModel?: QueryModel; findingSink?: FindingSink; /** Injected collector for `research digest` — skips real vault I/O in tests. */ digestCollectRuns?: (since: string, now: string) => Promise; } export declare function registerResearchCommand(program: Command, overrides?: ResearchRunOverrides): void; //# sourceMappingURL=research.d.ts.map