@tuttiai/cli 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +293 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/templates/index.ts","../src/commands/run.ts","../src/watch/score-watcher.ts","../src/commands/resume.ts","../src/commands/add.ts","../src/commands/check.ts","../src/commands/studio.ts","../src/commands/search.ts","../src/commands/publish.ts","../src/commands/eval.ts","../src/commands/serve.ts","../src/commands/schedule.ts","../src/commands/update.ts","../src/commands/outdated.ts","../src/commands/info.ts","../src/commands/upgrade.ts","../src/commands/replay.ts","../src/commands/replay-render.ts","../src/commands/schedules.ts","../src/commands/traces.ts","../src/commands/traces-render.ts"],"sourcesContent":["import { config } from \"dotenv\";\nconfig();\n\nimport { createLogger } from \"@tuttiai/core\";\nconst logger = createLogger(\"tutti-cli\");\n\nprocess.on(\"unhandledRejection\", (reason) => {\n logger.error({ error: reason instanceof Error ? reason.message : String(reason) }, \"Unhandled rejection\");\n process.exit(1);\n});\n\nprocess.on(\"uncaughtException\", (err) => {\n logger.error({ error: err.message }, \"Fatal error\");\n process.exit(1);\n});\n\nimport { Command } from \"commander\";\nimport { initCommand, templatesCommand } from \"./commands/init.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { resumeCommand, type ResumeOptions } from \"./commands/resume.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { studioCommand } from \"./commands/studio.js\";\nimport { searchCommand, voicesCommand } from \"./commands/search.js\";\nimport { publishCommand } from \"./commands/publish.js\";\nimport { evalCommand } from \"./commands/eval.js\";\nimport { serveCommand, type ServeOptions } from \"./commands/serve.js\";\nimport { scheduleCommand } from \"./commands/schedule.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { outdatedCommand } from \"./commands/outdated.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { upgradeCommand } from \"./commands/upgrade.js\";\nimport { replayCommand } from \"./commands/replay.js\";\nimport {\n schedulesListCommand,\n schedulesEnableCommand,\n schedulesDisableCommand,\n schedulesTriggerCommand,\n schedulesRunsCommand,\n} from \"./commands/schedules.js\";\nimport {\n tracesListCommand,\n tracesShowCommand,\n tracesTailCommand,\n type TracesOptions,\n} from \"./commands/traces.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"tutti-ai\")\n .description(\"Tutti — multi-agent orchestration. All agents. All together.\")\n .version(\"0.13.0\");\n\nprogram\n .command(\"init [project-name]\")\n .description(\"Create a new Tutti project\")\n .option(\"-t, --template <id>\", \"Project template to use\")\n .action(async (projectName: string | undefined, opts: { template?: string }) => {\n await initCommand(projectName, opts.template);\n });\n\nprogram\n .command(\"templates\")\n .description(\"List all available project templates\")\n .action(() => {\n templatesCommand();\n });\n\nprogram\n .command(\"run [score]\")\n .description(\"Run a Tutti score interactively\")\n .option(\"-w, --watch\", \"Reload the score on file changes\")\n .action(async (score: string | undefined, opts: { watch?: boolean }) => {\n await runCommand(score, { watch: opts.watch });\n });\n\nprogram\n .command(\"serve [score]\")\n .description(\"Start the Tutti HTTP server\")\n .option(\"-p, --port <number>\", \"Port to listen on (default: 3847)\")\n .option(\"-H, --host <address>\", \"Host to bind to (default: 0.0.0.0)\")\n .option(\"-k, --api-key <key>\", \"API key for bearer auth (or set TUTTI_API_KEY)\")\n .option(\"-a, --agent <name>\", \"Agent to expose (default: score entry or first agent)\")\n .option(\"-w, --watch\", \"Reload the score on file changes\")\n .action(async (score: string | undefined, opts: ServeOptions) => {\n await serveCommand(score, opts);\n });\n\nprogram\n .command(\"resume <session-id>\")\n .description(\"Resume a crashed or interrupted run from its last checkpoint\")\n .option(\n \"--store <backend>\",\n \"Durable store the checkpoint was written to (redis | postgres)\",\n \"redis\",\n )\n .option(\"-s, --score <path>\", \"Path to score file (default: ./tutti.score.ts)\")\n .option(\"-a, --agent <name>\", \"Agent key to resume (default: score.entry or the first agent)\")\n .option(\"-y, --yes\", \"Skip the confirmation prompt\")\n .action(\n async (\n sessionId: string,\n opts: { store?: string; score?: string; agent?: string; yes?: boolean },\n ) => {\n if (opts.store !== \"redis\" && opts.store !== \"postgres\") {\n console.error(\"--store must be 'redis' or 'postgres'\");\n process.exit(1);\n }\n const resolved: ResumeOptions = {\n store: opts.store,\n ...(opts.score !== undefined ? { score: opts.score } : {}),\n ...(opts.agent !== undefined ? { agent: opts.agent } : {}),\n ...(opts.yes !== undefined ? { yes: opts.yes } : {}),\n };\n await resumeCommand(sessionId, resolved);\n },\n );\n\nprogram\n .command(\"add <voice>\")\n .description(\"Add a voice to your project\")\n .action((voice: string) => {\n addCommand(voice);\n });\n\nprogram\n .command(\"check [score]\")\n .description(\"Validate a score file without running it\")\n .action(async (score?: string) => {\n await checkCommand(score);\n });\n\nprogram\n .command(\"doctor [score]\")\n .description(\"Alias for check — validate a score file\")\n .action(async (score?: string) => {\n await checkCommand(score);\n });\n\nprogram\n .command(\"studio [score]\")\n .description(\"Launch Tutti Studio — local web UI for inspecting agent runs\")\n .action(async (score?: string) => {\n await studioCommand(score);\n });\n\nprogram\n .command(\"search <query>\")\n .description(\"Search the voice registry for voices matching a query\")\n .action(async (query: string) => {\n await searchCommand(query);\n });\n\nprogram\n .command(\"voices\")\n .description(\"List all available official voices and install status\")\n .action(async () => {\n await voicesCommand();\n });\n\nprogram\n .command(\"publish\")\n .description(\"Publish the current voice to npm and the voice registry\")\n .option(\"--dry-run\", \"Run all checks without publishing\")\n .action(async (opts: { dryRun?: boolean }) => {\n await publishCommand(opts);\n });\n\nprogram\n .command(\"eval <suite-file>\")\n .description(\"Run an evaluation suite against a score\")\n .option(\"--ci\", \"Exit with code 1 if any case fails\")\n .option(\"-s, --score <path>\", \"Path to score file (default: ./tutti.score.ts)\")\n .action(async (suitePath: string, opts: { ci?: boolean; score?: string }) => {\n await evalCommand(suitePath, opts);\n });\n\nprogram\n .command(\"update\")\n .description(\"Update @tuttiai packages to their latest versions\")\n .action(() => {\n updateCommand();\n });\n\nprogram\n .command(\"outdated\")\n .description(\"Check installed @tuttiai packages for newer versions\")\n .action(() => {\n outdatedCommand();\n });\n\nprogram\n .command(\"info [score]\")\n .description(\"Show project info — agents, voices, models, and package versions\")\n .action(async (score?: string) => {\n await infoCommand(score);\n });\n\nprogram\n .command(\"upgrade [voice]\")\n .description(\"Upgrade a specific voice or all @tuttiai packages to latest\")\n .action((voice?: string) => {\n upgradeCommand(voice);\n });\n\nprogram\n .command(\"replay <session-id>\")\n .description(\"Time-travel debugger — navigate and replay a session from PostgreSQL\")\n .option(\"-s, --score <path>\", \"Path to score file for replay-from (default: ./tutti.score.ts)\")\n .action(async (sessionId: string, opts: { score?: string }) => {\n await replayCommand(sessionId, { score: opts.score });\n });\n\nprogram\n .command(\"schedule [score]\")\n .description(\"Start the scheduler daemon — runs agents on their configured schedules\")\n .action(async (score?: string) => {\n await scheduleCommand(score);\n });\n\nconst schedulesCmd = program\n .command(\"schedules\")\n .description(\"Manage scheduled agents\");\n\nschedulesCmd\n .command(\"list\")\n .description(\"Show all registered schedules\")\n .action(async () => {\n await schedulesListCommand();\n });\n\nschedulesCmd\n .command(\"enable <id>\")\n .description(\"Enable a disabled schedule\")\n .action(async (id: string) => {\n await schedulesEnableCommand(id);\n });\n\nschedulesCmd\n .command(\"disable <id>\")\n .description(\"Disable a schedule without deleting it\")\n .action(async (id: string) => {\n await schedulesDisableCommand(id);\n });\n\nschedulesCmd\n .command(\"trigger <id>\")\n .description(\"Manually trigger a scheduled run immediately\")\n .option(\"-s, --score <path>\", \"Path to score file (default: ./tutti.score.ts)\")\n .action(async (id: string, opts: { score?: string }) => {\n await schedulesTriggerCommand(id, opts.score);\n });\n\nschedulesCmd\n .command(\"runs <id>\")\n .description(\"Show run history for a schedule (last 20 runs)\")\n .action(async (id: string) => {\n await schedulesRunsCommand(id);\n });\n\nconst tracesCmd = program\n .command(\"traces\")\n .description(\"Inspect spans emitted by a running tutti-ai serve process\");\n\ntracesCmd\n .command(\"list\")\n .description(\"Show the last 20 traces (most recent first)\")\n .option(\"-u, --url <url>\", \"Server URL (default: http://127.0.0.1:3847)\")\n .option(\"-k, --api-key <key>\", \"Bearer token (default: TUTTI_API_KEY env)\")\n .action(async (opts: { url?: string; apiKey?: string }) => {\n const resolved: TracesOptions = {\n ...(opts.url !== undefined ? { url: opts.url } : {}),\n ...(opts.apiKey !== undefined ? { apiKey: opts.apiKey } : {}),\n };\n await tracesListCommand(resolved);\n });\n\ntracesCmd\n .command(\"show <trace-id>\")\n .description(\"Render every span in a trace as an indented tree\")\n .option(\"-u, --url <url>\", \"Server URL (default: http://127.0.0.1:3847)\")\n .option(\"-k, --api-key <key>\", \"Bearer token (default: TUTTI_API_KEY env)\")\n .action(async (traceId: string, opts: { url?: string; apiKey?: string }) => {\n const resolved: TracesOptions = {\n ...(opts.url !== undefined ? { url: opts.url } : {}),\n ...(opts.apiKey !== undefined ? { apiKey: opts.apiKey } : {}),\n };\n await tracesShowCommand(traceId, resolved);\n });\n\ntracesCmd\n .command(\"tail\")\n .description(\"Live-tail spans as they are emitted (Ctrl+C to exit)\")\n .option(\"-u, --url <url>\", \"Server URL (default: http://127.0.0.1:3847)\")\n .option(\"-k, --api-key <key>\", \"Bearer token (default: TUTTI_API_KEY env)\")\n .action(async (opts: { url?: string; apiKey?: string }) => {\n const resolved: TracesOptions = {\n ...(opts.url !== undefined ? { url: opts.url } : {}),\n ...(opts.apiKey !== undefined ? { apiKey: opts.apiKey } : {}),\n };\n await tracesTailCommand(resolved);\n });\n\nprogram.parse();\n","import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport Enquirer from \"enquirer\";\nimport { createLogger } from \"@tuttiai/core\";\nimport { TEMPLATES, getTemplate } from \"../templates/index.js\";\nimport type { Template } from \"../templates/index.js\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nconst { prompt } = Enquirer;\n\nexport async function initCommand(projectName?: string, templateId?: string): Promise<void> {\n if (!projectName) {\n const response = await prompt<{ projectName: string }>({\n type: \"input\",\n name: \"projectName\",\n message: \"Project name?\",\n });\n projectName = response.projectName;\n }\n\n if (!projectName) {\n logger.error(\"Project name is required\");\n process.exit(1);\n }\n\n const dir = join(process.cwd(), projectName);\n\n if (existsSync(dir)) {\n logger.error({ dir: `${projectName}/` }, \"Directory already exists\");\n process.exit(1);\n }\n\n // Resolve template\n let template: Template | undefined;\n if (templateId) {\n template = getTemplate(templateId);\n if (!template) {\n logger.error({ template: templateId }, \"Unknown template\");\n console.error(chalk.dim(\" Available: \" + TEMPLATES.map((t) => t.id).join(\", \")));\n process.exit(1);\n }\n } else {\n // Interactive picker\n const response = await prompt<{ templateId: string }>({\n type: \"select\",\n name: \"templateId\",\n message: \"Which template?\",\n choices: TEMPLATES.map((t) => ({\n name: t.id,\n message: t.name + chalk.dim(\" — \" + t.description),\n })),\n });\n template = getTemplate(response.templateId);\n if (!template) template = TEMPLATES[0];\n }\n\n mkdirSync(dir, { recursive: true });\n\n const deps: Record<string, string> = {\n \"@tuttiai/core\": \"*\",\n \"@tuttiai/types\": \"*\",\n ...template.deps,\n };\n\n const envLines = [\n \"ANTHROPIC_API_KEY=your_key_here\",\n ...template.envVars,\n \"\",\n \"# Log level: debug | info | warn | error (default: info)\",\n \"TUTTI_LOG_LEVEL=info\",\n \"\",\n \"# OpenTelemetry (optional)\",\n \"# OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318\",\n \"# OTEL_SERVICE_NAME=tutti\",\n ];\n\n const files: Record<string, string> = {\n \"package.json\": JSON.stringify(\n {\n name: projectName,\n version: \"0.0.1\",\n type: \"module\",\n scripts: {\n dev: \"tsx watch tutti.score.ts\",\n start: \"tsx tutti.score.ts\",\n },\n dependencies: deps,\n devDependencies: {\n tsx: \"^4.0.0\",\n typescript: \"^5.7.0\",\n },\n },\n null,\n 2,\n ),\n\n \".env.example\": envLines.join(\"\\n\") + \"\\n\",\n\n \".gitignore\": \"node_modules\\ndist\\n.env\\n\",\n\n \"tsconfig.json\": JSON.stringify(\n {\n compilerOptions: {\n strict: true,\n target: \"ES2022\",\n module: \"ES2022\",\n moduleResolution: \"bundler\",\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: \"dist\",\n rootDir: \".\",\n },\n include: [\".\"],\n },\n null,\n 2,\n ),\n\n \"tutti.score.ts\": template.score,\n\n \"README.md\": `# ${projectName}\n\nA Tutti agent project. All agents. All together.\n\n**Template:** ${template.name} — ${template.description}\n\n## Setup\n\n\\`\\`\\`bash\ncp .env.example .env\n# Add your API keys to .env\nnpm install\n\\`\\`\\`\n\n## Run\n\n\\`\\`\\`bash\nnpm run dev\n\\`\\`\\`\n`,\n };\n\n for (const [filename, content] of Object.entries(files)) {\n writeFileSync(join(dir, filename), content);\n }\n\n console.log();\n console.log(chalk.green(` ✔ Created ${projectName}/`) + chalk.dim(` (${template.name})`));\n console.log();\n console.log(\" Next steps:\");\n console.log(chalk.cyan(` cd ${projectName}`));\n console.log(chalk.cyan(\" cp .env.example .env\"));\n console.log(chalk.cyan(\" npm install\"));\n console.log(chalk.cyan(\" npm run dev\"));\n console.log();\n}\n\nexport function templatesCommand(): void {\n console.log();\n console.log(chalk.bold(\" Available Templates\"));\n console.log();\n for (const t of TEMPLATES) {\n console.log(\" \" + chalk.cyan(t.id.padEnd(18)) + t.description);\n }\n console.log();\n console.log(chalk.dim(\" Use: tutti-ai init my-project --template \" + TEMPLATES[0].id));\n console.log();\n}\n","export interface Template {\n id: string;\n name: string;\n description: string;\n deps: Record<string, string>;\n envVars: string[];\n score: string;\n}\n\nconst minimal: Template = {\n id: \"minimal\",\n name: \"Minimal\",\n description: \"One agent, no voices — the simplest starting point\",\n deps: {},\n envVars: [],\n score: `import { defineScore, AnthropicProvider } from \"@tuttiai/core\"\n\nexport default defineScore({\n provider: new AnthropicProvider(),\n default_model: \"claude-sonnet-4-20250514\",\n agents: {\n assistant: {\n name: \"Assistant\",\n system_prompt: \"You are a helpful assistant.\",\n voices: [],\n }\n }\n})\n`,\n};\n\nconst codingAgent: Template = {\n id: \"coding-agent\",\n name: \"Coding Agent\",\n description: \"TypeScript developer with filesystem + GitHub access\",\n deps: { \"@tuttiai/filesystem\": \"*\", \"@tuttiai/github\": \"*\" },\n envVars: [\"GITHUB_TOKEN=ghp_your_token_here\"],\n score: `import { defineScore, AnthropicProvider } from \"@tuttiai/core\"\nimport { FilesystemVoice } from \"@tuttiai/filesystem\"\nimport { GitHubVoice } from \"@tuttiai/github\"\n\nexport default defineScore({\n provider: new AnthropicProvider(),\n default_model: \"claude-sonnet-4-20250514\",\n agents: {\n coder: {\n name: \"Coder\",\n system_prompt:\n \"You are an expert TypeScript developer. \" +\n \"You read and write code using the filesystem voice, \" +\n \"and manage issues and PRs via the GitHub voice. \" +\n \"Write clean, tested, well-documented code.\",\n voices: [new FilesystemVoice(), new GitHubVoice()],\n permissions: [\"filesystem\", \"network\"],\n streaming: true,\n }\n }\n})\n`,\n};\n\nconst researchAgent: Template = {\n id: \"research-agent\",\n name: \"Research Agent\",\n description: \"Researcher that saves structured notes to files\",\n deps: { \"@tuttiai/filesystem\": \"*\" },\n envVars: [],\n score: `import { defineScore, AnthropicProvider } from \"@tuttiai/core\"\nimport { FilesystemVoice } from \"@tuttiai/filesystem\"\n\nexport default defineScore({\n provider: new AnthropicProvider(),\n default_model: \"claude-sonnet-4-20250514\",\n agents: {\n researcher: {\n name: \"Researcher\",\n system_prompt:\n \"You are an expert researcher. \" +\n \"Analyze topics thoroughly, cite sources, and save \" +\n \"structured notes as markdown files using the filesystem voice. \" +\n \"Organize findings with clear headings and bullet points.\",\n voices: [new FilesystemVoice()],\n permissions: [\"filesystem\"],\n streaming: true,\n }\n }\n})\n`,\n};\n\nconst qaPipeline: Template = {\n id: \"qa-pipeline\",\n name: \"QA Pipeline\",\n description: \"Orchestrator + QA specialist with browser testing and HITL\",\n deps: { \"@tuttiai/playwright\": \"*\" },\n envVars: [],\n score: `import { defineScore, AnthropicProvider } from \"@tuttiai/core\"\nimport { PlaywrightVoice } from \"@tuttiai/playwright\"\n\nexport default defineScore({\n provider: new AnthropicProvider(),\n default_model: \"claude-sonnet-4-20250514\",\n entry: \"orchestrator\",\n agents: {\n orchestrator: {\n name: \"QA Lead\",\n system_prompt:\n \"You are a QA lead. Triage incoming bugs by delegating \" +\n \"browser testing to the QA specialist. Use human-in-the-loop \" +\n \"to ask for approval before marking bugs as verified.\",\n voices: [],\n role: \"orchestrator\",\n delegates: [\"qa\"],\n allow_human_input: true,\n streaming: true,\n },\n qa: {\n name: \"QA Specialist\",\n system_prompt:\n \"You are a QA engineer. Navigate to URLs, check elements, \" +\n \"take screenshots, and verify bug reports using the browser.\",\n voices: [new PlaywrightVoice()],\n permissions: [\"network\", \"browser\"],\n role: \"specialist\",\n budget: { max_cost_usd: 0.50, warn_at_percent: 80 },\n streaming: true,\n }\n }\n})\n`,\n};\n\nconst devTeam: Template = {\n id: \"dev-team\",\n name: \"Dev Team\",\n description: \"Full team: orchestrator + coder + PM + QA with all voices\",\n deps: {\n \"@tuttiai/filesystem\": \"*\",\n \"@tuttiai/github\": \"*\",\n \"@tuttiai/playwright\": \"*\",\n },\n envVars: [\"GITHUB_TOKEN=ghp_your_token_here\"],\n score: `import { defineScore, AnthropicProvider, createLoggingHook, createBlocklistHook, createLogger } from \"@tuttiai/core\"\nimport { FilesystemVoice } from \"@tuttiai/filesystem\"\nimport { GitHubVoice } from \"@tuttiai/github\"\nimport { PlaywrightVoice } from \"@tuttiai/playwright\"\n\nconst logger = createLogger(\"dev-team\")\n\nexport default defineScore({\n provider: new AnthropicProvider(),\n default_model: \"claude-sonnet-4-20250514\",\n entry: \"orchestrator\",\n hooks: {\n ...createLoggingHook(logger),\n ...createBlocklistHook([\"delete_file\"]),\n },\n agents: {\n orchestrator: {\n name: \"Tech Lead\",\n system_prompt:\n \"You are the tech lead. Break tasks into subtasks and delegate: \" +\n \"code tasks to Coder, documentation to PM, testing to QA. \" +\n \"Review outputs before presenting to the user.\",\n voices: [],\n role: \"orchestrator\",\n delegates: [\"coder\", \"pm\", \"qa\"],\n allow_human_input: true,\n streaming: true,\n },\n coder: {\n name: \"Coder\",\n system_prompt:\n \"You are a senior TypeScript developer. Write clean, tested code. \" +\n \"Use the filesystem voice to read/write files and GitHub to manage PRs.\",\n voices: [new FilesystemVoice(), new GitHubVoice()],\n permissions: [\"filesystem\", \"network\"],\n role: \"specialist\",\n streaming: true,\n },\n pm: {\n name: \"PM\",\n system_prompt:\n \"You are a product manager. Write specs, update documentation, \" +\n \"and create GitHub issues for tracking. Focus on clarity and completeness.\",\n voices: [new FilesystemVoice(), new GitHubVoice()],\n permissions: [\"filesystem\", \"network\"],\n role: \"specialist\",\n streaming: true,\n },\n qa: {\n name: \"QA\",\n system_prompt:\n \"You are a QA engineer. Test features in the browser, verify bugs, \" +\n \"and write test reports. Screenshot evidence for every finding.\",\n voices: [new PlaywrightVoice()],\n permissions: [\"network\", \"browser\"],\n role: \"specialist\",\n budget: { max_cost_usd: 1.00 },\n streaming: true,\n }\n }\n})\n`,\n};\n\nexport const TEMPLATES: Template[] = [minimal, codingAgent, researchAgent, qaPipeline, devTeam];\n\nexport function getTemplate(id: string): Template | undefined {\n return TEMPLATES.find((t) => t.id === id);\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n TuttiRuntime,\n ScoreLoader,\n AnthropicProvider,\n OpenAIProvider,\n GeminiProvider,\n SecretsManager,\n InMemorySessionStore,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { ScoreConfig, SessionStore } from \"@tuttiai/types\";\nimport { ReactiveScore } from \"../watch/score-watcher.js\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nexport interface RunOptions {\n /** Reload the score on file changes. */\n watch?: boolean;\n}\n\nexport async function runCommand(\n scorePath?: string,\n options: RunOptions = {},\n): Promise<void> {\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n\n if (!existsSync(file)) {\n logger.error({ file }, \"Score file not found\");\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n let score;\n try {\n score = await ScoreLoader.load(file);\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Failed to load score\",\n );\n process.exit(1);\n }\n\n // Validate that the provider has a valid API key\n const providerKeyMap: [unknown, string][] = [\n [AnthropicProvider, \"ANTHROPIC_API_KEY\"],\n [OpenAIProvider, \"OPENAI_API_KEY\"],\n [GeminiProvider, \"GEMINI_API_KEY\"],\n ];\n\n for (const [ProviderClass, envVar] of providerKeyMap) {\n if (score.provider instanceof (ProviderClass as new (...args: unknown[]) => unknown)) {\n const key = SecretsManager.optional(envVar);\n if (!key) {\n logger.error({ envVar }, \"Missing API key\");\n process.exit(1);\n }\n }\n }\n\n // Enable streaming on every agent in the score. Factored out so we can\n // reapply it after a hot-reload in watch mode.\n const applyRunDefaults = (cfg: ScoreConfig): void => {\n for (const agent of Object.values(cfg.agents)) {\n agent.streaming = true;\n }\n };\n applyRunDefaults(score);\n\n // Build a single session store up front in watch mode so the\n // conversation history survives runtime swaps. Non-watch runs can let\n // TuttiRuntime provision its own store from score.memory as usual.\n const sharedSessions: SessionStore | undefined = options.watch\n ? new InMemorySessionStore()\n : undefined;\n\n const spinner = ora({ color: \"cyan\" });\n\n // REPL-level state. `streaming` resets per turn; `runtime` may be\n // swapped by the hot-reload path below.\n let streaming = false;\n let runtime = buildRuntime(score, sharedSessions);\n\n attachListeners(runtime);\n\n // REPL readline — created early so the HITL handler below can use it.\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n // Wire per-runtime listeners. Separated from the REPL so a hot-reload\n // can swap the runtime and re-wire without touching the outer loop.\n function attachListeners(r: TuttiRuntime): void {\n r.events.on(\"agent:start\", (e) => {\n logger.info({ agent: e.agent_name }, \"Running agent\");\n });\n\n r.events.on(\"llm:request\", () => {\n spinner.start(\"Thinking...\");\n });\n\n r.events.on(\"token:stream\", (e) => {\n if (!streaming) {\n spinner.stop();\n streaming = true;\n }\n process.stdout.write(e.text);\n });\n\n r.events.on(\"llm:response\", () => {\n if (streaming) {\n process.stdout.write(\"\\n\");\n } else {\n spinner.stop();\n }\n });\n\n r.events.on(\"tool:start\", (e) => {\n if (streaming) {\n process.stdout.write(chalk.dim(\"\\n [using: \" + e.tool_name + \"]\"));\n } else {\n spinner.stop();\n console.log(chalk.dim(\" [using: \" + e.tool_name + \"]\"));\n }\n });\n\n r.events.on(\"tool:end\", (e) => {\n if (streaming) {\n process.stdout.write(chalk.dim(\" [done: \" + e.tool_name + \"]\\n\"));\n }\n });\n\n r.events.on(\"tool:error\", (e) => {\n spinner.stop();\n logger.error({ tool: e.tool_name }, \"Tool error\");\n });\n\n r.events.on(\"security:injection_detected\", (e) => {\n logger.warn({ tool: e.tool_name }, \"Potential prompt injection detected\");\n });\n\n r.events.on(\"budget:warning\", () => {\n logger.warn(\"Approaching token budget (80%)\");\n });\n\n r.events.on(\"budget:exceeded\", () => {\n logger.error(\"Token budget exceeded — stopping\");\n });\n\n r.events.on(\"hitl:requested\", (e) => {\n spinner.stop();\n if (streaming) {\n process.stdout.write(\"\\n\");\n streaming = false;\n }\n console.log();\n console.log(\n chalk.yellow(\n \" \" + chalk.bold(\"[Agent needs input]\") + \" \" + e.question,\n ),\n );\n if (e.options) {\n e.options.forEach((opt, i) => {\n console.log(chalk.yellow(\" \" + (i + 1) + \". \" + opt));\n });\n }\n void rl.question(chalk.yellow(\" > \")).then((answer) => {\n runtime.answer(e.session_id, answer.trim());\n });\n });\n }\n\n // --- Watch mode wiring ---------------------------------------------------\n // Scope: set up a ReactiveScore that reloads the score file on change\n // and surfaces status to the REPL. The REPL checks `pendingReload`\n // between turns (so we never interrupt a mid-turn call) and swaps\n // `runtime` when appropriate.\n let reactive: ReactiveScore | undefined;\n if (options.watch) {\n reactive = new ReactiveScore(score, file);\n reactive.on(\"file-change\", () => {\n console.log(chalk.cyan(\"\\n[tutti] Score changed, reloading...\"));\n });\n reactive.on(\"reloaded\", () => {\n // Defer the actual swap to the next turn boundary — the REPL loop\n // checks `pendingReload` before each iteration. Applying mid-turn\n // would either interrupt a tool call or strand events listeners\n // pointing at the old runtime instance.\n console.log(chalk.green(\"[tutti] Score reloaded. Changes applied.\"));\n });\n reactive.on(\"reload-failed\", (err) => {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"[tutti] Reload failed — using previous config\",\n );\n });\n }\n\n // REPL\n console.log(chalk.dim('Tutti REPL — type \"exit\" to quit\\n'));\n if (options.watch) {\n console.log(chalk.dim(\"Watching \" + file + \" for changes…\\n\"));\n }\n\n let sessionId: string | undefined;\n\n // Handle Ctrl+C cleanly\n process.on(\"SIGINT\", () => {\n if (streaming) process.stdout.write(\"\\n\");\n spinner.stop();\n console.log(chalk.dim(\"Goodbye!\"));\n rl.close();\n if (reactive) void reactive.close();\n process.exit(0);\n });\n\n try {\n while (true) {\n // Apply any pending hot-reload before we start the next turn. This\n // is the \"don't interrupt mid-tool-call\" guarantee — we only swap\n // at a REPL-loop boundary, after the previous `run()` resolved.\n if (reactive?.pendingReload) {\n const nextScore = reactive.current;\n applyRunDefaults(nextScore);\n runtime = buildRuntime(nextScore, sharedSessions);\n attachListeners(runtime);\n reactive.consumePendingReload();\n }\n\n const input = await rl.question(chalk.cyan(\"> \"));\n const trimmed = input.trim();\n\n if (!trimmed) continue;\n if (trimmed === \"exit\" || trimmed === \"quit\") break;\n\n // Reset streaming state for this run\n streaming = false;\n\n try {\n const result = await runtime.run(\"assistant\", trimmed, sessionId);\n sessionId = result.session_id;\n\n if (!streaming) {\n console.log(\"\\n\" + result.output + \"\\n\");\n } else {\n console.log();\n }\n } catch (err) {\n if (streaming) process.stdout.write(\"\\n\");\n spinner.stop();\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Something went wrong\",\n );\n }\n }\n } catch {\n // readline closed\n }\n\n console.log(chalk.dim(\"Goodbye!\"));\n rl.close();\n if (reactive) await reactive.close();\n process.exit(0);\n}\n\nfunction buildRuntime(\n score: ScoreConfig,\n sessionStore: SessionStore | undefined,\n): TuttiRuntime {\n return new TuttiRuntime(\n score,\n sessionStore ? { sessionStore } : {},\n );\n}\n","import { dirname, resolve } from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport chokidar, { type FSWatcher } from \"chokidar\";\nimport type { ScoreConfig } from \"@tuttiai/types\";\nimport { validateScore } from \"@tuttiai/core\";\n\n/** How long to wait after the last change event before reloading. */\nconst DEFAULT_DEBOUNCE_MS = 200;\n\n/** Default ignore-patterns for the directory-tree watch. */\nconst DEFAULT_IGNORED = [\n /(^|[/\\\\])\\../, // dotfiles (.git, .env, etc.)\n /node_modules/,\n /[/\\\\]dist[/\\\\]/,\n /[/\\\\]coverage[/\\\\]/,\n];\n\n/**\n * Load a score module with ESM cache-busting. Node's ESM cache is per-URL\n * and cannot be invalidated, so we append a unique query parameter on\n * each reload to force a fresh module instance. The old instance stays in\n * memory — acceptable leak for a development-only watch loop.\n */\nasync function defaultLoadScore(path: string): Promise<ScoreConfig> {\n const absolute = resolve(path);\n // Node's ESM cache is per-URL and can't be invalidated — append a\n // unique query parameter so each reload gets a fresh module instance.\n // The previous instance stays in memory (small leak, acceptable for a\n // development-only watch loop).\n const { pathToFileURL } = await import(\"node:url\");\n const url = pathToFileURL(absolute).href + \"?t=\" + Date.now().toString(36);\n const mod = (await import(url)) as { default?: ScoreConfig };\n if (!mod.default) {\n throw new Error(\n \"Score file has no default export: \" + path +\n \" — your score must export `defineScore({ ... })` as its default.\",\n );\n }\n // Validate the freshly-loaded score. `ScoreLoader.load` would have run\n // the same validator but on a stale cache entry, so we inline it.\n validateScore(mod.default);\n return mod.default;\n}\n\nexport interface ReactiveScoreEvents {\n /** Emitted immediately when a watched file changes (before debounce settles). */\n \"file-change\": (changedPath: string) => void;\n /** Emitted when a reload attempt starts (after debounce). */\n reloading: () => void;\n /** Emitted when a reload succeeds — `current` now returns the new score. */\n reloaded: (score: ScoreConfig) => void;\n /**\n * Emitted when a reload fails. The previous `current` score is kept so\n * the REPL can continue with the last-known-good config.\n */\n \"reload-failed\": (error: Error) => void;\n}\n\nexport interface ReactiveScoreOptions {\n /**\n * Additional paths or glob patterns to watch beyond the score file and\n * its parent directory. Useful when voices live elsewhere.\n */\n extraPaths?: string[];\n /** Debounce window in ms. Default 200. */\n debounceMs?: number;\n /**\n * Override the score loader. Primarily a test seam — production code\n * uses the default cache-busting ESM importer.\n */\n load?: (path: string) => Promise<ScoreConfig>;\n}\n\n/**\n * A {@link ScoreConfig} that refreshes itself when the underlying file\n * (or any file in its directory) changes on disk.\n *\n * Consumers read `reactive.current` before each turn and get the most\n * recent successfully-loaded score. On a reload failure (syntax error in\n * the score file, schema validation, etc.), `current` keeps returning the\n * previous value — callers can listen for `reload-failed` to surface the\n * error in their UI.\n */\nexport class ReactiveScore extends EventEmitter {\n private _current: ScoreConfig;\n private readonly scorePath: string;\n private readonly load: (path: string) => Promise<ScoreConfig>;\n private readonly debounceMs: number;\n private readonly watcher: FSWatcher;\n private debounceTimer: ReturnType<typeof setTimeout> | undefined;\n private closed = false;\n private _pendingReload = false;\n\n constructor(\n initialScore: ScoreConfig,\n scorePath: string,\n options: ReactiveScoreOptions = {},\n ) {\n super();\n this._current = initialScore;\n this.scorePath = resolve(scorePath);\n this.load = options.load ?? defaultLoadScore;\n this.debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n\n // Watch the score file, its parent directory tree, and any extras.\n // Directory-tree watching catches voice files and local utility\n // modules without needing a proper import-graph resolver; the\n // trade-off is that unrelated files in the tree also trigger reloads.\n const watchTargets = [\n this.scorePath,\n dirname(this.scorePath),\n ...(options.extraPaths ?? []),\n ];\n this.watcher = chokidar.watch(watchTargets, {\n ignored: DEFAULT_IGNORED,\n ignoreInitial: true,\n // awaitWriteFinish: guard against partial writes from editors that\n // save atomically via rename/move.\n awaitWriteFinish: {\n stabilityThreshold: 50,\n pollInterval: 20,\n },\n });\n\n this.watcher.on(\"change\", (path) => this.handleChange(path));\n this.watcher.on(\"add\", (path) => this.handleChange(path));\n }\n\n /** The most recent successfully-loaded score. Never stale. */\n get current(): ScoreConfig {\n return this._current;\n }\n\n /**\n * True when a file change has been observed and a reload is pending\n * (or just completed and not yet consumed). Readers call\n * {@link consumePendingReload} to clear the flag when they've taken\n * action on the new config.\n */\n get pendingReload(): boolean {\n return this._pendingReload;\n }\n\n consumePendingReload(): void {\n this._pendingReload = false;\n }\n\n /** Release the underlying filesystem watchers. */\n async close(): Promise<void> {\n this.closed = true;\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n await this.watcher.close();\n }\n\n /**\n * Force an immediate reload without waiting for a filesystem event.\n * Exposed for tests and for the `reload` REPL command.\n */\n async reloadNow(): Promise<void> {\n if (this.closed) return;\n this.emit(\"reloading\");\n try {\n const next = await this.load(this.scorePath);\n this._current = next;\n this._pendingReload = true;\n this.emit(\"reloaded\", next);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit(\"reload-failed\", error);\n }\n }\n\n private handleChange(path: string): void {\n if (this.closed) return;\n this.emit(\"file-change\", path);\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n void this.reloadNow();\n }, this.debounceMs);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n AnthropicProvider,\n GeminiProvider,\n OpenAIProvider,\n ScoreLoader,\n SecretsManager,\n TuttiRuntime,\n createCheckpointStore,\n createLogger,\n type Checkpoint,\n type ChatMessage,\n} from \"@tuttiai/core\";\nconst logger = createLogger(\"tutti-cli\");\n\nexport interface ResumeOptions {\n /** Which durable store the checkpoint was written to. */\n store: \"redis\" | \"postgres\";\n /** Path to the score file (defaults to ./tutti.score.ts). */\n score?: string;\n /** Agent key to resume; defaults to the score's entry agent. */\n agent?: string;\n /** Skip the confirmation prompt — for scripted use. */\n yes?: boolean;\n}\n\nexport async function resumeCommand(\n sessionId: string,\n opts: ResumeOptions,\n): Promise<void> {\n // --- Score loading (same flow as `run`) -------------------------------\n const scoreFile = resolve(opts.score ?? \"./tutti.score.ts\");\n if (!existsSync(scoreFile)) {\n logger.error({ file: scoreFile }, \"Score file not found\");\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n let score;\n try {\n score = await ScoreLoader.load(scoreFile);\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Failed to load score\",\n );\n process.exit(1);\n }\n\n // --- Provider API-key check (same shortlist as `run`) -----------------\n const providerKeyMap: [unknown, string][] = [\n [AnthropicProvider, \"ANTHROPIC_API_KEY\"],\n [OpenAIProvider, \"OPENAI_API_KEY\"],\n [GeminiProvider, \"GEMINI_API_KEY\"],\n ];\n for (const [ProviderClass, envVar] of providerKeyMap) {\n if (\n score.provider instanceof\n (ProviderClass as new (...args: unknown[]) => unknown)\n ) {\n if (!SecretsManager.optional(envVar)) {\n logger.error({ envVar }, \"Missing API key\");\n process.exit(1);\n }\n }\n }\n\n // --- Resolve the target agent -----------------------------------------\n const agentName = resolveAgentName(score, opts.agent);\n const agentMap = new Map(Object.entries(score.agents));\n const agent = agentMap.get(agentName);\n if (!agent) {\n logger.error(\n { agent: agentName, available: Object.keys(score.agents) },\n \"Agent not found in score\",\n );\n process.exit(1);\n }\n if (!agent.durable) {\n console.error(\n chalk.yellow(\n \"Agent '\" +\n agentName +\n \"' does not have `durable: true` set — resume has nothing to restore.\",\n ),\n );\n console.error(\n chalk.dim(\n \"Enable durable checkpointing on the agent before the run that created this session.\",\n ),\n );\n process.exit(1);\n }\n\n // --- Load the checkpoint ----------------------------------------------\n const spinner = ora({ color: \"cyan\" }).start(\"Loading checkpoint...\");\n let checkpointStore;\n let checkpoint: Checkpoint | null;\n try {\n checkpointStore = createCheckpointStore({ store: opts.store });\n checkpoint = await checkpointStore.loadLatest(sessionId);\n } catch (err) {\n spinner.fail(\"Failed to load checkpoint\");\n logger.error(\n { error: err instanceof Error ? err.message : String(err), store: opts.store },\n \"Checkpoint store error\",\n );\n process.exit(1);\n }\n spinner.stop();\n\n if (!checkpoint) {\n console.error(\n chalk.red(\"No checkpoint found for session \" + sessionId + \".\"),\n );\n console.error(\n chalk.dim(\n \"Verify TUTTI_\" +\n (opts.store === \"redis\" ? \"REDIS\" : \"PG\") +\n \"_URL points to the same \" +\n opts.store +\n \" the original run used.\",\n ),\n );\n process.exit(1);\n }\n\n // --- Render the summary -----------------------------------------------\n printSummary(checkpoint);\n\n // --- Confirm (unless --yes) -------------------------------------------\n if (!opts.yes && !(await confirmResume(checkpoint.turn))) {\n console.log(chalk.dim(\"Cancelled.\"));\n process.exit(0);\n }\n\n // --- Build the runtime and hand off to AgentRunner --------------------\n const runtime = new TuttiRuntime(score, { checkpointStore });\n\n // Seed the session store with a synthetic Session so the runner's\n // `sessions.get(id)` lookup succeeds. The agent loop immediately\n // overwrites `messages` from the checkpoint — the seeded messages\n // array only exists so the initial get() call doesn't miss.\n const sessions = runtime.sessions;\n if (\"save\" in sessions && typeof sessions.save === \"function\") {\n (sessions.save as (s: { id: string; agent_name: string; messages: ChatMessage[]; created_at: Date; updated_at: Date }) => void)({\n id: sessionId,\n agent_name: agentName,\n messages: [...checkpoint.messages],\n created_at: checkpoint.saved_at,\n updated_at: new Date(),\n });\n } else {\n console.error(\n chalk.red(\n \"Session store does not support resume seeding. Use the default InMemorySessionStore or PostgresSessionStore.\",\n ),\n );\n process.exit(1);\n }\n\n wireProgress(runtime);\n\n try {\n // Input is ignored when the runner sees a mid-cycle checkpoint, but\n // we still need a non-empty value to satisfy the method signature.\n const result = await runtime.run(agentName, \"[resume]\", sessionId);\n console.log();\n console.log(chalk.green(\"✓ Resumed run complete.\"));\n console.log(chalk.dim(\" Final turn: \" + result.turns));\n console.log(chalk.dim(\" Session ID: \" + result.session_id));\n console.log(\n chalk.dim(\n \" Token usage: \" +\n result.usage.input_tokens +\n \" in / \" +\n result.usage.output_tokens +\n \" out\",\n ),\n );\n console.log();\n console.log(result.output);\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Resume failed\",\n );\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveAgentName(\n score: { entry?: string | { agents: string[] }; agents: Record<string, unknown> },\n override?: string,\n): string {\n if (override) return override;\n if (typeof score.entry === \"string\") return score.entry;\n const first = Object.keys(score.agents)[0];\n if (!first) {\n console.error(chalk.red(\"Score has no agents defined.\"));\n process.exit(1);\n }\n return first;\n}\n\nfunction printSummary(checkpoint: Checkpoint): void {\n console.log();\n console.log(chalk.cyan.bold(\"Checkpoint summary\"));\n console.log(\n chalk.dim(\" Session ID: \") + checkpoint.session_id,\n );\n console.log(\n chalk.dim(\" Last turn: \") + String(checkpoint.turn),\n );\n console.log(\n chalk.dim(\" Saved at: \") +\n checkpoint.saved_at.toISOString(),\n );\n console.log(\n chalk.dim(\" Messages: \") +\n String(checkpoint.messages.length) +\n \" total\",\n );\n console.log();\n console.log(chalk.cyan(\"First messages\"));\n const preview = checkpoint.messages.slice(0, 3);\n for (const msg of preview) {\n const text = excerpt(messageToText(msg), 200);\n console.log(chalk.dim(\" [\" + msg.role + \"] \") + text);\n }\n if (checkpoint.messages.length > preview.length) {\n console.log(\n chalk.dim(\n \" … \" +\n String(checkpoint.messages.length - preview.length) +\n \" more\",\n ),\n );\n }\n console.log();\n}\n\nfunction messageToText(msg: ChatMessage): string {\n if (typeof msg.content === \"string\") return msg.content;\n const parts: string[] = [];\n for (const block of msg.content) {\n if (block.type === \"text\") {\n parts.push(block.text);\n } else if (block.type === \"tool_use\") {\n parts.push(\"[tool_use \" + block.name + \"]\");\n } else if (block.type === \"tool_result\") {\n parts.push(\"[tool_result \" + excerpt(block.content, 80) + \"]\");\n }\n }\n return parts.join(\" \");\n}\n\nfunction excerpt(text: string, max: number): string {\n const oneLine = text.replace(/\\s+/g, \" \").trim();\n return oneLine.length > max ? oneLine.slice(0, max - 1) + \"…\" : oneLine;\n}\n\nasync function confirmResume(turn: number): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n const answer = (\n await rl.question(\n chalk.cyan(\"Resume from turn \" + turn + \"? \") + chalk.dim(\"(y/n) \"),\n )\n )\n .trim()\n .toLowerCase();\n return answer === \"y\" || answer === \"yes\";\n } finally {\n rl.close();\n }\n}\n\nfunction wireProgress(runtime: TuttiRuntime): void {\n const spinner = ora({ color: \"cyan\" });\n let streaming = false;\n\n runtime.events.on(\"checkpoint:restored\", (e) => {\n console.log(\n chalk.dim(\"↻ Restored from turn \" + e.turn) +\n chalk.dim(\" (session \" + e.session_id.slice(0, 8) + \"…)\"),\n );\n });\n runtime.events.on(\"checkpoint:saved\", (e) => {\n console.log(chalk.dim(\"· Checkpoint saved at turn \" + e.turn));\n });\n runtime.events.on(\"llm:request\", () => {\n spinner.start(\"Thinking...\");\n });\n runtime.events.on(\"token:stream\", (e) => {\n if (!streaming) {\n spinner.stop();\n streaming = true;\n }\n process.stdout.write(e.text);\n });\n runtime.events.on(\"llm:response\", () => {\n if (streaming) {\n process.stdout.write(\"\\n\");\n } else {\n spinner.stop();\n }\n });\n runtime.events.on(\"tool:start\", (e) => {\n if (streaming) {\n process.stdout.write(chalk.dim(\"\\n [using: \" + e.tool_name + \"]\"));\n } else {\n spinner.stop();\n console.log(chalk.dim(\" [using: \" + e.tool_name + \"]\"));\n }\n });\n runtime.events.on(\"tool:end\", (e) => {\n if (streaming) {\n process.stdout.write(chalk.dim(\" [done: \" + e.tool_name + \"]\\n\"));\n }\n });\n runtime.events.on(\"tool:error\", (e) => {\n spinner.stop();\n logger.error({ tool: e.tool_name }, \"Tool error\");\n });\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { createLogger } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nconst OFFICIAL_VOICES = new Map<string, { package: string; setup: string }>([\n [\"filesystem\", {\n package: \"@tuttiai/filesystem\",\n setup: ` Add to your score:\n ${chalk.cyan('import { FilesystemVoice } from \"@tuttiai/filesystem\"')}\n ${chalk.cyan(\"voices: [new FilesystemVoice()]\")}`,\n }],\n [\"github\", {\n package: \"@tuttiai/github\",\n setup: ` Add ${chalk.bold(\"GITHUB_TOKEN\")} to your .env file:\n ${chalk.cyan(\"GITHUB_TOKEN=ghp_your_token_here\")}\n\n Add to your score:\n ${chalk.cyan('import { GitHubVoice } from \"@tuttiai/github\"')}\n ${chalk.cyan(\"voices: [new GitHubVoice()]\")}`,\n }],\n [\"playwright\", {\n package: \"@tuttiai/playwright\",\n setup: ` Install the browser:\n ${chalk.cyan(\"npx playwright install chromium\")}\n\n Add to your score:\n ${chalk.cyan('import { PlaywrightVoice } from \"@tuttiai/playwright\"')}\n ${chalk.cyan(\"voices: [new PlaywrightVoice()]\")}`,\n }],\n [\"postgres\", {\n package: \"pg\",\n setup: ` Add ${chalk.bold(\"DATABASE_URL\")} to your .env file:\n ${chalk.cyan(\"DATABASE_URL=postgres://user:pass@localhost:5432/tutti\")}\n\n Add to your score:\n ${chalk.cyan(\"memory: { provider: 'postgres' }\")}\n\n Or with an explicit URL:\n ${chalk.cyan(\"memory: { provider: 'postgres', url: process.env.DATABASE_URL }\")}\n\n Use the async factory for initialization:\n ${chalk.cyan(\"const tutti = await TuttiRuntime.create(score)\")}`,\n }],\n]);\n\nfunction resolvePackageName(input: string): string {\n // Known official voice\n const voice = OFFICIAL_VOICES.get(input);\n if (voice) {\n return voice.package;\n }\n // Already a scoped package\n if (input.startsWith(\"@\")) {\n return input;\n }\n // Try @tuttiai/<name> convention\n return `@tuttiai/${input}`;\n}\n\nfunction isAlreadyInstalled(packageName: string): boolean {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) return false;\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n const deps: Record<string, string> = { ...pkg.dependencies, ...pkg.devDependencies };\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\nexport function addCommand(voiceName: string): void {\n const packageName = resolvePackageName(voiceName);\n\n // Check if package.json exists in cwd\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) {\n logger.error(\"No package.json found in the current directory\");\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project first.'));\n process.exit(1);\n }\n\n // Check if already installed\n if (isAlreadyInstalled(packageName)) {\n console.log(chalk.green(` ✔ ${packageName} is already installed`));\n return;\n }\n\n // Install\n const spinner = ora(`Installing ${packageName}...`).start();\n\n try {\n execSync(`npm install ${packageName}`, {\n cwd: process.cwd(),\n stdio: \"pipe\",\n });\n spinner.succeed(`Installed ${packageName}`);\n } catch (error) {\n spinner.fail(`Failed to install ${packageName}`);\n const message = error instanceof Error ? error.message : String(error);\n logger.error({ error: message, package: packageName }, \"Installation failed\");\n process.exit(1);\n }\n\n // Print setup instructions\n const official = OFFICIAL_VOICES.get(voiceName);\n if (official) {\n console.log();\n console.log(\" Setup:\");\n console.log(official.setup);\n console.log();\n } else {\n console.log();\n console.log(\n chalk.dim(\" Check the package README for setup instructions.\"),\n );\n console.log();\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport {\n ScoreLoader,\n AnthropicProvider,\n OpenAIProvider,\n GeminiProvider,\n SecretsManager,\n createLogger,\n} from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nconst ok = (msg: string): void => { console.log(chalk.green(\" \\u2714 \" + msg)); };\nconst fail = (msg: string): void => { console.log(chalk.red(\" \\u2718 \" + msg)); };\n\nexport async function checkCommand(scorePath?: string): Promise<void> {\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n\n console.log(chalk.cyan(`\\nChecking ${file}...\\n`));\n\n if (!existsSync(file)) {\n fail(\"Score file not found: \" + file);\n process.exit(1);\n }\n\n // 1. Load and validate\n let score;\n try {\n score = await ScoreLoader.load(file);\n ok(\"Score file is valid\");\n } catch (err) {\n fail(\"Score validation failed\");\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Score validation failed\",\n );\n process.exit(1);\n }\n\n let hasErrors = false;\n\n // 2. Check provider and API key\n const providerChecks: [unknown, string, string][] = [\n [AnthropicProvider, \"AnthropicProvider\", \"ANTHROPIC_API_KEY\"],\n [OpenAIProvider, \"OpenAIProvider\", \"OPENAI_API_KEY\"],\n [GeminiProvider, \"GeminiProvider\", \"GEMINI_API_KEY\"],\n ];\n\n let providerDetected = false;\n for (const [ProviderClass, name, envVar] of providerChecks) {\n if (\n score.provider instanceof\n (ProviderClass as new (...args: unknown[]) => unknown)\n ) {\n providerDetected = true;\n const key = SecretsManager.optional(envVar);\n if (key) {\n ok(\"Provider: \" + name + \" (\" + envVar + \" is set)\");\n } else {\n fail(\"Provider: \" + name + \" (\" + envVar + \" is NOT set)\");\n hasErrors = true;\n }\n }\n }\n\n if (!providerDetected) {\n ok(\"Provider: custom LLMProvider\");\n }\n\n // 3. Count agents\n const agentKeys = Object.keys(score.agents);\n ok(agentKeys.length + \" agent\" + (agentKeys.length === 1 ? \"\" : \"s\") + \" configured\");\n\n // 4. Check voices\n for (const [agentKey, agent] of Object.entries(score.agents)) {\n for (const voice of agent.voices) {\n const voiceName = voice.name;\n\n // Check for known voices and their env vars\n const voiceEnvMap = new Map<string, string>([\n [\"github\", \"GITHUB_TOKEN\"],\n ]);\n\n const envVar = voiceEnvMap.get(voiceName);\n if (envVar) {\n const key = SecretsManager.optional(envVar);\n if (key) {\n ok(\n \"Voice: \" + voiceName + \" on \" + agentKey + \" (\" + envVar + \" is set)\",\n );\n } else {\n fail(\n \"Voice: \" + voiceName + \" on \" + agentKey + \" (\" + envVar + \" is NOT set)\",\n );\n hasErrors = true;\n }\n } else {\n ok(\"Voice: \" + voiceName + \" on \" + agentKey + \" (installed)\");\n }\n }\n }\n\n // Final summary\n console.log(\"\");\n if (hasErrors) {\n console.log(\n chalk.yellow(\"Some checks failed. Fix the issues above and re-run.\"),\n );\n process.exit(1);\n } else {\n console.log(\n chalk.green(\"All checks passed.\") +\n chalk.dim(\" Run tutti-ai run to start.\"),\n );\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport express from \"express\";\nimport chalk from \"chalk\";\nimport {\n TuttiRuntime,\n ScoreLoader,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { Response as ExpressResponse } from \"express\";\n\nconst logger = createLogger(\"tutti-studio\");\nconst envPort = Number.parseInt(process.env.PORT ?? \"\", 10);\nconst PORT = Number.isInteger(envPort) && envPort > 0 && envPort <= 65535 ? envPort : 4747;\n\nfunction safeStringify(obj: unknown): string {\n return JSON.stringify(obj, (_key, value: unknown) => {\n if (value instanceof Error) return { message: value.message, name: value.name };\n if (typeof value === \"function\") return undefined;\n return value;\n });\n}\n\nfunction openBrowser(url: string): void {\n if (process.platform === \"win32\") {\n execFile(\"cmd.exe\", [\"/c\", \"start\", \"\", url]);\n return;\n }\n const cmd = process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\n execFile(cmd, [url]);\n}\n\nexport async function studioCommand(scorePath?: string): Promise<void> {\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n\n if (!existsSync(file)) {\n logger.error({ file }, \"Score file not found\");\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n let score;\n try {\n score = await ScoreLoader.load(file);\n } catch (err) {\n logger.error({ error: err instanceof Error ? err.message : String(err) }, \"Failed to load score\");\n process.exit(1);\n }\n\n const runtime = new TuttiRuntime(score);\n\n // Track sessions via events\n const sessionRegistry = new Map<string, { agent_name: string; created_at: Date }>();\n runtime.events.on(\"agent:start\", (e) => {\n if (!sessionRegistry.has(e.session_id)) {\n sessionRegistry.set(e.session_id, { agent_name: e.agent_name, created_at: new Date() });\n }\n });\n\n // SSE clients\n const sseClients = new Set<ExpressResponse>();\n runtime.events.onAny((event) => {\n const data = safeStringify(event);\n for (const client of sseClients) {\n client.write(\"event: tutti\\ndata: \" + data + \"\\n\\n\");\n }\n });\n\n // Express\n const app = express();\n app.use(express.json());\n\n // SSE endpoint\n app.get(\"/events\", (_req, res) => {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n res.write(\":\\n\\n\");\n sseClients.add(res);\n _req.on(\"close\", () => sseClients.delete(res));\n });\n\n // REST API\n app.get(\"/api/score\", (_req, res) => {\n const agents = Object.fromEntries(\n Object.entries(runtime.score.agents).map(([id, agent]) => [\n id,\n {\n name: agent.name,\n description: agent.description,\n model: agent.model,\n role: agent.role,\n delegates: agent.delegates,\n voice_count: agent.voices.length,\n voices: agent.voices.map((v) => v.name),\n },\n ]),\n );\n res.json({\n name: runtime.score.name,\n description: runtime.score.description,\n default_model: runtime.score.default_model,\n entry: runtime.score.entry,\n agents,\n });\n });\n\n app.get(\"/api/sessions\", (_req, res) => {\n const sessions = Array.from(sessionRegistry.entries()).map(([id, meta]) => {\n const session = runtime.getSession(id);\n return {\n id,\n agent_name: meta.agent_name,\n message_count: session?.messages.length ?? 0,\n created_at: meta.created_at,\n };\n });\n res.json(sessions.reverse());\n });\n\n app.get(\"/api/sessions/:id\", (req, res) => {\n const session = runtime.getSession(req.params.id);\n if (!session) {\n res.status(404).json({ error: \"Session not found\" });\n return;\n }\n res.json(session);\n });\n\n app.post(\"/api/run\", async (req, res) => {\n const body: unknown = req.body;\n if (typeof body !== \"object\" || body === null) {\n res.status(400).json({ error: \"Invalid request body\" });\n return;\n }\n const agent = (body as Record<string, unknown>).agent;\n const input = (body as Record<string, unknown>).input;\n const session_id = (body as Record<string, unknown>).session_id;\n if (typeof agent !== \"string\" || agent.trim().length === 0) {\n res.status(400).json({ error: \"agent must be a non-empty string\" });\n return;\n }\n if (typeof input !== \"string\" || input.trim().length === 0) {\n res.status(400).json({ error: \"input must be a non-empty string\" });\n return;\n }\n if (session_id !== undefined && (typeof session_id !== \"string\" || session_id.trim().length === 0)) {\n res.status(400).json({ error: \"session_id must be a non-empty string when provided\" });\n return;\n }\n try {\n const result = await runtime.run(agent, input, session_id);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: err instanceof Error ? err.message : String(err) });\n }\n });\n\n // Serve UI\n app.get(\"/\", (_req, res) => {\n res.type(\"html\").send(getStudioHtml());\n });\n\n app.listen(PORT, () => {\n const url = \"http://localhost:\" + PORT;\n console.log();\n console.log(chalk.bold(\" Tutti Studio\"));\n console.log(chalk.dim(\" \" + url));\n console.log();\n console.log(chalk.dim(\" Score: \") + (runtime.score.name ?? file));\n console.log(chalk.dim(\" Agents: \") + Object.keys(runtime.score.agents).join(\", \"));\n console.log();\n openBrowser(url);\n });\n\n process.on(\"SIGINT\", () => {\n console.log(chalk.dim(\"\\nShutting down Tutti Studio...\"));\n process.exit(0);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Inline HTML UI\n// ---------------------------------------------------------------------------\n\nfunction getStudioHtml(): string {\n return '<!DOCTYPE html>\\\n<html lang=\"en\">\\\n<head>\\\n<meta charset=\"utf-8\">\\\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\\\n<title>Tutti Studio</title>\\\n<style>\\\n*{margin:0;padding:0;box-sizing:border-box}\\\n:root{\\\n--bg:#0a0a0f;--panel:#12121a;--card:#1a1a26;--input:#0f0f17;\\\n--border:#2a2a3a;--text:#e2e8f0;--muted:#64748b;\\\n--purple:#8b5cf6;--teal:#14b8a6;--blue:#3b82f6;--green:#10b981;\\\n--red:#ef4444;--orange:#f97316;--amber:#f59e0b;--indigo:#6366f1;\\\n}\\\nhtml,body{height:100%;font-family:system-ui,-apple-system,sans-serif;background:var(--bg);color:var(--text);font-size:13px}\\\n#app{display:flex;flex-direction:column;height:100vh}\\\n\\\nheader{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;border-bottom:1px solid var(--border);background:var(--panel)}\\\nheader .logo{font-weight:700;font-size:15px;letter-spacing:.5px}\\\nheader .logo span{color:var(--purple)}\\\nheader .meta{color:var(--muted);font-size:12px}\\\nheader .status{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--muted)}\\\nheader .dot{width:7px;height:7px;border-radius:50%;background:var(--green)}\\\nheader .dot.off{background:var(--red)}\\\n\\\nmain{display:grid;grid-template-columns:260px 1fr 280px;flex:1;overflow:hidden;border-bottom:1px solid var(--border)}\\\n\\\n.panel{display:flex;flex-direction:column;border-right:1px solid var(--border);overflow:hidden}\\\n.panel:last-child{border-right:none}\\\n.panel-title{padding:10px 14px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.8px;color:var(--muted);border-bottom:1px solid var(--border);background:var(--panel);flex-shrink:0}\\\n.panel-body{flex:1;overflow-y:auto;padding:10px}\\\n.panel-body::-webkit-scrollbar{width:5px}\\\n.panel-body::-webkit-scrollbar-track{background:transparent}\\\n.panel-body::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}\\\n\\\n#graph-panel .panel-body{padding:0;display:flex;align-items:center;justify-content:center}\\\n#graph-panel svg text{font-family:system-ui,-apple-system,sans-serif}\\\n\\\n#events-panel{display:flex;flex-direction:column}\\\n#event-stream{flex:1;overflow-y:auto;padding:10px}\\\n#event-stream::-webkit-scrollbar{width:5px}\\\n#event-stream::-webkit-scrollbar-track{background:transparent}\\\n#event-stream::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}\\\n\\\n.ev{padding:7px 10px;margin-bottom:6px;border-radius:6px;background:var(--card);border-left:3px solid var(--muted);font-size:12px;line-height:1.5}\\\n.ev .ev-head{display:flex;justify-content:space-between;align-items:center}\\\n.ev .ev-type{font-weight:600;font-family:\"SF Mono\",Menlo,monospace;font-size:11px}\\\n.ev .ev-time{color:var(--muted);font-size:10px;font-family:\"SF Mono\",Menlo,monospace}\\\n.ev .ev-detail{color:var(--muted);margin-top:3px;font-size:11px;word-break:break-all}\\\n.ev.agent{border-left-color:var(--purple)}.ev.agent .ev-type{color:var(--purple)}\\\n.ev.turn{border-left-color:var(--blue)}.ev.turn .ev-type{color:var(--blue)}\\\n.ev.llm{border-left-color:var(--green)}.ev.llm .ev-type{color:var(--green)}\\\n.ev.tool{border-left-color:var(--teal)}.ev.tool .ev-type{color:var(--teal)}\\\n.ev.tool-error{border-left-color:var(--red)}.ev.tool-error .ev-type{color:var(--red)}\\\n.ev.security{border-left-color:var(--orange)}.ev.security .ev-type{color:var(--orange)}\\\n.ev.budget-warn{border-left-color:var(--amber)}.ev.budget-warn .ev-type{color:var(--amber)}\\\n.ev.budget-exceed{border-left-color:var(--red)}.ev.budget-exceed .ev-type{color:var(--red)}\\\n.ev.delegate{border-left-color:var(--indigo)}.ev.delegate .ev-type{color:var(--indigo)}\\\n\\\n#input-bar{display:flex;gap:8px;padding:10px 12px;border-top:1px solid var(--border);background:var(--panel);flex-shrink:0}\\\n#agent-select{background:var(--input);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:6px 10px;font-size:12px;outline:none;cursor:pointer;min-width:110px}\\\n#user-input{flex:1;background:var(--input);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:6px 12px;font-size:13px;outline:none}\\\n#user-input:focus{border-color:var(--purple)}\\\n#send-btn{background:var(--purple);color:#fff;border:none;border-radius:6px;padding:6px 16px;font-size:12px;font-weight:600;cursor:pointer;white-space:nowrap}\\\n#send-btn:hover{opacity:.9}\\\n#send-btn:disabled{opacity:.4;cursor:default}\\\n\\\n.session-item{padding:8px 10px;margin-bottom:4px;border-radius:6px;background:var(--card);cursor:pointer;transition:background .15s}\\\n.session-item:hover{background:#22223a}\\\n.session-item.active{background:#22223a;border:1px solid var(--purple)}\\\n.session-id{font-family:\"SF Mono\",Menlo,monospace;font-size:11px;color:var(--purple)}\\\n.session-meta{font-size:11px;color:var(--muted);margin-top:2px}\\\n\\\n#session-detail{margin-top:10px;border-top:1px solid var(--border);padding-top:10px}\\\n.msg{padding:6px 8px;margin-bottom:4px;border-radius:5px;font-size:12px;line-height:1.5;word-break:break-word}\\\n.msg.user{background:#1c1c3a;border-left:2px solid var(--blue)}\\\n.msg.assistant{background:#1a2a1a;border-left:2px solid var(--green)}\\\n.msg .msg-role{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-bottom:2px}\\\n.msg.user .msg-role{color:var(--blue)}\\\n.msg.assistant .msg-role{color:var(--green)}\\\n\\\nfooter{display:flex;align-items:center;gap:32px;padding:8px 20px;background:var(--panel);font-size:12px}\\\n.token-item{display:flex;align-items:center;gap:6px}\\\n.token-label{color:var(--muted)}\\\n.token-val{font-family:\"SF Mono\",Menlo,monospace;font-weight:600}\\\n.token-val.input{color:var(--blue)}\\\n.token-val.output{color:var(--green)}\\\n.token-val.cost{color:var(--amber)}\\\n\\\n.empty{color:var(--muted);text-align:center;padding:30px 10px;font-size:12px}\\\n</style>\\\n</head>\\\n<body>\\\n<div id=\"app\">\\\n\\\n<header>\\\n <div class=\"logo\"><span>♫</span> Tutti Studio</div>\\\n <div class=\"meta\" id=\"score-name\"></div>\\\n <div class=\"status\"><div class=\"dot\" id=\"sse-dot\"></div><span id=\"sse-label\">connecting</span></div>\\\n</header>\\\n\\\n<main>\\\n <div class=\"panel\" id=\"graph-panel\">\\\n <div class=\"panel-title\">Agent Graph</div>\\\n <div class=\"panel-body\" id=\"graph-body\"></div>\\\n </div>\\\n\\\n <div class=\"panel\" id=\"events-panel\">\\\n <div class=\"panel-title\">Live Event Stream</div>\\\n <div id=\"event-stream\"><div class=\"empty\">Waiting for events…<br>Send a message below to start an agent run.</div></div>\\\n <div id=\"input-bar\">\\\n <select id=\"agent-select\"></select>\\\n <input id=\"user-input\" placeholder=\"Type a message…\" autocomplete=\"off\">\\\n <button id=\"send-btn\">Send</button>\\\n </div>\\\n </div>\\\n\\\n <div class=\"panel\" id=\"sessions-panel\">\\\n <div class=\"panel-title\">Sessions</div>\\\n <div class=\"panel-body\" id=\"sessions-body\"><div class=\"empty\">No sessions yet</div></div>\\\n </div>\\\n</main>\\\n\\\n<footer>\\\n <div class=\"token-item\"><span class=\"token-label\">↓ Input</span><span class=\"token-val input\" id=\"tok-in\">0</span></div>\\\n <div class=\"token-item\"><span class=\"token-label\">↑ Output</span><span class=\"token-val output\" id=\"tok-out\">0</span></div>\\\n <div class=\"token-item\"><span class=\"token-label\">$ Est. cost</span><span class=\"token-val cost\" id=\"tok-cost\">0.0000</span></div>\\\n</footer>\\\n\\\n</div>\\\n\\\n<script>\\\n(function(){\\\n\\\nvar tokIn=0,tokOut=0;\\\nvar sessionMap={};\\\nvar activeSession=null;\\\n\\\n/* ---- helpers ---- */\\\nfunction esc(s){var d=document.createElement(\"div\");d.textContent=s;return d.innerHTML}\\\nfunction fmt(n){return n.toLocaleString()}\\\nfunction timeStr(){var d=new Date();return (\"0\"+d.getHours()).slice(-2)+\":\"+(\"0\"+d.getMinutes()).slice(-2)+\":\"+(\"0\"+d.getSeconds()).slice(-2)}\\\nfunction truncId(id){return id.slice(0,8)}\\\n\\\n/* ---- score + graph ---- */\\\nfunction loadScore(){\\\n fetch(\"/api/score\").then(function(r){return r.json()}).then(function(s){\\\n document.getElementById(\"score-name\").textContent=s.name||\"tutti.score.ts\";\\\n var sel=document.getElementById(\"agent-select\");\\\n sel.innerHTML=\"\";\\\n Object.keys(s.agents).forEach(function(id){\\\n var o=document.createElement(\"option\");o.value=id;o.textContent=s.agents[id].name;sel.appendChild(o);\\\n });\\\n renderGraph(s);\\\n });\\\n}\\\n\\\nfunction renderGraph(score){\\\n var body=document.getElementById(\"graph-body\");\\\n var W=260,ids=Object.keys(score.agents),N=ids.length;\\\n if(N===0){body.innerHTML=\"<div class=\\\\\"empty\\\\\">No agents</div>\";return}\\\n var hasDelegate=false;\\\n ids.forEach(function(id){if(score.agents[id].delegates&&score.agents[id].delegates.length)hasDelegate=true});\\\n var nodeR=26,padY=90,padTop=50;\\\n var leftIds=[],rightIds=[];\\\n if(hasDelegate){\\\n ids.forEach(function(id){var a=score.agents[id];if(a.delegates&&a.delegates.length)leftIds.push(id);else rightIds.push(id)});\\\n }else{leftIds=ids}\\\n var cols=hasDelegate?2:1;\\\n var cx1=cols===1?W/2:72,cx2=W-72;\\\n var H=Math.max(leftIds.length,rightIds.length)*padY+padTop*2;\\\n if(H<200)H=200;\\\n var pos={};\\\n var svg=\\'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"\\'+W+\\'\" height=\"\\'+H+\\'\" viewBox=\"0 0 \\'+W+\" \"+H+\\'\">\\';\\\n svg+=\\'<defs><marker id=\"ah\" viewBox=\"0 0 10 10\" refX=\"10\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto\"><path d=\"M0 0L10 5L0 10z\" fill=\"#64748b\"/></marker></defs>\\';\\\n function drawNode(id,cx,cy){\\\n var a=score.agents[id];\\\n var col=a.role===\"orchestrator\"?\"#8b5cf6\":\"#14b8a6\";\\\n pos[id]={x:cx,y:cy};\\\n svg+=\\'<circle cx=\"\\'+cx+\\'\" cy=\"\\'+cy+\\'\" r=\"\\'+nodeR+\\'\" fill=\"\\'+col+\\'\" fill-opacity=\"0.15\" stroke=\"\\'+col+\\'\" stroke-width=\"2\"/>\\';\\\n svg+=\\'<text x=\"\\'+cx+\\'\" y=\"\\'+(cy+4)+\\'\" text-anchor=\"middle\" fill=\"#e2e8f0\" font-size=\"10\" font-weight=\"600\">\\'+esc(a.name)+\\'</text>\\';\\\n var model=a.model||score.default_model||\"\";\\\n if(model){var sh=model.replace(/-\\\\d{8}$/,\"\");if(sh.length>18)sh=sh.slice(0,18)+\"\\\\u2026\";svg+=\\'<text x=\"\\'+cx+\\'\" y=\"\\'+(cy+nodeR+14)+\\'\" text-anchor=\"middle\" fill=\"#64748b\" font-size=\"9\">\\'+esc(sh)+\\'</text>\\'}\\\n svg+=\\'<text x=\"\\'+cx+\\'\" y=\"\\'+(cy+nodeR+26)+\\'\" text-anchor=\"middle\" fill=\"#64748b\" font-size=\"9\">\\'+a.voice_count+\" voice\"+(a.voice_count!==1?\"s\":\"\")+\\'</text>\\';\\\n }\\\n leftIds.forEach(function(id,i){drawNode(id,cx1,padTop+i*padY)});\\\n rightIds.forEach(function(id,i){drawNode(id,cx2,padTop+i*padY)});\\\n ids.forEach(function(id){\\\n var a=score.agents[id];\\\n if(a.delegates)a.delegates.forEach(function(did){\\\n if(pos[id]&&pos[did]){\\\n var x1=pos[id].x+nodeR,y1=pos[id].y,x2=pos[did].x-nodeR,y2=pos[did].y;\\\n var mx=(x1+x2)/2;\\\n svg+=\\'<path d=\"M\\'+x1+\" \"+y1+\" C\"+mx+\" \"+y1+\" \"+mx+\" \"+y2+\" \"+x2+\" \"+y2+\\'\" fill=\"none\" stroke=\"#64748b\" stroke-width=\"1.5\" stroke-dasharray=\"4 3\" marker-end=\"url(#ah)\"/>\\';\\\n }\\\n });\\\n });\\\n svg+=\"</svg>\";\\\n body.innerHTML=svg;\\\n}\\\n\\\n/* ---- SSE ---- */\\\nfunction connectSSE(){\\\n var es=new EventSource(\"/events\");\\\n es.addEventListener(\"tutti\",function(e){\\\n var ev=JSON.parse(e.data);\\\n addEvent(ev);\\\n if(ev.type===\"llm:response\"&&ev.response&&ev.response.usage){\\\n tokIn+=ev.response.usage.input_tokens||0;\\\n tokOut+=ev.response.usage.output_tokens||0;\\\n document.getElementById(\"tok-in\").textContent=fmt(tokIn);\\\n document.getElementById(\"tok-out\").textContent=fmt(tokOut);\\\n document.getElementById(\"tok-cost\").textContent=estimateCost(tokIn,tokOut);\\\n }\\\n if(ev.type===\"agent:start\"||ev.type===\"agent:end\")refreshSessions();\\\n });\\\n es.onopen=function(){document.getElementById(\"sse-dot\").className=\"dot\";document.getElementById(\"sse-label\").textContent=\"connected\"};\\\n es.onerror=function(){document.getElementById(\"sse-dot\").className=\"dot off\";document.getElementById(\"sse-label\").textContent=\"disconnected\"};\\\n}\\\n\\\n/* Pricing: USD per 1M tokens (Sonnet-class default) */\\\nvar INPUT_PRICE_PER_MILLION=3;\\\nvar OUTPUT_PRICE_PER_MILLION=15;\\\nfunction estimateCost(inp,out){\\\n var c=(inp/1e6)*INPUT_PRICE_PER_MILLION+(out/1e6)*OUTPUT_PRICE_PER_MILLION;\\\n return c.toFixed(4);\\\n}\\\n\\\nfunction evClass(t){\\\n if(t.indexOf(\"agent\")===0)return \"agent\";\\\n if(t.indexOf(\"turn\")===0)return \"turn\";\\\n if(t===\"llm:request\"||t===\"llm:response\")return \"llm\";\\\n if(t===\"tool:error\")return \"tool-error\";\\\n if(t.indexOf(\"tool\")===0)return \"tool\";\\\n if(t.indexOf(\"security\")===0)return \"security\";\\\n if(t===\"budget:warning\")return \"budget-warn\";\\\n if(t===\"budget:exceeded\")return \"budget-exceed\";\\\n if(t.indexOf(\"delegate\")===0)return \"delegate\";\\\n return \"\";\\\n}\\\n\\\nfunction evDetail(ev){\\\n var parts=[];\\\n if(ev.agent_name)parts.push(\"agent: \"+ev.agent_name);\\\n if(ev.session_id)parts.push(\"session: \"+truncId(ev.session_id));\\\n if(ev.turn!==undefined)parts.push(\"turn: \"+ev.turn);\\\n if(ev.tool_name)parts.push(\"tool: \"+ev.tool_name);\\\n if(ev.from)parts.push(\"from: \"+ev.from);\\\n if(ev.to)parts.push(\"to: \"+ev.to);\\\n if(ev.tokens!==undefined)parts.push(\"tokens: \"+fmt(ev.tokens));\\\n if(ev.cost_usd!==undefined)parts.push(\"cost: $\"+ev.cost_usd.toFixed(4));\\\n if(ev.response&&ev.response.usage)parts.push(\"tokens: \"+fmt(ev.response.usage.input_tokens)+\" in / \"+fmt(ev.response.usage.output_tokens)+\" out\");\\\n if(ev.error){var em=typeof ev.error===\"object\"?ev.error.message||\"\":ev.error;if(em)parts.push(\"error: \"+em)}\\\n if(ev.patterns)parts.push(\"patterns: \"+ev.patterns.join(\", \"));\\\n return parts.join(\" · \");\\\n}\\\n\\\nvar firstEvent=true;\\\nfunction addEvent(ev){\\\n var stream=document.getElementById(\"event-stream\");\\\n if(firstEvent){stream.innerHTML=\"\";firstEvent=false}\\\n var div=document.createElement(\"div\");\\\n div.className=\"ev \"+evClass(ev.type);\\\n div.innerHTML=\\'<div class=\"ev-head\"><span class=\"ev-type\">\\'+esc(ev.type)+\\'</span><span class=\"ev-time\">\\'+timeStr()+\\'</span></div>\\';\\\n var det=evDetail(ev);\\\n if(det)div.innerHTML+=\\'<div class=\"ev-detail\">\\'+det+\"</div>\";\\\n stream.appendChild(div);\\\n stream.scrollTop=stream.scrollHeight;\\\n}\\\n\\\n/* ---- sessions ---- */\\\nfunction refreshSessions(){\\\n fetch(\"/api/sessions\").then(function(r){return r.json()}).then(function(list){\\\n var body=document.getElementById(\"sessions-body\");\\\n if(!list.length){body.innerHTML=\\'<div class=\"empty\">No sessions yet</div>\\';return}\\\n var html=\"\";\\\n list.forEach(function(s){\\\n var cls=\"session-item\"+(activeSession===s.id?\" active\":\"\");\\\n html+=\\'<div class=\"\\'+cls+\\'\" data-id=\"\\'+s.id+\\'\">\\';\\\n html+=\\'<div class=\"session-id\">\\'+truncId(s.id)+\"</div>\";\\\n html+=\\'<div class=\"session-meta\">\\'+esc(s.agent_name)+\" · \"+s.message_count+\" msgs</div>\";\\\n html+=\"</div>\";\\\n });\\\n if(activeSession)html+=\\'<div id=\"session-detail\"></div>\\';\\\n body.innerHTML=html;\\\n body.querySelectorAll(\".session-item\").forEach(function(el){\\\n el.addEventListener(\"click\",function(){selectSession(el.getAttribute(\"data-id\"))});\\\n });\\\n if(activeSession)loadSessionDetail(activeSession);\\\n });\\\n}\\\n\\\nfunction selectSession(id){\\\n activeSession=activeSession===id?null:id;\\\n refreshSessions();\\\n}\\\n\\\nfunction loadSessionDetail(id){\\\n var det=document.getElementById(\"session-detail\");\\\n if(!det)return;\\\n fetch(\"/api/sessions/\"+id).then(function(r){return r.json()}).then(function(session){\\\n if(!session||session.error){det.innerHTML=\\'<div class=\"empty\">Session not found</div>\\';return}\\\n var html=\"\";\\\n (session.messages||[]).forEach(function(m){\\\n var role=m.role;\\\n var text=\"\";\\\n if(typeof m.content===\"string\")text=m.content;\\\n else if(Array.isArray(m.content)){\\\n m.content.forEach(function(b){\\\n if(b.type===\"text\")text+=b.text+\"\\\\n\";\\\n else if(b.type===\"tool_use\")text+=\"[tool_use: \"+b.name+\"]\\\\n\";\\\n else if(b.type===\"tool_result\")text+=\"[tool_result]\\\\n\";\\\n });\\\n }\\\n html+=\\'<div class=\"msg \\'+role+\\'\"><div class=\"msg-role\">\\'+role+\"</div>\"+esc(text.trim())+\"</div>\";\\\n });\\\n det.innerHTML=html;\\\n });\\\n}\\\n\\\n/* ---- send ---- */\\\nfunction sendMessage(){\\\n var agentSel=document.getElementById(\"agent-select\");\\\n var inputEl=document.getElementById(\"user-input\");\\\n var btn=document.getElementById(\"send-btn\");\\\n var agent=agentSel.value;\\\n var input=inputEl.value.trim();\\\n if(!input)return;\\\n btn.disabled=true;btn.textContent=\"Running\\\\u2026\";\\\n inputEl.value=\"\";\\\n var sid=sessionMap[agent]||undefined;\\\n fetch(\"/api/run\",{method:\"POST\",headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify({agent:agent,input:input,session_id:sid})})\\\n .then(function(r){return r.json()})\\\n .then(function(result){\\\n if(result.session_id)sessionMap[agent]=result.session_id;\\\n if(result.output){\\\n addEvent({type:\"__output\",agent_name:agent,output:result.output});\\\n }\\\n refreshSessions();\\\n })\\\n .catch(function(err){addEvent({type:\"__error\",error:err.message||String(err)})})\\\n .finally(function(){btn.disabled=false;btn.textContent=\"Send\"});\\\n}\\\n\\\ndocument.getElementById(\"send-btn\").addEventListener(\"click\",sendMessage);\\\ndocument.getElementById(\"user-input\").addEventListener(\"keydown\",function(e){if(e.key===\"Enter\"&&!e.shiftKey){e.preventDefault();sendMessage()}});\\\n\\\n/* ---- init ---- */\\\nloadScore();\\\nconnectSSE();\\\n\\\n})();\\\n</script>\\\n</body>\\\n</html>';\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { createLogger } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nconst REGISTRY_URL =\n \"https://raw.githubusercontent.com/tuttiai/voices/main/voices.json\";\n\ninterface VoiceEntry {\n name: string;\n package: string;\n description: string;\n tags: string[];\n official: boolean;\n tools: number;\n}\n\n// Built-in fallback when the remote registry is unreachable\nconst BUILTIN_VOICES: VoiceEntry[] = [\n {\n name: \"filesystem\",\n package: \"@tuttiai/filesystem\",\n description: \"Read, write, search, and manage files and directories\",\n tags: [\"filesystem\", \"files\", \"io\", \"read\", \"write\"],\n official: true,\n tools: 7,\n },\n {\n name: \"github\",\n package: \"@tuttiai/github\",\n description: \"Interact with GitHub repos, issues, PRs, and code search\",\n tags: [\"github\", \"git\", \"code\", \"issues\", \"pull-requests\", \"api\"],\n official: true,\n tools: 10,\n },\n {\n name: \"playwright\",\n package: \"@tuttiai/playwright\",\n description: \"Control a browser like a human — navigate, click, type, screenshot\",\n tags: [\"browser\", \"playwright\", \"web\", \"qa\", \"testing\", \"automation\", \"scraping\"],\n official: true,\n tools: 12,\n },\n {\n name: \"postgres\",\n package: \"pg\",\n description: \"PostgreSQL session persistence and database access\",\n tags: [\"database\", \"postgres\", \"sql\", \"persistence\", \"sessions\"],\n official: true,\n tools: 0,\n },\n];\n\ninterface RegistryEntry {\n name: string;\n package: string;\n description: string;\n tags: string[];\n}\n\nasync function fetchRegistry(): Promise<VoiceEntry[]> {\n try {\n const res = await fetch(REGISTRY_URL);\n if (!res.ok) throw new Error(\"HTTP \" + res.status);\n const data = (await res.json()) as { official?: RegistryEntry[]; community?: RegistryEntry[] };\n\n const voices: VoiceEntry[] = [];\n for (const entry of data.official ?? []) {\n voices.push({ ...entry, official: true, tools: toolCount(entry.name) });\n }\n for (const entry of data.community ?? []) {\n voices.push({ ...entry, official: false, tools: 0 });\n }\n if (voices.length === 0) throw new Error(\"Empty registry\");\n return voices;\n } catch {\n logger.debug(\"Registry unreachable, using built-in voice list\");\n return BUILTIN_VOICES;\n }\n}\n\nfunction toolCount(name: string): number {\n const counts = new Map<string, number>([[\"filesystem\", 7], [\"github\", 10], [\"playwright\", 12]]);\n return counts.get(name) ?? 0;\n}\n\nfunction matchesQuery(voice: VoiceEntry, query: string): boolean {\n const q = query.toLowerCase();\n if (voice.name.toLowerCase().includes(q)) return true;\n if (voice.description.toLowerCase().includes(q)) return true;\n if (voice.tags.some((t) => t.toLowerCase().includes(q))) return true;\n return false;\n}\n\nfunction isInstalled(packageName: string): boolean {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) return false;\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n const deps: Record<string, string> = { ...pkg.dependencies, ...pkg.devDependencies };\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\nfunction printVoice(voice: VoiceEntry, showInstallStatus: boolean): void {\n const badge = voice.official\n ? chalk.green(\" [official]\")\n : chalk.blue(\" [community]\");\n const installed = showInstallStatus && isInstalled(voice.package);\n const status = showInstallStatus\n ? installed\n ? chalk.green(\" ✔ installed\")\n : chalk.dim(\" not installed\")\n : \"\";\n\n console.log();\n console.log(\" \" + chalk.bold(voice.package) + badge + status);\n console.log(\" \" + voice.description);\n\n const installCmd = voice.official && voice.name !== \"postgres\"\n ? \"tutti-ai add \" + voice.name\n : \"npm install \" + voice.package;\n console.log(\" \" + chalk.dim(\"Install: \") + chalk.cyan(installCmd));\n\n if (voice.tags.length > 0) {\n console.log(\" \" + chalk.dim(\"Tags: \") + voice.tags.join(\", \"));\n }\n}\n\nexport async function searchCommand(query: string): Promise<void> {\n const spinner = ora(\"Searching the Repertoire...\").start();\n\n const voices = await fetchRegistry();\n const results = voices.filter((v) => matchesQuery(v, query));\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log();\n console.log(chalk.yellow(' No voices found for \"' + query + '\"'));\n console.log();\n console.log(chalk.dim(\" Browse all: https://tutti-ai.com/voices\"));\n console.log(chalk.dim(\" Build your own: tutti-ai create voice <name>\"));\n console.log();\n return;\n }\n\n console.log();\n console.log(\n \" Found \" +\n chalk.bold(String(results.length)) +\n \" voice\" +\n (results.length !== 1 ? \"s\" : \"\") +\n \" matching \" +\n chalk.cyan(\"'\" + query + \"'\") +\n \":\",\n );\n\n for (const voice of results) {\n printVoice(voice, false);\n }\n console.log();\n}\n\nexport async function voicesCommand(): Promise<void> {\n const spinner = ora(\"Loading voices...\").start();\n\n const voices = await fetchRegistry();\n const official = voices.filter((v) => v.official);\n\n spinner.stop();\n\n console.log();\n console.log(\" \" + chalk.bold(\"Official Tutti Voices\"));\n console.log();\n\n for (const voice of official) {\n printVoice(voice, true);\n }\n\n const community = voices.filter((v) => !v.official);\n if (community.length > 0) {\n console.log();\n console.log(\" \" + chalk.bold(\"Community Voices\"));\n for (const voice of community) {\n printVoice(voice, true);\n }\n }\n\n console.log();\n console.log(chalk.dim(\" Search: tutti-ai search <query>\"));\n console.log(chalk.dim(\" Browse: https://tutti-ai.com/voices\"));\n console.log();\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport Enquirer from \"enquirer\";\nimport { createLogger, SecretsManager } from \"@tuttiai/core\";\n\nconst { prompt } = Enquirer;\nconst logger = createLogger(\"tutti-cli\");\n\ninterface PkgJson {\n name?: string;\n version?: string;\n description?: string;\n license?: string;\n exports?: unknown;\n}\n\nfunction readPkg(dir: string): PkgJson | undefined {\n const p = resolve(dir, \"package.json\");\n if (!existsSync(p)) return undefined;\n return JSON.parse(readFileSync(p, \"utf-8\")) as PkgJson;\n}\n\nfunction run(cmd: string, cwd: string): string {\n return execSync(cmd, { cwd, stdio: \"pipe\", encoding: \"utf-8\" });\n}\n\nfunction fail(msg: string): never {\n console.error(chalk.red(\" \" + msg));\n process.exit(1);\n}\n\nconst ok = (msg: string): void => { console.log(chalk.green(\" ✔ \" + msg)); };\n\nexport async function publishCommand(opts: { dryRun?: boolean }): Promise<void> {\n const cwd = process.cwd();\n const pkg = readPkg(cwd);\n\n console.log();\n console.log(chalk.bold(\" Tutti Voice Publisher\"));\n console.log();\n\n // ── Step 1: Pre-flight checks ──\n\n const spinner = ora(\"Running pre-flight checks...\").start();\n\n // 1a. Must be a voice directory\n if (!pkg) fail(\"No package.json found in the current directory.\");\n if (!existsSync(resolve(cwd, \"src/index.ts\"))) fail(\"No src/index.ts found — are you inside a voice directory?\");\n\n // 1b. Required fields\n const missing: string[] = [];\n if (!pkg.name) missing.push(\"name\");\n if (!pkg.version) missing.push(\"version\");\n if (!pkg.description) missing.push(\"description\");\n if (!pkg.license) missing.push(\"license\");\n if (!pkg.exports) missing.push(\"exports\");\n if (missing.length > 0) fail(\"package.json is missing: \" + missing.join(\", \"));\n\n const name = pkg.name ?? \"\";\n const version = pkg.version ?? \"\";\n\n // 1c. Name convention\n const validName = name.startsWith(\"@tuttiai/\") || name.startsWith(\"tutti\");\n if (!validName) fail(\"Package name must start with @tuttiai/ or tutti — got: \" + name);\n\n // 1d. Check required_permissions is declared in source\n const src = readFileSync(resolve(cwd, \"src/index.ts\"), \"utf-8\");\n if (!src.includes(\"required_permissions\")) {\n fail(\"Voice class must declare required_permissions in src/index.ts\");\n }\n\n spinner.succeed(\"Pre-flight checks passed\");\n\n // 1e. Build\n const buildSpinner = ora(\"Building...\").start();\n try {\n run(\"npm run build\", cwd);\n buildSpinner.succeed(\"Build succeeded\");\n } catch (err) {\n buildSpinner.fail(\"Build failed\");\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.dim(\" \" + msg.split(\"\\n\").slice(0, 5).join(\"\\n \")));\n process.exit(1);\n }\n\n // 1f. Tests\n const testSpinner = ora(\"Running tests...\").start();\n try {\n run(\"npx vitest run\", cwd);\n testSpinner.succeed(\"Tests passed\");\n } catch {\n testSpinner.fail(\"Tests failed\");\n process.exit(1);\n }\n\n // 1g. Audit\n const auditSpinner = ora(\"Checking vulnerabilities...\").start();\n try {\n run(\"npm audit --audit-level=high\", cwd);\n auditSpinner.succeed(\"No high/critical vulnerabilities\");\n } catch {\n auditSpinner.stopAndPersist({ symbol: chalk.yellow(\"⚠\"), text: \"Vulnerabilities found (npm audit)\" });\n }\n\n // ── Step 2: Dry run ──\n\n console.log();\n const drySpinner = ora(\"Packing (dry run)...\").start();\n let packOutput: string;\n try {\n packOutput = run(\"npm pack --dry-run 2>&1\", cwd);\n drySpinner.succeed(\"Pack dry-run complete\");\n } catch (err) {\n drySpinner.fail(\"Pack dry-run failed\");\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.dim(\" \" + msg));\n process.exit(1);\n }\n\n // Show files from the pack output\n const fileLines = packOutput\n .split(\"\\n\")\n // eslint-disable-next-line security/detect-unsafe-regex -- simple size-matching pattern, no nested quantifiers\n .filter((l) => l.includes(\"npm notice\") && /\\d+(?:\\.\\d+)?\\s*[kM]?B\\s/.test(l))\n .map((l) => l.replace(/npm notice\\s*/, \"\"));\n\n if (fileLines.length > 0) {\n console.log(chalk.dim(\" Files:\"));\n for (const line of fileLines) {\n console.log(chalk.dim(\" \" + line.trim()));\n }\n }\n\n // Show totals\n const sizeLine = packOutput.split(\"\\n\").find((l) => l.includes(\"package size\"));\n const totalLine = packOutput.split(\"\\n\").find((l) => l.includes(\"total files\"));\n if (sizeLine) console.log(chalk.dim(\" \" + sizeLine.replace(/npm notice\\s*/, \"\").trim()));\n if (totalLine) console.log(chalk.dim(\" \" + totalLine.replace(/npm notice\\s*/, \"\").trim()));\n\n if (opts.dryRun) {\n console.log();\n ok(\"Dry run complete — no packages were published\");\n console.log(chalk.dim(\" Run without --dry-run to publish for real.\"));\n console.log();\n return;\n }\n\n // Prompt for confirmation\n console.log();\n const { confirm } = await prompt<{ confirm: boolean }>({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Publish \" + chalk.cyan(name + \"@\" + version) + \"?\",\n });\n\n if (!confirm) {\n console.log(chalk.dim(\" Cancelled.\"));\n return;\n }\n\n // ── Step 3: Publish ──\n\n const pubSpinner = ora(\"Publishing to npm...\").start();\n try {\n run(\"npm publish --access public\", cwd);\n pubSpinner.succeed(\"Published \" + chalk.cyan(name + \"@\" + version));\n } catch (err) {\n pubSpinner.fail(\"Publish failed\");\n const msg = err instanceof Error ? err.message : String(err);\n logger.error({ error: msg }, \"npm publish failed\");\n process.exit(1);\n }\n\n // ── Step 4: Open PR to voice registry ──\n\n const ghToken = SecretsManager.optional(\"GITHUB_TOKEN\");\n let prUrl: string | undefined;\n\n if (ghToken) {\n const prSpinner = ora(\"Opening PR to voice registry...\").start();\n try {\n prUrl = await openRegistryPR(name, version, pkg.description ?? \"\", ghToken);\n prSpinner.succeed(\"PR opened: \" + prUrl);\n } catch (err) {\n prSpinner.fail(\"Failed to open PR\");\n const msg = err instanceof Error ? err.message : String(err);\n logger.error({ error: msg }, \"Registry PR failed\");\n }\n } else {\n console.log();\n console.log(chalk.dim(\" To list in the Repertoire, set GITHUB_TOKEN and re-run\"));\n console.log(chalk.dim(\" Or open a PR manually: github.com/tuttiai/voices\"));\n }\n\n // ── Step 5: Summary ──\n\n console.log();\n ok(name + \"@\" + version + \" published to npm\");\n if (prUrl) ok(\"PR opened to tuttiai/voices\");\n const shortName = name.replace(\"@tuttiai/\", \"\").replace(/^tutti-?/, \"\");\n ok(\"Install: tutti-ai add \" + shortName);\n ok(\"View: https://www.npmjs.com/package/\" + name);\n console.log();\n}\n\nasync function openRegistryPR(\n packageName: string,\n version: string,\n description: string,\n token: string,\n): Promise<string> {\n const owner = \"tuttiai\";\n const repo = \"voices\";\n const branch = \"add-\" + packageName.replace(/[@/]/g, \"-\").replace(/^-/, \"\");\n const shortName = packageName.replace(\"@tuttiai/\", \"\").replace(/^tutti-?/, \"\");\n const isOfficial = packageName.startsWith(\"@tuttiai/\");\n\n // 1. Get current voices.json content and SHA\n const fileRes = await fetch(\n \"https://api.github.com/repos/\" + owner + \"/\" + repo + \"/contents/voices.json\",\n { headers: { Authorization: \"Bearer \" + token, Accept: \"application/vnd.github.v3+json\" } },\n );\n if (!fileRes.ok) throw new Error(\"Failed to fetch voices.json: \" + fileRes.status);\n const fileData = (await fileRes.json()) as { content: string; sha: string };\n\n interface RegistryVoice { name: string; package: string; description: string; version: string; author: string; tags: string[]; repo?: string }\n interface Registry { official: RegistryVoice[]; community: RegistryVoice[] }\n\n const registry = JSON.parse(Buffer.from(fileData.content, \"base64\").toString(\"utf-8\")) as Registry;\n\n // 2. Add the new voice entry\n const section: keyof Registry = isOfficial ? \"official\" : \"community\";\n const entry: RegistryVoice = {\n name: shortName,\n package: packageName,\n description,\n repo: \"https://github.com/tuttiai/tutti/tree/main/voices/\" + shortName,\n version,\n author: isOfficial ? \"tuttiai\" : packageName.split(\"/\")[0]?.replace(\"@\", \"\") ?? \"community\",\n tags: [shortName],\n };\n\n const sectionList = section === \"official\" ? registry.official : registry.community;\n const list = sectionList ?? [];\n if (section === \"official\") {\n registry.official = list;\n } else {\n registry.community = list;\n }\n const existingIdx = list.findIndex((v) => v.package === packageName);\n if (existingIdx >= 0) {\n const existing = list.at(existingIdx);\n list.splice(existingIdx, 1, { ...existing, ...entry });\n } else {\n list.push(entry);\n }\n\n const updatedContent = Buffer.from(JSON.stringify(registry, null, 2) + \"\\n\").toString(\"base64\");\n\n // 3. Get default branch SHA\n const mainRes = await fetch(\n \"https://api.github.com/repos/\" + owner + \"/\" + repo + \"/git/ref/heads/main\",\n { headers: { Authorization: \"Bearer \" + token, Accept: \"application/vnd.github.v3+json\" } },\n );\n if (!mainRes.ok) throw new Error(\"Failed to get main ref: \" + mainRes.status);\n const mainData = (await mainRes.json()) as { object: { sha: string } };\n\n // 4. Create branch\n await fetch(\"https://api.github.com/repos/\" + owner + \"/\" + repo + \"/git/refs\", {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + token, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ ref: \"refs/heads/\" + branch, sha: mainData.object.sha }),\n });\n\n // 5. Update voices.json on the new branch\n await fetch(\n \"https://api.github.com/repos/\" + owner + \"/\" + repo + \"/contents/voices.json\",\n {\n method: \"PUT\",\n headers: { Authorization: \"Bearer \" + token, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n message: \"feat: add \" + packageName + \" to the Repertoire\",\n content: updatedContent,\n sha: fileData.sha,\n branch,\n }),\n },\n );\n\n // 6. Create PR\n const prRes = await fetch(\"https://api.github.com/repos/\" + owner + \"/\" + repo + \"/pulls\", {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + token, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title: \"feat: add \" + packageName + \" to the Repertoire\",\n head: branch,\n base: \"main\",\n body: \"## New voice: \" + packageName + \"@\" + version + \"\\n\\n\" + description + \"\\n\\nPublished via `tutti-ai publish`.\",\n }),\n });\n\n if (!prRes.ok) {\n const err = await prRes.text();\n throw new Error(\"Failed to create PR: \" + prRes.status + \" \" + err);\n }\n\n const prData = (await prRes.json()) as { html_url: string };\n return prData.html_url;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n ScoreLoader,\n EvalRunner,\n printEvalTable,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { EvalSuite } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nexport async function evalCommand(suitePath: string, opts: { ci?: boolean; score?: string }): Promise<void> {\n const suiteFile = resolve(suitePath);\n if (!existsSync(suiteFile)) {\n logger.error({ file: suiteFile }, \"Suite file not found\");\n process.exit(1);\n }\n\n // Load the eval suite JSON\n let suite: EvalSuite;\n try {\n suite = JSON.parse(readFileSync(suiteFile, \"utf-8\")) as EvalSuite;\n } catch (err) {\n logger.error({ error: err instanceof Error ? err.message : String(err) }, \"Failed to parse suite file\");\n process.exit(1);\n }\n\n // Load score\n const scoreFile = resolve(opts.score ?? \"./tutti.score.ts\");\n if (!existsSync(scoreFile)) {\n logger.error({ file: scoreFile }, \"Score file not found\");\n process.exit(1);\n }\n\n const spinner = ora(\"Loading score...\").start();\n let score;\n try {\n score = await ScoreLoader.load(scoreFile);\n } catch (err) {\n spinner.fail(\"Failed to load score\");\n logger.error({ error: err instanceof Error ? err.message : String(err) }, \"Score load failed\");\n process.exit(1);\n }\n spinner.succeed(\"Score loaded\");\n\n // Run eval\n const evalSpinner = ora(\"Running \" + suite.cases.length + \" eval cases...\").start();\n const runner = new EvalRunner(score);\n const report = await runner.run(suite);\n evalSpinner.stop();\n\n // Print results\n printEvalTable(report);\n\n // CI mode: exit 1 if any failed\n if (opts.ci && report.summary.failed > 0) {\n console.error(chalk.red(\" CI mode: \" + report.summary.failed + \" case(s) failed\"));\n process.exit(1);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport {\n TuttiRuntime,\n ScoreLoader,\n AnthropicProvider,\n OpenAIProvider,\n GeminiProvider,\n SecretsManager,\n InMemorySessionStore,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { ScoreConfig, SessionStore } from \"@tuttiai/types\";\nimport { createServer, DEFAULT_PORT, SERVER_VERSION } from \"@tuttiai/server\";\nimport type { FastifyInstance } from \"fastify\";\nimport { ReactiveScore } from \"../watch/score-watcher.js\";\n\nconst logger = createLogger(\"tutti-serve\");\n\nexport interface ServeOptions {\n port?: string;\n host?: string;\n apiKey?: string;\n agent?: string;\n watch?: boolean;\n}\n\nexport async function serveCommand(\n scorePath?: string,\n options: ServeOptions = {},\n): Promise<void> {\n // ── Resolve score file ──────────────────────────────────────\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n\n if (!existsSync(file)) {\n logger.error({ file }, \"Score file not found\");\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n let score: ScoreConfig;\n try {\n score = await ScoreLoader.load(file);\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Failed to load score\",\n );\n process.exit(1);\n }\n\n // ── Validate provider API key ───────────────────────────────\n const providerKeyMap: [unknown, string][] = [\n [AnthropicProvider, \"ANTHROPIC_API_KEY\"],\n [OpenAIProvider, \"OPENAI_API_KEY\"],\n [GeminiProvider, \"GEMINI_API_KEY\"],\n ];\n\n for (const [ProviderClass, envVar] of providerKeyMap) {\n if (score.provider instanceof (ProviderClass as new (...args: unknown[]) => unknown)) {\n const key = SecretsManager.optional(envVar);\n if (!key) {\n logger.error({ envVar }, \"Missing API key\");\n process.exit(1);\n }\n }\n }\n\n // ── Resolve agent name ──────────────────────────────────────\n const agentNames = Object.keys(score.agents);\n const agentName =\n options.agent ??\n (typeof score.entry === \"string\" ? score.entry : undefined) ??\n agentNames[0];\n\n if (!agentName || !Object.hasOwn(score.agents, agentName)) {\n logger.error(\n { requested: agentName, available: agentNames },\n \"Agent not found in score\",\n );\n process.exit(1);\n }\n\n // ── Resolve port & host ─────────────────────────────────────\n const port = parsePort(options.port);\n const host = options.host ?? \"0.0.0.0\";\n\n // ── Build runtime and server ────────────────────────────────\n // Watch mode keeps a shared session store so hot-reloads don't\n // discard in-flight sessions.\n const sharedSessions: SessionStore | undefined = options.watch\n ? new InMemorySessionStore()\n : undefined;\n\n let runtime = buildRuntime(score, sharedSessions);\n let app = await buildApp(runtime, agentName, port, host, options.apiKey);\n\n // ── Watch mode ──────────────────────────────────────────────\n let reactive: ReactiveScore | undefined;\n if (options.watch) {\n reactive = new ReactiveScore(score, file);\n\n reactive.on(\"file-change\", () => {\n console.log(chalk.cyan(\"\\n[tutti] Score changed, reloading...\"));\n });\n\n reactive.on(\"reloaded\", () => {\n void (async () => {\n try {\n const nextScore = reactive?.current;\n if (!nextScore) return;\n const nextRuntime = buildRuntime(nextScore, sharedSessions);\n const nextApp = await buildApp(nextRuntime, agentName, port, host, options.apiKey);\n\n await app.close();\n runtime = nextRuntime;\n app = nextApp;\n await app.listen({ port, host });\n\n console.log(chalk.green(\"[tutti] Score reloaded. Server restarted.\"));\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"[tutti] Reload failed — server continues with previous config\",\n );\n }\n })();\n });\n\n reactive.on(\"reload-failed\", (err) => {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"[tutti] Reload failed — server continues with previous config\",\n );\n });\n }\n\n // ── Start listening ─────────────────────────────────────────\n await app.listen({ port, host });\n\n printBanner(port, host, agentName, score, file, options.watch);\n\n // ── Graceful shutdown ───────────────────────────────────────\n const shutdown = async (signal: string): Promise<void> => {\n console.log(chalk.dim(\"\\n\" + signal + \" received — shutting down...\"));\n if (reactive) await reactive.close();\n await app.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n}\n\n// ── Helpers ──────────────────────────────────────────────────\n\nfunction parsePort(raw: string | undefined): number {\n if (raw === undefined) return DEFAULT_PORT;\n const n = Number.parseInt(raw, 10);\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n logger.error({ port: raw }, \"Invalid port number\");\n process.exit(1);\n }\n return n;\n}\n\nfunction buildRuntime(\n score: ScoreConfig,\n sessionStore: SessionStore | undefined,\n): TuttiRuntime {\n return new TuttiRuntime(\n score,\n sessionStore ? { sessionStore } : {},\n );\n}\n\nasync function buildApp(\n runtime: TuttiRuntime,\n agentName: string,\n port: number,\n host: string,\n apiKey: string | undefined,\n): Promise<FastifyInstance> {\n return createServer({\n port,\n host,\n runtime,\n agent_name: agentName,\n api_key: apiKey,\n });\n}\n\nfunction printBanner(\n port: number,\n host: string,\n agentName: string,\n score: ScoreConfig,\n file: string,\n watch: boolean | undefined,\n): void {\n const display = host === \"0.0.0.0\" || host === \"::\" ? \"localhost\" : host;\n const url = \"http://\" + display + \":\" + port;\n\n console.log();\n console.log(chalk.bold(\" Tutti Server v\" + SERVER_VERSION));\n console.log(chalk.dim(\" \" + url));\n console.log();\n console.log(chalk.dim(\" Score: \") + (score.name ?? file));\n console.log(chalk.dim(\" Agent: \") + agentName);\n console.log(chalk.dim(\" Agents: \") + Object.keys(score.agents).join(\", \"));\n if (watch) {\n console.log(chalk.dim(\" Watch: \") + chalk.cyan(\"enabled\"));\n }\n console.log();\n console.log(chalk.dim(\" Endpoints:\"));\n console.log(chalk.dim(\" POST \") + url + \"/run\");\n console.log(chalk.dim(\" POST \") + url + \"/run/stream\");\n console.log(chalk.dim(\" GET \") + url + \"/sessions/:id\");\n console.log(chalk.dim(\" GET \") + url + \"/health\");\n console.log();\n}\n","/**\n * `tutti-ai schedule [score]` — start the scheduler daemon.\n *\n * Reads the score file, registers all agents that have a `schedule`\n * config, then runs until killed. Uses PostgreSQL via `TUTTI_PG_URL`\n * for schedule persistence, falling back to in-memory for local dev.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport {\n ScoreLoader,\n SchedulerEngine,\n PostgresScheduleStore,\n MemoryScheduleStore,\n AgentRunner,\n EventBus,\n InMemorySessionStore,\n SecretsManager,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { ScheduleStore } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nfunction resolveStore(): ScheduleStore {\n const pgUrl = SecretsManager.optional(\"TUTTI_PG_URL\");\n if (pgUrl) {\n return new PostgresScheduleStore({ connection_string: pgUrl });\n }\n logger.warn(\"TUTTI_PG_URL not set — using in-memory store (not durable across restarts)\");\n return new MemoryScheduleStore();\n}\n\nexport async function scheduleCommand(scorePath?: string): Promise<void> {\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n\n if (!existsSync(file)) {\n console.error(chalk.red(\"Score file not found: \" + file));\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n const score = await ScoreLoader.load(file);\n const events = new EventBus();\n const sessions = new InMemorySessionStore();\n const runner = new AgentRunner(\n score.provider,\n events,\n sessions,\n );\n\n const store = resolveStore();\n const engine = new SchedulerEngine(store, runner, events);\n\n // Register agents with schedule config\n let registered = 0;\n for (const [agentId, agent] of Object.entries(score.agents)) {\n if (!agent.schedule) continue;\n const resolvedAgent = agent.model\n ? agent\n : { ...agent, model: score.default_model ?? \"claude-sonnet-4-20250514\" };\n await engine.schedule(agentId, resolvedAgent, agent.schedule);\n registered++;\n }\n\n if (registered === 0) {\n console.log(chalk.yellow(\"No agents have a schedule config. Nothing to run.\"));\n console.log(chalk.dim(\"Add schedule: { cron: '...', input: '...' } to an agent in your score.\"));\n process.exit(0);\n }\n\n // Event logging\n events.onAny((e) => {\n if (e.type === \"schedule:triggered\") {\n const ev = e as { schedule_id: string; agent_name: string };\n console.log(\n chalk.dim(new Date().toISOString()) + \" \" +\n chalk.cyan(\"triggered\") + \" \" +\n chalk.bold(ev.schedule_id) + \" → \" + ev.agent_name,\n );\n }\n if (e.type === \"schedule:completed\") {\n const ev = e as { schedule_id: string; agent_name: string; duration_ms: number };\n console.log(\n chalk.dim(new Date().toISOString()) + \" \" +\n chalk.green(\"completed\") + \" \" +\n chalk.bold(ev.schedule_id) + \" \" +\n chalk.dim(\"(\" + ev.duration_ms + \"ms)\"),\n );\n }\n if (e.type === \"schedule:error\") {\n const ev = e as { schedule_id: string; agent_name: string; error: Error };\n console.log(\n chalk.dim(new Date().toISOString()) + \" \" +\n chalk.red(\"error\") + \" \" +\n chalk.bold(ev.schedule_id) + \" — \" + ev.error.message,\n );\n }\n });\n\n engine.start();\n\n // Banner\n console.log(\"\");\n console.log(chalk.cyan.bold(\" Tutti Scheduler\"));\n console.log(chalk.dim(\" Score: \" + (score.name ?? file)));\n console.log(chalk.dim(\" Schedules: \" + registered));\n console.log(chalk.dim(\" Store: \" + (SecretsManager.optional(\"TUTTI_PG_URL\") ? \"postgres\" : \"memory\")));\n console.log(\"\");\n console.log(chalk.dim(\" Press Ctrl+C to stop.\"));\n console.log(\"\");\n\n // Graceful shutdown\n const shutdown = (): void => {\n console.log(chalk.dim(\"\\n Shutting down scheduler...\"));\n engine.stop();\n if (\"close\" in store && typeof (store as { close: () => Promise<void> }).close === \"function\") {\n void (store as { close: () => Promise<void> }).close();\n }\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep process alive\n await new Promise(() => undefined);\n}\n","/**\n * `tutti-ai update` — self-update the CLI and core packages to latest.\n *\n * Detects npm or yarn, runs the appropriate install command to pull\n * the latest versions of @tuttiai/* packages, and prints a before/after\n * version comparison.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\n\nconst TUTTI_PACKAGES = [\n \"@tuttiai/core\",\n \"@tuttiai/cli\",\n \"@tuttiai/types\",\n \"@tuttiai/server\",\n \"@tuttiai/filesystem\",\n \"@tuttiai/github\",\n \"@tuttiai/playwright\",\n \"@tuttiai/mcp\",\n \"@tuttiai/web\",\n \"@tuttiai/sandbox\",\n \"@tuttiai/rag\",\n];\n\nfunction getInstalledVersion(pkg: string): string | null {\n try {\n const out = execSync(`npm list ${pkg} --depth=0 --json 2>/dev/null`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const data = JSON.parse(out) as { dependencies?: Record<string, { version?: string }> };\n const deps = data.dependencies;\n if (!deps) return null;\n for (const [name, info] of Object.entries(deps)) {\n if (name === pkg && info.version) return info.version;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction getLatestVersion(pkg: string): string | null {\n try {\n return execSync(`npm view ${pkg} version 2>/dev/null`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\nfunction detectPackageManager(): \"npm\" | \"yarn\" | \"pnpm\" {\n const cwd = process.cwd();\n if (existsSync(resolve(cwd, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(resolve(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n return \"npm\";\n}\n\nfunction isGlobalInstall(): boolean {\n try {\n const globalPrefix = execSync(\"npm prefix -g\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return process.argv[1]?.startsWith(globalPrefix) ?? false;\n } catch {\n return false;\n }\n}\n\nexport function updateCommand(): void {\n console.log();\n console.log(chalk.cyan.bold(\" Tutti Update\"));\n console.log();\n\n // 1. Check for CLI update (global install)\n const spinner = ora(\"Checking for updates...\").start();\n\n const cliCurrent = getInstalledVersion(\"@tuttiai/cli\") ?? \"unknown\";\n const cliLatest = getLatestVersion(\"@tuttiai/cli\");\n\n spinner.stop();\n\n if (cliLatest && cliCurrent !== cliLatest) {\n console.log(\n chalk.yellow(\" CLI update available: \") +\n chalk.dim(cliCurrent) + \" → \" + chalk.green(cliLatest),\n );\n\n if (isGlobalInstall()) {\n const updateSpinner = ora(\"Updating global CLI...\").start();\n try {\n execSync(\"npm install -g tutti-ai@latest\", { stdio: \"pipe\" });\n updateSpinner.succeed(\"CLI updated to \" + cliLatest);\n } catch {\n updateSpinner.fail(\"Failed to update global CLI\");\n console.log(chalk.dim(\" Run manually: npm install -g tutti-ai@latest\"));\n }\n } else {\n console.log(chalk.dim(\" Global: npm install -g tutti-ai@latest\"));\n }\n } else {\n console.log(chalk.green(\" CLI is up to date\") + chalk.dim(\" (\" + cliCurrent + \")\"));\n }\n\n // 2. Check local project packages\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) {\n console.log();\n console.log(chalk.dim(\" No package.json found — skipping project dependency check.\"));\n console.log();\n return;\n }\n\n let pkg: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n try {\n pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as typeof pkg;\n } catch {\n console.log(chalk.dim(\" Could not read package.json\"));\n return;\n }\n\n const allDeps = new Map<string, string>();\n if (pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n allDeps.set(name, version);\n }\n }\n if (pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n allDeps.set(name, version);\n }\n }\n\n const installed = TUTTI_PACKAGES.filter((p) => allDeps.has(p));\n if (installed.length === 0) {\n console.log();\n console.log(chalk.dim(\" No @tuttiai packages found in this project.\"));\n console.log();\n return;\n }\n\n console.log();\n console.log(\" \" + chalk.bold(\"Project packages:\"));\n\n const toUpdate: string[] = [];\n for (const name of installed) {\n const current = allDeps.get(name) ?? \"?\";\n const latest = getLatestVersion(name);\n if (!latest) {\n console.log(\" \" + chalk.dim(name) + \" \" + current + chalk.dim(\" (could not check)\"));\n continue;\n }\n const cleanCurrent = current.replace(/^[\\^~]/, \"\");\n if (cleanCurrent === latest) {\n console.log(\" \" + chalk.green(\"✔\") + \" \" + name + \" \" + chalk.dim(latest));\n } else {\n console.log(\n \" \" + chalk.yellow(\"↑\") + \" \" + name + \" \" +\n chalk.dim(cleanCurrent) + \" → \" + chalk.green(latest),\n );\n toUpdate.push(name + \"@latest\");\n }\n }\n\n if (toUpdate.length === 0) {\n console.log();\n console.log(chalk.green(\" All packages are up to date.\"));\n console.log();\n return;\n }\n\n console.log();\n const pm = detectPackageManager();\n const installCmd = pm === \"yarn\"\n ? \"yarn add \" + toUpdate.join(\" \")\n : pm === \"pnpm\"\n ? \"pnpm add \" + toUpdate.join(\" \")\n : \"npm install \" + toUpdate.join(\" \");\n\n const updateSpinner = ora(\"Updating \" + toUpdate.length + \" package(s)...\").start();\n try {\n execSync(installCmd, { cwd: process.cwd(), stdio: \"pipe\" });\n updateSpinner.succeed(\"Updated \" + toUpdate.length + \" package(s)\");\n } catch {\n updateSpinner.fail(\"Update failed\");\n console.log(chalk.dim(\" Run manually: \" + installCmd));\n }\n console.log();\n}\n","/**\n * `tutti-ai outdated` — check installed @tuttiai/* packages and voices\n * against the npm registry and show which ones have updates available.\n *\n * Does NOT install anything — just reports. Use `tutti-ai update` to\n * actually pull the latest versions.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\n\nfunction getLatestVersion(pkg: string): string | null {\n try {\n return execSync(`npm view ${pkg} version 2>/dev/null`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\nfunction pad(s: string, len: number): string {\n return s.length >= len ? s : s + \" \".repeat(len - s.length);\n}\n\nexport function outdatedCommand(): void {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) {\n console.error(chalk.red(\"No package.json found in the current directory.\"));\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n let pkg: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n try {\n pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as typeof pkg;\n } catch {\n console.error(chalk.red(\"Could not parse package.json\"));\n process.exit(1);\n }\n\n const allDeps = new Map<string, string>();\n if (pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n allDeps.set(name, version);\n }\n }\n if (pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n allDeps.set(name, version);\n }\n }\n\n // Filter to @tuttiai/* packages only\n const tuttiDeps = [...allDeps.entries()].filter(([name]) => name.startsWith(\"@tuttiai/\"));\n if (tuttiDeps.length === 0) {\n console.log(chalk.dim(\"No @tuttiai packages found in this project.\"));\n return;\n }\n\n const spinner = ora(\"Checking npm registry...\").start();\n\n const results: Array<{ name: string; current: string; latest: string; outdated: boolean }> = [];\n for (const [name, version] of tuttiDeps) {\n const latest = getLatestVersion(name);\n const current = version.replace(/^[\\^~]/, \"\");\n results.push({\n name,\n current,\n latest: latest ?? \"?\",\n outdated: latest !== null && current !== latest,\n });\n }\n\n spinner.stop();\n\n console.log();\n console.log(\n chalk.dim(\n \" \" + pad(\"PACKAGE\", 28) + pad(\"CURRENT\", 12) + pad(\"LATEST\", 12) + \"STATUS\",\n ),\n );\n console.log(chalk.dim(\" \" + \"─\".repeat(64)));\n\n let outdatedCount = 0;\n for (const r of results) {\n const status = r.outdated\n ? chalk.yellow(\"update available\")\n : chalk.green(\"up to date\");\n if (r.outdated) outdatedCount++;\n\n console.log(\n \" \" +\n pad(r.name, 28) +\n pad(r.current, 12) +\n pad(r.latest, 12) +\n status,\n );\n }\n\n console.log();\n if (outdatedCount > 0) {\n console.log(\n chalk.yellow(\" \" + outdatedCount + \" package(s) can be updated.\") +\n chalk.dim(\" Run: tutti-ai update\"),\n );\n } else {\n console.log(chalk.green(\" All packages are up to date.\"));\n }\n console.log();\n}\n","/**\n * `tutti-ai info` — show project information: score, agents, voices, versions.\n *\n * Reads the score file and package.json from the current directory and\n * prints a structured overview of the project configuration.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport { ScoreLoader, createLogger } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nfunction pad(s: string, len: number): string {\n return s.length >= len ? s : s + \" \".repeat(len - s.length);\n}\n\nexport async function infoCommand(scorePath?: string): Promise<void> {\n // Project info from package.json\n const pkgPath = resolve(process.cwd(), \"package.json\");\n let projectName = \"(unknown)\";\n let projectVersion = \"(unknown)\";\n const installedDeps = new Map<string, string>();\n\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n projectName = pkg.name ?? \"(unnamed)\";\n projectVersion = pkg.version ?? \"0.0.0\";\n if (pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n installedDeps.set(name, version);\n }\n }\n if (pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n installedDeps.set(name, version);\n }\n }\n } catch {\n // ignore\n }\n }\n\n console.log();\n console.log(chalk.cyan.bold(\" Tutti Project Info\"));\n console.log();\n console.log(\" \" + chalk.dim(\"Project:\") + \" \" + chalk.bold(projectName) + \" \" + chalk.dim(projectVersion));\n\n // Installed @tuttiai/* packages\n const tuttiPkgs = [...installedDeps.entries()].filter(([name]) => name.startsWith(\"@tuttiai/\"));\n if (tuttiPkgs.length > 0) {\n console.log();\n console.log(\" \" + chalk.bold(\"Packages:\"));\n for (const [name, version] of tuttiPkgs) {\n console.log(\" \" + pad(name, 28) + chalk.dim(version));\n }\n }\n\n // Score file info\n const scoreFile = resolve(scorePath ?? \"./tutti.score.ts\");\n if (!existsSync(scoreFile)) {\n console.log();\n console.log(chalk.dim(\" No score file found at \" + scoreFile));\n console.log(chalk.dim(' Run \"tutti-ai init\" to create a new project.'));\n console.log();\n return;\n }\n\n let score;\n try {\n score = await ScoreLoader.load(scoreFile);\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Failed to load score\",\n );\n console.log(chalk.dim(\" Score file found but failed to load.\"));\n console.log();\n return;\n }\n\n console.log(\" \" + chalk.dim(\"Score:\") + \" \" + (score.name ?? scoreFile));\n\n // Agents\n const agentEntries = Object.entries(score.agents);\n console.log();\n console.log(\" \" + chalk.bold(\"Agents:\") + chalk.dim(\" (\" + agentEntries.length + \")\"));\n for (const [id, agent] of agentEntries) {\n const voiceNames = agent.voices.map((v) => v.name).join(\", \") || \"none\";\n const model = agent.model ?? score.default_model ?? \"(default)\";\n const flags: string[] = [];\n if (agent.streaming) flags.push(\"streaming\");\n if (agent.allow_human_input) flags.push(\"hitl\");\n if (agent.durable) flags.push(\"durable\");\n if (agent.schedule) flags.push(\"scheduled\");\n if (agent.outputSchema) flags.push(\"structured\");\n if (agent.beforeRun ?? agent.afterRun) flags.push(\"guardrails\");\n\n console.log();\n console.log(\" \" + chalk.bold(id) + chalk.dim(\" (\" + agent.name + \")\"));\n console.log(\" \" + chalk.dim(\"Model: \") + model);\n console.log(\" \" + chalk.dim(\"Voices: \") + voiceNames);\n if (flags.length > 0) {\n console.log(\" \" + chalk.dim(\"Flags: \") + flags.join(\", \"));\n }\n if (agent.schedule) {\n const sched = agent.schedule;\n const trigger = sched.cron ?? sched.every ?? sched.at ?? \"?\";\n console.log(\" \" + chalk.dim(\"Schedule: \") + trigger);\n }\n }\n\n // Entry point\n if (score.entry) {\n const entry = typeof score.entry === \"string\" ? score.entry : \"parallel\";\n console.log();\n console.log(\" \" + chalk.dim(\"Entry:\") + \" \" + entry);\n }\n\n console.log();\n}\n","/**\n * `tutti-ai upgrade [voice]` — upgrade a specific voice or all voices.\n *\n * Without arguments: upgrades all installed @tuttiai/* packages.\n * With a voice name: upgrades just that one package.\n *\n * Detects the package manager from lock files and uses the appropriate\n * install command.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\n\nfunction detectPackageManager(): \"npm\" | \"yarn\" | \"pnpm\" {\n const cwd = process.cwd();\n if (existsSync(resolve(cwd, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(resolve(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n return \"npm\";\n}\n\nfunction resolvePackageName(input: string): string {\n const KNOWN = new Map([\n [\"filesystem\", \"@tuttiai/filesystem\"],\n [\"github\", \"@tuttiai/github\"],\n [\"playwright\", \"@tuttiai/playwright\"],\n [\"mcp\", \"@tuttiai/mcp\"],\n [\"web\", \"@tuttiai/web\"],\n [\"sandbox\", \"@tuttiai/sandbox\"],\n [\"rag\", \"@tuttiai/rag\"],\n [\"core\", \"@tuttiai/core\"],\n [\"types\", \"@tuttiai/types\"],\n [\"server\", \"@tuttiai/server\"],\n ]);\n return KNOWN.get(input) ?? (input.startsWith(\"@\") ? input : `@tuttiai/${input}`);\n}\n\nfunction getInstalledTuttiPackages(): Map<string, string> {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) return new Map();\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const result = new Map<string, string>();\n if (pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n if (name.startsWith(\"@tuttiai/\")) result.set(name, version);\n }\n }\n if (pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n if (name.startsWith(\"@tuttiai/\")) result.set(name, version);\n }\n }\n return result;\n } catch {\n return new Map();\n }\n}\n\nexport function upgradeCommand(target?: string): void {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) {\n console.error(chalk.red(\"No package.json found in the current directory.\"));\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n const pm = detectPackageManager();\n const installed = getInstalledTuttiPackages();\n\n if (installed.size === 0) {\n console.log(chalk.dim(\"No @tuttiai packages found in this project.\"));\n return;\n }\n\n let packages: string[];\n if (target) {\n const resolved = resolvePackageName(target);\n if (!installed.has(resolved)) {\n console.error(chalk.red(resolved + \" is not installed in this project.\"));\n console.error(chalk.dim(\"Installed: \" + [...installed.keys()].join(\", \")));\n process.exit(1);\n }\n packages = [resolved + \"@latest\"];\n console.log(chalk.cyan(\" Upgrading \" + resolved + \"...\"));\n } else {\n packages = [...installed.keys()].map((p) => p + \"@latest\");\n console.log(chalk.cyan(\" Upgrading all \" + packages.length + \" @tuttiai packages...\"));\n }\n\n const installCmd = pm === \"yarn\"\n ? \"yarn add \" + packages.join(\" \")\n : pm === \"pnpm\"\n ? \"pnpm add \" + packages.join(\" \")\n : \"npm install \" + packages.join(\" \");\n\n const spinner = ora(\"Installing...\").start();\n try {\n execSync(installCmd, { cwd: process.cwd(), stdio: \"pipe\" });\n spinner.succeed(\"Upgraded \" + packages.length + \" package(s)\");\n } catch {\n spinner.fail(\"Upgrade failed\");\n console.log(chalk.dim(\" Run manually: \" + installCmd));\n process.exit(1);\n }\n\n // Show new versions\n console.log();\n const newInstalled = getInstalledTuttiPackages();\n for (const [name, oldVersion] of installed) {\n const newVersion = newInstalled.get(name) ?? oldVersion;\n const oldClean = oldVersion.replace(/^[\\^~]/, \"\");\n const newClean = newVersion.replace(/^[\\^~]/, \"\");\n if (oldClean !== newClean) {\n console.log(\" \" + chalk.green(\"↑\") + \" \" + name + \" \" + chalk.dim(oldClean) + \" → \" + chalk.green(newClean));\n } else {\n console.log(\" \" + chalk.dim(\"=\") + \" \" + name + \" \" + chalk.dim(newClean) + chalk.dim(\" (already latest)\"));\n }\n }\n console.log();\n}\n","/**\n * `tutti-ai replay <session-id>` — time-travel debugger for sessions.\n *\n * Loads all messages for a session from the PostgreSQL session store,\n * then opens an interactive REPL for navigating, inspecting, replaying,\n * and exporting the conversation history.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n PostgresSessionStore,\n ScoreLoader,\n TuttiRuntime,\n SecretsManager,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { Session } from \"@tuttiai/types\";\nimport {\n messageToText,\n renderList,\n renderShow,\n renderInspect,\n exportJSON,\n exportMarkdown,\n} from \"./replay-render.js\";\n\n// Re-export rendering functions so existing tests keep working\nexport {\n messageToText,\n renderList,\n renderShow,\n renderInspect,\n exportJSON,\n exportMarkdown,\n} from \"./replay-render.js\";\n\nconst logger = createLogger(\"tutti-cli\");\n\n// ── REPL ─────────────────────────────────────────────────────\n\nexport interface ReplayOptions {\n score?: string;\n}\n\nexport async function replayCommand(\n sessionId: string,\n opts: ReplayOptions = {},\n): Promise<void> {\n const pgUrl = SecretsManager.optional(\"TUTTI_PG_URL\");\n if (!pgUrl) {\n console.error(chalk.red(\"TUTTI_PG_URL is not set.\"));\n console.error(\n chalk.dim(\n \"The replay command requires PostgreSQL for session persistence.\\n\" +\n \"Set TUTTI_PG_URL=postgres://user:pass@host/db in your environment.\",\n ),\n );\n process.exit(1);\n }\n\n const store = new PostgresSessionStore(pgUrl);\n\n const spinner = ora({ color: \"cyan\" }).start(\"Loading session...\");\n let session: Session | undefined;\n try {\n session = await store.getAsync(sessionId);\n } catch (err) {\n spinner.fail(\"Failed to load session\");\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Session store error\",\n );\n process.exit(1);\n }\n spinner.stop();\n\n if (!session) {\n console.error(chalk.red(\"Session not found: \" + sessionId));\n console.error(chalk.dim(\"Check the session ID and ensure TUTTI_PG_URL points to the correct database.\"));\n await store.close();\n process.exit(1);\n }\n\n const messages = session.messages;\n\n console.log(\"\");\n console.log(chalk.cyan.bold(\" Tutti Replay\"));\n console.log(chalk.dim(\" Session: \" + session.id));\n console.log(chalk.dim(\" Agent: \" + session.agent_name));\n console.log(chalk.dim(\" Created: \" + session.created_at.toISOString()));\n console.log(chalk.dim(\" Messages: \" + messages.length));\n console.log(\"\");\n console.log(chalk.dim(\" Commands: list, show <n>, next, prev, inspect, replay-from <n>, export <json|md>, quit\"));\n console.log(\"\");\n\n let cursor = 0;\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n while (true) {\n const prompt = chalk.cyan(\"replay [\" + cursor + \"/\" + (messages.length - 1) + \"]> \");\n const raw = await rl.question(prompt);\n const input = raw.trim();\n if (!input) continue;\n\n const [cmd, ...args] = input.split(/\\s+/);\n\n switch (cmd) {\n case \"quit\":\n case \"exit\":\n case \"q\":\n console.log(chalk.dim(\"Bye.\"));\n return;\n\n case \"list\":\n console.log(renderList(messages));\n break;\n\n case \"show\": {\n const n = parseInt(args[0] ?? String(cursor), 10);\n console.log(renderShow(messages, n));\n if (n >= 0 && n < messages.length) cursor = n;\n break;\n }\n\n case \"next\":\n if (cursor < messages.length - 1) {\n cursor++;\n console.log(renderShow(messages, cursor));\n } else {\n console.log(chalk.dim(\"Already at last message.\"));\n }\n break;\n\n case \"prev\":\n if (cursor > 0) {\n cursor--;\n console.log(renderShow(messages, cursor));\n } else {\n console.log(chalk.dim(\"Already at first message.\"));\n }\n break;\n\n case \"inspect\":\n console.log(renderInspect(messages, cursor));\n break;\n\n case \"replay-from\": {\n const turn = parseInt(args[0] ?? \"\", 10);\n if (isNaN(turn) || turn < 0 || turn >= messages.length) {\n console.log(chalk.red(\"Usage: replay-from <turn-number>\"));\n break;\n }\n await handleReplayFrom(turn, session, rl, opts);\n break;\n }\n\n case \"export\": {\n const format = args[0];\n if (format === \"json\") {\n const filename = \"session-\" + session.id.slice(0, 8) + \".json\";\n await writeFile(filename, exportJSON(session));\n console.log(chalk.green(\"Exported to \" + filename));\n } else if (format === \"md\" || format === \"markdown\") {\n const filename = \"session-\" + session.id.slice(0, 8) + \".md\";\n await writeFile(filename, exportMarkdown(session));\n console.log(chalk.green(\"Exported to \" + filename));\n } else {\n console.log(chalk.dim(\"Usage: export <json|md>\"));\n }\n break;\n }\n\n default:\n console.log(\n chalk.dim(\"Unknown command. Available: list, show <n>, next, prev, inspect, replay-from <n>, export <json|md>, quit\"),\n );\n }\n }\n } finally {\n rl.close();\n await store.close();\n }\n}\n\n// ── replay-from ──────────────────────────────────────────────\n\nasync function handleReplayFrom(\n turn: number,\n session: Session,\n rl: ReturnType<typeof createInterface>,\n opts: ReplayOptions,\n): Promise<void> {\n const scoreFile = resolve(opts.score ?? \"./tutti.score.ts\");\n if (!existsSync(scoreFile)) {\n console.log(chalk.red(\"Score file not found: \" + scoreFile));\n console.log(chalk.dim(\"Use --score to specify the score file.\"));\n return;\n }\n\n const originalMsg = session.messages.at(turn);\n const originalInput = originalMsg ? messageToText(originalMsg) : \"\";\n\n const answer = await rl.question(\n chalk.cyan(\"Replay from turn \" + turn + \" with original input? \") +\n chalk.dim(\"(y / enter new input) \"),\n );\n\n const input = answer.trim().toLowerCase() === \"y\" || answer.trim() === \"\"\n ? originalInput\n : answer.trim();\n\n if (!input) {\n console.log(chalk.dim(\"No input provided. Cancelled.\"));\n return;\n }\n\n const spinnerLoad = ora({ color: \"cyan\" }).start(\"Loading score...\");\n let score;\n try {\n score = await ScoreLoader.load(scoreFile);\n } catch (err) {\n spinnerLoad.fail(\"Failed to load score\");\n logger.error({ error: err instanceof Error ? err.message : String(err) }, \"Score load error\");\n return;\n }\n spinnerLoad.stop();\n\n const restoredMessages = session.messages.slice(0, turn);\n const runtime = new TuttiRuntime(score);\n\n const sessions = runtime.sessions;\n if (\"save\" in sessions && typeof sessions.save === \"function\") {\n (sessions.save as (s: {\n id: string;\n agent_name: string;\n messages: typeof restoredMessages;\n created_at: Date;\n updated_at: Date;\n }) => void)({\n id: session.id,\n agent_name: session.agent_name,\n messages: restoredMessages,\n created_at: session.created_at,\n updated_at: new Date(),\n });\n }\n\n const agentName = session.agent_name;\n const agentMap = new Map(Object.entries(score.agents));\n const agent = agentMap.get(agentName);\n if (!agent) {\n console.log(chalk.red(\"Agent \\\"\" + agentName + \"\\\" not found in score.\"));\n return;\n }\n\n const spinnerRun = ora({ color: \"cyan\" }).start(\"Running from turn \" + turn + \"...\");\n\n runtime.events.on(\"token:stream\", (e) => {\n spinnerRun.stop();\n process.stdout.write(e.text);\n });\n\n try {\n const result = await runtime.run(agentName, input, session.id);\n spinnerRun.stop();\n console.log(\"\");\n console.log(chalk.green(\"Replay complete.\"));\n console.log(chalk.dim(\" Turns: \" + result.turns));\n console.log(chalk.dim(\" Tokens: \" + result.usage.input_tokens + \" in / \" + result.usage.output_tokens + \" out\"));\n console.log(\"\");\n console.log(result.output);\n } catch (err) {\n spinnerRun.fail(\"Replay failed\");\n logger.error({ error: err instanceof Error ? err.message : String(err) }, \"Replay error\");\n }\n}\n","/**\n * Pure rendering functions for the replay command.\n *\n * Split from `replay.ts` so they stay in the coverage scope while\n * the interactive REPL and Postgres I/O are excluded.\n */\n\nimport chalk from \"chalk\";\nimport type { ChatMessage, Session } from \"@tuttiai/types\";\n\n/** Convert a message's content to a single-line text summary. */\nexport function messageToText(msg: ChatMessage): string {\n if (typeof msg.content === \"string\") return msg.content;\n const parts: string[] = [];\n for (const block of msg.content) {\n if (block.type === \"text\") {\n parts.push(block.text);\n } else if (block.type === \"tool_use\") {\n parts.push(\"[tool_use \" + block.name + \"]\");\n } else if (block.type === \"tool_result\") {\n const preview = block.content.replace(/\\s+/g, \" \").trim();\n parts.push(\"[tool_result \" + (preview.length > 60 ? preview.slice(0, 59) + \"\\u2026\" : preview) + \"]\");\n }\n }\n return parts.join(\" \");\n}\n\n/** Excerpt a string to a maximum length. */\nfunction excerpt(text: string, max: number): string {\n const oneLine = text.replace(/\\s+/g, \" \").trim();\n return oneLine.length > max ? oneLine.slice(0, max - 1) + \"\\u2026\" : oneLine;\n}\n\n/** Render the `list` view — all messages with index, role, and preview. */\nexport function renderList(messages: ChatMessage[]): string {\n const lines: string[] = [];\n for (let i = 0; i < messages.length; i++) {\n const msg = messages.at(i);\n if (!msg) continue;\n const role = msg.role === \"user\"\n ? chalk.blue(\"user \")\n : chalk.green(\"assistant\");\n const text = excerpt(messageToText(msg), 80);\n lines.push(\n chalk.dim(String(i).padStart(3)) + \" \" + role + \" \" + text,\n );\n }\n return lines.join(\"\\n\");\n}\n\n/** Render the `show <n>` view — full detail for one message. */\nexport function renderShow(messages: ChatMessage[], index: number): string {\n if (index < 0 || index >= messages.length) {\n return chalk.red(\"Index out of range. Valid: 0\\u2013\" + (messages.length - 1));\n }\n\n const msg = messages.at(index);\n if (!msg) return chalk.red(\"Index out of range.\");\n const lines: string[] = [];\n\n lines.push(chalk.cyan.bold(\"Turn \" + index) + \" \" + chalk.dim(\"[\" + msg.role + \"]\"));\n lines.push(\"\");\n\n if (typeof msg.content === \"string\") {\n lines.push(msg.content);\n } else {\n for (const block of msg.content) {\n if (block.type === \"text\") {\n lines.push(block.text);\n } else if (block.type === \"tool_use\") {\n lines.push(chalk.yellow(\" tool_use: \" + block.name));\n lines.push(chalk.dim(\" id: \" + block.id));\n lines.push(chalk.dim(\" input: \" + JSON.stringify(block.input, null, 2)));\n } else if (block.type === \"tool_result\") {\n const label = block.is_error ? chalk.red(\" tool_result (error):\") : chalk.green(\" tool_result:\");\n lines.push(label);\n lines.push(chalk.dim(\" tool_use_id: \" + block.tool_use_id));\n lines.push(\" \" + block.content);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/** Render the `inspect` view — raw JSON of the current message. */\nexport function renderInspect(messages: ChatMessage[], index: number): string {\n if (index < 0 || index >= messages.length) {\n return chalk.red(\"Index out of range.\");\n }\n return JSON.stringify(messages.at(index), null, 2);\n}\n\n/** Export the session as JSON. */\nexport function exportJSON(session: Session): string {\n return JSON.stringify(\n {\n id: session.id,\n agent_name: session.agent_name,\n created_at: session.created_at,\n messages: session.messages,\n },\n null,\n 2,\n );\n}\n\n/** Export the session as Markdown. */\nexport function exportMarkdown(session: Session): string {\n const lines: string[] = [];\n lines.push(\"# Session \" + session.id);\n lines.push(\"\");\n lines.push(\"**Agent:** \" + session.agent_name);\n lines.push(\"**Created:** \" + session.created_at.toISOString());\n lines.push(\"**Messages:** \" + session.messages.length);\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n\n for (let i = 0; i < session.messages.length; i++) {\n const msg = session.messages.at(i);\n if (!msg) continue;\n lines.push(\"## Turn \" + i + \" (\" + msg.role + \")\");\n lines.push(\"\");\n if (typeof msg.content === \"string\") {\n lines.push(msg.content);\n } else {\n for (const block of msg.content) {\n if (block.type === \"text\") {\n lines.push(block.text);\n } else if (block.type === \"tool_use\") {\n lines.push(\"**Tool call:** `\" + block.name + \"`\");\n lines.push(\"```json\\n\" + JSON.stringify(block.input, null, 2) + \"\\n```\");\n } else if (block.type === \"tool_result\") {\n const label = block.is_error ? \"**Tool error:**\" : \"**Tool result:**\";\n lines.push(label);\n lines.push(\"```\\n\" + block.content + \"\\n```\");\n }\n }\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * `tutti-ai schedules <subcommand>` — schedule management commands.\n *\n * All subcommands connect to the schedule store via TUTTI_PG_URL.\n * Falls back to in-memory (ephemeral) when TUTTI_PG_URL is not set.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport {\n ScoreLoader,\n SchedulerEngine,\n PostgresScheduleStore,\n MemoryScheduleStore,\n AgentRunner,\n EventBus,\n InMemorySessionStore,\n SecretsManager,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { ScheduleStore, ScheduleRecord } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nfunction resolveStore(): ScheduleStore {\n const pgUrl = SecretsManager.optional(\"TUTTI_PG_URL\");\n if (pgUrl) {\n return new PostgresScheduleStore({ connection_string: pgUrl });\n }\n logger.warn(\"TUTTI_PG_URL not set — using in-memory store (schedules are ephemeral)\");\n return new MemoryScheduleStore();\n}\n\nasync function closeStore(store: ScheduleStore): Promise<void> {\n if (\"close\" in store && typeof (store as { close: () => Promise<void> }).close === \"function\") {\n await (store as { close: () => Promise<void> }).close();\n }\n}\n\nfunction formatTrigger(r: ScheduleRecord): string {\n if (r.config.cron) return \"cron: \" + r.config.cron;\n if (r.config.every) return \"every \" + r.config.every;\n if (r.config.at) return \"at \" + r.config.at;\n return \"?\";\n}\n\nfunction pad(s: string, len: number): string {\n return s.length >= len ? s : s + \" \".repeat(len - s.length);\n}\n\n// ── list ──────────────────────────────────────────────────────\n\nexport async function schedulesListCommand(): Promise<void> {\n const store = resolveStore();\n try {\n const records = await store.list();\n\n if (records.length === 0) {\n console.log(chalk.dim(\"No schedules found.\"));\n console.log(chalk.dim('Run \"tutti-ai schedule\" to start the scheduler daemon.'));\n return;\n }\n\n console.log(\"\");\n console.log(\n chalk.dim(\n \" \" + pad(\"ID\", 20) + pad(\"AGENT\", 16) +\n pad(\"TRIGGER\", 22) + pad(\"ENABLED\", 10) +\n pad(\"RUNS\", 8) + \"CREATED\",\n ),\n );\n console.log(chalk.dim(\" \" + \"─\".repeat(90)));\n\n for (const r of records) {\n const enabled = r.enabled\n ? chalk.green(\"yes\")\n : chalk.red(\"no\") + \" \";\n const maxLabel = r.config.max_runs\n ? r.run_count + \"/\" + r.config.max_runs\n : String(r.run_count);\n\n console.log(\n \" \" +\n chalk.bold(pad(r.id, 20)) +\n pad(r.agent_id, 16) +\n pad(formatTrigger(r), 22) +\n pad(enabled, 10) +\n pad(maxLabel, 8) +\n chalk.dim(r.created_at.toISOString().slice(0, 10)),\n );\n }\n console.log(\"\");\n } finally {\n await closeStore(store);\n }\n}\n\n// ── enable ────────────────────────────────────────────────────\n\nexport async function schedulesEnableCommand(id: string): Promise<void> {\n const store = resolveStore();\n try {\n const record = await store.get(id);\n if (!record) {\n console.error(chalk.red('Schedule \"' + id + '\" not found.'));\n process.exit(1);\n }\n await store.setEnabled(id, true);\n console.log(chalk.green('Schedule \"' + id + '\" enabled.'));\n } finally {\n await closeStore(store);\n }\n}\n\n// ── disable ───────────────────────────────────────────────────\n\nexport async function schedulesDisableCommand(id: string): Promise<void> {\n const store = resolveStore();\n try {\n const record = await store.get(id);\n if (!record) {\n console.error(chalk.red('Schedule \"' + id + '\" not found.'));\n process.exit(1);\n }\n await store.setEnabled(id, false);\n console.log(chalk.yellow('Schedule \"' + id + '\" disabled.'));\n } finally {\n await closeStore(store);\n }\n}\n\n// ── trigger ───────────────────────────────────────────────────\n\nexport async function schedulesTriggerCommand(\n id: string,\n scorePath?: string,\n): Promise<void> {\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n if (!existsSync(file)) {\n console.error(chalk.red(\"Score file not found: \" + file));\n process.exit(1);\n }\n\n const score = await ScoreLoader.load(file);\n const events = new EventBus();\n const sessions = new InMemorySessionStore();\n const runner = new AgentRunner(score.provider, events, sessions);\n const store = resolveStore();\n\n try {\n const record = await store.get(id);\n if (!record) {\n console.error(chalk.red('Schedule \"' + id + '\" not found.'));\n process.exit(1);\n }\n\n const agent = score.agents[record.agent_id];\n if (!agent) {\n console.error(chalk.red('Agent \"' + record.agent_id + '\" not found in score.'));\n process.exit(1);\n }\n\n const resolvedAgent = agent.model\n ? agent\n : { ...agent, model: score.default_model ?? \"claude-sonnet-4-20250514\" };\n\n const engine = new SchedulerEngine(store, runner, events);\n await engine.schedule(id, resolvedAgent, record.config);\n engine.start();\n\n console.log(chalk.cyan('Triggering \"' + id + '\" (' + record.agent_id + \")...\"));\n\n const run = await engine.trigger(id);\n\n engine.stop();\n\n if (run.error) {\n console.log(chalk.red(\" Error: \" + run.error));\n process.exit(1);\n }\n\n const duration = run.completed_at && run.triggered_at\n ? run.completed_at.getTime() - run.triggered_at.getTime()\n : 0;\n\n console.log(chalk.green(\" Completed in \" + duration + \"ms\"));\n if (run.result) {\n const preview = run.result.length > 200\n ? run.result.slice(0, 200) + \"...\"\n : run.result;\n console.log(chalk.dim(\" Output: \" + preview));\n }\n } finally {\n await closeStore(store);\n }\n}\n\n// ── runs ──────────────────────────────────────────────────────\n\nexport async function schedulesRunsCommand(id: string): Promise<void> {\n const store = resolveStore();\n try {\n const record = await store.get(id);\n if (!record) {\n console.error(chalk.red('Schedule \"' + id + '\" not found.'));\n process.exit(1);\n }\n\n // MemoryScheduleStore exposes getRuns(); Postgres tracks only run_count.\n if (\"getRuns\" in store && typeof (store as { getRuns: (id: string) => unknown[] }).getRuns === \"function\") {\n const runs = (store as { getRuns: (id: string) => Array<{\n triggered_at: Date;\n completed_at?: Date;\n result?: string;\n error?: string;\n }> }).getRuns(id);\n\n if (runs.length === 0) {\n console.log(chalk.dim(\"No runs recorded for this schedule.\"));\n return;\n }\n\n const recent = runs.slice(-20);\n console.log(\"\");\n console.log(chalk.dim(\" Showing last \" + recent.length + \" of \" + runs.length + \" runs:\"));\n console.log(\"\");\n\n for (const run of recent) {\n const duration = run.completed_at && run.triggered_at\n ? (run.completed_at.getTime() - run.triggered_at.getTime()) + \"ms\"\n : \"?\";\n const status = run.error\n ? chalk.red(\"error\")\n : chalk.green(\"ok\");\n const preview = run.error\n ? run.error.slice(0, 80)\n : (run.result ?? \"\").slice(0, 80);\n console.log(\n \" \" + chalk.dim(run.triggered_at.toISOString()) + \" \" +\n status + \" \" + chalk.dim(duration) + \" \" + preview,\n );\n }\n console.log(\"\");\n } else {\n // Postgres store — only has run_count, not full history\n console.log(chalk.dim('Schedule \"' + id + '\" has completed ' + record.run_count + \" runs.\"));\n console.log(chalk.dim(\"Full run history requires the MemoryScheduleStore or a future tutti_schedule_runs table.\"));\n }\n } finally {\n await closeStore(store);\n }\n}\n","/**\n * `tutti-ai traces <subcommand>` — list, show, and tail traces emitted\n * by a running `tutti-ai serve` process.\n *\n * All three subcommands talk to the server's `/traces` route family.\n * The CLI never reads spans from a local tracer because traces are\n * per-process and the CLI runs in a separate process from the agent.\n */\n\nimport chalk from \"chalk\";\nimport { SecretsManager } from \"@tuttiai/core\";\nimport type { TraceSummary, TuttiSpan } from \"@tuttiai/core\";\n\nimport {\n renderSpanLine,\n renderTraceShow,\n renderTracesList,\n} from \"./traces-render.js\";\n\nconst DEFAULT_SERVER_URL = \"http://127.0.0.1:3847\";\n\n/** Common command-line options shared by all three subcommands. */\nexport interface TracesOptions {\n /** Base URL of the `tutti-ai serve` process. Defaults to localhost:3847. */\n url?: string;\n /** Bearer token. Falls back to TUTTI_API_KEY env var. */\n apiKey?: string;\n}\n\nfunction resolveUrl(opts: TracesOptions): string {\n return opts.url ?? SecretsManager.optional(\"TUTTI_SERVER_URL\") ?? DEFAULT_SERVER_URL;\n}\n\nfunction resolveAuthHeader(opts: TracesOptions): Record<string, string> {\n const key = opts.apiKey ?? SecretsManager.optional(\"TUTTI_API_KEY\");\n return key ? { Authorization: \"Bearer \" + key } : {};\n}\n\nfunction explainConnectionError(err: unknown, baseUrl: string): never {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.red(\"Failed to reach Tutti server at \" + baseUrl));\n console.error(chalk.dim(\" \" + msg));\n console.error(chalk.dim(' Is `tutti-ai serve` running? Set --url or TUTTI_SERVER_URL to override.'));\n process.exit(1);\n}\n\n// ── list ──────────────────────────────────────────────────────\n\nexport async function tracesListCommand(opts: TracesOptions): Promise<void> {\n const baseUrl = resolveUrl(opts);\n const url = baseUrl.replace(/\\/$/, \"\") + \"/traces\";\n let res: Response;\n try {\n res = await fetch(url, { headers: resolveAuthHeader(opts) });\n } catch (err) {\n explainConnectionError(err, baseUrl);\n }\n\n if (res.status === 401) {\n console.error(chalk.red(\"Unauthorized — set --api-key or TUTTI_API_KEY.\"));\n process.exit(1);\n }\n if (!res.ok) {\n console.error(chalk.red(\"Server returned \" + res.status + \" \" + res.statusText));\n process.exit(1);\n }\n\n const body = (await res.json()) as { traces: TraceSummary[] };\n console.log(renderTracesList(body.traces));\n}\n\n// ── show ──────────────────────────────────────────────────────\n\nexport async function tracesShowCommand(\n traceId: string,\n opts: TracesOptions,\n): Promise<void> {\n const baseUrl = resolveUrl(opts);\n const url = baseUrl.replace(/\\/$/, \"\") + \"/traces/\" + encodeURIComponent(traceId);\n let res: Response;\n try {\n res = await fetch(url, { headers: resolveAuthHeader(opts) });\n } catch (err) {\n explainConnectionError(err, baseUrl);\n }\n\n if (res.status === 404) {\n console.error(chalk.red('Trace \"' + traceId + '\" not found.'));\n process.exit(1);\n }\n if (res.status === 401) {\n console.error(chalk.red(\"Unauthorized — set --api-key or TUTTI_API_KEY.\"));\n process.exit(1);\n }\n if (!res.ok) {\n console.error(chalk.red(\"Server returned \" + res.status + \" \" + res.statusText));\n process.exit(1);\n }\n\n const body = (await res.json()) as { trace_id: string; spans: TuttiSpan[] };\n // Dates round-trip as ISO strings; the renderer expects Date objects.\n const spans = body.spans.map(reviveSpanDates);\n console.log(renderTraceShow(spans));\n}\n\n// ── tail ──────────────────────────────────────────────────────\n\nexport async function tracesTailCommand(opts: TracesOptions): Promise<void> {\n const baseUrl = resolveUrl(opts);\n const url = baseUrl.replace(/\\/$/, \"\") + \"/traces/stream\";\n\n console.error(chalk.dim(\"Tailing traces from \" + baseUrl + \" — Ctrl+C to exit\"));\n console.error(\"\");\n\n const controller = new AbortController();\n process.once(\"SIGINT\", () => {\n controller.abort();\n console.error(\"\");\n console.error(chalk.dim(\"Disconnected.\"));\n process.exit(0);\n });\n\n let res: Response;\n try {\n res = await fetch(url, {\n headers: { ...resolveAuthHeader(opts), Accept: \"text/event-stream\" },\n signal: controller.signal,\n });\n } catch (err) {\n if (controller.signal.aborted) return;\n explainConnectionError(err, baseUrl);\n }\n\n if (res.status === 401) {\n console.error(chalk.red(\"Unauthorized — set --api-key or TUTTI_API_KEY.\"));\n process.exit(1);\n }\n if (!res.ok || !res.body) {\n console.error(chalk.red(\"Server returned \" + res.status + \" \" + res.statusText));\n process.exit(1);\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n for (;;) {\n let chunk: ReadableStreamReadResult<Uint8Array>;\n try {\n chunk = await reader.read();\n } catch {\n // Aborted via SIGINT.\n return;\n }\n if (chunk.done) break;\n buffer += decoder.decode(chunk.value, { stream: true });\n\n let frameEnd: number;\n while ((frameEnd = buffer.indexOf(\"\\n\\n\")) !== -1) {\n const frame = buffer.slice(0, frameEnd);\n buffer = buffer.slice(frameEnd + 2);\n const dataLine = frame.split(\"\\n\").find((l) => l.startsWith(\"data: \"));\n if (!dataLine) continue;\n try {\n const span = reviveSpanDates(JSON.parse(dataLine.slice(6)) as TuttiSpan);\n console.log(renderSpanLine(span, 0));\n } catch (err) {\n console.error(chalk.red(\"Bad SSE frame: \" + (err instanceof Error ? err.message : String(err))));\n }\n }\n }\n}\n\n/**\n * Convert ISO date strings on a wire-format span back to `Date` objects\n * so the render functions can call `.getTime()` etc.\n */\nfunction reviveSpanDates(span: TuttiSpan): TuttiSpan {\n return {\n ...span,\n started_at: new Date(span.started_at as unknown as string),\n ...(span.ended_at !== undefined\n ? { ended_at: new Date(span.ended_at as unknown as string) }\n : {}),\n };\n}\n","/**\n * Pure rendering functions for the `tutti-ai traces` command.\n *\n * Split from `traces.ts` so they stay in the coverage scope while the\n * HTTP fetching, SSE consumption, and signal handling stay excluded.\n */\n\nimport chalk from \"chalk\";\nimport type {\n SpanKind,\n SpanStatus,\n TraceSummary,\n TuttiSpan,\n} from \"@tuttiai/core\";\n\n/** Visible width of an ANSI-coloured string. */\nfunction visibleLen(s: string): number {\n // eslint-disable-next-line no-control-regex\n return s.replace(/\\u001b\\[[0-9;]*m/g, \"\").length;\n}\n\n/** Right-pad to `len` accounting for ANSI escape sequences. */\nfunction pad(s: string, len: number): string {\n const v = visibleLen(s);\n return v >= len ? s : s + \" \".repeat(len - v);\n}\n\nfunction colorStatus(status: SpanStatus): string {\n if (status === \"ok\") return chalk.green(\"ok\");\n if (status === \"error\") return chalk.red(\"error\");\n return chalk.yellow(\"running\");\n}\n\nfunction formatCost(cost: number | null): string {\n if (cost === null) return chalk.dim(\"—\");\n if (cost === 0) return \"$0\";\n // 6 decimals covers fractions of a cent on cheap models without\n // exploding the column width.\n return \"$\" + cost.toFixed(6);\n}\n\nfunction formatTokens(n: number): string {\n return n > 0 ? String(n) : chalk.dim(\"—\");\n}\n\nfunction formatDuration(ms: number | null): string {\n if (ms === null) return chalk.dim(\"—\");\n return ms + \"ms\";\n}\n\n/**\n * Render a list of trace summaries as a fixed-width table. Empty input\n * renders a friendly \"no traces\" message.\n *\n * Sort order is the caller's responsibility (server returns most-recent-\n * first); this function preserves the input order.\n */\nexport function renderTracesList(traces: readonly TraceSummary[]): string {\n if (traces.length === 0) {\n return chalk.dim(\"No traces found.\");\n }\n\n const lines: string[] = [];\n lines.push(\"\");\n lines.push(\n chalk.dim(\n \" \" +\n pad(\"TRACE\", 10) +\n pad(\"AGENT\", 18) +\n pad(\"STARTED\", 12) +\n pad(\"DURATION\", 12) +\n pad(\"STATUS\", 12) +\n pad(\"TOKENS\", 10) +\n \"COST\",\n ),\n );\n lines.push(chalk.dim(\" \" + \"─\".repeat(80)));\n\n for (const t of traces) {\n const traceShort = t.trace_id.slice(0, 8);\n // ISO format: 2026-04-15T12:34:56.789Z → take HH:MM:SS slice.\n const startedShort = t.started_at.slice(11, 19);\n\n lines.push(\n \" \" +\n chalk.bold(pad(traceShort, 10)) +\n pad(t.agent_id ?? chalk.dim(\"—\"), 18) +\n pad(startedShort, 12) +\n pad(formatDuration(t.duration_ms), 12) +\n pad(colorStatus(t.status), 12) +\n pad(formatTokens(t.total_tokens), 10) +\n formatCost(t.cost_usd),\n );\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n/** Single-character icon per span kind. */\nconst SPAN_ICONS: Record<SpanKind, string> = {\n agent: \"▶\",\n llm: \"◆\",\n tool: \"⚙\",\n guardrail: \"🛡\",\n checkpoint: \"💾\",\n};\n\n/**\n * Render a single span line. Exported so `traces tail` can reuse the same\n * formatting for individual spans arriving over SSE.\n */\nexport function renderSpanLine(span: TuttiSpan, indent: number): string {\n const icon = SPAN_ICONS[span.kind];\n const indentStr = \" \".repeat(indent);\n const dur =\n span.duration_ms !== undefined\n ? chalk.dim(\" \" + span.duration_ms + \"ms \")\n : chalk.dim(\" (running) \");\n const status = colorStatus(span.status);\n const attrs = formatAttrs(span);\n const attrSuffix = attrs ? chalk.dim(\" · \" + attrs) : \"\";\n return indentStr + icon + \" \" + chalk.bold(span.name) + dur + status + attrSuffix;\n}\n\nfunction formatAttrs(span: TuttiSpan): string {\n const a = span.attributes;\n const parts: string[] = [];\n if (span.kind === \"agent\") {\n if (a.agent_id !== undefined) parts.push(\"agent=\" + a.agent_id);\n if (a.model !== undefined) parts.push(\"model=\" + a.model);\n } else if (span.kind === \"llm\") {\n if (a.model !== undefined) parts.push(\"model=\" + a.model);\n if (a.total_tokens !== undefined) parts.push(a.total_tokens + \" tok\");\n if (a.cost_usd !== undefined) parts.push(formatCost(a.cost_usd));\n } else if (span.kind === \"tool\") {\n if (a.tool_name !== undefined) parts.push(a.tool_name);\n } else if (span.kind === \"guardrail\") {\n if (a.guardrail_name !== undefined) parts.push(a.guardrail_name);\n if (a.guardrail_action !== undefined) parts.push(\"→ \" + a.guardrail_action);\n } else if (span.kind === \"checkpoint\") {\n if (a.session_id !== undefined) parts.push(\"session=\" + a.session_id.slice(0, 8));\n }\n if (span.error?.message) {\n parts.push(chalk.red(\"error: \" + span.error.message));\n }\n return parts.join(\" · \");\n}\n\n/**\n * Render every span belonging to one trace as an indented tree, with a\n * summary footer (token total, cost, wall time of the root span).\n *\n * The caller is expected to have already filtered `spans` to a single\n * trace — usually the response of `GET /traces/:id`. Spans whose parent\n * is missing from the input become additional roots so partial fragments\n * left over from ring-buffer eviction still render.\n */\nexport function renderTraceShow(spans: readonly TuttiSpan[]): string {\n if (spans.length === 0) {\n return chalk.dim(\"No spans found for this trace.\");\n }\n\n const childrenByParent = new Map<string, TuttiSpan[]>();\n const presentSpanIds = new Set(spans.map((s) => s.span_id));\n const roots: TuttiSpan[] = [];\n\n for (const span of spans) {\n const parent = span.parent_span_id;\n if (parent === undefined || !presentSpanIds.has(parent)) {\n roots.push(span);\n continue;\n }\n const arr = childrenByParent.get(parent) ?? [];\n arr.push(span);\n childrenByParent.set(parent, arr);\n }\n\n // Stable child ordering: insertion order from the tracer is the natural\n // execution order, so use that. The .sort() call below for roots is\n // for the rare multi-root edge case (eviction).\n roots.sort((a, b) => a.started_at.getTime() - b.started_at.getTime());\n\n const lines: string[] = [\"\"];\n\n function walk(span: TuttiSpan, indent: number): void {\n lines.push(renderSpanLine(span, indent));\n const kids = childrenByParent.get(span.span_id);\n if (!kids) return;\n for (const child of kids) {\n walk(child, indent + 1);\n }\n }\n\n for (const root of roots) walk(root, 0);\n\n // Footer: aggregate from llm.completion spans + root span wall time.\n let total_tokens = 0;\n let total_cost = 0;\n let any_cost = false;\n for (const s of spans) {\n if (s.name !== \"llm.completion\") continue;\n total_tokens += s.attributes.total_tokens ?? 0;\n if (s.attributes.cost_usd !== undefined) {\n total_cost += s.attributes.cost_usd;\n any_cost = true;\n }\n }\n // Wall time = duration of the earliest top-level root that has one.\n const wall_ms = roots\n .map((r) => r.duration_ms)\n .find((d): d is number => d !== undefined);\n\n lines.push(\"\");\n lines.push(chalk.dim(\"─\".repeat(60)));\n lines.push(\n chalk.dim(\"Total: \") +\n chalk.bold(formatTokens(total_tokens)) +\n chalk.dim(\" tokens · \") +\n chalk.bold(any_cost ? formatCost(total_cost) : chalk.dim(\"—\")) +\n chalk.dim(\" cost · \") +\n chalk.bold(wall_ms !== undefined ? wall_ms + \"ms\" : chalk.dim(\"—\")) +\n chalk.dim(\" wall\"),\n );\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["createLogger","existsSync","resolve","chalk","createLogger","logger","createLogger","resolve","existsSync","chalk","existsSync","resolve","createInterface","chalk","ora","AnthropicProvider","GeminiProvider","OpenAIProvider","ScoreLoader","SecretsManager","TuttiRuntime","createLogger","logger","existsSync","resolve","chalk","ora","createLogger","logger","existsSync","resolve","chalk","ScoreLoader","AnthropicProvider","OpenAIProvider","GeminiProvider","SecretsManager","createLogger","logger","existsSync","resolve","chalk","TuttiRuntime","ScoreLoader","createLogger","logger","existsSync","readFileSync","resolve","chalk","ora","createLogger","logger","existsSync","readFileSync","resolve","execSync","chalk","ora","Enquirer","createLogger","SecretsManager","prompt","logger","fail","ok","existsSync","readFileSync","resolve","chalk","ora","ScoreLoader","createLogger","logger","existsSync","resolve","chalk","TuttiRuntime","ScoreLoader","AnthropicProvider","OpenAIProvider","GeminiProvider","SecretsManager","InMemorySessionStore","createLogger","logger","createLogger","resolve","existsSync","chalk","ScoreLoader","AnthropicProvider","OpenAIProvider","GeminiProvider","SecretsManager","InMemorySessionStore","buildRuntime","TuttiRuntime","existsSync","resolve","chalk","ScoreLoader","InMemorySessionStore","SecretsManager","createLogger","logger","execSync","existsSync","readFileSync","resolve","chalk","ora","updateSpinner","execSync","existsSync","readFileSync","resolve","chalk","ora","getLatestVersion","existsSync","readFileSync","resolve","chalk","ScoreLoader","createLogger","logger","pad","execSync","existsSync","readFileSync","resolve","chalk","ora","detectPackageManager","resolvePackageName","existsSync","resolve","createInterface","chalk","ora","ScoreLoader","TuttiRuntime","SecretsManager","createLogger","chalk","messageToText","excerpt","logger","createLogger","SecretsManager","chalk","ora","createInterface","prompt","resolve","existsSync","messageToText","ScoreLoader","TuttiRuntime","existsSync","resolve","chalk","ScoreLoader","SchedulerEngine","PostgresScheduleStore","MemoryScheduleStore","AgentRunner","EventBus","InMemorySessionStore","SecretsManager","createLogger","logger","resolveStore","pad","run","chalk","SecretsManager","chalk","pad","SecretsManager","chalk","logger","createLogger"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/templates/index.ts","../src/commands/run.ts","../src/watch/score-watcher.ts","../src/commands/resume.ts","../src/commands/add.ts","../src/commands/check.ts","../src/commands/studio.ts","../src/commands/search.ts","../src/commands/publish.ts","../src/commands/eval.ts","../src/commands/serve.ts","../src/commands/schedule.ts","../src/commands/update.ts","../src/commands/outdated.ts","../src/commands/info.ts","../src/commands/upgrade.ts","../src/commands/replay.ts","../src/commands/replay-render.ts","../src/commands/schedules.ts","../src/commands/traces.ts","../src/commands/traces-render.ts","../src/commands/memory.ts","../src/commands/memory-render.ts"],"sourcesContent":["import { config } from \"dotenv\";\nconfig();\n\nimport { createLogger } from \"@tuttiai/core\";\nconst logger = createLogger(\"tutti-cli\");\n\nprocess.on(\"unhandledRejection\", (reason) => {\n logger.error({ error: reason instanceof Error ? reason.message : String(reason) }, \"Unhandled rejection\");\n process.exit(1);\n});\n\nprocess.on(\"uncaughtException\", (err) => {\n logger.error({ error: err.message }, \"Fatal error\");\n process.exit(1);\n});\n\nimport { Command } from \"commander\";\nimport { initCommand, templatesCommand } from \"./commands/init.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { resumeCommand, type ResumeOptions } from \"./commands/resume.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { studioCommand } from \"./commands/studio.js\";\nimport { searchCommand, voicesCommand } from \"./commands/search.js\";\nimport { publishCommand } from \"./commands/publish.js\";\nimport { evalCommand } from \"./commands/eval.js\";\nimport { serveCommand, type ServeOptions } from \"./commands/serve.js\";\nimport { scheduleCommand } from \"./commands/schedule.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { outdatedCommand } from \"./commands/outdated.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { upgradeCommand } from \"./commands/upgrade.js\";\nimport { replayCommand } from \"./commands/replay.js\";\nimport {\n schedulesListCommand,\n schedulesEnableCommand,\n schedulesDisableCommand,\n schedulesTriggerCommand,\n schedulesRunsCommand,\n} from \"./commands/schedules.js\";\nimport {\n tracesListCommand,\n tracesShowCommand,\n tracesTailCommand,\n type TracesOptions,\n} from \"./commands/traces.js\";\nimport {\n memoryAddCommand,\n memoryClearCommand,\n memoryDeleteCommand,\n memoryExportCommand,\n memoryListCommand,\n memorySearchCommand,\n} from \"./commands/memory.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"tutti-ai\")\n .description(\"Tutti — multi-agent orchestration. All agents. All together.\")\n .version(\"0.13.0\");\n\nprogram\n .command(\"init [project-name]\")\n .description(\"Create a new Tutti project\")\n .option(\"-t, --template <id>\", \"Project template to use\")\n .action(async (projectName: string | undefined, opts: { template?: string }) => {\n await initCommand(projectName, opts.template);\n });\n\nprogram\n .command(\"templates\")\n .description(\"List all available project templates\")\n .action(() => {\n templatesCommand();\n });\n\nprogram\n .command(\"run [score]\")\n .description(\"Run a Tutti score interactively\")\n .option(\"-w, --watch\", \"Reload the score on file changes\")\n .action(async (score: string | undefined, opts: { watch?: boolean }) => {\n await runCommand(score, { watch: opts.watch });\n });\n\nprogram\n .command(\"serve [score]\")\n .description(\"Start the Tutti HTTP server\")\n .option(\"-p, --port <number>\", \"Port to listen on (default: 3847)\")\n .option(\"-H, --host <address>\", \"Host to bind to (default: 0.0.0.0)\")\n .option(\"-k, --api-key <key>\", \"API key for bearer auth (or set TUTTI_API_KEY)\")\n .option(\"-a, --agent <name>\", \"Agent to expose (default: score entry or first agent)\")\n .option(\"-w, --watch\", \"Reload the score on file changes\")\n .action(async (score: string | undefined, opts: ServeOptions) => {\n await serveCommand(score, opts);\n });\n\nprogram\n .command(\"resume <session-id>\")\n .description(\"Resume a crashed or interrupted run from its last checkpoint\")\n .option(\n \"--store <backend>\",\n \"Durable store the checkpoint was written to (redis | postgres)\",\n \"redis\",\n )\n .option(\"-s, --score <path>\", \"Path to score file (default: ./tutti.score.ts)\")\n .option(\"-a, --agent <name>\", \"Agent key to resume (default: score.entry or the first agent)\")\n .option(\"-y, --yes\", \"Skip the confirmation prompt\")\n .action(\n async (\n sessionId: string,\n opts: { store?: string; score?: string; agent?: string; yes?: boolean },\n ) => {\n if (opts.store !== \"redis\" && opts.store !== \"postgres\") {\n console.error(\"--store must be 'redis' or 'postgres'\");\n process.exit(1);\n }\n const resolved: ResumeOptions = {\n store: opts.store,\n ...(opts.score !== undefined ? { score: opts.score } : {}),\n ...(opts.agent !== undefined ? { agent: opts.agent } : {}),\n ...(opts.yes !== undefined ? { yes: opts.yes } : {}),\n };\n await resumeCommand(sessionId, resolved);\n },\n );\n\nprogram\n .command(\"add <voice>\")\n .description(\"Add a voice to your project\")\n .action((voice: string) => {\n addCommand(voice);\n });\n\nprogram\n .command(\"check [score]\")\n .description(\"Validate a score file without running it\")\n .action(async (score?: string) => {\n await checkCommand(score);\n });\n\nprogram\n .command(\"doctor [score]\")\n .description(\"Alias for check — validate a score file\")\n .action(async (score?: string) => {\n await checkCommand(score);\n });\n\nprogram\n .command(\"studio [score]\")\n .description(\"Launch Tutti Studio — local web UI for inspecting agent runs\")\n .action(async (score?: string) => {\n await studioCommand(score);\n });\n\nprogram\n .command(\"search <query>\")\n .description(\"Search the voice registry for voices matching a query\")\n .action(async (query: string) => {\n await searchCommand(query);\n });\n\nprogram\n .command(\"voices\")\n .description(\"List all available official voices and install status\")\n .action(async () => {\n await voicesCommand();\n });\n\nprogram\n .command(\"publish\")\n .description(\"Publish the current voice to npm and the voice registry\")\n .option(\"--dry-run\", \"Run all checks without publishing\")\n .action(async (opts: { dryRun?: boolean }) => {\n await publishCommand(opts);\n });\n\nprogram\n .command(\"eval <suite-file>\")\n .description(\"Run an evaluation suite against a score\")\n .option(\"--ci\", \"Exit with code 1 if any case fails\")\n .option(\"-s, --score <path>\", \"Path to score file (default: ./tutti.score.ts)\")\n .action(async (suitePath: string, opts: { ci?: boolean; score?: string }) => {\n await evalCommand(suitePath, opts);\n });\n\nprogram\n .command(\"update\")\n .description(\"Update @tuttiai packages to their latest versions\")\n .action(() => {\n updateCommand();\n });\n\nprogram\n .command(\"outdated\")\n .description(\"Check installed @tuttiai packages for newer versions\")\n .action(() => {\n outdatedCommand();\n });\n\nprogram\n .command(\"info [score]\")\n .description(\"Show project info — agents, voices, models, and package versions\")\n .action(async (score?: string) => {\n await infoCommand(score);\n });\n\nprogram\n .command(\"upgrade [voice]\")\n .description(\"Upgrade a specific voice or all @tuttiai packages to latest\")\n .action((voice?: string) => {\n upgradeCommand(voice);\n });\n\nprogram\n .command(\"replay <session-id>\")\n .description(\"Time-travel debugger — navigate and replay a session from PostgreSQL\")\n .option(\"-s, --score <path>\", \"Path to score file for replay-from (default: ./tutti.score.ts)\")\n .action(async (sessionId: string, opts: { score?: string }) => {\n await replayCommand(sessionId, { score: opts.score });\n });\n\nprogram\n .command(\"schedule [score]\")\n .description(\"Start the scheduler daemon — runs agents on their configured schedules\")\n .action(async (score?: string) => {\n await scheduleCommand(score);\n });\n\nconst schedulesCmd = program\n .command(\"schedules\")\n .description(\"Manage scheduled agents\");\n\nschedulesCmd\n .command(\"list\")\n .description(\"Show all registered schedules\")\n .action(async () => {\n await schedulesListCommand();\n });\n\nschedulesCmd\n .command(\"enable <id>\")\n .description(\"Enable a disabled schedule\")\n .action(async (id: string) => {\n await schedulesEnableCommand(id);\n });\n\nschedulesCmd\n .command(\"disable <id>\")\n .description(\"Disable a schedule without deleting it\")\n .action(async (id: string) => {\n await schedulesDisableCommand(id);\n });\n\nschedulesCmd\n .command(\"trigger <id>\")\n .description(\"Manually trigger a scheduled run immediately\")\n .option(\"-s, --score <path>\", \"Path to score file (default: ./tutti.score.ts)\")\n .action(async (id: string, opts: { score?: string }) => {\n await schedulesTriggerCommand(id, opts.score);\n });\n\nschedulesCmd\n .command(\"runs <id>\")\n .description(\"Show run history for a schedule (last 20 runs)\")\n .action(async (id: string) => {\n await schedulesRunsCommand(id);\n });\n\nconst tracesCmd = program\n .command(\"traces\")\n .description(\"Inspect spans emitted by a running tutti-ai serve process\");\n\ntracesCmd\n .command(\"list\")\n .description(\"Show the last 20 traces (most recent first)\")\n .option(\"-u, --url <url>\", \"Server URL (default: http://127.0.0.1:3847)\")\n .option(\"-k, --api-key <key>\", \"Bearer token (default: TUTTI_API_KEY env)\")\n .action(async (opts: { url?: string; apiKey?: string }) => {\n const resolved: TracesOptions = {\n ...(opts.url !== undefined ? { url: opts.url } : {}),\n ...(opts.apiKey !== undefined ? { apiKey: opts.apiKey } : {}),\n };\n await tracesListCommand(resolved);\n });\n\ntracesCmd\n .command(\"show <trace-id>\")\n .description(\"Render every span in a trace as an indented tree\")\n .option(\"-u, --url <url>\", \"Server URL (default: http://127.0.0.1:3847)\")\n .option(\"-k, --api-key <key>\", \"Bearer token (default: TUTTI_API_KEY env)\")\n .action(async (traceId: string, opts: { url?: string; apiKey?: string }) => {\n const resolved: TracesOptions = {\n ...(opts.url !== undefined ? { url: opts.url } : {}),\n ...(opts.apiKey !== undefined ? { apiKey: opts.apiKey } : {}),\n };\n await tracesShowCommand(traceId, resolved);\n });\n\ntracesCmd\n .command(\"tail\")\n .description(\"Live-tail spans as they are emitted (Ctrl+C to exit)\")\n .option(\"-u, --url <url>\", \"Server URL (default: http://127.0.0.1:3847)\")\n .option(\"-k, --api-key <key>\", \"Bearer token (default: TUTTI_API_KEY env)\")\n .action(async (opts: { url?: string; apiKey?: string }) => {\n const resolved: TracesOptions = {\n ...(opts.url !== undefined ? { url: opts.url } : {}),\n ...(opts.apiKey !== undefined ? { apiKey: opts.apiKey } : {}),\n };\n await tracesTailCommand(resolved);\n });\n\nconst memoryCmd = program\n .command(\"memory\")\n .description(\"Manage per-user memories (uses TUTTI_PG_URL like the runtime)\");\n\nmemoryCmd\n .command(\"list\")\n .description(\"Show every memory for a user, sorted by importance + recency\")\n .requiredOption(\"--user <user-id>\", \"End-user identifier\")\n .action(async (opts: { user: string }) => {\n await memoryListCommand({ user: opts.user });\n });\n\nmemoryCmd\n .command(\"search <query>\")\n .description(\"Search a user's memories by relevance\")\n .requiredOption(\"--user <user-id>\", \"End-user identifier\")\n .action(async (query: string, opts: { user: string }) => {\n await memorySearchCommand(query, { user: opts.user });\n });\n\nmemoryCmd\n .command(\"add <content>\")\n .description(\"Manually store a memory for a user\")\n .requiredOption(\"--user <user-id>\", \"End-user identifier\")\n .option(\"--importance <n>\", \"Importance: 1 (low), 2 (normal), 3 (high)\", \"2\")\n .action(async (content: string, opts: { user: string; importance?: string }) => {\n await memoryAddCommand(content, {\n user: opts.user,\n ...(opts.importance !== undefined ? { importance: opts.importance } : {}),\n });\n });\n\nmemoryCmd\n .command(\"delete <memory-id>\")\n .description(\"Delete a specific memory by id\")\n .requiredOption(\"--user <user-id>\", \"End-user identifier\")\n .action(async (memoryId: string, opts: { user: string }) => {\n await memoryDeleteCommand(memoryId, { user: opts.user });\n });\n\nmemoryCmd\n .command(\"clear\")\n .description(\"Delete every memory for a user (prompts for confirmation)\")\n .requiredOption(\"--user <user-id>\", \"End-user identifier\")\n .action(async (opts: { user: string }) => {\n await memoryClearCommand({ user: opts.user });\n });\n\nmemoryCmd\n .command(\"export\")\n .description(\"Export every memory for a user as JSON or CSV\")\n .requiredOption(\"--user <user-id>\", \"End-user identifier\")\n .option(\"--format <fmt>\", \"Output format: json | csv\", \"json\")\n .option(\"-o, --out <path>\", \"Write to file instead of stdout\")\n .action(async (opts: { user: string; format?: string; out?: string }) => {\n await memoryExportCommand({\n user: opts.user,\n ...(opts.format !== undefined ? { format: opts.format } : {}),\n ...(opts.out !== undefined ? { out: opts.out } : {}),\n });\n });\n\nprogram.parse();\n","import { mkdirSync, writeFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport Enquirer from \"enquirer\";\nimport { createLogger } from \"@tuttiai/core\";\nimport { TEMPLATES, getTemplate } from \"../templates/index.js\";\nimport type { Template } from \"../templates/index.js\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nconst { prompt } = Enquirer;\n\nexport async function initCommand(projectName?: string, templateId?: string): Promise<void> {\n if (!projectName) {\n const response = await prompt<{ projectName: string }>({\n type: \"input\",\n name: \"projectName\",\n message: \"Project name?\",\n });\n projectName = response.projectName;\n }\n\n if (!projectName) {\n logger.error(\"Project name is required\");\n process.exit(1);\n }\n\n const dir = join(process.cwd(), projectName);\n\n if (existsSync(dir)) {\n logger.error({ dir: `${projectName}/` }, \"Directory already exists\");\n process.exit(1);\n }\n\n // Resolve template\n let template: Template | undefined;\n if (templateId) {\n template = getTemplate(templateId);\n if (!template) {\n logger.error({ template: templateId }, \"Unknown template\");\n console.error(chalk.dim(\" Available: \" + TEMPLATES.map((t) => t.id).join(\", \")));\n process.exit(1);\n }\n } else {\n // Interactive picker\n const response = await prompt<{ templateId: string }>({\n type: \"select\",\n name: \"templateId\",\n message: \"Which template?\",\n choices: TEMPLATES.map((t) => ({\n name: t.id,\n message: t.name + chalk.dim(\" — \" + t.description),\n })),\n });\n template = getTemplate(response.templateId);\n if (!template) template = TEMPLATES[0];\n }\n\n mkdirSync(dir, { recursive: true });\n\n const deps: Record<string, string> = {\n \"@tuttiai/core\": \"*\",\n \"@tuttiai/types\": \"*\",\n ...template.deps,\n };\n\n const envLines = [\n \"ANTHROPIC_API_KEY=your_key_here\",\n ...template.envVars,\n \"\",\n \"# Log level: debug | info | warn | error (default: info)\",\n \"TUTTI_LOG_LEVEL=info\",\n \"\",\n \"# OpenTelemetry (optional)\",\n \"# OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318\",\n \"# OTEL_SERVICE_NAME=tutti\",\n ];\n\n const files: Record<string, string> = {\n \"package.json\": JSON.stringify(\n {\n name: projectName,\n version: \"0.0.1\",\n type: \"module\",\n scripts: {\n dev: \"tsx watch tutti.score.ts\",\n start: \"tsx tutti.score.ts\",\n },\n dependencies: deps,\n devDependencies: {\n tsx: \"^4.0.0\",\n typescript: \"^5.7.0\",\n },\n },\n null,\n 2,\n ),\n\n \".env.example\": envLines.join(\"\\n\") + \"\\n\",\n\n \".gitignore\": \"node_modules\\ndist\\n.env\\n\",\n\n \"tsconfig.json\": JSON.stringify(\n {\n compilerOptions: {\n strict: true,\n target: \"ES2022\",\n module: \"ES2022\",\n moduleResolution: \"bundler\",\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: \"dist\",\n rootDir: \".\",\n },\n include: [\".\"],\n },\n null,\n 2,\n ),\n\n \"tutti.score.ts\": template.score,\n\n \"README.md\": `# ${projectName}\n\nA Tutti agent project. All agents. All together.\n\n**Template:** ${template.name} — ${template.description}\n\n## Setup\n\n\\`\\`\\`bash\ncp .env.example .env\n# Add your API keys to .env\nnpm install\n\\`\\`\\`\n\n## Run\n\n\\`\\`\\`bash\nnpm run dev\n\\`\\`\\`\n`,\n };\n\n for (const [filename, content] of Object.entries(files)) {\n writeFileSync(join(dir, filename), content);\n }\n\n console.log();\n console.log(chalk.green(` ✔ Created ${projectName}/`) + chalk.dim(` (${template.name})`));\n console.log();\n console.log(\" Next steps:\");\n console.log(chalk.cyan(` cd ${projectName}`));\n console.log(chalk.cyan(\" cp .env.example .env\"));\n console.log(chalk.cyan(\" npm install\"));\n console.log(chalk.cyan(\" npm run dev\"));\n console.log();\n}\n\nexport function templatesCommand(): void {\n console.log();\n console.log(chalk.bold(\" Available Templates\"));\n console.log();\n for (const t of TEMPLATES) {\n console.log(\" \" + chalk.cyan(t.id.padEnd(18)) + t.description);\n }\n console.log();\n console.log(chalk.dim(\" Use: tutti-ai init my-project --template \" + TEMPLATES[0].id));\n console.log();\n}\n","export interface Template {\n id: string;\n name: string;\n description: string;\n deps: Record<string, string>;\n envVars: string[];\n score: string;\n}\n\nconst minimal: Template = {\n id: \"minimal\",\n name: \"Minimal\",\n description: \"One agent, no voices — the simplest starting point\",\n deps: {},\n envVars: [],\n score: `import { defineScore, AnthropicProvider } from \"@tuttiai/core\"\n\nexport default defineScore({\n provider: new AnthropicProvider(),\n default_model: \"claude-sonnet-4-20250514\",\n agents: {\n assistant: {\n name: \"Assistant\",\n system_prompt: \"You are a helpful assistant.\",\n voices: [],\n }\n }\n})\n`,\n};\n\nconst codingAgent: Template = {\n id: \"coding-agent\",\n name: \"Coding Agent\",\n description: \"TypeScript developer with filesystem + GitHub access\",\n deps: { \"@tuttiai/filesystem\": \"*\", \"@tuttiai/github\": \"*\" },\n envVars: [\"GITHUB_TOKEN=ghp_your_token_here\"],\n score: `import { defineScore, AnthropicProvider } from \"@tuttiai/core\"\nimport { FilesystemVoice } from \"@tuttiai/filesystem\"\nimport { GitHubVoice } from \"@tuttiai/github\"\n\nexport default defineScore({\n provider: new AnthropicProvider(),\n default_model: \"claude-sonnet-4-20250514\",\n agents: {\n coder: {\n name: \"Coder\",\n system_prompt:\n \"You are an expert TypeScript developer. \" +\n \"You read and write code using the filesystem voice, \" +\n \"and manage issues and PRs via the GitHub voice. \" +\n \"Write clean, tested, well-documented code.\",\n voices: [new FilesystemVoice(), new GitHubVoice()],\n permissions: [\"filesystem\", \"network\"],\n streaming: true,\n }\n }\n})\n`,\n};\n\nconst researchAgent: Template = {\n id: \"research-agent\",\n name: \"Research Agent\",\n description: \"Researcher that saves structured notes to files\",\n deps: { \"@tuttiai/filesystem\": \"*\" },\n envVars: [],\n score: `import { defineScore, AnthropicProvider } from \"@tuttiai/core\"\nimport { FilesystemVoice } from \"@tuttiai/filesystem\"\n\nexport default defineScore({\n provider: new AnthropicProvider(),\n default_model: \"claude-sonnet-4-20250514\",\n agents: {\n researcher: {\n name: \"Researcher\",\n system_prompt:\n \"You are an expert researcher. \" +\n \"Analyze topics thoroughly, cite sources, and save \" +\n \"structured notes as markdown files using the filesystem voice. \" +\n \"Organize findings with clear headings and bullet points.\",\n voices: [new FilesystemVoice()],\n permissions: [\"filesystem\"],\n streaming: true,\n }\n }\n})\n`,\n};\n\nconst qaPipeline: Template = {\n id: \"qa-pipeline\",\n name: \"QA Pipeline\",\n description: \"Orchestrator + QA specialist with browser testing and HITL\",\n deps: { \"@tuttiai/playwright\": \"*\" },\n envVars: [],\n score: `import { defineScore, AnthropicProvider } from \"@tuttiai/core\"\nimport { PlaywrightVoice } from \"@tuttiai/playwright\"\n\nexport default defineScore({\n provider: new AnthropicProvider(),\n default_model: \"claude-sonnet-4-20250514\",\n entry: \"orchestrator\",\n agents: {\n orchestrator: {\n name: \"QA Lead\",\n system_prompt:\n \"You are a QA lead. Triage incoming bugs by delegating \" +\n \"browser testing to the QA specialist. Use human-in-the-loop \" +\n \"to ask for approval before marking bugs as verified.\",\n voices: [],\n role: \"orchestrator\",\n delegates: [\"qa\"],\n allow_human_input: true,\n streaming: true,\n },\n qa: {\n name: \"QA Specialist\",\n system_prompt:\n \"You are a QA engineer. Navigate to URLs, check elements, \" +\n \"take screenshots, and verify bug reports using the browser.\",\n voices: [new PlaywrightVoice()],\n permissions: [\"network\", \"browser\"],\n role: \"specialist\",\n budget: { max_cost_usd: 0.50, warn_at_percent: 80 },\n streaming: true,\n }\n }\n})\n`,\n};\n\nconst devTeam: Template = {\n id: \"dev-team\",\n name: \"Dev Team\",\n description: \"Full team: orchestrator + coder + PM + QA with all voices\",\n deps: {\n \"@tuttiai/filesystem\": \"*\",\n \"@tuttiai/github\": \"*\",\n \"@tuttiai/playwright\": \"*\",\n },\n envVars: [\"GITHUB_TOKEN=ghp_your_token_here\"],\n score: `import { defineScore, AnthropicProvider, createLoggingHook, createBlocklistHook, createLogger } from \"@tuttiai/core\"\nimport { FilesystemVoice } from \"@tuttiai/filesystem\"\nimport { GitHubVoice } from \"@tuttiai/github\"\nimport { PlaywrightVoice } from \"@tuttiai/playwright\"\n\nconst logger = createLogger(\"dev-team\")\n\nexport default defineScore({\n provider: new AnthropicProvider(),\n default_model: \"claude-sonnet-4-20250514\",\n entry: \"orchestrator\",\n hooks: {\n ...createLoggingHook(logger),\n ...createBlocklistHook([\"delete_file\"]),\n },\n agents: {\n orchestrator: {\n name: \"Tech Lead\",\n system_prompt:\n \"You are the tech lead. Break tasks into subtasks and delegate: \" +\n \"code tasks to Coder, documentation to PM, testing to QA. \" +\n \"Review outputs before presenting to the user.\",\n voices: [],\n role: \"orchestrator\",\n delegates: [\"coder\", \"pm\", \"qa\"],\n allow_human_input: true,\n streaming: true,\n },\n coder: {\n name: \"Coder\",\n system_prompt:\n \"You are a senior TypeScript developer. Write clean, tested code. \" +\n \"Use the filesystem voice to read/write files and GitHub to manage PRs.\",\n voices: [new FilesystemVoice(), new GitHubVoice()],\n permissions: [\"filesystem\", \"network\"],\n role: \"specialist\",\n streaming: true,\n },\n pm: {\n name: \"PM\",\n system_prompt:\n \"You are a product manager. Write specs, update documentation, \" +\n \"and create GitHub issues for tracking. Focus on clarity and completeness.\",\n voices: [new FilesystemVoice(), new GitHubVoice()],\n permissions: [\"filesystem\", \"network\"],\n role: \"specialist\",\n streaming: true,\n },\n qa: {\n name: \"QA\",\n system_prompt:\n \"You are a QA engineer. Test features in the browser, verify bugs, \" +\n \"and write test reports. Screenshot evidence for every finding.\",\n voices: [new PlaywrightVoice()],\n permissions: [\"network\", \"browser\"],\n role: \"specialist\",\n budget: { max_cost_usd: 1.00 },\n streaming: true,\n }\n }\n})\n`,\n};\n\nexport const TEMPLATES: Template[] = [minimal, codingAgent, researchAgent, qaPipeline, devTeam];\n\nexport function getTemplate(id: string): Template | undefined {\n return TEMPLATES.find((t) => t.id === id);\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n TuttiRuntime,\n ScoreLoader,\n AnthropicProvider,\n OpenAIProvider,\n GeminiProvider,\n SecretsManager,\n InMemorySessionStore,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { ScoreConfig, SessionStore } from \"@tuttiai/types\";\nimport { ReactiveScore } from \"../watch/score-watcher.js\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nexport interface RunOptions {\n /** Reload the score on file changes. */\n watch?: boolean;\n}\n\nexport async function runCommand(\n scorePath?: string,\n options: RunOptions = {},\n): Promise<void> {\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n\n if (!existsSync(file)) {\n logger.error({ file }, \"Score file not found\");\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n let score;\n try {\n score = await ScoreLoader.load(file);\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Failed to load score\",\n );\n process.exit(1);\n }\n\n // Validate that the provider has a valid API key\n const providerKeyMap: [unknown, string][] = [\n [AnthropicProvider, \"ANTHROPIC_API_KEY\"],\n [OpenAIProvider, \"OPENAI_API_KEY\"],\n [GeminiProvider, \"GEMINI_API_KEY\"],\n ];\n\n for (const [ProviderClass, envVar] of providerKeyMap) {\n if (score.provider instanceof (ProviderClass as new (...args: unknown[]) => unknown)) {\n const key = SecretsManager.optional(envVar);\n if (!key) {\n logger.error({ envVar }, \"Missing API key\");\n process.exit(1);\n }\n }\n }\n\n // Enable streaming on every agent in the score. Factored out so we can\n // reapply it after a hot-reload in watch mode.\n const applyRunDefaults = (cfg: ScoreConfig): void => {\n for (const agent of Object.values(cfg.agents)) {\n agent.streaming = true;\n }\n };\n applyRunDefaults(score);\n\n // Build a single session store up front in watch mode so the\n // conversation history survives runtime swaps. Non-watch runs can let\n // TuttiRuntime provision its own store from score.memory as usual.\n const sharedSessions: SessionStore | undefined = options.watch\n ? new InMemorySessionStore()\n : undefined;\n\n const spinner = ora({ color: \"cyan\" });\n\n // REPL-level state. `streaming` resets per turn; `runtime` may be\n // swapped by the hot-reload path below.\n let streaming = false;\n let runtime = buildRuntime(score, sharedSessions);\n\n attachListeners(runtime);\n\n // REPL readline — created early so the HITL handler below can use it.\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n // Wire per-runtime listeners. Separated from the REPL so a hot-reload\n // can swap the runtime and re-wire without touching the outer loop.\n function attachListeners(r: TuttiRuntime): void {\n r.events.on(\"agent:start\", (e) => {\n logger.info({ agent: e.agent_name }, \"Running agent\");\n });\n\n r.events.on(\"llm:request\", () => {\n spinner.start(\"Thinking...\");\n });\n\n r.events.on(\"token:stream\", (e) => {\n if (!streaming) {\n spinner.stop();\n streaming = true;\n }\n process.stdout.write(e.text);\n });\n\n r.events.on(\"llm:response\", () => {\n if (streaming) {\n process.stdout.write(\"\\n\");\n } else {\n spinner.stop();\n }\n });\n\n r.events.on(\"tool:start\", (e) => {\n if (streaming) {\n process.stdout.write(chalk.dim(\"\\n [using: \" + e.tool_name + \"]\"));\n } else {\n spinner.stop();\n console.log(chalk.dim(\" [using: \" + e.tool_name + \"]\"));\n }\n });\n\n r.events.on(\"tool:end\", (e) => {\n if (streaming) {\n process.stdout.write(chalk.dim(\" [done: \" + e.tool_name + \"]\\n\"));\n }\n });\n\n r.events.on(\"tool:error\", (e) => {\n spinner.stop();\n logger.error({ tool: e.tool_name }, \"Tool error\");\n });\n\n r.events.on(\"security:injection_detected\", (e) => {\n logger.warn({ tool: e.tool_name }, \"Potential prompt injection detected\");\n });\n\n r.events.on(\"budget:warning\", () => {\n logger.warn(\"Approaching token budget (80%)\");\n });\n\n r.events.on(\"budget:exceeded\", () => {\n logger.error(\"Token budget exceeded — stopping\");\n });\n\n r.events.on(\"hitl:requested\", (e) => {\n spinner.stop();\n if (streaming) {\n process.stdout.write(\"\\n\");\n streaming = false;\n }\n console.log();\n console.log(\n chalk.yellow(\n \" \" + chalk.bold(\"[Agent needs input]\") + \" \" + e.question,\n ),\n );\n if (e.options) {\n e.options.forEach((opt, i) => {\n console.log(chalk.yellow(\" \" + (i + 1) + \". \" + opt));\n });\n }\n void rl.question(chalk.yellow(\" > \")).then((answer) => {\n runtime.answer(e.session_id, answer.trim());\n });\n });\n }\n\n // --- Watch mode wiring ---------------------------------------------------\n // Scope: set up a ReactiveScore that reloads the score file on change\n // and surfaces status to the REPL. The REPL checks `pendingReload`\n // between turns (so we never interrupt a mid-turn call) and swaps\n // `runtime` when appropriate.\n let reactive: ReactiveScore | undefined;\n if (options.watch) {\n reactive = new ReactiveScore(score, file);\n reactive.on(\"file-change\", () => {\n console.log(chalk.cyan(\"\\n[tutti] Score changed, reloading...\"));\n });\n reactive.on(\"reloaded\", () => {\n // Defer the actual swap to the next turn boundary — the REPL loop\n // checks `pendingReload` before each iteration. Applying mid-turn\n // would either interrupt a tool call or strand events listeners\n // pointing at the old runtime instance.\n console.log(chalk.green(\"[tutti] Score reloaded. Changes applied.\"));\n });\n reactive.on(\"reload-failed\", (err) => {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"[tutti] Reload failed — using previous config\",\n );\n });\n }\n\n // REPL\n console.log(chalk.dim('Tutti REPL — type \"exit\" to quit\\n'));\n if (options.watch) {\n console.log(chalk.dim(\"Watching \" + file + \" for changes…\\n\"));\n }\n\n let sessionId: string | undefined;\n\n // Handle Ctrl+C cleanly\n process.on(\"SIGINT\", () => {\n if (streaming) process.stdout.write(\"\\n\");\n spinner.stop();\n console.log(chalk.dim(\"Goodbye!\"));\n rl.close();\n if (reactive) void reactive.close();\n process.exit(0);\n });\n\n try {\n while (true) {\n // Apply any pending hot-reload before we start the next turn. This\n // is the \"don't interrupt mid-tool-call\" guarantee — we only swap\n // at a REPL-loop boundary, after the previous `run()` resolved.\n if (reactive?.pendingReload) {\n const nextScore = reactive.current;\n applyRunDefaults(nextScore);\n runtime = buildRuntime(nextScore, sharedSessions);\n attachListeners(runtime);\n reactive.consumePendingReload();\n }\n\n const input = await rl.question(chalk.cyan(\"> \"));\n const trimmed = input.trim();\n\n if (!trimmed) continue;\n if (trimmed === \"exit\" || trimmed === \"quit\") break;\n\n // Reset streaming state for this run\n streaming = false;\n\n try {\n const result = await runtime.run(\"assistant\", trimmed, sessionId);\n sessionId = result.session_id;\n\n if (!streaming) {\n console.log(\"\\n\" + result.output + \"\\n\");\n } else {\n console.log();\n }\n } catch (err) {\n if (streaming) process.stdout.write(\"\\n\");\n spinner.stop();\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Something went wrong\",\n );\n }\n }\n } catch {\n // readline closed\n }\n\n console.log(chalk.dim(\"Goodbye!\"));\n rl.close();\n if (reactive) await reactive.close();\n process.exit(0);\n}\n\nfunction buildRuntime(\n score: ScoreConfig,\n sessionStore: SessionStore | undefined,\n): TuttiRuntime {\n return new TuttiRuntime(\n score,\n sessionStore ? { sessionStore } : {},\n );\n}\n","import { dirname, resolve } from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport chokidar, { type FSWatcher } from \"chokidar\";\nimport type { ScoreConfig } from \"@tuttiai/types\";\nimport { validateScore } from \"@tuttiai/core\";\n\n/** How long to wait after the last change event before reloading. */\nconst DEFAULT_DEBOUNCE_MS = 200;\n\n/** Default ignore-patterns for the directory-tree watch. */\nconst DEFAULT_IGNORED = [\n /(^|[/\\\\])\\../, // dotfiles (.git, .env, etc.)\n /node_modules/,\n /[/\\\\]dist[/\\\\]/,\n /[/\\\\]coverage[/\\\\]/,\n];\n\n/**\n * Load a score module with ESM cache-busting. Node's ESM cache is per-URL\n * and cannot be invalidated, so we append a unique query parameter on\n * each reload to force a fresh module instance. The old instance stays in\n * memory — acceptable leak for a development-only watch loop.\n */\nasync function defaultLoadScore(path: string): Promise<ScoreConfig> {\n const absolute = resolve(path);\n // Node's ESM cache is per-URL and can't be invalidated — append a\n // unique query parameter so each reload gets a fresh module instance.\n // The previous instance stays in memory (small leak, acceptable for a\n // development-only watch loop).\n const { pathToFileURL } = await import(\"node:url\");\n const url = pathToFileURL(absolute).href + \"?t=\" + Date.now().toString(36);\n const mod = (await import(url)) as { default?: ScoreConfig };\n if (!mod.default) {\n throw new Error(\n \"Score file has no default export: \" + path +\n \" — your score must export `defineScore({ ... })` as its default.\",\n );\n }\n // Validate the freshly-loaded score. `ScoreLoader.load` would have run\n // the same validator but on a stale cache entry, so we inline it.\n validateScore(mod.default);\n return mod.default;\n}\n\nexport interface ReactiveScoreEvents {\n /** Emitted immediately when a watched file changes (before debounce settles). */\n \"file-change\": (changedPath: string) => void;\n /** Emitted when a reload attempt starts (after debounce). */\n reloading: () => void;\n /** Emitted when a reload succeeds — `current` now returns the new score. */\n reloaded: (score: ScoreConfig) => void;\n /**\n * Emitted when a reload fails. The previous `current` score is kept so\n * the REPL can continue with the last-known-good config.\n */\n \"reload-failed\": (error: Error) => void;\n}\n\nexport interface ReactiveScoreOptions {\n /**\n * Additional paths or glob patterns to watch beyond the score file and\n * its parent directory. Useful when voices live elsewhere.\n */\n extraPaths?: string[];\n /** Debounce window in ms. Default 200. */\n debounceMs?: number;\n /**\n * Override the score loader. Primarily a test seam — production code\n * uses the default cache-busting ESM importer.\n */\n load?: (path: string) => Promise<ScoreConfig>;\n}\n\n/**\n * A {@link ScoreConfig} that refreshes itself when the underlying file\n * (or any file in its directory) changes on disk.\n *\n * Consumers read `reactive.current` before each turn and get the most\n * recent successfully-loaded score. On a reload failure (syntax error in\n * the score file, schema validation, etc.), `current` keeps returning the\n * previous value — callers can listen for `reload-failed` to surface the\n * error in their UI.\n */\nexport class ReactiveScore extends EventEmitter {\n private _current: ScoreConfig;\n private readonly scorePath: string;\n private readonly load: (path: string) => Promise<ScoreConfig>;\n private readonly debounceMs: number;\n private readonly watcher: FSWatcher;\n private debounceTimer: ReturnType<typeof setTimeout> | undefined;\n private closed = false;\n private _pendingReload = false;\n\n constructor(\n initialScore: ScoreConfig,\n scorePath: string,\n options: ReactiveScoreOptions = {},\n ) {\n super();\n this._current = initialScore;\n this.scorePath = resolve(scorePath);\n this.load = options.load ?? defaultLoadScore;\n this.debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n\n // Watch the score file, its parent directory tree, and any extras.\n // Directory-tree watching catches voice files and local utility\n // modules without needing a proper import-graph resolver; the\n // trade-off is that unrelated files in the tree also trigger reloads.\n const watchTargets = [\n this.scorePath,\n dirname(this.scorePath),\n ...(options.extraPaths ?? []),\n ];\n this.watcher = chokidar.watch(watchTargets, {\n ignored: DEFAULT_IGNORED,\n ignoreInitial: true,\n // awaitWriteFinish: guard against partial writes from editors that\n // save atomically via rename/move.\n awaitWriteFinish: {\n stabilityThreshold: 50,\n pollInterval: 20,\n },\n });\n\n this.watcher.on(\"change\", (path) => this.handleChange(path));\n this.watcher.on(\"add\", (path) => this.handleChange(path));\n }\n\n /** The most recent successfully-loaded score. Never stale. */\n get current(): ScoreConfig {\n return this._current;\n }\n\n /**\n * True when a file change has been observed and a reload is pending\n * (or just completed and not yet consumed). Readers call\n * {@link consumePendingReload} to clear the flag when they've taken\n * action on the new config.\n */\n get pendingReload(): boolean {\n return this._pendingReload;\n }\n\n consumePendingReload(): void {\n this._pendingReload = false;\n }\n\n /** Release the underlying filesystem watchers. */\n async close(): Promise<void> {\n this.closed = true;\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n await this.watcher.close();\n }\n\n /**\n * Force an immediate reload without waiting for a filesystem event.\n * Exposed for tests and for the `reload` REPL command.\n */\n async reloadNow(): Promise<void> {\n if (this.closed) return;\n this.emit(\"reloading\");\n try {\n const next = await this.load(this.scorePath);\n this._current = next;\n this._pendingReload = true;\n this.emit(\"reloaded\", next);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.emit(\"reload-failed\", error);\n }\n }\n\n private handleChange(path: string): void {\n if (this.closed) return;\n this.emit(\"file-change\", path);\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n void this.reloadNow();\n }, this.debounceMs);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n AnthropicProvider,\n GeminiProvider,\n OpenAIProvider,\n ScoreLoader,\n SecretsManager,\n TuttiRuntime,\n createCheckpointStore,\n createLogger,\n type Checkpoint,\n type ChatMessage,\n} from \"@tuttiai/core\";\nconst logger = createLogger(\"tutti-cli\");\n\nexport interface ResumeOptions {\n /** Which durable store the checkpoint was written to. */\n store: \"redis\" | \"postgres\";\n /** Path to the score file (defaults to ./tutti.score.ts). */\n score?: string;\n /** Agent key to resume; defaults to the score's entry agent. */\n agent?: string;\n /** Skip the confirmation prompt — for scripted use. */\n yes?: boolean;\n}\n\nexport async function resumeCommand(\n sessionId: string,\n opts: ResumeOptions,\n): Promise<void> {\n // --- Score loading (same flow as `run`) -------------------------------\n const scoreFile = resolve(opts.score ?? \"./tutti.score.ts\");\n if (!existsSync(scoreFile)) {\n logger.error({ file: scoreFile }, \"Score file not found\");\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n let score;\n try {\n score = await ScoreLoader.load(scoreFile);\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Failed to load score\",\n );\n process.exit(1);\n }\n\n // --- Provider API-key check (same shortlist as `run`) -----------------\n const providerKeyMap: [unknown, string][] = [\n [AnthropicProvider, \"ANTHROPIC_API_KEY\"],\n [OpenAIProvider, \"OPENAI_API_KEY\"],\n [GeminiProvider, \"GEMINI_API_KEY\"],\n ];\n for (const [ProviderClass, envVar] of providerKeyMap) {\n if (\n score.provider instanceof\n (ProviderClass as new (...args: unknown[]) => unknown)\n ) {\n if (!SecretsManager.optional(envVar)) {\n logger.error({ envVar }, \"Missing API key\");\n process.exit(1);\n }\n }\n }\n\n // --- Resolve the target agent -----------------------------------------\n const agentName = resolveAgentName(score, opts.agent);\n const agentMap = new Map(Object.entries(score.agents));\n const agent = agentMap.get(agentName);\n if (!agent) {\n logger.error(\n { agent: agentName, available: Object.keys(score.agents) },\n \"Agent not found in score\",\n );\n process.exit(1);\n }\n if (!agent.durable) {\n console.error(\n chalk.yellow(\n \"Agent '\" +\n agentName +\n \"' does not have `durable: true` set — resume has nothing to restore.\",\n ),\n );\n console.error(\n chalk.dim(\n \"Enable durable checkpointing on the agent before the run that created this session.\",\n ),\n );\n process.exit(1);\n }\n\n // --- Load the checkpoint ----------------------------------------------\n const spinner = ora({ color: \"cyan\" }).start(\"Loading checkpoint...\");\n let checkpointStore;\n let checkpoint: Checkpoint | null;\n try {\n checkpointStore = createCheckpointStore({ store: opts.store });\n checkpoint = await checkpointStore.loadLatest(sessionId);\n } catch (err) {\n spinner.fail(\"Failed to load checkpoint\");\n logger.error(\n { error: err instanceof Error ? err.message : String(err), store: opts.store },\n \"Checkpoint store error\",\n );\n process.exit(1);\n }\n spinner.stop();\n\n if (!checkpoint) {\n console.error(\n chalk.red(\"No checkpoint found for session \" + sessionId + \".\"),\n );\n console.error(\n chalk.dim(\n \"Verify TUTTI_\" +\n (opts.store === \"redis\" ? \"REDIS\" : \"PG\") +\n \"_URL points to the same \" +\n opts.store +\n \" the original run used.\",\n ),\n );\n process.exit(1);\n }\n\n // --- Render the summary -----------------------------------------------\n printSummary(checkpoint);\n\n // --- Confirm (unless --yes) -------------------------------------------\n if (!opts.yes && !(await confirmResume(checkpoint.turn))) {\n console.log(chalk.dim(\"Cancelled.\"));\n process.exit(0);\n }\n\n // --- Build the runtime and hand off to AgentRunner --------------------\n const runtime = new TuttiRuntime(score, { checkpointStore });\n\n // Seed the session store with a synthetic Session so the runner's\n // `sessions.get(id)` lookup succeeds. The agent loop immediately\n // overwrites `messages` from the checkpoint — the seeded messages\n // array only exists so the initial get() call doesn't miss.\n const sessions = runtime.sessions;\n if (\"save\" in sessions && typeof sessions.save === \"function\") {\n (sessions.save as (s: { id: string; agent_name: string; messages: ChatMessage[]; created_at: Date; updated_at: Date }) => void)({\n id: sessionId,\n agent_name: agentName,\n messages: [...checkpoint.messages],\n created_at: checkpoint.saved_at,\n updated_at: new Date(),\n });\n } else {\n console.error(\n chalk.red(\n \"Session store does not support resume seeding. Use the default InMemorySessionStore or PostgresSessionStore.\",\n ),\n );\n process.exit(1);\n }\n\n wireProgress(runtime);\n\n try {\n // Input is ignored when the runner sees a mid-cycle checkpoint, but\n // we still need a non-empty value to satisfy the method signature.\n const result = await runtime.run(agentName, \"[resume]\", sessionId);\n console.log();\n console.log(chalk.green(\"✓ Resumed run complete.\"));\n console.log(chalk.dim(\" Final turn: \" + result.turns));\n console.log(chalk.dim(\" Session ID: \" + result.session_id));\n console.log(\n chalk.dim(\n \" Token usage: \" +\n result.usage.input_tokens +\n \" in / \" +\n result.usage.output_tokens +\n \" out\",\n ),\n );\n console.log();\n console.log(result.output);\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Resume failed\",\n );\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveAgentName(\n score: { entry?: string | { agents: string[] }; agents: Record<string, unknown> },\n override?: string,\n): string {\n if (override) return override;\n if (typeof score.entry === \"string\") return score.entry;\n const first = Object.keys(score.agents)[0];\n if (!first) {\n console.error(chalk.red(\"Score has no agents defined.\"));\n process.exit(1);\n }\n return first;\n}\n\nfunction printSummary(checkpoint: Checkpoint): void {\n console.log();\n console.log(chalk.cyan.bold(\"Checkpoint summary\"));\n console.log(\n chalk.dim(\" Session ID: \") + checkpoint.session_id,\n );\n console.log(\n chalk.dim(\" Last turn: \") + String(checkpoint.turn),\n );\n console.log(\n chalk.dim(\" Saved at: \") +\n checkpoint.saved_at.toISOString(),\n );\n console.log(\n chalk.dim(\" Messages: \") +\n String(checkpoint.messages.length) +\n \" total\",\n );\n console.log();\n console.log(chalk.cyan(\"First messages\"));\n const preview = checkpoint.messages.slice(0, 3);\n for (const msg of preview) {\n const text = excerpt(messageToText(msg), 200);\n console.log(chalk.dim(\" [\" + msg.role + \"] \") + text);\n }\n if (checkpoint.messages.length > preview.length) {\n console.log(\n chalk.dim(\n \" … \" +\n String(checkpoint.messages.length - preview.length) +\n \" more\",\n ),\n );\n }\n console.log();\n}\n\nfunction messageToText(msg: ChatMessage): string {\n if (typeof msg.content === \"string\") return msg.content;\n const parts: string[] = [];\n for (const block of msg.content) {\n if (block.type === \"text\") {\n parts.push(block.text);\n } else if (block.type === \"tool_use\") {\n parts.push(\"[tool_use \" + block.name + \"]\");\n } else if (block.type === \"tool_result\") {\n parts.push(\"[tool_result \" + excerpt(block.content, 80) + \"]\");\n }\n }\n return parts.join(\" \");\n}\n\nfunction excerpt(text: string, max: number): string {\n const oneLine = text.replace(/\\s+/g, \" \").trim();\n return oneLine.length > max ? oneLine.slice(0, max - 1) + \"…\" : oneLine;\n}\n\nasync function confirmResume(turn: number): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n try {\n const answer = (\n await rl.question(\n chalk.cyan(\"Resume from turn \" + turn + \"? \") + chalk.dim(\"(y/n) \"),\n )\n )\n .trim()\n .toLowerCase();\n return answer === \"y\" || answer === \"yes\";\n } finally {\n rl.close();\n }\n}\n\nfunction wireProgress(runtime: TuttiRuntime): void {\n const spinner = ora({ color: \"cyan\" });\n let streaming = false;\n\n runtime.events.on(\"checkpoint:restored\", (e) => {\n console.log(\n chalk.dim(\"↻ Restored from turn \" + e.turn) +\n chalk.dim(\" (session \" + e.session_id.slice(0, 8) + \"…)\"),\n );\n });\n runtime.events.on(\"checkpoint:saved\", (e) => {\n console.log(chalk.dim(\"· Checkpoint saved at turn \" + e.turn));\n });\n runtime.events.on(\"llm:request\", () => {\n spinner.start(\"Thinking...\");\n });\n runtime.events.on(\"token:stream\", (e) => {\n if (!streaming) {\n spinner.stop();\n streaming = true;\n }\n process.stdout.write(e.text);\n });\n runtime.events.on(\"llm:response\", () => {\n if (streaming) {\n process.stdout.write(\"\\n\");\n } else {\n spinner.stop();\n }\n });\n runtime.events.on(\"tool:start\", (e) => {\n if (streaming) {\n process.stdout.write(chalk.dim(\"\\n [using: \" + e.tool_name + \"]\"));\n } else {\n spinner.stop();\n console.log(chalk.dim(\" [using: \" + e.tool_name + \"]\"));\n }\n });\n runtime.events.on(\"tool:end\", (e) => {\n if (streaming) {\n process.stdout.write(chalk.dim(\" [done: \" + e.tool_name + \"]\\n\"));\n }\n });\n runtime.events.on(\"tool:error\", (e) => {\n spinner.stop();\n logger.error({ tool: e.tool_name }, \"Tool error\");\n });\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { createLogger } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nconst OFFICIAL_VOICES = new Map<string, { package: string; setup: string }>([\n [\"filesystem\", {\n package: \"@tuttiai/filesystem\",\n setup: ` Add to your score:\n ${chalk.cyan('import { FilesystemVoice } from \"@tuttiai/filesystem\"')}\n ${chalk.cyan(\"voices: [new FilesystemVoice()]\")}`,\n }],\n [\"github\", {\n package: \"@tuttiai/github\",\n setup: ` Add ${chalk.bold(\"GITHUB_TOKEN\")} to your .env file:\n ${chalk.cyan(\"GITHUB_TOKEN=ghp_your_token_here\")}\n\n Add to your score:\n ${chalk.cyan('import { GitHubVoice } from \"@tuttiai/github\"')}\n ${chalk.cyan(\"voices: [new GitHubVoice()]\")}`,\n }],\n [\"playwright\", {\n package: \"@tuttiai/playwright\",\n setup: ` Install the browser:\n ${chalk.cyan(\"npx playwright install chromium\")}\n\n Add to your score:\n ${chalk.cyan('import { PlaywrightVoice } from \"@tuttiai/playwright\"')}\n ${chalk.cyan(\"voices: [new PlaywrightVoice()]\")}`,\n }],\n [\"postgres\", {\n package: \"pg\",\n setup: ` Add ${chalk.bold(\"DATABASE_URL\")} to your .env file:\n ${chalk.cyan(\"DATABASE_URL=postgres://user:pass@localhost:5432/tutti\")}\n\n Add to your score:\n ${chalk.cyan(\"memory: { provider: 'postgres' }\")}\n\n Or with an explicit URL:\n ${chalk.cyan(\"memory: { provider: 'postgres', url: process.env.DATABASE_URL }\")}\n\n Use the async factory for initialization:\n ${chalk.cyan(\"const tutti = await TuttiRuntime.create(score)\")}`,\n }],\n]);\n\nfunction resolvePackageName(input: string): string {\n // Known official voice\n const voice = OFFICIAL_VOICES.get(input);\n if (voice) {\n return voice.package;\n }\n // Already a scoped package\n if (input.startsWith(\"@\")) {\n return input;\n }\n // Try @tuttiai/<name> convention\n return `@tuttiai/${input}`;\n}\n\nfunction isAlreadyInstalled(packageName: string): boolean {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) return false;\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n const deps: Record<string, string> = { ...pkg.dependencies, ...pkg.devDependencies };\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\nexport function addCommand(voiceName: string): void {\n const packageName = resolvePackageName(voiceName);\n\n // Check if package.json exists in cwd\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) {\n logger.error(\"No package.json found in the current directory\");\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project first.'));\n process.exit(1);\n }\n\n // Check if already installed\n if (isAlreadyInstalled(packageName)) {\n console.log(chalk.green(` ✔ ${packageName} is already installed`));\n return;\n }\n\n // Install\n const spinner = ora(`Installing ${packageName}...`).start();\n\n try {\n execSync(`npm install ${packageName}`, {\n cwd: process.cwd(),\n stdio: \"pipe\",\n });\n spinner.succeed(`Installed ${packageName}`);\n } catch (error) {\n spinner.fail(`Failed to install ${packageName}`);\n const message = error instanceof Error ? error.message : String(error);\n logger.error({ error: message, package: packageName }, \"Installation failed\");\n process.exit(1);\n }\n\n // Print setup instructions\n const official = OFFICIAL_VOICES.get(voiceName);\n if (official) {\n console.log();\n console.log(\" Setup:\");\n console.log(official.setup);\n console.log();\n } else {\n console.log();\n console.log(\n chalk.dim(\" Check the package README for setup instructions.\"),\n );\n console.log();\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport {\n ScoreLoader,\n AnthropicProvider,\n OpenAIProvider,\n GeminiProvider,\n SecretsManager,\n createLogger,\n} from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nconst ok = (msg: string): void => { console.log(chalk.green(\" \\u2714 \" + msg)); };\nconst fail = (msg: string): void => { console.log(chalk.red(\" \\u2718 \" + msg)); };\n\nexport async function checkCommand(scorePath?: string): Promise<void> {\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n\n console.log(chalk.cyan(`\\nChecking ${file}...\\n`));\n\n if (!existsSync(file)) {\n fail(\"Score file not found: \" + file);\n process.exit(1);\n }\n\n // 1. Load and validate\n let score;\n try {\n score = await ScoreLoader.load(file);\n ok(\"Score file is valid\");\n } catch (err) {\n fail(\"Score validation failed\");\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Score validation failed\",\n );\n process.exit(1);\n }\n\n let hasErrors = false;\n\n // 2. Check provider and API key\n const providerChecks: [unknown, string, string][] = [\n [AnthropicProvider, \"AnthropicProvider\", \"ANTHROPIC_API_KEY\"],\n [OpenAIProvider, \"OpenAIProvider\", \"OPENAI_API_KEY\"],\n [GeminiProvider, \"GeminiProvider\", \"GEMINI_API_KEY\"],\n ];\n\n let providerDetected = false;\n for (const [ProviderClass, name, envVar] of providerChecks) {\n if (\n score.provider instanceof\n (ProviderClass as new (...args: unknown[]) => unknown)\n ) {\n providerDetected = true;\n const key = SecretsManager.optional(envVar);\n if (key) {\n ok(\"Provider: \" + name + \" (\" + envVar + \" is set)\");\n } else {\n fail(\"Provider: \" + name + \" (\" + envVar + \" is NOT set)\");\n hasErrors = true;\n }\n }\n }\n\n if (!providerDetected) {\n ok(\"Provider: custom LLMProvider\");\n }\n\n // 3. Count agents\n const agentKeys = Object.keys(score.agents);\n ok(agentKeys.length + \" agent\" + (agentKeys.length === 1 ? \"\" : \"s\") + \" configured\");\n\n // 4. Check voices\n for (const [agentKey, agent] of Object.entries(score.agents)) {\n for (const voice of agent.voices) {\n const voiceName = voice.name;\n\n // Check for known voices and their env vars\n const voiceEnvMap = new Map<string, string>([\n [\"github\", \"GITHUB_TOKEN\"],\n ]);\n\n const envVar = voiceEnvMap.get(voiceName);\n if (envVar) {\n const key = SecretsManager.optional(envVar);\n if (key) {\n ok(\n \"Voice: \" + voiceName + \" on \" + agentKey + \" (\" + envVar + \" is set)\",\n );\n } else {\n fail(\n \"Voice: \" + voiceName + \" on \" + agentKey + \" (\" + envVar + \" is NOT set)\",\n );\n hasErrors = true;\n }\n } else {\n ok(\"Voice: \" + voiceName + \" on \" + agentKey + \" (installed)\");\n }\n }\n }\n\n // Final summary\n console.log(\"\");\n if (hasErrors) {\n console.log(\n chalk.yellow(\"Some checks failed. Fix the issues above and re-run.\"),\n );\n process.exit(1);\n } else {\n console.log(\n chalk.green(\"All checks passed.\") +\n chalk.dim(\" Run tutti-ai run to start.\"),\n );\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport express from \"express\";\nimport chalk from \"chalk\";\nimport {\n TuttiRuntime,\n ScoreLoader,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { Response as ExpressResponse } from \"express\";\n\nconst logger = createLogger(\"tutti-studio\");\nconst envPort = Number.parseInt(process.env.PORT ?? \"\", 10);\nconst PORT = Number.isInteger(envPort) && envPort > 0 && envPort <= 65535 ? envPort : 4747;\n\nfunction safeStringify(obj: unknown): string {\n return JSON.stringify(obj, (_key, value: unknown) => {\n if (value instanceof Error) return { message: value.message, name: value.name };\n if (typeof value === \"function\") return undefined;\n return value;\n });\n}\n\nfunction openBrowser(url: string): void {\n if (process.platform === \"win32\") {\n execFile(\"cmd.exe\", [\"/c\", \"start\", \"\", url]);\n return;\n }\n const cmd = process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\n execFile(cmd, [url]);\n}\n\nexport async function studioCommand(scorePath?: string): Promise<void> {\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n\n if (!existsSync(file)) {\n logger.error({ file }, \"Score file not found\");\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n let score;\n try {\n score = await ScoreLoader.load(file);\n } catch (err) {\n logger.error({ error: err instanceof Error ? err.message : String(err) }, \"Failed to load score\");\n process.exit(1);\n }\n\n const runtime = new TuttiRuntime(score);\n\n // Track sessions via events\n const sessionRegistry = new Map<string, { agent_name: string; created_at: Date }>();\n runtime.events.on(\"agent:start\", (e) => {\n if (!sessionRegistry.has(e.session_id)) {\n sessionRegistry.set(e.session_id, { agent_name: e.agent_name, created_at: new Date() });\n }\n });\n\n // SSE clients\n const sseClients = new Set<ExpressResponse>();\n runtime.events.onAny((event) => {\n const data = safeStringify(event);\n for (const client of sseClients) {\n client.write(\"event: tutti\\ndata: \" + data + \"\\n\\n\");\n }\n });\n\n // Express\n const app = express();\n app.use(express.json());\n\n // SSE endpoint\n app.get(\"/events\", (_req, res) => {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n res.write(\":\\n\\n\");\n sseClients.add(res);\n _req.on(\"close\", () => sseClients.delete(res));\n });\n\n // REST API\n app.get(\"/api/score\", (_req, res) => {\n const agents = Object.fromEntries(\n Object.entries(runtime.score.agents).map(([id, agent]) => [\n id,\n {\n name: agent.name,\n description: agent.description,\n model: agent.model,\n role: agent.role,\n delegates: agent.delegates,\n voice_count: agent.voices.length,\n voices: agent.voices.map((v) => v.name),\n },\n ]),\n );\n res.json({\n name: runtime.score.name,\n description: runtime.score.description,\n default_model: runtime.score.default_model,\n entry: runtime.score.entry,\n agents,\n });\n });\n\n app.get(\"/api/sessions\", (_req, res) => {\n const sessions = Array.from(sessionRegistry.entries()).map(([id, meta]) => {\n const session = runtime.getSession(id);\n return {\n id,\n agent_name: meta.agent_name,\n message_count: session?.messages.length ?? 0,\n created_at: meta.created_at,\n };\n });\n res.json(sessions.reverse());\n });\n\n app.get(\"/api/sessions/:id\", (req, res) => {\n const session = runtime.getSession(req.params.id);\n if (!session) {\n res.status(404).json({ error: \"Session not found\" });\n return;\n }\n res.json(session);\n });\n\n app.post(\"/api/run\", async (req, res) => {\n const body: unknown = req.body;\n if (typeof body !== \"object\" || body === null) {\n res.status(400).json({ error: \"Invalid request body\" });\n return;\n }\n const agent = (body as Record<string, unknown>).agent;\n const input = (body as Record<string, unknown>).input;\n const session_id = (body as Record<string, unknown>).session_id;\n if (typeof agent !== \"string\" || agent.trim().length === 0) {\n res.status(400).json({ error: \"agent must be a non-empty string\" });\n return;\n }\n if (typeof input !== \"string\" || input.trim().length === 0) {\n res.status(400).json({ error: \"input must be a non-empty string\" });\n return;\n }\n if (session_id !== undefined && (typeof session_id !== \"string\" || session_id.trim().length === 0)) {\n res.status(400).json({ error: \"session_id must be a non-empty string when provided\" });\n return;\n }\n try {\n const result = await runtime.run(agent, input, session_id);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: err instanceof Error ? err.message : String(err) });\n }\n });\n\n // Serve UI\n app.get(\"/\", (_req, res) => {\n res.type(\"html\").send(getStudioHtml());\n });\n\n app.listen(PORT, () => {\n const url = \"http://localhost:\" + PORT;\n console.log();\n console.log(chalk.bold(\" Tutti Studio\"));\n console.log(chalk.dim(\" \" + url));\n console.log();\n console.log(chalk.dim(\" Score: \") + (runtime.score.name ?? file));\n console.log(chalk.dim(\" Agents: \") + Object.keys(runtime.score.agents).join(\", \"));\n console.log();\n openBrowser(url);\n });\n\n process.on(\"SIGINT\", () => {\n console.log(chalk.dim(\"\\nShutting down Tutti Studio...\"));\n process.exit(0);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Inline HTML UI\n// ---------------------------------------------------------------------------\n\nfunction getStudioHtml(): string {\n return '<!DOCTYPE html>\\\n<html lang=\"en\">\\\n<head>\\\n<meta charset=\"utf-8\">\\\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\\\n<title>Tutti Studio</title>\\\n<style>\\\n*{margin:0;padding:0;box-sizing:border-box}\\\n:root{\\\n--bg:#0a0a0f;--panel:#12121a;--card:#1a1a26;--input:#0f0f17;\\\n--border:#2a2a3a;--text:#e2e8f0;--muted:#64748b;\\\n--purple:#8b5cf6;--teal:#14b8a6;--blue:#3b82f6;--green:#10b981;\\\n--red:#ef4444;--orange:#f97316;--amber:#f59e0b;--indigo:#6366f1;\\\n}\\\nhtml,body{height:100%;font-family:system-ui,-apple-system,sans-serif;background:var(--bg);color:var(--text);font-size:13px}\\\n#app{display:flex;flex-direction:column;height:100vh}\\\n\\\nheader{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;border-bottom:1px solid var(--border);background:var(--panel)}\\\nheader .logo{font-weight:700;font-size:15px;letter-spacing:.5px}\\\nheader .logo span{color:var(--purple)}\\\nheader .meta{color:var(--muted);font-size:12px}\\\nheader .status{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--muted)}\\\nheader .dot{width:7px;height:7px;border-radius:50%;background:var(--green)}\\\nheader .dot.off{background:var(--red)}\\\n\\\nmain{display:grid;grid-template-columns:260px 1fr 280px;flex:1;overflow:hidden;border-bottom:1px solid var(--border)}\\\n\\\n.panel{display:flex;flex-direction:column;border-right:1px solid var(--border);overflow:hidden}\\\n.panel:last-child{border-right:none}\\\n.panel-title{padding:10px 14px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.8px;color:var(--muted);border-bottom:1px solid var(--border);background:var(--panel);flex-shrink:0}\\\n.panel-body{flex:1;overflow-y:auto;padding:10px}\\\n.panel-body::-webkit-scrollbar{width:5px}\\\n.panel-body::-webkit-scrollbar-track{background:transparent}\\\n.panel-body::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}\\\n\\\n#graph-panel .panel-body{padding:0;display:flex;align-items:center;justify-content:center}\\\n#graph-panel svg text{font-family:system-ui,-apple-system,sans-serif}\\\n\\\n#events-panel{display:flex;flex-direction:column}\\\n#event-stream{flex:1;overflow-y:auto;padding:10px}\\\n#event-stream::-webkit-scrollbar{width:5px}\\\n#event-stream::-webkit-scrollbar-track{background:transparent}\\\n#event-stream::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}\\\n\\\n.ev{padding:7px 10px;margin-bottom:6px;border-radius:6px;background:var(--card);border-left:3px solid var(--muted);font-size:12px;line-height:1.5}\\\n.ev .ev-head{display:flex;justify-content:space-between;align-items:center}\\\n.ev .ev-type{font-weight:600;font-family:\"SF Mono\",Menlo,monospace;font-size:11px}\\\n.ev .ev-time{color:var(--muted);font-size:10px;font-family:\"SF Mono\",Menlo,monospace}\\\n.ev .ev-detail{color:var(--muted);margin-top:3px;font-size:11px;word-break:break-all}\\\n.ev.agent{border-left-color:var(--purple)}.ev.agent .ev-type{color:var(--purple)}\\\n.ev.turn{border-left-color:var(--blue)}.ev.turn .ev-type{color:var(--blue)}\\\n.ev.llm{border-left-color:var(--green)}.ev.llm .ev-type{color:var(--green)}\\\n.ev.tool{border-left-color:var(--teal)}.ev.tool .ev-type{color:var(--teal)}\\\n.ev.tool-error{border-left-color:var(--red)}.ev.tool-error .ev-type{color:var(--red)}\\\n.ev.security{border-left-color:var(--orange)}.ev.security .ev-type{color:var(--orange)}\\\n.ev.budget-warn{border-left-color:var(--amber)}.ev.budget-warn .ev-type{color:var(--amber)}\\\n.ev.budget-exceed{border-left-color:var(--red)}.ev.budget-exceed .ev-type{color:var(--red)}\\\n.ev.delegate{border-left-color:var(--indigo)}.ev.delegate .ev-type{color:var(--indigo)}\\\n\\\n#input-bar{display:flex;gap:8px;padding:10px 12px;border-top:1px solid var(--border);background:var(--panel);flex-shrink:0}\\\n#agent-select{background:var(--input);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:6px 10px;font-size:12px;outline:none;cursor:pointer;min-width:110px}\\\n#user-input{flex:1;background:var(--input);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:6px 12px;font-size:13px;outline:none}\\\n#user-input:focus{border-color:var(--purple)}\\\n#send-btn{background:var(--purple);color:#fff;border:none;border-radius:6px;padding:6px 16px;font-size:12px;font-weight:600;cursor:pointer;white-space:nowrap}\\\n#send-btn:hover{opacity:.9}\\\n#send-btn:disabled{opacity:.4;cursor:default}\\\n\\\n.session-item{padding:8px 10px;margin-bottom:4px;border-radius:6px;background:var(--card);cursor:pointer;transition:background .15s}\\\n.session-item:hover{background:#22223a}\\\n.session-item.active{background:#22223a;border:1px solid var(--purple)}\\\n.session-id{font-family:\"SF Mono\",Menlo,monospace;font-size:11px;color:var(--purple)}\\\n.session-meta{font-size:11px;color:var(--muted);margin-top:2px}\\\n\\\n#session-detail{margin-top:10px;border-top:1px solid var(--border);padding-top:10px}\\\n.msg{padding:6px 8px;margin-bottom:4px;border-radius:5px;font-size:12px;line-height:1.5;word-break:break-word}\\\n.msg.user{background:#1c1c3a;border-left:2px solid var(--blue)}\\\n.msg.assistant{background:#1a2a1a;border-left:2px solid var(--green)}\\\n.msg .msg-role{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-bottom:2px}\\\n.msg.user .msg-role{color:var(--blue)}\\\n.msg.assistant .msg-role{color:var(--green)}\\\n\\\nfooter{display:flex;align-items:center;gap:32px;padding:8px 20px;background:var(--panel);font-size:12px}\\\n.token-item{display:flex;align-items:center;gap:6px}\\\n.token-label{color:var(--muted)}\\\n.token-val{font-family:\"SF Mono\",Menlo,monospace;font-weight:600}\\\n.token-val.input{color:var(--blue)}\\\n.token-val.output{color:var(--green)}\\\n.token-val.cost{color:var(--amber)}\\\n\\\n.empty{color:var(--muted);text-align:center;padding:30px 10px;font-size:12px}\\\n</style>\\\n</head>\\\n<body>\\\n<div id=\"app\">\\\n\\\n<header>\\\n <div class=\"logo\"><span>♫</span> Tutti Studio</div>\\\n <div class=\"meta\" id=\"score-name\"></div>\\\n <div class=\"status\"><div class=\"dot\" id=\"sse-dot\"></div><span id=\"sse-label\">connecting</span></div>\\\n</header>\\\n\\\n<main>\\\n <div class=\"panel\" id=\"graph-panel\">\\\n <div class=\"panel-title\">Agent Graph</div>\\\n <div class=\"panel-body\" id=\"graph-body\"></div>\\\n </div>\\\n\\\n <div class=\"panel\" id=\"events-panel\">\\\n <div class=\"panel-title\">Live Event Stream</div>\\\n <div id=\"event-stream\"><div class=\"empty\">Waiting for events…<br>Send a message below to start an agent run.</div></div>\\\n <div id=\"input-bar\">\\\n <select id=\"agent-select\"></select>\\\n <input id=\"user-input\" placeholder=\"Type a message…\" autocomplete=\"off\">\\\n <button id=\"send-btn\">Send</button>\\\n </div>\\\n </div>\\\n\\\n <div class=\"panel\" id=\"sessions-panel\">\\\n <div class=\"panel-title\">Sessions</div>\\\n <div class=\"panel-body\" id=\"sessions-body\"><div class=\"empty\">No sessions yet</div></div>\\\n </div>\\\n</main>\\\n\\\n<footer>\\\n <div class=\"token-item\"><span class=\"token-label\">↓ Input</span><span class=\"token-val input\" id=\"tok-in\">0</span></div>\\\n <div class=\"token-item\"><span class=\"token-label\">↑ Output</span><span class=\"token-val output\" id=\"tok-out\">0</span></div>\\\n <div class=\"token-item\"><span class=\"token-label\">$ Est. cost</span><span class=\"token-val cost\" id=\"tok-cost\">0.0000</span></div>\\\n</footer>\\\n\\\n</div>\\\n\\\n<script>\\\n(function(){\\\n\\\nvar tokIn=0,tokOut=0;\\\nvar sessionMap={};\\\nvar activeSession=null;\\\n\\\n/* ---- helpers ---- */\\\nfunction esc(s){var d=document.createElement(\"div\");d.textContent=s;return d.innerHTML}\\\nfunction fmt(n){return n.toLocaleString()}\\\nfunction timeStr(){var d=new Date();return (\"0\"+d.getHours()).slice(-2)+\":\"+(\"0\"+d.getMinutes()).slice(-2)+\":\"+(\"0\"+d.getSeconds()).slice(-2)}\\\nfunction truncId(id){return id.slice(0,8)}\\\n\\\n/* ---- score + graph ---- */\\\nfunction loadScore(){\\\n fetch(\"/api/score\").then(function(r){return r.json()}).then(function(s){\\\n document.getElementById(\"score-name\").textContent=s.name||\"tutti.score.ts\";\\\n var sel=document.getElementById(\"agent-select\");\\\n sel.innerHTML=\"\";\\\n Object.keys(s.agents).forEach(function(id){\\\n var o=document.createElement(\"option\");o.value=id;o.textContent=s.agents[id].name;sel.appendChild(o);\\\n });\\\n renderGraph(s);\\\n });\\\n}\\\n\\\nfunction renderGraph(score){\\\n var body=document.getElementById(\"graph-body\");\\\n var W=260,ids=Object.keys(score.agents),N=ids.length;\\\n if(N===0){body.innerHTML=\"<div class=\\\\\"empty\\\\\">No agents</div>\";return}\\\n var hasDelegate=false;\\\n ids.forEach(function(id){if(score.agents[id].delegates&&score.agents[id].delegates.length)hasDelegate=true});\\\n var nodeR=26,padY=90,padTop=50;\\\n var leftIds=[],rightIds=[];\\\n if(hasDelegate){\\\n ids.forEach(function(id){var a=score.agents[id];if(a.delegates&&a.delegates.length)leftIds.push(id);else rightIds.push(id)});\\\n }else{leftIds=ids}\\\n var cols=hasDelegate?2:1;\\\n var cx1=cols===1?W/2:72,cx2=W-72;\\\n var H=Math.max(leftIds.length,rightIds.length)*padY+padTop*2;\\\n if(H<200)H=200;\\\n var pos={};\\\n var svg=\\'<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"\\'+W+\\'\" height=\"\\'+H+\\'\" viewBox=\"0 0 \\'+W+\" \"+H+\\'\">\\';\\\n svg+=\\'<defs><marker id=\"ah\" viewBox=\"0 0 10 10\" refX=\"10\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto\"><path d=\"M0 0L10 5L0 10z\" fill=\"#64748b\"/></marker></defs>\\';\\\n function drawNode(id,cx,cy){\\\n var a=score.agents[id];\\\n var col=a.role===\"orchestrator\"?\"#8b5cf6\":\"#14b8a6\";\\\n pos[id]={x:cx,y:cy};\\\n svg+=\\'<circle cx=\"\\'+cx+\\'\" cy=\"\\'+cy+\\'\" r=\"\\'+nodeR+\\'\" fill=\"\\'+col+\\'\" fill-opacity=\"0.15\" stroke=\"\\'+col+\\'\" stroke-width=\"2\"/>\\';\\\n svg+=\\'<text x=\"\\'+cx+\\'\" y=\"\\'+(cy+4)+\\'\" text-anchor=\"middle\" fill=\"#e2e8f0\" font-size=\"10\" font-weight=\"600\">\\'+esc(a.name)+\\'</text>\\';\\\n var model=a.model||score.default_model||\"\";\\\n if(model){var sh=model.replace(/-\\\\d{8}$/,\"\");if(sh.length>18)sh=sh.slice(0,18)+\"\\\\u2026\";svg+=\\'<text x=\"\\'+cx+\\'\" y=\"\\'+(cy+nodeR+14)+\\'\" text-anchor=\"middle\" fill=\"#64748b\" font-size=\"9\">\\'+esc(sh)+\\'</text>\\'}\\\n svg+=\\'<text x=\"\\'+cx+\\'\" y=\"\\'+(cy+nodeR+26)+\\'\" text-anchor=\"middle\" fill=\"#64748b\" font-size=\"9\">\\'+a.voice_count+\" voice\"+(a.voice_count!==1?\"s\":\"\")+\\'</text>\\';\\\n }\\\n leftIds.forEach(function(id,i){drawNode(id,cx1,padTop+i*padY)});\\\n rightIds.forEach(function(id,i){drawNode(id,cx2,padTop+i*padY)});\\\n ids.forEach(function(id){\\\n var a=score.agents[id];\\\n if(a.delegates)a.delegates.forEach(function(did){\\\n if(pos[id]&&pos[did]){\\\n var x1=pos[id].x+nodeR,y1=pos[id].y,x2=pos[did].x-nodeR,y2=pos[did].y;\\\n var mx=(x1+x2)/2;\\\n svg+=\\'<path d=\"M\\'+x1+\" \"+y1+\" C\"+mx+\" \"+y1+\" \"+mx+\" \"+y2+\" \"+x2+\" \"+y2+\\'\" fill=\"none\" stroke=\"#64748b\" stroke-width=\"1.5\" stroke-dasharray=\"4 3\" marker-end=\"url(#ah)\"/>\\';\\\n }\\\n });\\\n });\\\n svg+=\"</svg>\";\\\n body.innerHTML=svg;\\\n}\\\n\\\n/* ---- SSE ---- */\\\nfunction connectSSE(){\\\n var es=new EventSource(\"/events\");\\\n es.addEventListener(\"tutti\",function(e){\\\n var ev=JSON.parse(e.data);\\\n addEvent(ev);\\\n if(ev.type===\"llm:response\"&&ev.response&&ev.response.usage){\\\n tokIn+=ev.response.usage.input_tokens||0;\\\n tokOut+=ev.response.usage.output_tokens||0;\\\n document.getElementById(\"tok-in\").textContent=fmt(tokIn);\\\n document.getElementById(\"tok-out\").textContent=fmt(tokOut);\\\n document.getElementById(\"tok-cost\").textContent=estimateCost(tokIn,tokOut);\\\n }\\\n if(ev.type===\"agent:start\"||ev.type===\"agent:end\")refreshSessions();\\\n });\\\n es.onopen=function(){document.getElementById(\"sse-dot\").className=\"dot\";document.getElementById(\"sse-label\").textContent=\"connected\"};\\\n es.onerror=function(){document.getElementById(\"sse-dot\").className=\"dot off\";document.getElementById(\"sse-label\").textContent=\"disconnected\"};\\\n}\\\n\\\n/* Pricing: USD per 1M tokens (Sonnet-class default) */\\\nvar INPUT_PRICE_PER_MILLION=3;\\\nvar OUTPUT_PRICE_PER_MILLION=15;\\\nfunction estimateCost(inp,out){\\\n var c=(inp/1e6)*INPUT_PRICE_PER_MILLION+(out/1e6)*OUTPUT_PRICE_PER_MILLION;\\\n return c.toFixed(4);\\\n}\\\n\\\nfunction evClass(t){\\\n if(t.indexOf(\"agent\")===0)return \"agent\";\\\n if(t.indexOf(\"turn\")===0)return \"turn\";\\\n if(t===\"llm:request\"||t===\"llm:response\")return \"llm\";\\\n if(t===\"tool:error\")return \"tool-error\";\\\n if(t.indexOf(\"tool\")===0)return \"tool\";\\\n if(t.indexOf(\"security\")===0)return \"security\";\\\n if(t===\"budget:warning\")return \"budget-warn\";\\\n if(t===\"budget:exceeded\")return \"budget-exceed\";\\\n if(t.indexOf(\"delegate\")===0)return \"delegate\";\\\n return \"\";\\\n}\\\n\\\nfunction evDetail(ev){\\\n var parts=[];\\\n if(ev.agent_name)parts.push(\"agent: \"+ev.agent_name);\\\n if(ev.session_id)parts.push(\"session: \"+truncId(ev.session_id));\\\n if(ev.turn!==undefined)parts.push(\"turn: \"+ev.turn);\\\n if(ev.tool_name)parts.push(\"tool: \"+ev.tool_name);\\\n if(ev.from)parts.push(\"from: \"+ev.from);\\\n if(ev.to)parts.push(\"to: \"+ev.to);\\\n if(ev.tokens!==undefined)parts.push(\"tokens: \"+fmt(ev.tokens));\\\n if(ev.cost_usd!==undefined)parts.push(\"cost: $\"+ev.cost_usd.toFixed(4));\\\n if(ev.response&&ev.response.usage)parts.push(\"tokens: \"+fmt(ev.response.usage.input_tokens)+\" in / \"+fmt(ev.response.usage.output_tokens)+\" out\");\\\n if(ev.error){var em=typeof ev.error===\"object\"?ev.error.message||\"\":ev.error;if(em)parts.push(\"error: \"+em)}\\\n if(ev.patterns)parts.push(\"patterns: \"+ev.patterns.join(\", \"));\\\n return parts.join(\" · \");\\\n}\\\n\\\nvar firstEvent=true;\\\nfunction addEvent(ev){\\\n var stream=document.getElementById(\"event-stream\");\\\n if(firstEvent){stream.innerHTML=\"\";firstEvent=false}\\\n var div=document.createElement(\"div\");\\\n div.className=\"ev \"+evClass(ev.type);\\\n div.innerHTML=\\'<div class=\"ev-head\"><span class=\"ev-type\">\\'+esc(ev.type)+\\'</span><span class=\"ev-time\">\\'+timeStr()+\\'</span></div>\\';\\\n var det=evDetail(ev);\\\n if(det)div.innerHTML+=\\'<div class=\"ev-detail\">\\'+det+\"</div>\";\\\n stream.appendChild(div);\\\n stream.scrollTop=stream.scrollHeight;\\\n}\\\n\\\n/* ---- sessions ---- */\\\nfunction refreshSessions(){\\\n fetch(\"/api/sessions\").then(function(r){return r.json()}).then(function(list){\\\n var body=document.getElementById(\"sessions-body\");\\\n if(!list.length){body.innerHTML=\\'<div class=\"empty\">No sessions yet</div>\\';return}\\\n var html=\"\";\\\n list.forEach(function(s){\\\n var cls=\"session-item\"+(activeSession===s.id?\" active\":\"\");\\\n html+=\\'<div class=\"\\'+cls+\\'\" data-id=\"\\'+s.id+\\'\">\\';\\\n html+=\\'<div class=\"session-id\">\\'+truncId(s.id)+\"</div>\";\\\n html+=\\'<div class=\"session-meta\">\\'+esc(s.agent_name)+\" · \"+s.message_count+\" msgs</div>\";\\\n html+=\"</div>\";\\\n });\\\n if(activeSession)html+=\\'<div id=\"session-detail\"></div>\\';\\\n body.innerHTML=html;\\\n body.querySelectorAll(\".session-item\").forEach(function(el){\\\n el.addEventListener(\"click\",function(){selectSession(el.getAttribute(\"data-id\"))});\\\n });\\\n if(activeSession)loadSessionDetail(activeSession);\\\n });\\\n}\\\n\\\nfunction selectSession(id){\\\n activeSession=activeSession===id?null:id;\\\n refreshSessions();\\\n}\\\n\\\nfunction loadSessionDetail(id){\\\n var det=document.getElementById(\"session-detail\");\\\n if(!det)return;\\\n fetch(\"/api/sessions/\"+id).then(function(r){return r.json()}).then(function(session){\\\n if(!session||session.error){det.innerHTML=\\'<div class=\"empty\">Session not found</div>\\';return}\\\n var html=\"\";\\\n (session.messages||[]).forEach(function(m){\\\n var role=m.role;\\\n var text=\"\";\\\n if(typeof m.content===\"string\")text=m.content;\\\n else if(Array.isArray(m.content)){\\\n m.content.forEach(function(b){\\\n if(b.type===\"text\")text+=b.text+\"\\\\n\";\\\n else if(b.type===\"tool_use\")text+=\"[tool_use: \"+b.name+\"]\\\\n\";\\\n else if(b.type===\"tool_result\")text+=\"[tool_result]\\\\n\";\\\n });\\\n }\\\n html+=\\'<div class=\"msg \\'+role+\\'\"><div class=\"msg-role\">\\'+role+\"</div>\"+esc(text.trim())+\"</div>\";\\\n });\\\n det.innerHTML=html;\\\n });\\\n}\\\n\\\n/* ---- send ---- */\\\nfunction sendMessage(){\\\n var agentSel=document.getElementById(\"agent-select\");\\\n var inputEl=document.getElementById(\"user-input\");\\\n var btn=document.getElementById(\"send-btn\");\\\n var agent=agentSel.value;\\\n var input=inputEl.value.trim();\\\n if(!input)return;\\\n btn.disabled=true;btn.textContent=\"Running\\\\u2026\";\\\n inputEl.value=\"\";\\\n var sid=sessionMap[agent]||undefined;\\\n fetch(\"/api/run\",{method:\"POST\",headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify({agent:agent,input:input,session_id:sid})})\\\n .then(function(r){return r.json()})\\\n .then(function(result){\\\n if(result.session_id)sessionMap[agent]=result.session_id;\\\n if(result.output){\\\n addEvent({type:\"__output\",agent_name:agent,output:result.output});\\\n }\\\n refreshSessions();\\\n })\\\n .catch(function(err){addEvent({type:\"__error\",error:err.message||String(err)})})\\\n .finally(function(){btn.disabled=false;btn.textContent=\"Send\"});\\\n}\\\n\\\ndocument.getElementById(\"send-btn\").addEventListener(\"click\",sendMessage);\\\ndocument.getElementById(\"user-input\").addEventListener(\"keydown\",function(e){if(e.key===\"Enter\"&&!e.shiftKey){e.preventDefault();sendMessage()}});\\\n\\\n/* ---- init ---- */\\\nloadScore();\\\nconnectSSE();\\\n\\\n})();\\\n</script>\\\n</body>\\\n</html>';\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { createLogger } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nconst REGISTRY_URL =\n \"https://raw.githubusercontent.com/tuttiai/voices/main/voices.json\";\n\ninterface VoiceEntry {\n name: string;\n package: string;\n description: string;\n tags: string[];\n official: boolean;\n tools: number;\n}\n\n// Built-in fallback when the remote registry is unreachable\nconst BUILTIN_VOICES: VoiceEntry[] = [\n {\n name: \"filesystem\",\n package: \"@tuttiai/filesystem\",\n description: \"Read, write, search, and manage files and directories\",\n tags: [\"filesystem\", \"files\", \"io\", \"read\", \"write\"],\n official: true,\n tools: 7,\n },\n {\n name: \"github\",\n package: \"@tuttiai/github\",\n description: \"Interact with GitHub repos, issues, PRs, and code search\",\n tags: [\"github\", \"git\", \"code\", \"issues\", \"pull-requests\", \"api\"],\n official: true,\n tools: 10,\n },\n {\n name: \"playwright\",\n package: \"@tuttiai/playwright\",\n description: \"Control a browser like a human — navigate, click, type, screenshot\",\n tags: [\"browser\", \"playwright\", \"web\", \"qa\", \"testing\", \"automation\", \"scraping\"],\n official: true,\n tools: 12,\n },\n {\n name: \"postgres\",\n package: \"pg\",\n description: \"PostgreSQL session persistence and database access\",\n tags: [\"database\", \"postgres\", \"sql\", \"persistence\", \"sessions\"],\n official: true,\n tools: 0,\n },\n];\n\ninterface RegistryEntry {\n name: string;\n package: string;\n description: string;\n tags: string[];\n}\n\nasync function fetchRegistry(): Promise<VoiceEntry[]> {\n try {\n const res = await fetch(REGISTRY_URL);\n if (!res.ok) throw new Error(\"HTTP \" + res.status);\n const data = (await res.json()) as { official?: RegistryEntry[]; community?: RegistryEntry[] };\n\n const voices: VoiceEntry[] = [];\n for (const entry of data.official ?? []) {\n voices.push({ ...entry, official: true, tools: toolCount(entry.name) });\n }\n for (const entry of data.community ?? []) {\n voices.push({ ...entry, official: false, tools: 0 });\n }\n if (voices.length === 0) throw new Error(\"Empty registry\");\n return voices;\n } catch {\n logger.debug(\"Registry unreachable, using built-in voice list\");\n return BUILTIN_VOICES;\n }\n}\n\nfunction toolCount(name: string): number {\n const counts = new Map<string, number>([[\"filesystem\", 7], [\"github\", 10], [\"playwright\", 12]]);\n return counts.get(name) ?? 0;\n}\n\nfunction matchesQuery(voice: VoiceEntry, query: string): boolean {\n const q = query.toLowerCase();\n if (voice.name.toLowerCase().includes(q)) return true;\n if (voice.description.toLowerCase().includes(q)) return true;\n if (voice.tags.some((t) => t.toLowerCase().includes(q))) return true;\n return false;\n}\n\nfunction isInstalled(packageName: string): boolean {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) return false;\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n const deps: Record<string, string> = { ...pkg.dependencies, ...pkg.devDependencies };\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\nfunction printVoice(voice: VoiceEntry, showInstallStatus: boolean): void {\n const badge = voice.official\n ? chalk.green(\" [official]\")\n : chalk.blue(\" [community]\");\n const installed = showInstallStatus && isInstalled(voice.package);\n const status = showInstallStatus\n ? installed\n ? chalk.green(\" ✔ installed\")\n : chalk.dim(\" not installed\")\n : \"\";\n\n console.log();\n console.log(\" \" + chalk.bold(voice.package) + badge + status);\n console.log(\" \" + voice.description);\n\n const installCmd = voice.official && voice.name !== \"postgres\"\n ? \"tutti-ai add \" + voice.name\n : \"npm install \" + voice.package;\n console.log(\" \" + chalk.dim(\"Install: \") + chalk.cyan(installCmd));\n\n if (voice.tags.length > 0) {\n console.log(\" \" + chalk.dim(\"Tags: \") + voice.tags.join(\", \"));\n }\n}\n\nexport async function searchCommand(query: string): Promise<void> {\n const spinner = ora(\"Searching the Repertoire...\").start();\n\n const voices = await fetchRegistry();\n const results = voices.filter((v) => matchesQuery(v, query));\n\n spinner.stop();\n\n if (results.length === 0) {\n console.log();\n console.log(chalk.yellow(' No voices found for \"' + query + '\"'));\n console.log();\n console.log(chalk.dim(\" Browse all: https://tutti-ai.com/voices\"));\n console.log(chalk.dim(\" Build your own: tutti-ai create voice <name>\"));\n console.log();\n return;\n }\n\n console.log();\n console.log(\n \" Found \" +\n chalk.bold(String(results.length)) +\n \" voice\" +\n (results.length !== 1 ? \"s\" : \"\") +\n \" matching \" +\n chalk.cyan(\"'\" + query + \"'\") +\n \":\",\n );\n\n for (const voice of results) {\n printVoice(voice, false);\n }\n console.log();\n}\n\nexport async function voicesCommand(): Promise<void> {\n const spinner = ora(\"Loading voices...\").start();\n\n const voices = await fetchRegistry();\n const official = voices.filter((v) => v.official);\n\n spinner.stop();\n\n console.log();\n console.log(\" \" + chalk.bold(\"Official Tutti Voices\"));\n console.log();\n\n for (const voice of official) {\n printVoice(voice, true);\n }\n\n const community = voices.filter((v) => !v.official);\n if (community.length > 0) {\n console.log();\n console.log(\" \" + chalk.bold(\"Community Voices\"));\n for (const voice of community) {\n printVoice(voice, true);\n }\n }\n\n console.log();\n console.log(chalk.dim(\" Search: tutti-ai search <query>\"));\n console.log(chalk.dim(\" Browse: https://tutti-ai.com/voices\"));\n console.log();\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport Enquirer from \"enquirer\";\nimport { createLogger, SecretsManager } from \"@tuttiai/core\";\n\nconst { prompt } = Enquirer;\nconst logger = createLogger(\"tutti-cli\");\n\ninterface PkgJson {\n name?: string;\n version?: string;\n description?: string;\n license?: string;\n exports?: unknown;\n}\n\nfunction readPkg(dir: string): PkgJson | undefined {\n const p = resolve(dir, \"package.json\");\n if (!existsSync(p)) return undefined;\n return JSON.parse(readFileSync(p, \"utf-8\")) as PkgJson;\n}\n\nfunction run(cmd: string, cwd: string): string {\n return execSync(cmd, { cwd, stdio: \"pipe\", encoding: \"utf-8\" });\n}\n\nfunction fail(msg: string): never {\n console.error(chalk.red(\" \" + msg));\n process.exit(1);\n}\n\nconst ok = (msg: string): void => { console.log(chalk.green(\" ✔ \" + msg)); };\n\nexport async function publishCommand(opts: { dryRun?: boolean }): Promise<void> {\n const cwd = process.cwd();\n const pkg = readPkg(cwd);\n\n console.log();\n console.log(chalk.bold(\" Tutti Voice Publisher\"));\n console.log();\n\n // ── Step 1: Pre-flight checks ──\n\n const spinner = ora(\"Running pre-flight checks...\").start();\n\n // 1a. Must be a voice directory\n if (!pkg) fail(\"No package.json found in the current directory.\");\n if (!existsSync(resolve(cwd, \"src/index.ts\"))) fail(\"No src/index.ts found — are you inside a voice directory?\");\n\n // 1b. Required fields\n const missing: string[] = [];\n if (!pkg.name) missing.push(\"name\");\n if (!pkg.version) missing.push(\"version\");\n if (!pkg.description) missing.push(\"description\");\n if (!pkg.license) missing.push(\"license\");\n if (!pkg.exports) missing.push(\"exports\");\n if (missing.length > 0) fail(\"package.json is missing: \" + missing.join(\", \"));\n\n const name = pkg.name ?? \"\";\n const version = pkg.version ?? \"\";\n\n // 1c. Name convention\n const validName = name.startsWith(\"@tuttiai/\") || name.startsWith(\"tutti\");\n if (!validName) fail(\"Package name must start with @tuttiai/ or tutti — got: \" + name);\n\n // 1d. Check required_permissions is declared in source\n const src = readFileSync(resolve(cwd, \"src/index.ts\"), \"utf-8\");\n if (!src.includes(\"required_permissions\")) {\n fail(\"Voice class must declare required_permissions in src/index.ts\");\n }\n\n spinner.succeed(\"Pre-flight checks passed\");\n\n // 1e. Build\n const buildSpinner = ora(\"Building...\").start();\n try {\n run(\"npm run build\", cwd);\n buildSpinner.succeed(\"Build succeeded\");\n } catch (err) {\n buildSpinner.fail(\"Build failed\");\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.dim(\" \" + msg.split(\"\\n\").slice(0, 5).join(\"\\n \")));\n process.exit(1);\n }\n\n // 1f. Tests\n const testSpinner = ora(\"Running tests...\").start();\n try {\n run(\"npx vitest run\", cwd);\n testSpinner.succeed(\"Tests passed\");\n } catch {\n testSpinner.fail(\"Tests failed\");\n process.exit(1);\n }\n\n // 1g. Audit\n const auditSpinner = ora(\"Checking vulnerabilities...\").start();\n try {\n run(\"npm audit --audit-level=high\", cwd);\n auditSpinner.succeed(\"No high/critical vulnerabilities\");\n } catch {\n auditSpinner.stopAndPersist({ symbol: chalk.yellow(\"⚠\"), text: \"Vulnerabilities found (npm audit)\" });\n }\n\n // ── Step 2: Dry run ──\n\n console.log();\n const drySpinner = ora(\"Packing (dry run)...\").start();\n let packOutput: string;\n try {\n packOutput = run(\"npm pack --dry-run 2>&1\", cwd);\n drySpinner.succeed(\"Pack dry-run complete\");\n } catch (err) {\n drySpinner.fail(\"Pack dry-run failed\");\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.dim(\" \" + msg));\n process.exit(1);\n }\n\n // Show files from the pack output\n const fileLines = packOutput\n .split(\"\\n\")\n // eslint-disable-next-line security/detect-unsafe-regex -- simple size-matching pattern, no nested quantifiers\n .filter((l) => l.includes(\"npm notice\") && /\\d+(?:\\.\\d+)?\\s*[kM]?B\\s/.test(l))\n .map((l) => l.replace(/npm notice\\s*/, \"\"));\n\n if (fileLines.length > 0) {\n console.log(chalk.dim(\" Files:\"));\n for (const line of fileLines) {\n console.log(chalk.dim(\" \" + line.trim()));\n }\n }\n\n // Show totals\n const sizeLine = packOutput.split(\"\\n\").find((l) => l.includes(\"package size\"));\n const totalLine = packOutput.split(\"\\n\").find((l) => l.includes(\"total files\"));\n if (sizeLine) console.log(chalk.dim(\" \" + sizeLine.replace(/npm notice\\s*/, \"\").trim()));\n if (totalLine) console.log(chalk.dim(\" \" + totalLine.replace(/npm notice\\s*/, \"\").trim()));\n\n if (opts.dryRun) {\n console.log();\n ok(\"Dry run complete — no packages were published\");\n console.log(chalk.dim(\" Run without --dry-run to publish for real.\"));\n console.log();\n return;\n }\n\n // Prompt for confirmation\n console.log();\n const { confirm } = await prompt<{ confirm: boolean }>({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Publish \" + chalk.cyan(name + \"@\" + version) + \"?\",\n });\n\n if (!confirm) {\n console.log(chalk.dim(\" Cancelled.\"));\n return;\n }\n\n // ── Step 3: Publish ──\n\n const pubSpinner = ora(\"Publishing to npm...\").start();\n try {\n run(\"npm publish --access public\", cwd);\n pubSpinner.succeed(\"Published \" + chalk.cyan(name + \"@\" + version));\n } catch (err) {\n pubSpinner.fail(\"Publish failed\");\n const msg = err instanceof Error ? err.message : String(err);\n logger.error({ error: msg }, \"npm publish failed\");\n process.exit(1);\n }\n\n // ── Step 4: Open PR to voice registry ──\n\n const ghToken = SecretsManager.optional(\"GITHUB_TOKEN\");\n let prUrl: string | undefined;\n\n if (ghToken) {\n const prSpinner = ora(\"Opening PR to voice registry...\").start();\n try {\n prUrl = await openRegistryPR(name, version, pkg.description ?? \"\", ghToken);\n prSpinner.succeed(\"PR opened: \" + prUrl);\n } catch (err) {\n prSpinner.fail(\"Failed to open PR\");\n const msg = err instanceof Error ? err.message : String(err);\n logger.error({ error: msg }, \"Registry PR failed\");\n }\n } else {\n console.log();\n console.log(chalk.dim(\" To list in the Repertoire, set GITHUB_TOKEN and re-run\"));\n console.log(chalk.dim(\" Or open a PR manually: github.com/tuttiai/voices\"));\n }\n\n // ── Step 5: Summary ──\n\n console.log();\n ok(name + \"@\" + version + \" published to npm\");\n if (prUrl) ok(\"PR opened to tuttiai/voices\");\n const shortName = name.replace(\"@tuttiai/\", \"\").replace(/^tutti-?/, \"\");\n ok(\"Install: tutti-ai add \" + shortName);\n ok(\"View: https://www.npmjs.com/package/\" + name);\n console.log();\n}\n\nasync function openRegistryPR(\n packageName: string,\n version: string,\n description: string,\n token: string,\n): Promise<string> {\n const owner = \"tuttiai\";\n const repo = \"voices\";\n const branch = \"add-\" + packageName.replace(/[@/]/g, \"-\").replace(/^-/, \"\");\n const shortName = packageName.replace(\"@tuttiai/\", \"\").replace(/^tutti-?/, \"\");\n const isOfficial = packageName.startsWith(\"@tuttiai/\");\n\n // 1. Get current voices.json content and SHA\n const fileRes = await fetch(\n \"https://api.github.com/repos/\" + owner + \"/\" + repo + \"/contents/voices.json\",\n { headers: { Authorization: \"Bearer \" + token, Accept: \"application/vnd.github.v3+json\" } },\n );\n if (!fileRes.ok) throw new Error(\"Failed to fetch voices.json: \" + fileRes.status);\n const fileData = (await fileRes.json()) as { content: string; sha: string };\n\n interface RegistryVoice { name: string; package: string; description: string; version: string; author: string; tags: string[]; repo?: string }\n interface Registry { official: RegistryVoice[]; community: RegistryVoice[] }\n\n const registry = JSON.parse(Buffer.from(fileData.content, \"base64\").toString(\"utf-8\")) as Registry;\n\n // 2. Add the new voice entry\n const section: keyof Registry = isOfficial ? \"official\" : \"community\";\n const entry: RegistryVoice = {\n name: shortName,\n package: packageName,\n description,\n repo: \"https://github.com/tuttiai/tutti/tree/main/voices/\" + shortName,\n version,\n author: isOfficial ? \"tuttiai\" : packageName.split(\"/\")[0]?.replace(\"@\", \"\") ?? \"community\",\n tags: [shortName],\n };\n\n const sectionList = section === \"official\" ? registry.official : registry.community;\n const list = sectionList ?? [];\n if (section === \"official\") {\n registry.official = list;\n } else {\n registry.community = list;\n }\n const existingIdx = list.findIndex((v) => v.package === packageName);\n if (existingIdx >= 0) {\n const existing = list.at(existingIdx);\n list.splice(existingIdx, 1, { ...existing, ...entry });\n } else {\n list.push(entry);\n }\n\n const updatedContent = Buffer.from(JSON.stringify(registry, null, 2) + \"\\n\").toString(\"base64\");\n\n // 3. Get default branch SHA\n const mainRes = await fetch(\n \"https://api.github.com/repos/\" + owner + \"/\" + repo + \"/git/ref/heads/main\",\n { headers: { Authorization: \"Bearer \" + token, Accept: \"application/vnd.github.v3+json\" } },\n );\n if (!mainRes.ok) throw new Error(\"Failed to get main ref: \" + mainRes.status);\n const mainData = (await mainRes.json()) as { object: { sha: string } };\n\n // 4. Create branch\n await fetch(\"https://api.github.com/repos/\" + owner + \"/\" + repo + \"/git/refs\", {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + token, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ ref: \"refs/heads/\" + branch, sha: mainData.object.sha }),\n });\n\n // 5. Update voices.json on the new branch\n await fetch(\n \"https://api.github.com/repos/\" + owner + \"/\" + repo + \"/contents/voices.json\",\n {\n method: \"PUT\",\n headers: { Authorization: \"Bearer \" + token, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n message: \"feat: add \" + packageName + \" to the Repertoire\",\n content: updatedContent,\n sha: fileData.sha,\n branch,\n }),\n },\n );\n\n // 6. Create PR\n const prRes = await fetch(\"https://api.github.com/repos/\" + owner + \"/\" + repo + \"/pulls\", {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + token, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n title: \"feat: add \" + packageName + \" to the Repertoire\",\n head: branch,\n base: \"main\",\n body: \"## New voice: \" + packageName + \"@\" + version + \"\\n\\n\" + description + \"\\n\\nPublished via `tutti-ai publish`.\",\n }),\n });\n\n if (!prRes.ok) {\n const err = await prRes.text();\n throw new Error(\"Failed to create PR: \" + prRes.status + \" \" + err);\n }\n\n const prData = (await prRes.json()) as { html_url: string };\n return prData.html_url;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n ScoreLoader,\n EvalRunner,\n printEvalTable,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { EvalSuite } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nexport async function evalCommand(suitePath: string, opts: { ci?: boolean; score?: string }): Promise<void> {\n const suiteFile = resolve(suitePath);\n if (!existsSync(suiteFile)) {\n logger.error({ file: suiteFile }, \"Suite file not found\");\n process.exit(1);\n }\n\n // Load the eval suite JSON\n let suite: EvalSuite;\n try {\n suite = JSON.parse(readFileSync(suiteFile, \"utf-8\")) as EvalSuite;\n } catch (err) {\n logger.error({ error: err instanceof Error ? err.message : String(err) }, \"Failed to parse suite file\");\n process.exit(1);\n }\n\n // Load score\n const scoreFile = resolve(opts.score ?? \"./tutti.score.ts\");\n if (!existsSync(scoreFile)) {\n logger.error({ file: scoreFile }, \"Score file not found\");\n process.exit(1);\n }\n\n const spinner = ora(\"Loading score...\").start();\n let score;\n try {\n score = await ScoreLoader.load(scoreFile);\n } catch (err) {\n spinner.fail(\"Failed to load score\");\n logger.error({ error: err instanceof Error ? err.message : String(err) }, \"Score load failed\");\n process.exit(1);\n }\n spinner.succeed(\"Score loaded\");\n\n // Run eval\n const evalSpinner = ora(\"Running \" + suite.cases.length + \" eval cases...\").start();\n const runner = new EvalRunner(score);\n const report = await runner.run(suite);\n evalSpinner.stop();\n\n // Print results\n printEvalTable(report);\n\n // CI mode: exit 1 if any failed\n if (opts.ci && report.summary.failed > 0) {\n console.error(chalk.red(\" CI mode: \" + report.summary.failed + \" case(s) failed\"));\n process.exit(1);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport {\n TuttiRuntime,\n ScoreLoader,\n AnthropicProvider,\n OpenAIProvider,\n GeminiProvider,\n SecretsManager,\n InMemorySessionStore,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { ScoreConfig, SessionStore } from \"@tuttiai/types\";\nimport { createServer, DEFAULT_PORT, SERVER_VERSION } from \"@tuttiai/server\";\nimport type { FastifyInstance } from \"fastify\";\nimport { ReactiveScore } from \"../watch/score-watcher.js\";\n\nconst logger = createLogger(\"tutti-serve\");\n\nexport interface ServeOptions {\n port?: string;\n host?: string;\n apiKey?: string;\n agent?: string;\n watch?: boolean;\n}\n\nexport async function serveCommand(\n scorePath?: string,\n options: ServeOptions = {},\n): Promise<void> {\n // ── Resolve score file ──────────────────────────────────────\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n\n if (!existsSync(file)) {\n logger.error({ file }, \"Score file not found\");\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n let score: ScoreConfig;\n try {\n score = await ScoreLoader.load(file);\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Failed to load score\",\n );\n process.exit(1);\n }\n\n // ── Validate provider API key ───────────────────────────────\n const providerKeyMap: [unknown, string][] = [\n [AnthropicProvider, \"ANTHROPIC_API_KEY\"],\n [OpenAIProvider, \"OPENAI_API_KEY\"],\n [GeminiProvider, \"GEMINI_API_KEY\"],\n ];\n\n for (const [ProviderClass, envVar] of providerKeyMap) {\n if (score.provider instanceof (ProviderClass as new (...args: unknown[]) => unknown)) {\n const key = SecretsManager.optional(envVar);\n if (!key) {\n logger.error({ envVar }, \"Missing API key\");\n process.exit(1);\n }\n }\n }\n\n // ── Resolve agent name ──────────────────────────────────────\n const agentNames = Object.keys(score.agents);\n const agentName =\n options.agent ??\n (typeof score.entry === \"string\" ? score.entry : undefined) ??\n agentNames[0];\n\n if (!agentName || !Object.hasOwn(score.agents, agentName)) {\n logger.error(\n { requested: agentName, available: agentNames },\n \"Agent not found in score\",\n );\n process.exit(1);\n }\n\n // ── Resolve port & host ─────────────────────────────────────\n const port = parsePort(options.port);\n const host = options.host ?? \"0.0.0.0\";\n\n // ── Build runtime and server ────────────────────────────────\n // Watch mode keeps a shared session store so hot-reloads don't\n // discard in-flight sessions.\n const sharedSessions: SessionStore | undefined = options.watch\n ? new InMemorySessionStore()\n : undefined;\n\n let runtime = buildRuntime(score, sharedSessions);\n let app = await buildApp(runtime, agentName, port, host, options.apiKey);\n\n // ── Watch mode ──────────────────────────────────────────────\n let reactive: ReactiveScore | undefined;\n if (options.watch) {\n reactive = new ReactiveScore(score, file);\n\n reactive.on(\"file-change\", () => {\n console.log(chalk.cyan(\"\\n[tutti] Score changed, reloading...\"));\n });\n\n reactive.on(\"reloaded\", () => {\n void (async () => {\n try {\n const nextScore = reactive?.current;\n if (!nextScore) return;\n const nextRuntime = buildRuntime(nextScore, sharedSessions);\n const nextApp = await buildApp(nextRuntime, agentName, port, host, options.apiKey);\n\n await app.close();\n runtime = nextRuntime;\n app = nextApp;\n await app.listen({ port, host });\n\n console.log(chalk.green(\"[tutti] Score reloaded. Server restarted.\"));\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"[tutti] Reload failed — server continues with previous config\",\n );\n }\n })();\n });\n\n reactive.on(\"reload-failed\", (err) => {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"[tutti] Reload failed — server continues with previous config\",\n );\n });\n }\n\n // ── Start listening ─────────────────────────────────────────\n await app.listen({ port, host });\n\n printBanner(port, host, agentName, score, file, options.watch);\n\n // ── Graceful shutdown ───────────────────────────────────────\n const shutdown = async (signal: string): Promise<void> => {\n console.log(chalk.dim(\"\\n\" + signal + \" received — shutting down...\"));\n if (reactive) await reactive.close();\n await app.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n}\n\n// ── Helpers ──────────────────────────────────────────────────\n\nfunction parsePort(raw: string | undefined): number {\n if (raw === undefined) return DEFAULT_PORT;\n const n = Number.parseInt(raw, 10);\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n logger.error({ port: raw }, \"Invalid port number\");\n process.exit(1);\n }\n return n;\n}\n\nfunction buildRuntime(\n score: ScoreConfig,\n sessionStore: SessionStore | undefined,\n): TuttiRuntime {\n return new TuttiRuntime(\n score,\n sessionStore ? { sessionStore } : {},\n );\n}\n\nasync function buildApp(\n runtime: TuttiRuntime,\n agentName: string,\n port: number,\n host: string,\n apiKey: string | undefined,\n): Promise<FastifyInstance> {\n return createServer({\n port,\n host,\n runtime,\n agent_name: agentName,\n api_key: apiKey,\n });\n}\n\nfunction printBanner(\n port: number,\n host: string,\n agentName: string,\n score: ScoreConfig,\n file: string,\n watch: boolean | undefined,\n): void {\n const display = host === \"0.0.0.0\" || host === \"::\" ? \"localhost\" : host;\n const url = \"http://\" + display + \":\" + port;\n\n console.log();\n console.log(chalk.bold(\" Tutti Server v\" + SERVER_VERSION));\n console.log(chalk.dim(\" \" + url));\n console.log();\n console.log(chalk.dim(\" Score: \") + (score.name ?? file));\n console.log(chalk.dim(\" Agent: \") + agentName);\n console.log(chalk.dim(\" Agents: \") + Object.keys(score.agents).join(\", \"));\n if (watch) {\n console.log(chalk.dim(\" Watch: \") + chalk.cyan(\"enabled\"));\n }\n console.log();\n console.log(chalk.dim(\" Endpoints:\"));\n console.log(chalk.dim(\" POST \") + url + \"/run\");\n console.log(chalk.dim(\" POST \") + url + \"/run/stream\");\n console.log(chalk.dim(\" GET \") + url + \"/sessions/:id\");\n console.log(chalk.dim(\" GET \") + url + \"/health\");\n console.log();\n}\n","/**\n * `tutti-ai schedule [score]` — start the scheduler daemon.\n *\n * Reads the score file, registers all agents that have a `schedule`\n * config, then runs until killed. Uses PostgreSQL via `TUTTI_PG_URL`\n * for schedule persistence, falling back to in-memory for local dev.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport {\n ScoreLoader,\n SchedulerEngine,\n PostgresScheduleStore,\n MemoryScheduleStore,\n AgentRunner,\n EventBus,\n InMemorySessionStore,\n SecretsManager,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { ScheduleStore } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nfunction resolveStore(): ScheduleStore {\n const pgUrl = SecretsManager.optional(\"TUTTI_PG_URL\");\n if (pgUrl) {\n return new PostgresScheduleStore({ connection_string: pgUrl });\n }\n logger.warn(\"TUTTI_PG_URL not set — using in-memory store (not durable across restarts)\");\n return new MemoryScheduleStore();\n}\n\nexport async function scheduleCommand(scorePath?: string): Promise<void> {\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n\n if (!existsSync(file)) {\n console.error(chalk.red(\"Score file not found: \" + file));\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n const score = await ScoreLoader.load(file);\n const events = new EventBus();\n const sessions = new InMemorySessionStore();\n const runner = new AgentRunner(\n score.provider,\n events,\n sessions,\n );\n\n const store = resolveStore();\n const engine = new SchedulerEngine(store, runner, events);\n\n // Register agents with schedule config\n let registered = 0;\n for (const [agentId, agent] of Object.entries(score.agents)) {\n if (!agent.schedule) continue;\n const resolvedAgent = agent.model\n ? agent\n : { ...agent, model: score.default_model ?? \"claude-sonnet-4-20250514\" };\n await engine.schedule(agentId, resolvedAgent, agent.schedule);\n registered++;\n }\n\n if (registered === 0) {\n console.log(chalk.yellow(\"No agents have a schedule config. Nothing to run.\"));\n console.log(chalk.dim(\"Add schedule: { cron: '...', input: '...' } to an agent in your score.\"));\n process.exit(0);\n }\n\n // Event logging\n events.onAny((e) => {\n if (e.type === \"schedule:triggered\") {\n const ev = e as { schedule_id: string; agent_name: string };\n console.log(\n chalk.dim(new Date().toISOString()) + \" \" +\n chalk.cyan(\"triggered\") + \" \" +\n chalk.bold(ev.schedule_id) + \" → \" + ev.agent_name,\n );\n }\n if (e.type === \"schedule:completed\") {\n const ev = e as { schedule_id: string; agent_name: string; duration_ms: number };\n console.log(\n chalk.dim(new Date().toISOString()) + \" \" +\n chalk.green(\"completed\") + \" \" +\n chalk.bold(ev.schedule_id) + \" \" +\n chalk.dim(\"(\" + ev.duration_ms + \"ms)\"),\n );\n }\n if (e.type === \"schedule:error\") {\n const ev = e as { schedule_id: string; agent_name: string; error: Error };\n console.log(\n chalk.dim(new Date().toISOString()) + \" \" +\n chalk.red(\"error\") + \" \" +\n chalk.bold(ev.schedule_id) + \" — \" + ev.error.message,\n );\n }\n });\n\n engine.start();\n\n // Banner\n console.log(\"\");\n console.log(chalk.cyan.bold(\" Tutti Scheduler\"));\n console.log(chalk.dim(\" Score: \" + (score.name ?? file)));\n console.log(chalk.dim(\" Schedules: \" + registered));\n console.log(chalk.dim(\" Store: \" + (SecretsManager.optional(\"TUTTI_PG_URL\") ? \"postgres\" : \"memory\")));\n console.log(\"\");\n console.log(chalk.dim(\" Press Ctrl+C to stop.\"));\n console.log(\"\");\n\n // Graceful shutdown\n const shutdown = (): void => {\n console.log(chalk.dim(\"\\n Shutting down scheduler...\"));\n engine.stop();\n if (\"close\" in store && typeof (store as { close: () => Promise<void> }).close === \"function\") {\n void (store as { close: () => Promise<void> }).close();\n }\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Keep process alive\n await new Promise(() => undefined);\n}\n","/**\n * `tutti-ai update` — self-update the CLI and core packages to latest.\n *\n * Detects npm or yarn, runs the appropriate install command to pull\n * the latest versions of @tuttiai/* packages, and prints a before/after\n * version comparison.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\n\nconst TUTTI_PACKAGES = [\n \"@tuttiai/core\",\n \"@tuttiai/cli\",\n \"@tuttiai/types\",\n \"@tuttiai/server\",\n \"@tuttiai/filesystem\",\n \"@tuttiai/github\",\n \"@tuttiai/playwright\",\n \"@tuttiai/mcp\",\n \"@tuttiai/web\",\n \"@tuttiai/sandbox\",\n \"@tuttiai/rag\",\n];\n\nfunction getInstalledVersion(pkg: string): string | null {\n try {\n const out = execSync(`npm list ${pkg} --depth=0 --json 2>/dev/null`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const data = JSON.parse(out) as { dependencies?: Record<string, { version?: string }> };\n const deps = data.dependencies;\n if (!deps) return null;\n for (const [name, info] of Object.entries(deps)) {\n if (name === pkg && info.version) return info.version;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction getLatestVersion(pkg: string): string | null {\n try {\n return execSync(`npm view ${pkg} version 2>/dev/null`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\nfunction detectPackageManager(): \"npm\" | \"yarn\" | \"pnpm\" {\n const cwd = process.cwd();\n if (existsSync(resolve(cwd, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(resolve(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n return \"npm\";\n}\n\nfunction isGlobalInstall(): boolean {\n try {\n const globalPrefix = execSync(\"npm prefix -g\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n return process.argv[1]?.startsWith(globalPrefix) ?? false;\n } catch {\n return false;\n }\n}\n\nexport function updateCommand(): void {\n console.log();\n console.log(chalk.cyan.bold(\" Tutti Update\"));\n console.log();\n\n // 1. Check for CLI update (global install)\n const spinner = ora(\"Checking for updates...\").start();\n\n const cliCurrent = getInstalledVersion(\"@tuttiai/cli\") ?? \"unknown\";\n const cliLatest = getLatestVersion(\"@tuttiai/cli\");\n\n spinner.stop();\n\n if (cliLatest && cliCurrent !== cliLatest) {\n console.log(\n chalk.yellow(\" CLI update available: \") +\n chalk.dim(cliCurrent) + \" → \" + chalk.green(cliLatest),\n );\n\n if (isGlobalInstall()) {\n const updateSpinner = ora(\"Updating global CLI...\").start();\n try {\n execSync(\"npm install -g tutti-ai@latest\", { stdio: \"pipe\" });\n updateSpinner.succeed(\"CLI updated to \" + cliLatest);\n } catch {\n updateSpinner.fail(\"Failed to update global CLI\");\n console.log(chalk.dim(\" Run manually: npm install -g tutti-ai@latest\"));\n }\n } else {\n console.log(chalk.dim(\" Global: npm install -g tutti-ai@latest\"));\n }\n } else {\n console.log(chalk.green(\" CLI is up to date\") + chalk.dim(\" (\" + cliCurrent + \")\"));\n }\n\n // 2. Check local project packages\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) {\n console.log();\n console.log(chalk.dim(\" No package.json found — skipping project dependency check.\"));\n console.log();\n return;\n }\n\n let pkg: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n try {\n pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as typeof pkg;\n } catch {\n console.log(chalk.dim(\" Could not read package.json\"));\n return;\n }\n\n const allDeps = new Map<string, string>();\n if (pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n allDeps.set(name, version);\n }\n }\n if (pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n allDeps.set(name, version);\n }\n }\n\n const installed = TUTTI_PACKAGES.filter((p) => allDeps.has(p));\n if (installed.length === 0) {\n console.log();\n console.log(chalk.dim(\" No @tuttiai packages found in this project.\"));\n console.log();\n return;\n }\n\n console.log();\n console.log(\" \" + chalk.bold(\"Project packages:\"));\n\n const toUpdate: string[] = [];\n for (const name of installed) {\n const current = allDeps.get(name) ?? \"?\";\n const latest = getLatestVersion(name);\n if (!latest) {\n console.log(\" \" + chalk.dim(name) + \" \" + current + chalk.dim(\" (could not check)\"));\n continue;\n }\n const cleanCurrent = current.replace(/^[\\^~]/, \"\");\n if (cleanCurrent === latest) {\n console.log(\" \" + chalk.green(\"✔\") + \" \" + name + \" \" + chalk.dim(latest));\n } else {\n console.log(\n \" \" + chalk.yellow(\"↑\") + \" \" + name + \" \" +\n chalk.dim(cleanCurrent) + \" → \" + chalk.green(latest),\n );\n toUpdate.push(name + \"@latest\");\n }\n }\n\n if (toUpdate.length === 0) {\n console.log();\n console.log(chalk.green(\" All packages are up to date.\"));\n console.log();\n return;\n }\n\n console.log();\n const pm = detectPackageManager();\n const installCmd = pm === \"yarn\"\n ? \"yarn add \" + toUpdate.join(\" \")\n : pm === \"pnpm\"\n ? \"pnpm add \" + toUpdate.join(\" \")\n : \"npm install \" + toUpdate.join(\" \");\n\n const updateSpinner = ora(\"Updating \" + toUpdate.length + \" package(s)...\").start();\n try {\n execSync(installCmd, { cwd: process.cwd(), stdio: \"pipe\" });\n updateSpinner.succeed(\"Updated \" + toUpdate.length + \" package(s)\");\n } catch {\n updateSpinner.fail(\"Update failed\");\n console.log(chalk.dim(\" Run manually: \" + installCmd));\n }\n console.log();\n}\n","/**\n * `tutti-ai outdated` — check installed @tuttiai/* packages and voices\n * against the npm registry and show which ones have updates available.\n *\n * Does NOT install anything — just reports. Use `tutti-ai update` to\n * actually pull the latest versions.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\n\nfunction getLatestVersion(pkg: string): string | null {\n try {\n return execSync(`npm view ${pkg} version 2>/dev/null`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\nfunction pad(s: string, len: number): string {\n return s.length >= len ? s : s + \" \".repeat(len - s.length);\n}\n\nexport function outdatedCommand(): void {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) {\n console.error(chalk.red(\"No package.json found in the current directory.\"));\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n let pkg: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n try {\n pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as typeof pkg;\n } catch {\n console.error(chalk.red(\"Could not parse package.json\"));\n process.exit(1);\n }\n\n const allDeps = new Map<string, string>();\n if (pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n allDeps.set(name, version);\n }\n }\n if (pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n allDeps.set(name, version);\n }\n }\n\n // Filter to @tuttiai/* packages only\n const tuttiDeps = [...allDeps.entries()].filter(([name]) => name.startsWith(\"@tuttiai/\"));\n if (tuttiDeps.length === 0) {\n console.log(chalk.dim(\"No @tuttiai packages found in this project.\"));\n return;\n }\n\n const spinner = ora(\"Checking npm registry...\").start();\n\n const results: Array<{ name: string; current: string; latest: string; outdated: boolean }> = [];\n for (const [name, version] of tuttiDeps) {\n const latest = getLatestVersion(name);\n const current = version.replace(/^[\\^~]/, \"\");\n results.push({\n name,\n current,\n latest: latest ?? \"?\",\n outdated: latest !== null && current !== latest,\n });\n }\n\n spinner.stop();\n\n console.log();\n console.log(\n chalk.dim(\n \" \" + pad(\"PACKAGE\", 28) + pad(\"CURRENT\", 12) + pad(\"LATEST\", 12) + \"STATUS\",\n ),\n );\n console.log(chalk.dim(\" \" + \"─\".repeat(64)));\n\n let outdatedCount = 0;\n for (const r of results) {\n const status = r.outdated\n ? chalk.yellow(\"update available\")\n : chalk.green(\"up to date\");\n if (r.outdated) outdatedCount++;\n\n console.log(\n \" \" +\n pad(r.name, 28) +\n pad(r.current, 12) +\n pad(r.latest, 12) +\n status,\n );\n }\n\n console.log();\n if (outdatedCount > 0) {\n console.log(\n chalk.yellow(\" \" + outdatedCount + \" package(s) can be updated.\") +\n chalk.dim(\" Run: tutti-ai update\"),\n );\n } else {\n console.log(chalk.green(\" All packages are up to date.\"));\n }\n console.log();\n}\n","/**\n * `tutti-ai info` — show project information: score, agents, voices, versions.\n *\n * Reads the score file and package.json from the current directory and\n * prints a structured overview of the project configuration.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport { ScoreLoader, createLogger } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nfunction pad(s: string, len: number): string {\n return s.length >= len ? s : s + \" \".repeat(len - s.length);\n}\n\nexport async function infoCommand(scorePath?: string): Promise<void> {\n // Project info from package.json\n const pkgPath = resolve(process.cwd(), \"package.json\");\n let projectName = \"(unknown)\";\n let projectVersion = \"(unknown)\";\n const installedDeps = new Map<string, string>();\n\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n projectName = pkg.name ?? \"(unnamed)\";\n projectVersion = pkg.version ?? \"0.0.0\";\n if (pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n installedDeps.set(name, version);\n }\n }\n if (pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n installedDeps.set(name, version);\n }\n }\n } catch {\n // ignore\n }\n }\n\n console.log();\n console.log(chalk.cyan.bold(\" Tutti Project Info\"));\n console.log();\n console.log(\" \" + chalk.dim(\"Project:\") + \" \" + chalk.bold(projectName) + \" \" + chalk.dim(projectVersion));\n\n // Installed @tuttiai/* packages\n const tuttiPkgs = [...installedDeps.entries()].filter(([name]) => name.startsWith(\"@tuttiai/\"));\n if (tuttiPkgs.length > 0) {\n console.log();\n console.log(\" \" + chalk.bold(\"Packages:\"));\n for (const [name, version] of tuttiPkgs) {\n console.log(\" \" + pad(name, 28) + chalk.dim(version));\n }\n }\n\n // Score file info\n const scoreFile = resolve(scorePath ?? \"./tutti.score.ts\");\n if (!existsSync(scoreFile)) {\n console.log();\n console.log(chalk.dim(\" No score file found at \" + scoreFile));\n console.log(chalk.dim(' Run \"tutti-ai init\" to create a new project.'));\n console.log();\n return;\n }\n\n let score;\n try {\n score = await ScoreLoader.load(scoreFile);\n } catch (err) {\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Failed to load score\",\n );\n console.log(chalk.dim(\" Score file found but failed to load.\"));\n console.log();\n return;\n }\n\n console.log(\" \" + chalk.dim(\"Score:\") + \" \" + (score.name ?? scoreFile));\n\n // Agents\n const agentEntries = Object.entries(score.agents);\n console.log();\n console.log(\" \" + chalk.bold(\"Agents:\") + chalk.dim(\" (\" + agentEntries.length + \")\"));\n for (const [id, agent] of agentEntries) {\n const voiceNames = agent.voices.map((v) => v.name).join(\", \") || \"none\";\n const model = agent.model ?? score.default_model ?? \"(default)\";\n const flags: string[] = [];\n if (agent.streaming) flags.push(\"streaming\");\n if (agent.allow_human_input) flags.push(\"hitl\");\n if (agent.durable) flags.push(\"durable\");\n if (agent.schedule) flags.push(\"scheduled\");\n if (agent.outputSchema) flags.push(\"structured\");\n if (agent.beforeRun ?? agent.afterRun) flags.push(\"guardrails\");\n\n console.log();\n console.log(\" \" + chalk.bold(id) + chalk.dim(\" (\" + agent.name + \")\"));\n console.log(\" \" + chalk.dim(\"Model: \") + model);\n console.log(\" \" + chalk.dim(\"Voices: \") + voiceNames);\n if (flags.length > 0) {\n console.log(\" \" + chalk.dim(\"Flags: \") + flags.join(\", \"));\n }\n if (agent.schedule) {\n const sched = agent.schedule;\n const trigger = sched.cron ?? sched.every ?? sched.at ?? \"?\";\n console.log(\" \" + chalk.dim(\"Schedule: \") + trigger);\n }\n }\n\n // Entry point\n if (score.entry) {\n const entry = typeof score.entry === \"string\" ? score.entry : \"parallel\";\n console.log();\n console.log(\" \" + chalk.dim(\"Entry:\") + \" \" + entry);\n }\n\n console.log();\n}\n","/**\n * `tutti-ai upgrade [voice]` — upgrade a specific voice or all voices.\n *\n * Without arguments: upgrades all installed @tuttiai/* packages.\n * With a voice name: upgrades just that one package.\n *\n * Detects the package manager from lock files and uses the appropriate\n * install command.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\n\nfunction detectPackageManager(): \"npm\" | \"yarn\" | \"pnpm\" {\n const cwd = process.cwd();\n if (existsSync(resolve(cwd, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(resolve(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n return \"npm\";\n}\n\nfunction resolvePackageName(input: string): string {\n const KNOWN = new Map([\n [\"filesystem\", \"@tuttiai/filesystem\"],\n [\"github\", \"@tuttiai/github\"],\n [\"playwright\", \"@tuttiai/playwright\"],\n [\"mcp\", \"@tuttiai/mcp\"],\n [\"web\", \"@tuttiai/web\"],\n [\"sandbox\", \"@tuttiai/sandbox\"],\n [\"rag\", \"@tuttiai/rag\"],\n [\"core\", \"@tuttiai/core\"],\n [\"types\", \"@tuttiai/types\"],\n [\"server\", \"@tuttiai/server\"],\n ]);\n return KNOWN.get(input) ?? (input.startsWith(\"@\") ? input : `@tuttiai/${input}`);\n}\n\nfunction getInstalledTuttiPackages(): Map<string, string> {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) return new Map();\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const result = new Map<string, string>();\n if (pkg.dependencies) {\n for (const [name, version] of Object.entries(pkg.dependencies)) {\n if (name.startsWith(\"@tuttiai/\")) result.set(name, version);\n }\n }\n if (pkg.devDependencies) {\n for (const [name, version] of Object.entries(pkg.devDependencies)) {\n if (name.startsWith(\"@tuttiai/\")) result.set(name, version);\n }\n }\n return result;\n } catch {\n return new Map();\n }\n}\n\nexport function upgradeCommand(target?: string): void {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (!existsSync(pkgPath)) {\n console.error(chalk.red(\"No package.json found in the current directory.\"));\n console.error(chalk.dim('Run \"tutti-ai init\" to create a new project.'));\n process.exit(1);\n }\n\n const pm = detectPackageManager();\n const installed = getInstalledTuttiPackages();\n\n if (installed.size === 0) {\n console.log(chalk.dim(\"No @tuttiai packages found in this project.\"));\n return;\n }\n\n let packages: string[];\n if (target) {\n const resolved = resolvePackageName(target);\n if (!installed.has(resolved)) {\n console.error(chalk.red(resolved + \" is not installed in this project.\"));\n console.error(chalk.dim(\"Installed: \" + [...installed.keys()].join(\", \")));\n process.exit(1);\n }\n packages = [resolved + \"@latest\"];\n console.log(chalk.cyan(\" Upgrading \" + resolved + \"...\"));\n } else {\n packages = [...installed.keys()].map((p) => p + \"@latest\");\n console.log(chalk.cyan(\" Upgrading all \" + packages.length + \" @tuttiai packages...\"));\n }\n\n const installCmd = pm === \"yarn\"\n ? \"yarn add \" + packages.join(\" \")\n : pm === \"pnpm\"\n ? \"pnpm add \" + packages.join(\" \")\n : \"npm install \" + packages.join(\" \");\n\n const spinner = ora(\"Installing...\").start();\n try {\n execSync(installCmd, { cwd: process.cwd(), stdio: \"pipe\" });\n spinner.succeed(\"Upgraded \" + packages.length + \" package(s)\");\n } catch {\n spinner.fail(\"Upgrade failed\");\n console.log(chalk.dim(\" Run manually: \" + installCmd));\n process.exit(1);\n }\n\n // Show new versions\n console.log();\n const newInstalled = getInstalledTuttiPackages();\n for (const [name, oldVersion] of installed) {\n const newVersion = newInstalled.get(name) ?? oldVersion;\n const oldClean = oldVersion.replace(/^[\\^~]/, \"\");\n const newClean = newVersion.replace(/^[\\^~]/, \"\");\n if (oldClean !== newClean) {\n console.log(\" \" + chalk.green(\"↑\") + \" \" + name + \" \" + chalk.dim(oldClean) + \" → \" + chalk.green(newClean));\n } else {\n console.log(\" \" + chalk.dim(\"=\") + \" \" + name + \" \" + chalk.dim(newClean) + chalk.dim(\" (already latest)\"));\n }\n }\n console.log();\n}\n","/**\n * `tutti-ai replay <session-id>` — time-travel debugger for sessions.\n *\n * Loads all messages for a session from the PostgreSQL session store,\n * then opens an interactive REPL for navigating, inspecting, replaying,\n * and exporting the conversation history.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport {\n PostgresSessionStore,\n ScoreLoader,\n TuttiRuntime,\n SecretsManager,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { Session } from \"@tuttiai/types\";\nimport {\n messageToText,\n renderList,\n renderShow,\n renderInspect,\n exportJSON,\n exportMarkdown,\n} from \"./replay-render.js\";\n\n// Re-export rendering functions so existing tests keep working\nexport {\n messageToText,\n renderList,\n renderShow,\n renderInspect,\n exportJSON,\n exportMarkdown,\n} from \"./replay-render.js\";\n\nconst logger = createLogger(\"tutti-cli\");\n\n// ── REPL ─────────────────────────────────────────────────────\n\nexport interface ReplayOptions {\n score?: string;\n}\n\nexport async function replayCommand(\n sessionId: string,\n opts: ReplayOptions = {},\n): Promise<void> {\n const pgUrl = SecretsManager.optional(\"TUTTI_PG_URL\");\n if (!pgUrl) {\n console.error(chalk.red(\"TUTTI_PG_URL is not set.\"));\n console.error(\n chalk.dim(\n \"The replay command requires PostgreSQL for session persistence.\\n\" +\n \"Set TUTTI_PG_URL=postgres://user:pass@host/db in your environment.\",\n ),\n );\n process.exit(1);\n }\n\n const store = new PostgresSessionStore(pgUrl);\n\n const spinner = ora({ color: \"cyan\" }).start(\"Loading session...\");\n let session: Session | undefined;\n try {\n session = await store.getAsync(sessionId);\n } catch (err) {\n spinner.fail(\"Failed to load session\");\n logger.error(\n { error: err instanceof Error ? err.message : String(err) },\n \"Session store error\",\n );\n process.exit(1);\n }\n spinner.stop();\n\n if (!session) {\n console.error(chalk.red(\"Session not found: \" + sessionId));\n console.error(chalk.dim(\"Check the session ID and ensure TUTTI_PG_URL points to the correct database.\"));\n await store.close();\n process.exit(1);\n }\n\n const messages = session.messages;\n\n console.log(\"\");\n console.log(chalk.cyan.bold(\" Tutti Replay\"));\n console.log(chalk.dim(\" Session: \" + session.id));\n console.log(chalk.dim(\" Agent: \" + session.agent_name));\n console.log(chalk.dim(\" Created: \" + session.created_at.toISOString()));\n console.log(chalk.dim(\" Messages: \" + messages.length));\n console.log(\"\");\n console.log(chalk.dim(\" Commands: list, show <n>, next, prev, inspect, replay-from <n>, export <json|md>, quit\"));\n console.log(\"\");\n\n let cursor = 0;\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n while (true) {\n const prompt = chalk.cyan(\"replay [\" + cursor + \"/\" + (messages.length - 1) + \"]> \");\n const raw = await rl.question(prompt);\n const input = raw.trim();\n if (!input) continue;\n\n const [cmd, ...args] = input.split(/\\s+/);\n\n switch (cmd) {\n case \"quit\":\n case \"exit\":\n case \"q\":\n console.log(chalk.dim(\"Bye.\"));\n return;\n\n case \"list\":\n console.log(renderList(messages));\n break;\n\n case \"show\": {\n const n = parseInt(args[0] ?? String(cursor), 10);\n console.log(renderShow(messages, n));\n if (n >= 0 && n < messages.length) cursor = n;\n break;\n }\n\n case \"next\":\n if (cursor < messages.length - 1) {\n cursor++;\n console.log(renderShow(messages, cursor));\n } else {\n console.log(chalk.dim(\"Already at last message.\"));\n }\n break;\n\n case \"prev\":\n if (cursor > 0) {\n cursor--;\n console.log(renderShow(messages, cursor));\n } else {\n console.log(chalk.dim(\"Already at first message.\"));\n }\n break;\n\n case \"inspect\":\n console.log(renderInspect(messages, cursor));\n break;\n\n case \"replay-from\": {\n const turn = parseInt(args[0] ?? \"\", 10);\n if (isNaN(turn) || turn < 0 || turn >= messages.length) {\n console.log(chalk.red(\"Usage: replay-from <turn-number>\"));\n break;\n }\n await handleReplayFrom(turn, session, rl, opts);\n break;\n }\n\n case \"export\": {\n const format = args[0];\n if (format === \"json\") {\n const filename = \"session-\" + session.id.slice(0, 8) + \".json\";\n await writeFile(filename, exportJSON(session));\n console.log(chalk.green(\"Exported to \" + filename));\n } else if (format === \"md\" || format === \"markdown\") {\n const filename = \"session-\" + session.id.slice(0, 8) + \".md\";\n await writeFile(filename, exportMarkdown(session));\n console.log(chalk.green(\"Exported to \" + filename));\n } else {\n console.log(chalk.dim(\"Usage: export <json|md>\"));\n }\n break;\n }\n\n default:\n console.log(\n chalk.dim(\"Unknown command. Available: list, show <n>, next, prev, inspect, replay-from <n>, export <json|md>, quit\"),\n );\n }\n }\n } finally {\n rl.close();\n await store.close();\n }\n}\n\n// ── replay-from ──────────────────────────────────────────────\n\nasync function handleReplayFrom(\n turn: number,\n session: Session,\n rl: ReturnType<typeof createInterface>,\n opts: ReplayOptions,\n): Promise<void> {\n const scoreFile = resolve(opts.score ?? \"./tutti.score.ts\");\n if (!existsSync(scoreFile)) {\n console.log(chalk.red(\"Score file not found: \" + scoreFile));\n console.log(chalk.dim(\"Use --score to specify the score file.\"));\n return;\n }\n\n const originalMsg = session.messages.at(turn);\n const originalInput = originalMsg ? messageToText(originalMsg) : \"\";\n\n const answer = await rl.question(\n chalk.cyan(\"Replay from turn \" + turn + \" with original input? \") +\n chalk.dim(\"(y / enter new input) \"),\n );\n\n const input = answer.trim().toLowerCase() === \"y\" || answer.trim() === \"\"\n ? originalInput\n : answer.trim();\n\n if (!input) {\n console.log(chalk.dim(\"No input provided. Cancelled.\"));\n return;\n }\n\n const spinnerLoad = ora({ color: \"cyan\" }).start(\"Loading score...\");\n let score;\n try {\n score = await ScoreLoader.load(scoreFile);\n } catch (err) {\n spinnerLoad.fail(\"Failed to load score\");\n logger.error({ error: err instanceof Error ? err.message : String(err) }, \"Score load error\");\n return;\n }\n spinnerLoad.stop();\n\n const restoredMessages = session.messages.slice(0, turn);\n const runtime = new TuttiRuntime(score);\n\n const sessions = runtime.sessions;\n if (\"save\" in sessions && typeof sessions.save === \"function\") {\n (sessions.save as (s: {\n id: string;\n agent_name: string;\n messages: typeof restoredMessages;\n created_at: Date;\n updated_at: Date;\n }) => void)({\n id: session.id,\n agent_name: session.agent_name,\n messages: restoredMessages,\n created_at: session.created_at,\n updated_at: new Date(),\n });\n }\n\n const agentName = session.agent_name;\n const agentMap = new Map(Object.entries(score.agents));\n const agent = agentMap.get(agentName);\n if (!agent) {\n console.log(chalk.red(\"Agent \\\"\" + agentName + \"\\\" not found in score.\"));\n return;\n }\n\n const spinnerRun = ora({ color: \"cyan\" }).start(\"Running from turn \" + turn + \"...\");\n\n runtime.events.on(\"token:stream\", (e) => {\n spinnerRun.stop();\n process.stdout.write(e.text);\n });\n\n try {\n const result = await runtime.run(agentName, input, session.id);\n spinnerRun.stop();\n console.log(\"\");\n console.log(chalk.green(\"Replay complete.\"));\n console.log(chalk.dim(\" Turns: \" + result.turns));\n console.log(chalk.dim(\" Tokens: \" + result.usage.input_tokens + \" in / \" + result.usage.output_tokens + \" out\"));\n console.log(\"\");\n console.log(result.output);\n } catch (err) {\n spinnerRun.fail(\"Replay failed\");\n logger.error({ error: err instanceof Error ? err.message : String(err) }, \"Replay error\");\n }\n}\n","/**\n * Pure rendering functions for the replay command.\n *\n * Split from `replay.ts` so they stay in the coverage scope while\n * the interactive REPL and Postgres I/O are excluded.\n */\n\nimport chalk from \"chalk\";\nimport type { ChatMessage, Session } from \"@tuttiai/types\";\n\n/** Convert a message's content to a single-line text summary. */\nexport function messageToText(msg: ChatMessage): string {\n if (typeof msg.content === \"string\") return msg.content;\n const parts: string[] = [];\n for (const block of msg.content) {\n if (block.type === \"text\") {\n parts.push(block.text);\n } else if (block.type === \"tool_use\") {\n parts.push(\"[tool_use \" + block.name + \"]\");\n } else if (block.type === \"tool_result\") {\n const preview = block.content.replace(/\\s+/g, \" \").trim();\n parts.push(\"[tool_result \" + (preview.length > 60 ? preview.slice(0, 59) + \"\\u2026\" : preview) + \"]\");\n }\n }\n return parts.join(\" \");\n}\n\n/** Excerpt a string to a maximum length. */\nfunction excerpt(text: string, max: number): string {\n const oneLine = text.replace(/\\s+/g, \" \").trim();\n return oneLine.length > max ? oneLine.slice(0, max - 1) + \"\\u2026\" : oneLine;\n}\n\n/** Render the `list` view — all messages with index, role, and preview. */\nexport function renderList(messages: ChatMessage[]): string {\n const lines: string[] = [];\n for (let i = 0; i < messages.length; i++) {\n const msg = messages.at(i);\n if (!msg) continue;\n const role = msg.role === \"user\"\n ? chalk.blue(\"user \")\n : chalk.green(\"assistant\");\n const text = excerpt(messageToText(msg), 80);\n lines.push(\n chalk.dim(String(i).padStart(3)) + \" \" + role + \" \" + text,\n );\n }\n return lines.join(\"\\n\");\n}\n\n/** Render the `show <n>` view — full detail for one message. */\nexport function renderShow(messages: ChatMessage[], index: number): string {\n if (index < 0 || index >= messages.length) {\n return chalk.red(\"Index out of range. Valid: 0\\u2013\" + (messages.length - 1));\n }\n\n const msg = messages.at(index);\n if (!msg) return chalk.red(\"Index out of range.\");\n const lines: string[] = [];\n\n lines.push(chalk.cyan.bold(\"Turn \" + index) + \" \" + chalk.dim(\"[\" + msg.role + \"]\"));\n lines.push(\"\");\n\n if (typeof msg.content === \"string\") {\n lines.push(msg.content);\n } else {\n for (const block of msg.content) {\n if (block.type === \"text\") {\n lines.push(block.text);\n } else if (block.type === \"tool_use\") {\n lines.push(chalk.yellow(\" tool_use: \" + block.name));\n lines.push(chalk.dim(\" id: \" + block.id));\n lines.push(chalk.dim(\" input: \" + JSON.stringify(block.input, null, 2)));\n } else if (block.type === \"tool_result\") {\n const label = block.is_error ? chalk.red(\" tool_result (error):\") : chalk.green(\" tool_result:\");\n lines.push(label);\n lines.push(chalk.dim(\" tool_use_id: \" + block.tool_use_id));\n lines.push(\" \" + block.content);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/** Render the `inspect` view — raw JSON of the current message. */\nexport function renderInspect(messages: ChatMessage[], index: number): string {\n if (index < 0 || index >= messages.length) {\n return chalk.red(\"Index out of range.\");\n }\n return JSON.stringify(messages.at(index), null, 2);\n}\n\n/** Export the session as JSON. */\nexport function exportJSON(session: Session): string {\n return JSON.stringify(\n {\n id: session.id,\n agent_name: session.agent_name,\n created_at: session.created_at,\n messages: session.messages,\n },\n null,\n 2,\n );\n}\n\n/** Export the session as Markdown. */\nexport function exportMarkdown(session: Session): string {\n const lines: string[] = [];\n lines.push(\"# Session \" + session.id);\n lines.push(\"\");\n lines.push(\"**Agent:** \" + session.agent_name);\n lines.push(\"**Created:** \" + session.created_at.toISOString());\n lines.push(\"**Messages:** \" + session.messages.length);\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n\n for (let i = 0; i < session.messages.length; i++) {\n const msg = session.messages.at(i);\n if (!msg) continue;\n lines.push(\"## Turn \" + i + \" (\" + msg.role + \")\");\n lines.push(\"\");\n if (typeof msg.content === \"string\") {\n lines.push(msg.content);\n } else {\n for (const block of msg.content) {\n if (block.type === \"text\") {\n lines.push(block.text);\n } else if (block.type === \"tool_use\") {\n lines.push(\"**Tool call:** `\" + block.name + \"`\");\n lines.push(\"```json\\n\" + JSON.stringify(block.input, null, 2) + \"\\n```\");\n } else if (block.type === \"tool_result\") {\n const label = block.is_error ? \"**Tool error:**\" : \"**Tool result:**\";\n lines.push(label);\n lines.push(\"```\\n\" + block.content + \"\\n```\");\n }\n }\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * `tutti-ai schedules <subcommand>` — schedule management commands.\n *\n * All subcommands connect to the schedule store via TUTTI_PG_URL.\n * Falls back to in-memory (ephemeral) when TUTTI_PG_URL is not set.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport {\n ScoreLoader,\n SchedulerEngine,\n PostgresScheduleStore,\n MemoryScheduleStore,\n AgentRunner,\n EventBus,\n InMemorySessionStore,\n SecretsManager,\n createLogger,\n} from \"@tuttiai/core\";\nimport type { ScheduleStore, ScheduleRecord } from \"@tuttiai/core\";\n\nconst logger = createLogger(\"tutti-cli\");\n\nfunction resolveStore(): ScheduleStore {\n const pgUrl = SecretsManager.optional(\"TUTTI_PG_URL\");\n if (pgUrl) {\n return new PostgresScheduleStore({ connection_string: pgUrl });\n }\n logger.warn(\"TUTTI_PG_URL not set — using in-memory store (schedules are ephemeral)\");\n return new MemoryScheduleStore();\n}\n\nasync function closeStore(store: ScheduleStore): Promise<void> {\n if (\"close\" in store && typeof (store as { close: () => Promise<void> }).close === \"function\") {\n await (store as { close: () => Promise<void> }).close();\n }\n}\n\nfunction formatTrigger(r: ScheduleRecord): string {\n if (r.config.cron) return \"cron: \" + r.config.cron;\n if (r.config.every) return \"every \" + r.config.every;\n if (r.config.at) return \"at \" + r.config.at;\n return \"?\";\n}\n\nfunction pad(s: string, len: number): string {\n return s.length >= len ? s : s + \" \".repeat(len - s.length);\n}\n\n// ── list ──────────────────────────────────────────────────────\n\nexport async function schedulesListCommand(): Promise<void> {\n const store = resolveStore();\n try {\n const records = await store.list();\n\n if (records.length === 0) {\n console.log(chalk.dim(\"No schedules found.\"));\n console.log(chalk.dim('Run \"tutti-ai schedule\" to start the scheduler daemon.'));\n return;\n }\n\n console.log(\"\");\n console.log(\n chalk.dim(\n \" \" + pad(\"ID\", 20) + pad(\"AGENT\", 16) +\n pad(\"TRIGGER\", 22) + pad(\"ENABLED\", 10) +\n pad(\"RUNS\", 8) + \"CREATED\",\n ),\n );\n console.log(chalk.dim(\" \" + \"─\".repeat(90)));\n\n for (const r of records) {\n const enabled = r.enabled\n ? chalk.green(\"yes\")\n : chalk.red(\"no\") + \" \";\n const maxLabel = r.config.max_runs\n ? r.run_count + \"/\" + r.config.max_runs\n : String(r.run_count);\n\n console.log(\n \" \" +\n chalk.bold(pad(r.id, 20)) +\n pad(r.agent_id, 16) +\n pad(formatTrigger(r), 22) +\n pad(enabled, 10) +\n pad(maxLabel, 8) +\n chalk.dim(r.created_at.toISOString().slice(0, 10)),\n );\n }\n console.log(\"\");\n } finally {\n await closeStore(store);\n }\n}\n\n// ── enable ────────────────────────────────────────────────────\n\nexport async function schedulesEnableCommand(id: string): Promise<void> {\n const store = resolveStore();\n try {\n const record = await store.get(id);\n if (!record) {\n console.error(chalk.red('Schedule \"' + id + '\" not found.'));\n process.exit(1);\n }\n await store.setEnabled(id, true);\n console.log(chalk.green('Schedule \"' + id + '\" enabled.'));\n } finally {\n await closeStore(store);\n }\n}\n\n// ── disable ───────────────────────────────────────────────────\n\nexport async function schedulesDisableCommand(id: string): Promise<void> {\n const store = resolveStore();\n try {\n const record = await store.get(id);\n if (!record) {\n console.error(chalk.red('Schedule \"' + id + '\" not found.'));\n process.exit(1);\n }\n await store.setEnabled(id, false);\n console.log(chalk.yellow('Schedule \"' + id + '\" disabled.'));\n } finally {\n await closeStore(store);\n }\n}\n\n// ── trigger ───────────────────────────────────────────────────\n\nexport async function schedulesTriggerCommand(\n id: string,\n scorePath?: string,\n): Promise<void> {\n const file = resolve(scorePath ?? \"./tutti.score.ts\");\n if (!existsSync(file)) {\n console.error(chalk.red(\"Score file not found: \" + file));\n process.exit(1);\n }\n\n const score = await ScoreLoader.load(file);\n const events = new EventBus();\n const sessions = new InMemorySessionStore();\n const runner = new AgentRunner(score.provider, events, sessions);\n const store = resolveStore();\n\n try {\n const record = await store.get(id);\n if (!record) {\n console.error(chalk.red('Schedule \"' + id + '\" not found.'));\n process.exit(1);\n }\n\n const agent = score.agents[record.agent_id];\n if (!agent) {\n console.error(chalk.red('Agent \"' + record.agent_id + '\" not found in score.'));\n process.exit(1);\n }\n\n const resolvedAgent = agent.model\n ? agent\n : { ...agent, model: score.default_model ?? \"claude-sonnet-4-20250514\" };\n\n const engine = new SchedulerEngine(store, runner, events);\n await engine.schedule(id, resolvedAgent, record.config);\n engine.start();\n\n console.log(chalk.cyan('Triggering \"' + id + '\" (' + record.agent_id + \")...\"));\n\n const run = await engine.trigger(id);\n\n engine.stop();\n\n if (run.error) {\n console.log(chalk.red(\" Error: \" + run.error));\n process.exit(1);\n }\n\n const duration = run.completed_at && run.triggered_at\n ? run.completed_at.getTime() - run.triggered_at.getTime()\n : 0;\n\n console.log(chalk.green(\" Completed in \" + duration + \"ms\"));\n if (run.result) {\n const preview = run.result.length > 200\n ? run.result.slice(0, 200) + \"...\"\n : run.result;\n console.log(chalk.dim(\" Output: \" + preview));\n }\n } finally {\n await closeStore(store);\n }\n}\n\n// ── runs ──────────────────────────────────────────────────────\n\nexport async function schedulesRunsCommand(id: string): Promise<void> {\n const store = resolveStore();\n try {\n const record = await store.get(id);\n if (!record) {\n console.error(chalk.red('Schedule \"' + id + '\" not found.'));\n process.exit(1);\n }\n\n // MemoryScheduleStore exposes getRuns(); Postgres tracks only run_count.\n if (\"getRuns\" in store && typeof (store as { getRuns: (id: string) => unknown[] }).getRuns === \"function\") {\n const runs = (store as { getRuns: (id: string) => Array<{\n triggered_at: Date;\n completed_at?: Date;\n result?: string;\n error?: string;\n }> }).getRuns(id);\n\n if (runs.length === 0) {\n console.log(chalk.dim(\"No runs recorded for this schedule.\"));\n return;\n }\n\n const recent = runs.slice(-20);\n console.log(\"\");\n console.log(chalk.dim(\" Showing last \" + recent.length + \" of \" + runs.length + \" runs:\"));\n console.log(\"\");\n\n for (const run of recent) {\n const duration = run.completed_at && run.triggered_at\n ? (run.completed_at.getTime() - run.triggered_at.getTime()) + \"ms\"\n : \"?\";\n const status = run.error\n ? chalk.red(\"error\")\n : chalk.green(\"ok\");\n const preview = run.error\n ? run.error.slice(0, 80)\n : (run.result ?? \"\").slice(0, 80);\n console.log(\n \" \" + chalk.dim(run.triggered_at.toISOString()) + \" \" +\n status + \" \" + chalk.dim(duration) + \" \" + preview,\n );\n }\n console.log(\"\");\n } else {\n // Postgres store — only has run_count, not full history\n console.log(chalk.dim('Schedule \"' + id + '\" has completed ' + record.run_count + \" runs.\"));\n console.log(chalk.dim(\"Full run history requires the MemoryScheduleStore or a future tutti_schedule_runs table.\"));\n }\n } finally {\n await closeStore(store);\n }\n}\n","/**\n * `tutti-ai traces <subcommand>` — list, show, and tail traces emitted\n * by a running `tutti-ai serve` process.\n *\n * All three subcommands talk to the server's `/traces` route family.\n * The CLI never reads spans from a local tracer because traces are\n * per-process and the CLI runs in a separate process from the agent.\n */\n\nimport chalk from \"chalk\";\nimport { SecretsManager } from \"@tuttiai/core\";\nimport type { TraceSummary, TuttiSpan } from \"@tuttiai/core\";\n\nimport {\n renderSpanLine,\n renderTraceShow,\n renderTracesList,\n} from \"./traces-render.js\";\n\nconst DEFAULT_SERVER_URL = \"http://127.0.0.1:3847\";\n\n/** Common command-line options shared by all three subcommands. */\nexport interface TracesOptions {\n /** Base URL of the `tutti-ai serve` process. Defaults to localhost:3847. */\n url?: string;\n /** Bearer token. Falls back to TUTTI_API_KEY env var. */\n apiKey?: string;\n}\n\nfunction resolveUrl(opts: TracesOptions): string {\n return opts.url ?? SecretsManager.optional(\"TUTTI_SERVER_URL\") ?? DEFAULT_SERVER_URL;\n}\n\nfunction resolveAuthHeader(opts: TracesOptions): Record<string, string> {\n const key = opts.apiKey ?? SecretsManager.optional(\"TUTTI_API_KEY\");\n return key ? { Authorization: \"Bearer \" + key } : {};\n}\n\nfunction explainConnectionError(err: unknown, baseUrl: string): never {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(chalk.red(\"Failed to reach Tutti server at \" + baseUrl));\n console.error(chalk.dim(\" \" + msg));\n console.error(chalk.dim(' Is `tutti-ai serve` running? Set --url or TUTTI_SERVER_URL to override.'));\n process.exit(1);\n}\n\n// ── list ──────────────────────────────────────────────────────\n\nexport async function tracesListCommand(opts: TracesOptions): Promise<void> {\n const baseUrl = resolveUrl(opts);\n const url = baseUrl.replace(/\\/$/, \"\") + \"/traces\";\n let res: Response;\n try {\n res = await fetch(url, { headers: resolveAuthHeader(opts) });\n } catch (err) {\n explainConnectionError(err, baseUrl);\n }\n\n if (res.status === 401) {\n console.error(chalk.red(\"Unauthorized — set --api-key or TUTTI_API_KEY.\"));\n process.exit(1);\n }\n if (!res.ok) {\n console.error(chalk.red(\"Server returned \" + res.status + \" \" + res.statusText));\n process.exit(1);\n }\n\n const body = (await res.json()) as { traces: TraceSummary[] };\n console.log(renderTracesList(body.traces));\n}\n\n// ── show ──────────────────────────────────────────────────────\n\nexport async function tracesShowCommand(\n traceId: string,\n opts: TracesOptions,\n): Promise<void> {\n const baseUrl = resolveUrl(opts);\n const url = baseUrl.replace(/\\/$/, \"\") + \"/traces/\" + encodeURIComponent(traceId);\n let res: Response;\n try {\n res = await fetch(url, { headers: resolveAuthHeader(opts) });\n } catch (err) {\n explainConnectionError(err, baseUrl);\n }\n\n if (res.status === 404) {\n console.error(chalk.red('Trace \"' + traceId + '\" not found.'));\n process.exit(1);\n }\n if (res.status === 401) {\n console.error(chalk.red(\"Unauthorized — set --api-key or TUTTI_API_KEY.\"));\n process.exit(1);\n }\n if (!res.ok) {\n console.error(chalk.red(\"Server returned \" + res.status + \" \" + res.statusText));\n process.exit(1);\n }\n\n const body = (await res.json()) as { trace_id: string; spans: TuttiSpan[] };\n // Dates round-trip as ISO strings; the renderer expects Date objects.\n const spans = body.spans.map(reviveSpanDates);\n console.log(renderTraceShow(spans));\n}\n\n// ── tail ──────────────────────────────────────────────────────\n\nexport async function tracesTailCommand(opts: TracesOptions): Promise<void> {\n const baseUrl = resolveUrl(opts);\n const url = baseUrl.replace(/\\/$/, \"\") + \"/traces/stream\";\n\n console.error(chalk.dim(\"Tailing traces from \" + baseUrl + \" — Ctrl+C to exit\"));\n console.error(\"\");\n\n const controller = new AbortController();\n process.once(\"SIGINT\", () => {\n controller.abort();\n console.error(\"\");\n console.error(chalk.dim(\"Disconnected.\"));\n process.exit(0);\n });\n\n let res: Response;\n try {\n res = await fetch(url, {\n headers: { ...resolveAuthHeader(opts), Accept: \"text/event-stream\" },\n signal: controller.signal,\n });\n } catch (err) {\n if (controller.signal.aborted) return;\n explainConnectionError(err, baseUrl);\n }\n\n if (res.status === 401) {\n console.error(chalk.red(\"Unauthorized — set --api-key or TUTTI_API_KEY.\"));\n process.exit(1);\n }\n if (!res.ok || !res.body) {\n console.error(chalk.red(\"Server returned \" + res.status + \" \" + res.statusText));\n process.exit(1);\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n for (;;) {\n let chunk: ReadableStreamReadResult<Uint8Array>;\n try {\n chunk = await reader.read();\n } catch {\n // Aborted via SIGINT.\n return;\n }\n if (chunk.done) break;\n buffer += decoder.decode(chunk.value, { stream: true });\n\n let frameEnd: number;\n while ((frameEnd = buffer.indexOf(\"\\n\\n\")) !== -1) {\n const frame = buffer.slice(0, frameEnd);\n buffer = buffer.slice(frameEnd + 2);\n const dataLine = frame.split(\"\\n\").find((l) => l.startsWith(\"data: \"));\n if (!dataLine) continue;\n try {\n const span = reviveSpanDates(JSON.parse(dataLine.slice(6)) as TuttiSpan);\n console.log(renderSpanLine(span, 0));\n } catch (err) {\n console.error(chalk.red(\"Bad SSE frame: \" + (err instanceof Error ? err.message : String(err))));\n }\n }\n }\n}\n\n/**\n * Convert ISO date strings on a wire-format span back to `Date` objects\n * so the render functions can call `.getTime()` etc.\n */\nfunction reviveSpanDates(span: TuttiSpan): TuttiSpan {\n return {\n ...span,\n started_at: new Date(span.started_at as unknown as string),\n ...(span.ended_at !== undefined\n ? { ended_at: new Date(span.ended_at as unknown as string) }\n : {}),\n };\n}\n","/**\n * Pure rendering functions for the `tutti-ai traces` command.\n *\n * Split from `traces.ts` so they stay in the coverage scope while the\n * HTTP fetching, SSE consumption, and signal handling stay excluded.\n */\n\nimport chalk from \"chalk\";\nimport type {\n SpanKind,\n SpanStatus,\n TraceSummary,\n TuttiSpan,\n} from \"@tuttiai/core\";\n\n/** Visible width of an ANSI-coloured string. */\nfunction visibleLen(s: string): number {\n // eslint-disable-next-line no-control-regex\n return s.replace(/\\u001b\\[[0-9;]*m/g, \"\").length;\n}\n\n/** Right-pad to `len` accounting for ANSI escape sequences. */\nfunction pad(s: string, len: number): string {\n const v = visibleLen(s);\n return v >= len ? s : s + \" \".repeat(len - v);\n}\n\nfunction colorStatus(status: SpanStatus): string {\n if (status === \"ok\") return chalk.green(\"ok\");\n if (status === \"error\") return chalk.red(\"error\");\n return chalk.yellow(\"running\");\n}\n\nfunction formatCost(cost: number | null): string {\n if (cost === null) return chalk.dim(\"—\");\n if (cost === 0) return \"$0\";\n // 6 decimals covers fractions of a cent on cheap models without\n // exploding the column width.\n return \"$\" + cost.toFixed(6);\n}\n\nfunction formatTokens(n: number): string {\n return n > 0 ? String(n) : chalk.dim(\"—\");\n}\n\nfunction formatDuration(ms: number | null): string {\n if (ms === null) return chalk.dim(\"—\");\n return ms + \"ms\";\n}\n\n/**\n * Render a list of trace summaries as a fixed-width table. Empty input\n * renders a friendly \"no traces\" message.\n *\n * Sort order is the caller's responsibility (server returns most-recent-\n * first); this function preserves the input order.\n */\nexport function renderTracesList(traces: readonly TraceSummary[]): string {\n if (traces.length === 0) {\n return chalk.dim(\"No traces found.\");\n }\n\n const lines: string[] = [];\n lines.push(\"\");\n lines.push(\n chalk.dim(\n \" \" +\n pad(\"TRACE\", 10) +\n pad(\"AGENT\", 18) +\n pad(\"STARTED\", 12) +\n pad(\"DURATION\", 12) +\n pad(\"STATUS\", 12) +\n pad(\"TOKENS\", 10) +\n \"COST\",\n ),\n );\n lines.push(chalk.dim(\" \" + \"─\".repeat(80)));\n\n for (const t of traces) {\n const traceShort = t.trace_id.slice(0, 8);\n // ISO format: 2026-04-15T12:34:56.789Z → take HH:MM:SS slice.\n const startedShort = t.started_at.slice(11, 19);\n\n lines.push(\n \" \" +\n chalk.bold(pad(traceShort, 10)) +\n pad(t.agent_id ?? chalk.dim(\"—\"), 18) +\n pad(startedShort, 12) +\n pad(formatDuration(t.duration_ms), 12) +\n pad(colorStatus(t.status), 12) +\n pad(formatTokens(t.total_tokens), 10) +\n formatCost(t.cost_usd),\n );\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n/** Single-character icon per span kind. */\nconst SPAN_ICONS: Record<SpanKind, string> = {\n agent: \"▶\",\n llm: \"◆\",\n tool: \"⚙\",\n guardrail: \"🛡\",\n checkpoint: \"💾\",\n};\n\n/**\n * Render a single span line. Exported so `traces tail` can reuse the same\n * formatting for individual spans arriving over SSE.\n */\nexport function renderSpanLine(span: TuttiSpan, indent: number): string {\n const icon = SPAN_ICONS[span.kind];\n const indentStr = \" \".repeat(indent);\n const dur =\n span.duration_ms !== undefined\n ? chalk.dim(\" \" + span.duration_ms + \"ms \")\n : chalk.dim(\" (running) \");\n const status = colorStatus(span.status);\n const attrs = formatAttrs(span);\n const attrSuffix = attrs ? chalk.dim(\" · \" + attrs) : \"\";\n return indentStr + icon + \" \" + chalk.bold(span.name) + dur + status + attrSuffix;\n}\n\nfunction formatAttrs(span: TuttiSpan): string {\n const a = span.attributes;\n const parts: string[] = [];\n if (span.kind === \"agent\") {\n if (a.agent_id !== undefined) parts.push(\"agent=\" + a.agent_id);\n if (a.model !== undefined) parts.push(\"model=\" + a.model);\n } else if (span.kind === \"llm\") {\n if (a.model !== undefined) parts.push(\"model=\" + a.model);\n if (a.total_tokens !== undefined) parts.push(a.total_tokens + \" tok\");\n if (a.cost_usd !== undefined) parts.push(formatCost(a.cost_usd));\n } else if (span.kind === \"tool\") {\n if (a.tool_name !== undefined) parts.push(a.tool_name);\n } else if (span.kind === \"guardrail\") {\n if (a.guardrail_name !== undefined) parts.push(a.guardrail_name);\n if (a.guardrail_action !== undefined) parts.push(\"→ \" + a.guardrail_action);\n } else if (span.kind === \"checkpoint\") {\n if (a.session_id !== undefined) parts.push(\"session=\" + a.session_id.slice(0, 8));\n }\n if (span.error?.message) {\n parts.push(chalk.red(\"error: \" + span.error.message));\n }\n return parts.join(\" · \");\n}\n\n/**\n * Render every span belonging to one trace as an indented tree, with a\n * summary footer (token total, cost, wall time of the root span).\n *\n * The caller is expected to have already filtered `spans` to a single\n * trace — usually the response of `GET /traces/:id`. Spans whose parent\n * is missing from the input become additional roots so partial fragments\n * left over from ring-buffer eviction still render.\n */\nexport function renderTraceShow(spans: readonly TuttiSpan[]): string {\n if (spans.length === 0) {\n return chalk.dim(\"No spans found for this trace.\");\n }\n\n const childrenByParent = new Map<string, TuttiSpan[]>();\n const presentSpanIds = new Set(spans.map((s) => s.span_id));\n const roots: TuttiSpan[] = [];\n\n for (const span of spans) {\n const parent = span.parent_span_id;\n if (parent === undefined || !presentSpanIds.has(parent)) {\n roots.push(span);\n continue;\n }\n const arr = childrenByParent.get(parent) ?? [];\n arr.push(span);\n childrenByParent.set(parent, arr);\n }\n\n // Stable child ordering: insertion order from the tracer is the natural\n // execution order, so use that. The .sort() call below for roots is\n // for the rare multi-root edge case (eviction).\n roots.sort((a, b) => a.started_at.getTime() - b.started_at.getTime());\n\n const lines: string[] = [\"\"];\n\n function walk(span: TuttiSpan, indent: number): void {\n lines.push(renderSpanLine(span, indent));\n const kids = childrenByParent.get(span.span_id);\n if (!kids) return;\n for (const child of kids) {\n walk(child, indent + 1);\n }\n }\n\n for (const root of roots) walk(root, 0);\n\n // Footer: aggregate from llm.completion spans + root span wall time.\n let total_tokens = 0;\n let total_cost = 0;\n let any_cost = false;\n for (const s of spans) {\n if (s.name !== \"llm.completion\") continue;\n total_tokens += s.attributes.total_tokens ?? 0;\n if (s.attributes.cost_usd !== undefined) {\n total_cost += s.attributes.cost_usd;\n any_cost = true;\n }\n }\n // Wall time = duration of the earliest top-level root that has one.\n const wall_ms = roots\n .map((r) => r.duration_ms)\n .find((d): d is number => d !== undefined);\n\n lines.push(\"\");\n lines.push(chalk.dim(\"─\".repeat(60)));\n lines.push(\n chalk.dim(\"Total: \") +\n chalk.bold(formatTokens(total_tokens)) +\n chalk.dim(\" tokens · \") +\n chalk.bold(any_cost ? formatCost(total_cost) : chalk.dim(\"—\")) +\n chalk.dim(\" cost · \") +\n chalk.bold(wall_ms !== undefined ? wall_ms + \"ms\" : chalk.dim(\"—\")) +\n chalk.dim(\" wall\"),\n );\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n","/**\n * `tutti-ai memory <subcommand>` — manage per-user memories from the\n * shell.\n *\n * Connects to the same Postgres store the runtime uses (via TUTTI_PG_URL).\n * Falls back to the in-memory store when TUTTI_PG_URL is unset, but the\n * in-memory case is degenerate for CLI use (each invocation is a fresh\n * process with empty state) — we warn loudly so operators don't\n * misunderstand.\n */\n\nimport { writeFileSync } from \"node:fs\";\nimport chalk from \"chalk\";\nimport Enquirer from \"enquirer\";\nimport {\n MemoryUserMemoryStore,\n PostgresUserMemoryStore,\n SecretsManager,\n createLogger,\n type UserMemoryImportance,\n type UserMemoryStore,\n} from \"@tuttiai/core\";\n\nimport {\n exportMemoriesCsv,\n exportMemoriesJson,\n renderMemoryAdded,\n renderMemoryCleared,\n renderMemoryDeleted,\n renderMemoryList,\n renderMemorySearch,\n} from \"./memory-render.js\";\n\nconst logger = createLogger(\"tutti-cli\");\nconst { prompt } = Enquirer;\n\n/** Common opts every subcommand accepts. */\nexport interface MemoryOptions {\n user?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Store resolution */\n/* ------------------------------------------------------------------ */\n\nfunction resolveStore(): UserMemoryStore & { close?: () => Promise<void> } {\n const pgUrl = SecretsManager.optional(\"TUTTI_PG_URL\");\n if (pgUrl) {\n return new PostgresUserMemoryStore({ connection_string: pgUrl });\n }\n logger.warn(\n \"TUTTI_PG_URL not set — using in-memory store \" +\n \"(memories are ephemeral; this command will appear to do nothing useful)\",\n );\n return new MemoryUserMemoryStore();\n}\n\nasync function closeStore(\n store: UserMemoryStore & { close?: () => Promise<void> },\n): Promise<void> {\n if (typeof store.close === \"function\") {\n await store.close();\n }\n}\n\nfunction requireUser(opts: MemoryOptions): string {\n if (!opts.user || opts.user.trim() === \"\") {\n console.error(chalk.red(\"--user <user-id> is required\"));\n process.exit(1);\n }\n return opts.user.trim();\n}\n\nfunction parseImportance(raw: string | undefined): UserMemoryImportance {\n if (raw === undefined) return 2;\n if (raw === \"1\") return 1;\n if (raw === \"2\") return 2;\n if (raw === \"3\") return 3;\n console.error(chalk.red(\"--importance must be 1, 2, or 3\"));\n process.exit(1);\n}\n\n/* ------------------------------------------------------------------ */\n/* list */\n/* ------------------------------------------------------------------ */\n\nexport async function memoryListCommand(opts: MemoryOptions): Promise<void> {\n const userId = requireUser(opts);\n const store = resolveStore();\n try {\n const memories = await store.list(userId);\n console.log(renderMemoryList(memories, userId));\n } finally {\n await closeStore(store);\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* search */\n/* ------------------------------------------------------------------ */\n\nexport async function memorySearchCommand(\n query: string,\n opts: MemoryOptions,\n): Promise<void> {\n const userId = requireUser(opts);\n if (query.trim() === \"\") {\n console.error(chalk.red(\"Search query is required\"));\n process.exit(1);\n }\n const store = resolveStore();\n try {\n const memories = await store.search(userId, query);\n console.log(renderMemorySearch(memories, userId, query));\n } finally {\n await closeStore(store);\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* add */\n/* ------------------------------------------------------------------ */\n\nexport async function memoryAddCommand(\n content: string,\n opts: MemoryOptions & { importance?: string },\n): Promise<void> {\n const userId = requireUser(opts);\n if (content.trim() === \"\") {\n console.error(chalk.red(\"Memory content is required\"));\n process.exit(1);\n }\n const importance = parseImportance(opts.importance);\n const store = resolveStore();\n try {\n const stored = await store.store(userId, content.trim(), {\n source: \"explicit\",\n importance,\n });\n console.log(renderMemoryAdded(stored));\n } finally {\n await closeStore(store);\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* delete */\n/* ------------------------------------------------------------------ */\n\nexport async function memoryDeleteCommand(\n memoryId: string,\n opts: MemoryOptions,\n): Promise<void> {\n // --user is required for symmetry with the other subcommands and so\n // operators don't accidentally run a `delete` keyed only on a 36-char\n // UUID across whatever user happens to own it.\n requireUser(opts);\n const store = resolveStore();\n try {\n await store.delete(memoryId);\n console.log(renderMemoryDeleted(memoryId));\n } finally {\n await closeStore(store);\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* clear */\n/* ------------------------------------------------------------------ */\n\nexport async function memoryClearCommand(opts: MemoryOptions): Promise<void> {\n const userId = requireUser(opts);\n const store = resolveStore();\n try {\n const memories = await store.list(userId);\n if (memories.length === 0) {\n console.log(chalk.dim('No memories stored for user \"' + userId + '\".'));\n return;\n }\n\n const { confirm } = await prompt<{ confirm: boolean }>({\n type: \"confirm\",\n name: \"confirm\",\n message:\n \"Delete all \" +\n memories.length +\n ' memories for user \"' + userId + '\"?',\n initial: false,\n });\n\n if (!confirm) {\n console.log(chalk.dim(\" Cancelled.\"));\n return;\n }\n\n await store.deleteAll(userId);\n console.log(renderMemoryCleared(userId, memories.length));\n } finally {\n await closeStore(store);\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* export */\n/* ------------------------------------------------------------------ */\n\nexport async function memoryExportCommand(\n opts: MemoryOptions & { format?: string; out?: string },\n): Promise<void> {\n const userId = requireUser(opts);\n const format = (opts.format ?? \"json\").toLowerCase();\n if (format !== \"json\" && format !== \"csv\") {\n console.error(chalk.red(\"--format must be 'json' or 'csv'\"));\n process.exit(1);\n }\n const store = resolveStore();\n try {\n const memories = await store.list(userId);\n const body =\n format === \"json\"\n ? exportMemoriesJson(memories)\n : exportMemoriesCsv(memories);\n\n if (opts.out) {\n writeFileSync(opts.out, body, \"utf8\");\n console.log(\n chalk.green(\"✓\") +\n \" Wrote \" +\n chalk.bold(String(memories.length)) +\n \" memor\" +\n (memories.length === 1 ? \"y\" : \"ies\") +\n \" to \" +\n chalk.bold(opts.out),\n );\n } else {\n // Stream to stdout so callers can pipe to jq / xsv / etc.\n process.stdout.write(body);\n }\n } finally {\n await closeStore(store);\n }\n}\n","/**\n * Pure rendering functions for the `tutti-ai memory` command.\n *\n * Split from `memory.ts` so they stay in the coverage scope while the\n * Postgres I/O, Enquirer prompts, and process-exit handling stay\n * excluded.\n */\n\nimport chalk from \"chalk\";\nimport type { UserMemory, UserMemoryImportance } from \"@tuttiai/core\";\n\n/** Visible width of an ANSI-coloured string. */\nfunction visibleLen(s: string): number {\n // eslint-disable-next-line no-control-regex\n return s.replace(/\\u001b\\[[0-9;]*m/g, \"\").length;\n}\n\n/** Right-pad to `len` accounting for ANSI escape sequences. */\nfunction pad(s: string, len: number): string {\n const v = visibleLen(s);\n return v >= len ? s : s + \" \".repeat(len - v);\n}\n\n/** Truncate text to `max` chars, appending `…` when cut. */\nfunction truncate(text: string, max: number): string {\n const oneLine = text.replace(/\\s+/g, \" \").trim();\n return oneLine.length > max ? oneLine.slice(0, max - 1) + \"\\u2026\" : oneLine;\n}\n\n/** Render importance as a 3-star bar. */\nexport function importanceStars(importance: UserMemoryImportance): string {\n if (importance === 3) return \"\\u2605\\u2605\\u2605\"; // ★★★\n if (importance === 2) return \"\\u2605\\u2605\\u2606\"; // ★★☆\n return \"\\u2605\\u2606\\u2606\"; // ★☆☆\n}\n\n/** Format a Date as a short `YYYY-MM-DD HH:MM` UTC string. */\nfunction formatDate(d: Date): string {\n // toISOString → \"2026-04-15T10:30:45.789Z\"; slice \"YYYY-MM-DD HH:MM\".\n const iso = d.toISOString();\n return iso.slice(0, 10) + \" \" + iso.slice(11, 16);\n}\n\n/** Sort by importance DESC, then created_at DESC. Matches the spec for `list`. */\nfunction sortMemoriesForList(memories: readonly UserMemory[]): UserMemory[] {\n return [...memories].sort((a, b) => {\n if (a.importance !== b.importance) return b.importance - a.importance;\n return b.created_at.getTime() - a.created_at.getTime();\n });\n}\n\n/**\n * Render the per-memory table that `memory list` and `memory search`\n * share. `header` lets each command label its own context (the search\n * query, the user id, etc.) without duplicating column setup.\n */\nfunction renderTable(\n memories: readonly UserMemory[],\n emptyMessage: string,\n): string {\n if (memories.length === 0) return chalk.dim(emptyMessage);\n\n const lines: string[] = [];\n lines.push(\"\");\n lines.push(\n chalk.dim(\n \" \" +\n pad(\"ID\", 10) +\n pad(\"CONTENT\", 62) +\n pad(\"SOURCE\", 12) +\n pad(\"IMPORTANCE\", 14) +\n \"CREATED\",\n ),\n );\n lines.push(chalk.dim(\" \" + \"\\u2500\".repeat(110)));\n\n for (const m of memories) {\n const idShort = m.id.slice(0, 8);\n const content = truncate(m.content, 60);\n const sourceColored =\n m.source === \"explicit\" ? chalk.green(\"explicit\") : chalk.yellow(\"inferred\");\n const importance = importanceStars(m.importance);\n const created = formatDate(m.created_at);\n\n lines.push(\n \" \" +\n chalk.bold(pad(idShort, 10)) +\n pad(content, 62) +\n pad(sourceColored, 12) +\n pad(importance, 14) +\n chalk.dim(created),\n );\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n/**\n * Render every memory in the input as a table, sorted by\n * `(importance DESC, created_at DESC)` per the spec. `userId` is used\n * only for the empty-state message.\n */\nexport function renderMemoryList(\n memories: readonly UserMemory[],\n userId: string,\n): string {\n return renderTable(\n sortMemoriesForList(memories),\n 'No memories stored for user \"' + userId + '\".',\n );\n}\n\n/**\n * Render search results. The store has already ranked these by\n * relevance, so this preserves input order rather than re-sorting.\n * The header reproduces the query so output stays self-describing\n * when piped or redirected.\n */\nexport function renderMemorySearch(\n memories: readonly UserMemory[],\n userId: string,\n query: string,\n): string {\n const header =\n chalk.dim(\n 'Search for ' + chalk.bold('\"' + query + '\"') + ' in user \"' + userId + '\" — ' +\n memories.length + \" result\" + (memories.length === 1 ? \"\" : \"s\"),\n );\n const body = renderTable(\n memories,\n 'No memories matching \"' + query + '\" for user \"' + userId + '\".',\n );\n return header + body;\n}\n\n/** Confirmation line shown after `memory add`. */\nexport function renderMemoryAdded(memory: UserMemory): string {\n return (\n chalk.green(\"✓\") +\n \" Stored memory \" +\n chalk.bold(memory.id.slice(0, 8)) +\n chalk.dim(\" (\" + memory.source + \", \" + importanceStars(memory.importance) + \")\")\n );\n}\n\n/** Confirmation line shown after `memory delete`. */\nexport function renderMemoryDeleted(memoryId: string): string {\n return chalk.green(\"✓\") + \" Deleted memory \" + chalk.bold(memoryId.slice(0, 8));\n}\n\n/** Confirmation line shown after `memory clear`. */\nexport function renderMemoryCleared(userId: string, count: number): string {\n return (\n chalk.green(\"✓\") +\n \" Deleted \" +\n chalk.bold(String(count)) +\n \" memor\" +\n (count === 1 ? \"y\" : \"ies\") +\n ' for user \"' + userId + '\"'\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Export formats */\n/* ------------------------------------------------------------------ */\n\n/** Newline-suffixed JSON dump of the memories. Pretty-printed for diffability. */\nexport function exportMemoriesJson(memories: readonly UserMemory[]): string {\n return JSON.stringify(memories, null, 2) + \"\\n\";\n}\n\n/**\n * RFC-4180-ish CSV: comma-separated, double-quote any field that\n * contains a comma / quote / newline; embedded quotes doubled. `tags`\n * is joined with `;` so it survives spreadsheet round-tripping.\n */\nexport function exportMemoriesCsv(memories: readonly UserMemory[]): string {\n const headers = [\n \"id\",\n \"user_id\",\n \"content\",\n \"source\",\n \"importance\",\n \"tags\",\n \"created_at\",\n \"last_accessed_at\",\n \"expires_at\",\n ];\n const rows: string[] = [headers.join(\",\")];\n\n for (const m of memories) {\n rows.push(\n [\n m.id,\n m.user_id,\n m.content,\n m.source,\n String(m.importance),\n m.tags?.join(\";\") ?? \"\",\n m.created_at.toISOString(),\n m.last_accessed_at?.toISOString() ?? \"\",\n m.expires_at?.toISOString() ?? \"\",\n ]\n .map(csvEscape)\n .join(\",\"),\n );\n }\n return rows.join(\"\\n\") + \"\\n\";\n}\n\nfunction csvEscape(field: string): string {\n if (/[\",\\n\\r]/.test(field)) {\n return '\"' + field.replace(/\"/g, '\"\"') + '\"';\n }\n return field;\n}\n"],"mappings":"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","names":["createLogger","existsSync","resolve","chalk","createLogger","logger","createLogger","resolve","existsSync","chalk","existsSync","resolve","createInterface","chalk","ora","AnthropicProvider","GeminiProvider","OpenAIProvider","ScoreLoader","SecretsManager","TuttiRuntime","createLogger","logger","existsSync","resolve","chalk","ora","createLogger","logger","existsSync","resolve","chalk","ScoreLoader","AnthropicProvider","OpenAIProvider","GeminiProvider","SecretsManager","createLogger","logger","existsSync","resolve","chalk","TuttiRuntime","ScoreLoader","createLogger","logger","existsSync","readFileSync","resolve","chalk","ora","createLogger","logger","existsSync","readFileSync","resolve","execSync","chalk","ora","Enquirer","createLogger","SecretsManager","prompt","logger","fail","ok","existsSync","readFileSync","resolve","chalk","ora","ScoreLoader","createLogger","logger","existsSync","resolve","chalk","TuttiRuntime","ScoreLoader","AnthropicProvider","OpenAIProvider","GeminiProvider","SecretsManager","InMemorySessionStore","createLogger","logger","createLogger","resolve","existsSync","chalk","ScoreLoader","AnthropicProvider","OpenAIProvider","GeminiProvider","SecretsManager","InMemorySessionStore","buildRuntime","TuttiRuntime","existsSync","resolve","chalk","ScoreLoader","InMemorySessionStore","SecretsManager","createLogger","logger","execSync","existsSync","readFileSync","resolve","chalk","ora","updateSpinner","execSync","existsSync","readFileSync","resolve","chalk","ora","getLatestVersion","existsSync","readFileSync","resolve","chalk","ScoreLoader","createLogger","logger","pad","execSync","existsSync","readFileSync","resolve","chalk","ora","detectPackageManager","resolvePackageName","existsSync","resolve","createInterface","chalk","ora","ScoreLoader","TuttiRuntime","SecretsManager","createLogger","chalk","messageToText","excerpt","logger","createLogger","SecretsManager","chalk","ora","createInterface","prompt","resolve","existsSync","messageToText","ScoreLoader","TuttiRuntime","existsSync","resolve","chalk","ScoreLoader","SchedulerEngine","PostgresScheduleStore","MemoryScheduleStore","AgentRunner","EventBus","InMemorySessionStore","SecretsManager","createLogger","logger","resolveStore","pad","run","chalk","SecretsManager","chalk","pad","SecretsManager","chalk","writeFileSync","chalk","Enquirer","SecretsManager","createLogger","chalk","visibleLen","pad","logger","createLogger","prompt","Enquirer","resolveStore","SecretsManager","closeStore","chalk","writeFileSync","logger","createLogger"]}
|