@sonnechasser/ntrp 0.1.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/demo/whimsy-smoke.js +394 -0
- package/dist/demo/whimsy-smoke.js.map +1 -0
- package/dist/index.js +23728 -0
- package/dist/index.js.map +1 -0
- package/dist/investigation/verbosity-cli.js +14297 -0
- package/dist/investigation/verbosity-cli.js.map +1 -0
- package/dist/mcp/server.js +15074 -0
- package/dist/mcp/server.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/args.ts","../src/ai/llm/thread-compat.ts","../src/io/context.ts","../src/db/connection.ts","../src/output/formatters.ts","../src/db/queries.ts","../src/db/schema.ts","../src/cli/context.ts","../src/config/store.ts","../src/config/llm-config.ts","../src/cli/argparse.ts","../src/cli/repl-globals.ts","../src/ui/theme.ts","../src/cli/prompts.ts","../src/cli/admin-confirm.ts","../src/services/scratch-wipe.ts","../src/config/profile.ts","../src/ui/layout.ts","../src/ui/markdown.ts","../src/ui/banner.ts","../src/ai/llm/gate.ts","../src/ai/repl-api.ts","../src/demo/taxonomy-cache.ts","../src/ai/llm/types.ts","../src/ai/llm/errors.ts","../src/ai/llm/adapters/anthropic.ts","../src/ai/llm/adapters/openai.ts","../src/ai/llm/catalog.ts","../src/ai/llm/surfaces.ts","../src/ai/llm/session-state.ts","../src/ai/llm/resolver.ts","../src/ai/llm/failover.ts","../src/ai/llm/complete.ts","../src/ai/profile-draft.ts","../src/ai/profile-clarify.ts","../src/baselines/profile-presets.ts","../src/baselines/defaults.ts","../src/baselines/resolve.ts","../src/commands/profile.ts","../src/commands/onboard.ts","../src/commands/scratch.ts","../src/commands/cleanup.ts","../src/config/demo.ts","../src/commands/deactivate-demo.ts","../src/cli/global-admin.ts","../src/cli/post-action.ts","../src/io/types.ts","../src/io/errors.ts","../src/io/emit.ts","../src/pipeline/csv-parse.ts","../src/pipeline/csv-mappings.ts","../src/pipeline/csv-detect.ts","../src/pipeline/importer.ts","../src/pipeline/resolver.ts","../src/demo/seed.ts","../src/demo/scenarios.ts","../src/demo/data-pools.ts","../src/demo/factories/organizations.ts","../src/demo/whimsy-names.ts","../src/demo/factories/people.ts","../src/demo/factories/opportunities.ts","../src/demo/factories/activities.ts","../src/demo/factories/saas-enrichment.ts","../src/demo/exporters/salesforce.ts","../src/demo/exporters/hubspot.ts","../src/demo/exporters/outreach.ts","../src/demo/generator.ts","../src/output/llm-attribution.ts","../src/output/terminal.ts","../src/ai/demo-taxonomy.ts","../src/commands/generate.ts","../src/metrics/classify-source.ts","../src/pipeline/revenue-importer.ts","../src/commands/ingest.ts","../src/pipeline/segments.ts","../src/baselines/metrics-benchmarks.ts","../src/vitals/shared.ts","../src/vitals/freshness.ts","../src/vitals/flow-rate.ts","../src/vitals/drop-rate.ts","../src/vitals/signal-to-noise.ts","../src/vitals/thread-depth.ts","../src/vitals/health-score.ts","../src/metrics/helpers.ts","../src/metrics/coverage.ts","../src/metrics/context.ts","../src/metrics/revenue.ts","../src/metrics/retention.ts","../src/metrics/pipeline.ts","../src/metrics/sales-efficiency.ts","../src/metrics/unit-economics.ts","../src/metrics/confidence.ts","../src/metrics/periods.ts","../src/metrics/compute.ts","../src/data/playbook.ts","../src/ai/prompt-parts.ts","../src/ai/json-response.ts","../src/ai/metrics-findings.ts","../src/metrics/companion.ts","../src/services/metrics-analysis.ts","../src/metrics/insights.ts","../src/output/metrics-report.ts","../src/pipeline/divergence.ts","../src/ai/findings.ts","../src/ai/web-search.ts","../src/ai/tool-schemas.ts","../src/ai/privacy.ts","../src/conversation/agent-context.ts","../src/conversation/scope.ts","../src/conversation/phase.ts","../src/conversation/gap-audit.ts","../src/conversation/gap-card.ts","../src/conversation/compute.ts","../src/conversation/ingest-chat.ts","../src/services/session-analysis.ts","../src/conversation/handoff-draft.ts","../src/ai/tool-handlers.ts","../src/ai/agentic-loop.ts","../src/services/diagnosis.ts","../src/services/serialize.ts","../src/commands/diagnose.ts","../src/commands/new.ts","../src/commands/end.ts","../src/commands/session.ts","../src/output/markdown.ts","../src/output/json.ts","../src/output/path-safety.ts","../src/services/report.ts","../src/output/metrics-markdown.ts","../src/commands/report.ts","../src/output/notes-export.ts","../src/commands/export.ts","../src/commands/backmeup.ts","../src/repositories/bundle.ts","../src/repositories/markdown.ts","../src/repositories/adapters.ts","../src/services/publish.ts","../src/commands/publish.ts","../src/commands/handoff.ts","../src/services/actions.ts","../src/commands/actions.ts","../src/commands/segment.ts","../src/ai/strategy-normalize.ts","../src/strategies/readers.ts","../src/strategies/library.ts","../src/strategies/connectors.ts","../src/services/strategy.ts","../src/commands/strategy.ts","../src/services/status.ts","../src/commands/status.ts","../src/commands/reset.ts","../src/commands/playbook.ts","../src/commands/config.ts","../src/license/verify.ts","../src/commands/activate.ts","../src/services/setup.ts","../src/commands/setup.ts","../src/conversation/orchestrator.ts","../src/ai/explore-mode.ts","../src/ai/thread.ts","../src/ai/embeddings.ts","../src/memory/retrieval.ts","../src/memory/knowledge.ts","../src/memory/store.ts","../src/services/smoke-protocol.ts","../src/cli/nl.ts","../src/services/ask.ts","../src/commands/ask.ts","../src/commands/metrics.ts","../src/ai/feedback-apply.ts","../src/commands/feedback.ts","../src/commands/recap.ts","../src/commands/remember.ts","../src/commands/recall.ts","../src/memory/feedback.ts","../src/commands/rate.ts","../src/commands/knowledge.ts","../src/commands/sessions.ts","../src/commands/resume.ts","../src/commands/name.ts","../src/commands/switch.ts","../src/commands/provider.ts","../src/commands/tier.ts","../src/commands/model.ts","../src/config/update-check.ts","../src/version.ts","../src/update/registry.ts","../src/commands/update.ts","../src/workflows/registry.ts","../src/conversation/router.ts","../src/cli/dispatch.ts","../src/ui/welcome.ts","../src/cli/repl.ts","../src/index.ts"],"sourcesContent":["/**\n * Argv parser for the NTRP shell. Thin by design — the dispatcher decides\n * whether an invocation is a slash command, a known subcommand, or\n * free-form natural language.\n */\n\nimport { basename } from \"node:path\";\n\nexport interface ParsedArgs {\n /** True when no arguments are given → launch welcome + REPL. */\n repl: boolean;\n /** True when args were given → run once and exit. */\n oneShot: boolean;\n /** Raw string to hand to the dispatcher (everything after the binary). */\n input: string;\n /** Global output/process flags consumed before command dispatch. */\n globals: {\n headless: boolean;\n json: boolean;\n ndjson: boolean;\n noProgress: boolean;\n noColor: boolean;\n quiet: boolean;\n stdin: boolean;\n };\n}\n\nconst EMPTY_GLOBALS: ParsedArgs[\"globals\"] = {\n headless: false,\n json: false,\n ndjson: false,\n noProgress: false,\n noColor: false,\n quiet: false,\n stdin: false,\n};\n\nfunction splitGlobalFlags(args: string[]): { globals: ParsedArgs[\"globals\"]; rest: string[] } {\n const globals = { ...EMPTY_GLOBALS };\n const rest: string[] = [];\n for (const arg of args) {\n switch (arg) {\n case \"--headless\":\n globals.headless = true;\n globals.json = true;\n globals.noProgress = true;\n globals.noColor = true;\n globals.quiet = true;\n continue;\n case \"--json\":\n globals.json = true;\n continue;\n case \"--ndjson\":\n globals.ndjson = true;\n continue;\n case \"--no-progress\":\n globals.noProgress = true;\n continue;\n case \"--no-color\":\n globals.noColor = true;\n continue;\n case \"--quiet\":\n globals.quiet = true;\n continue;\n case \"--stdin\":\n globals.stdin = true;\n continue;\n default:\n rest.push(arg);\n }\n }\n if (globals.ndjson) globals.json = false;\n return { globals, rest };\n}\n\n/**\n * Parse process.argv into a ParsedArgs struct.\n *\n * Handling:\n * - `ntrp` → repl\n * - `ntrp /diagnose ...` → one-shot, input=\"/diagnose ...\"\n * - `ntrp diagnose ...` → one-shot, input=\"diagnose ...\"\n * - `ntrp \"which deals...\"`→ one-shot natural language\n * - `diagnose ...` → mapped through basename shortcut\n */\nexport function parseArgs(argv: string[]): ParsedArgs {\n // Honor the `diagnose` binary shortcut.\n const binName = basename(argv[1] ?? \"\");\n const BINARY_SHORTCUTS: Record<string, string> = {\n diagnose: \"diagnose\",\n };\n const injected = BINARY_SHORTCUTS[binName];\n\n const { globals, rest: userArgs } = splitGlobalFlags(argv.slice(2));\n\n if (injected) {\n return {\n repl: false,\n oneShot: true,\n input: [injected, ...userArgs].join(\" \"),\n globals,\n };\n }\n\n if (userArgs.length === 0) {\n return { repl: !globals.stdin, oneShot: globals.stdin, input: \"\", globals };\n }\n\n return {\n repl: false,\n oneShot: true,\n input: userArgs.join(\" \"),\n globals,\n };\n}\n\n// ============================================================\n// Token splitting — respects double-quoted strings\n// ============================================================\n\n/**\n * Split an input line into tokens, honoring double-quoted strings so that\n * `ntrp \"which deals are stuck?\"` becomes a single token.\n */\nexport function tokenize(input: string): string[] {\n const tokens: string[] = [];\n let buf = \"\";\n let inQuote: '\"' | \"'\" | null = null;\n\n for (let i = 0; i < input.length; i++) {\n const ch = input[i]!;\n if (inQuote) {\n if (ch === inQuote) {\n inQuote = null;\n continue;\n }\n buf += ch;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n inQuote = ch;\n continue;\n }\n if (/\\s/.test(ch)) {\n if (buf.length > 0) {\n tokens.push(buf);\n buf = \"\";\n }\n continue;\n }\n buf += ch;\n }\n\n if (buf.length > 0) tokens.push(buf);\n return tokens;\n}\n","import type { LlmMessage } from \"./types.js\";\n\n/** Convert legacy Anthropic thread blobs to neutral LlmMessage[]. */\nexport function normalizeThread(messages: unknown[]): LlmMessage[] {\n const out: LlmMessage[] = [];\n for (const raw of messages) {\n const m = raw as { role?: string; content?: unknown };\n if (!m.role || m.content === undefined) continue;\n if (m.role === \"user\" || m.role === \"assistant\") {\n const text =\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? (m.content as { type?: string; text?: string }[])\n .filter((b) => b.type === \"text\" && b.text)\n .map((b) => b.text!)\n .join(\"\\n\")\n : \"\";\n if (text.trim()) out.push({ role: m.role as \"user\" | \"assistant\", content: text });\n }\n }\n return out;\n}\n","import type { ExecutionOptions } from \"./types.js\";\n\nexport const DEFAULT_EXECUTION: ExecutionOptions = {\n mode: \"interactive\",\n output: \"terminal\",\n progress: true,\n color: true,\n strictStdout: false,\n quiet: false,\n};\n\nexport function buildExecutionOptions(opts: Partial<ExecutionOptions> = {}): ExecutionOptions {\n const envHeadless = process.env.NTRP_HEADLESS === \"1\" || process.env.NTRP_HEADLESS === \"true\";\n const envOutput = process.env.NTRP_OUTPUT;\n const output = opts.output ?? (envOutput === \"json\" || envOutput === \"ndjson\" || envOutput === \"markdown\" ? envOutput : undefined);\n const headless = envHeadless || opts.mode === \"headless\" || output === \"json\" || output === \"ndjson\";\n\n return {\n ...DEFAULT_EXECUTION,\n ...opts,\n mode: opts.mode ?? (headless ? \"headless\" : DEFAULT_EXECUTION.mode),\n output: output ?? (headless ? \"json\" : DEFAULT_EXECUTION.output),\n progress: opts.progress ?? !headless,\n color: opts.color ?? !headless,\n strictStdout: opts.strictStdout ?? headless,\n quiet: opts.quiet ?? headless,\n };\n}\n","import type duckdb from \"duckdb\";\nimport { mkdirSync, existsSync, rmSync } from \"fs\";\nimport { dirname, join, resolve } from \"path\";\n\nconst NTRP_DIR = process.env.NTRP_HOME ? resolve(process.env.NTRP_HOME) : join(process.env.HOME ?? \"\", \".ntrp\");\nconst DEFAULT_DB_PATH = process.env.NTRP_DB_PATH ? resolve(process.env.NTRP_DB_PATH) : join(NTRP_DIR, \"ntrp.duckdb\");\n\n/**\n * When NTRP_DB_PATH is set (headless/agent/CI), the database is *pinned* — the\n * per-session dataset switching used by the interactive REPL is ignored so the\n * documented one-shot test flow stays deterministic against a single file.\n */\nconst DB_PATH_PINNED = !!process.env.NTRP_DB_PATH;\n\n/**\n * The active database file. Defaults to the shared global DB; the interactive\n * REPL repoints this at a per-session dataset (`~/.ntrp/datasets/<id>.duckdb`)\n * so each point-in-time analysis owns its own data. Because every query flows\n * through this module, swapping the path is all that's needed to isolate data.\n */\nlet activeDbPath = DEFAULT_DB_PATH;\n\nlet db: duckdb.Database | null = null;\nlet conn: duckdb.Connection | null = null;\nlet duckdbModule: typeof duckdb | null = null;\nlet connectionGeneration = 0;\nlet lastHealthCheckMs = 0;\n\nconst HEALTH_CHECK_INTERVAL_MS = 1000;\n\nfunction ensureDir(): void {\n const dir = dirname(activeDbPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\n/** Absolute path of the database file currently backing the connection. */\nexport function getActiveDbPath(): string {\n return activeDbPath;\n}\n\n/**\n * Repoint the connection at a different database file (per-session dataset).\n * Discards the live connection so the next query opens the new file, which\n * bumps the connection generation and forces a fresh schema init. No-op when\n * the DB is pinned via NTRP_DB_PATH or already pointed at `path`.\n */\nexport async function setActiveDbPath(path: string): Promise<void> {\n if (DB_PATH_PINNED) return;\n const resolved = resolve(path);\n if (resolved === activeDbPath) return;\n await discardConnection();\n activeDbPath = resolved;\n}\n\nasync function loadDuckDB(): Promise<typeof duckdb> {\n if (duckdbModule) return duckdbModule;\n duckdbModule = (await import(\"duckdb\")).default;\n return duckdbModule;\n}\n\nexport async function getConnection(): Promise<duckdb.Connection> {\n if (conn) {\n const now = Date.now();\n if (now - lastHealthCheckMs < HEALTH_CHECK_INTERVAL_MS) return conn;\n if (await isConnectionAlive(conn)) {\n lastHealthCheckMs = now;\n return conn;\n }\n await discardConnection();\n }\n ensureDir();\n const duckdb = await loadDuckDB();\n db = new duckdb.Database(activeDbPath);\n conn = new duckdb.Connection(db);\n connectionGeneration++;\n lastHealthCheckMs = Date.now();\n return conn;\n}\n\nexport function getConnectionGeneration(): number {\n return connectionGeneration;\n}\n\nexport function isClosedConnectionError(err: unknown): boolean {\n const message = err instanceof Error ? err.message : String(err);\n return /connection was never established|closed already|connection.*closed/i.test(message);\n}\n\nfunction closeConnection(c: duckdb.Connection): Promise<void> {\n const close = (c as { close?: (callback?: () => void) => void }).close;\n if (typeof close !== \"function\") return Promise.resolve();\n return new Promise((resolve) => {\n try {\n close.call(c, () => resolve());\n } catch {\n resolve();\n }\n });\n}\n\nfunction isConnectionAlive(c: duckdb.Connection): Promise<boolean> {\n return new Promise((resolve) => {\n try {\n c.all(\"SELECT 1\", (err: Error | null) => resolve(!err));\n } catch {\n resolve(false);\n }\n });\n}\n\nasync function discardConnection(): Promise<void> {\n const currentConn = conn;\n const currentDb = db;\n conn = null;\n db = null;\n lastHealthCheckMs = 0;\n\n if (currentConn) {\n await closeConnection(currentConn).catch(() => undefined);\n }\n if (currentDb) {\n await new Promise<void>((resolve) => {\n currentDb.close(() => resolve());\n }).catch(() => undefined);\n }\n}\n\nasync function withReconnect<T>(op: () => Promise<T>): Promise<T> {\n try {\n return await op();\n } catch (err) {\n if (!isClosedConnectionError(err)) throw err;\n await discardConnection();\n return op();\n }\n}\n\nasync function execAllOnce<T>(sql: string, params: unknown[]): Promise<T[]> {\n const c = await getConnection();\n return new Promise((resolve, reject) => {\n const cb = (err: Error | null, rows: T[]) => {\n if (err) reject(err);\n else resolve(rows ?? []);\n };\n if (params.length > 0) {\n const stmt = c.prepare(sql);\n stmt.all(...params, ((err: Error | null, rows: T[]) => {\n stmt.finalize();\n cb(err, rows);\n }) as any);\n } else {\n c.all(sql, cb as any);\n }\n });\n}\n\nasync function runOnce(sql: string, params: unknown[] = []): Promise<void> {\n const c = await getConnection();\n return new Promise((resolve, reject) => {\n if (params.length > 0) {\n const stmt = c.prepare(sql);\n stmt.run(...params, (err: Error | null) => {\n stmt.finalize();\n if (err) reject(err);\n else resolve();\n });\n } else {\n c.run(sql, (err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n }\n });\n}\n\nexport async function run(sql: string, params: unknown[] = []): Promise<void> {\n return withReconnect(() => runOnce(sql, params));\n}\n\nexport function all<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n return withReconnect(() => execAllOnce<T>(sql, params));\n}\n\nexport function get<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T | null> {\n return all<T>(sql, params).then((rows) => rows[0] ?? null);\n}\n\nexport async function close(): Promise<void> {\n await discardConnection();\n}\n\nexport async function recreateDatabaseFile(): Promise<void> {\n await discardConnection();\n for (const path of [activeDbPath, `${activeDbPath}.wal`]) {\n rmSync(path, { force: true });\n }\n}\n","import type { VitalSign, VitalSignStatus } from \"../types.js\";\n\nexport const VITAL_SIGN_LABELS: Record<VitalSign, string> = {\n freshness: \"Freshness\",\n flow_rate: \"Flow Rate\",\n drop_rate: \"Drop Rate\",\n signal_to_noise: \"Signal:Noise\",\n thread_depth: \"Thread Depth\",\n};\n\nexport function statusEmoji(status: VitalSignStatus): string {\n switch (status) {\n case \"green\": return \"🟢\";\n case \"yellow\": return \"🟡\";\n case \"red\": return \"🔴\";\n }\n}\n\nexport function formatDollarImpact(value: number | null | undefined, label: string | null | undefined): string {\n if (value != null && value > 0) return `${formatDollarValue(value)} ${label ?? \"\"}`.trim();\n return \"N/A\";\n}\n\nexport function formatScore(score: number): string {\n return `${Math.round(score)}`;\n}\n\nexport function formatPercent(value: number): string {\n return `${Math.round(value)}%`;\n}\n\nexport function formatNumber(value: number): string {\n return value.toLocaleString();\n}\n\nexport function formatCurrency(value: number): string {\n if (value >= 1_000_000) return `$${(value / 1_000_000).toFixed(1)}M`;\n if (value >= 1_000) return `$${(value / 1_000).toFixed(0)}K`;\n return `$${value.toFixed(0)}`;\n}\n\nexport interface PipelineMetrics {\n total_pipeline_value: number;\n at_risk_value: number;\n at_risk_deal_count: number;\n total_open_deals: number;\n}\n\ninterface VitalSignResultLike {\n vital_sign: string;\n components: Record<string, unknown>;\n}\n\nexport function extractPipelineMetrics(vitals: VitalSignResultLike[]): PipelineMetrics | null {\n const flowRate = vitals.find((v) => v.vital_sign === \"flow_rate\");\n if (!flowRate) return null;\n const openDeals = flowRate.components.open_deals as Record<string, unknown> | undefined;\n if (!openDeals) return null;\n const total = typeof openDeals.total_amount === \"number\" ? openDeals.total_amount : 0;\n if (total === 0) return null;\n return {\n total_pipeline_value: total,\n at_risk_value: typeof openDeals.stuck_total_amount === \"number\" ? openDeals.stuck_total_amount : 0,\n at_risk_deal_count: typeof openDeals.stuck_count === \"number\" ? openDeals.stuck_count : 0,\n total_open_deals: typeof openDeals.count === \"number\" ? openDeals.count : 0,\n };\n}\n\nexport function formatPipelineLine(metrics: PipelineMetrics): string {\n const total = formatCurrency(metrics.total_pipeline_value);\n if (metrics.at_risk_deal_count > 0) {\n const atRisk = formatCurrency(metrics.at_risk_value);\n return `Pipeline: ${total} total \\u00B7 ${atRisk} at risk (${metrics.at_risk_deal_count} deals)`;\n }\n return `Pipeline: ${total} open (${metrics.total_open_deals} deals)`;\n}\n\nexport const DOLLAR_LABELS: Record<VitalSign, string> = {\n freshness: \"pipeline at risk\",\n flow_rate: \"stuck in pipeline\",\n drop_rate: \"est. lost at handoff\",\n signal_to_noise: \"misdirected effort\",\n thread_depth: \"single-threaded\",\n};\n\nexport function formatDollarValue(value: number | null | undefined): string {\n if (value == null || value === 0) return \"N/A\";\n return formatCurrency(value);\n}\n\nexport function severityLabel(severity: string): string {\n switch (severity) {\n case \"critical\": return \"CRITICAL\";\n case \"warning\": return \"WARNING\";\n case \"info\": return \"INFO\";\n default: return severity.toUpperCase();\n }\n}\n","import { run, all, get } from \"./connection.js\";\nimport { randomUUID } from \"crypto\";\nimport type { ActionDryRun, ActionExecution, ActionPermissionClass, ActionProposal, ActionProposalStatus, ActionTarget } from \"../actions/types.js\";\nimport type { Strategy, StrategyMetric, StrategyPriority, StrategySource, StrategySourceType, StrategyStatus } from \"../types.js\";\n\n// ============================================================\n// Generic Helpers\n// ============================================================\n\nexport function uuid(): string {\n return randomUUID();\n}\n\nexport function now(): string {\n return new Date().toISOString();\n}\n\n/** Serialize a value for DuckDB JSON column */\nfunction jsonStr(val: unknown): string {\n return JSON.stringify(val ?? {});\n}\n\nfunction parseJson<T>(val: unknown, fallback: T): T {\n if (typeof val !== \"string\") return (val as T) ?? fallback;\n try {\n return JSON.parse(val) as T;\n } catch {\n return fallback;\n }\n}\n\nasync function inTransaction<T>(fn: () => Promise<T>): Promise<T> {\n await run(\"BEGIN TRANSACTION\");\n try {\n const result = await fn();\n await run(\"COMMIT\");\n return result;\n } catch (err) {\n await run(\"ROLLBACK\").catch(() => undefined);\n throw err;\n }\n}\n\n// ============================================================\n// Entity Inserts\n// ============================================================\n\nexport interface OrgInsert {\n canonical_name: string;\n canonical_domain?: string | null;\n source_system: string;\n source_id: string;\n raw_data?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nexport async function insertOrganization(row: OrgInsert): Promise<string> {\n const id = uuid();\n const ts = now();\n await run(\n `INSERT INTO organizations (id, canonical_name, canonical_domain, source_system, source_id, raw_data, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, row.canonical_name, row.canonical_domain ?? null, row.source_system, row.source_id, jsonStr(row.raw_data), jsonStr(row.metadata), ts, ts],\n );\n return id;\n}\n\nexport async function insertOrganizations(rows: OrgInsert[]): Promise<string[]> {\n if (rows.length === 0) return [];\n return inTransaction(async () => {\n const ids: string[] = [];\n for (const row of rows) {\n ids.push(await insertOrganization(row));\n }\n return ids;\n });\n}\n\nexport interface PersonInsert {\n canonical_name: string;\n canonical_email?: string | null;\n organization_id?: string | null;\n source_system: string;\n source_id: string;\n raw_data?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nexport async function insertPerson(row: PersonInsert): Promise<string> {\n const id = uuid();\n const ts = now();\n await run(\n `INSERT INTO people (id, canonical_name, canonical_email, organization_id, source_system, source_id, raw_data, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, row.canonical_name, row.canonical_email ?? null, row.organization_id ?? null, row.source_system, row.source_id, jsonStr(row.raw_data), jsonStr(row.metadata), ts, ts],\n );\n return id;\n}\n\nexport async function insertPeople(rows: PersonInsert[]): Promise<string[]> {\n if (rows.length === 0) return [];\n return inTransaction(async () => {\n const ids: string[] = [];\n for (const row of rows) {\n ids.push(await insertPerson(row));\n }\n return ids;\n });\n}\n\nexport interface OppInsert {\n canonical_name: string;\n organization_id?: string | null;\n owner_id?: string | null;\n current_stage?: string | null;\n amount?: number | null;\n close_date?: string | null;\n source_system: string;\n source_id: string;\n raw_data?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n /** Historical created_at from source data. Falls back to insert time. */\n created_at?: string;\n}\n\nexport async function insertOpportunity(row: OppInsert): Promise<string> {\n const id = uuid();\n const ts = row.created_at ?? now();\n await run(\n `INSERT INTO opportunities (id, canonical_name, organization_id, owner_id, current_stage, amount, close_date, source_system, source_id, raw_data, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, row.canonical_name, row.organization_id ?? null, row.owner_id ?? null, row.current_stage ?? null, row.amount ?? null, row.close_date ?? null, row.source_system, row.source_id, jsonStr(row.raw_data), jsonStr(row.metadata), ts, ts],\n );\n return id;\n}\n\nexport async function insertOpportunities(rows: OppInsert[]): Promise<string[]> {\n if (rows.length === 0) return [];\n return inTransaction(async () => {\n const ids: string[] = [];\n for (const row of rows) {\n ids.push(await insertOpportunity(row));\n }\n return ids;\n });\n}\n\nexport interface ActivityInsert {\n activity_type: string;\n occurred_at: string;\n person_id?: string | null;\n organization_id?: string | null;\n opportunity_id?: string | null;\n source_system: string;\n source_id: string;\n raw_data?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nexport async function insertActivity(row: ActivityInsert): Promise<string> {\n const id = uuid();\n const ts = now();\n await run(\n `INSERT INTO activities (id, activity_type, occurred_at, person_id, organization_id, opportunity_id, source_system, source_id, raw_data, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, row.activity_type, row.occurred_at, row.person_id ?? null, row.organization_id ?? null, row.opportunity_id ?? null, row.source_system, row.source_id, jsonStr(row.raw_data), jsonStr(row.metadata), ts, ts],\n );\n return id;\n}\n\nexport async function insertActivities(rows: ActivityInsert[]): Promise<void> {\n if (rows.length === 0) return;\n await inTransaction(async () => {\n for (const row of rows) {\n await insertActivity(row);\n }\n });\n}\n\nexport interface CampaignInsert {\n canonical_name: string;\n campaign_type: string;\n source_system: string;\n source_id: string;\n raw_data?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nexport async function insertCampaign(row: CampaignInsert): Promise<string> {\n const id = uuid();\n const ts = now();\n await run(\n `INSERT INTO campaigns (id, canonical_name, campaign_type, source_system, source_id, raw_data, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, row.canonical_name, row.campaign_type, row.source_system, row.source_id, jsonStr(row.raw_data), jsonStr(row.metadata), ts, ts],\n );\n return id;\n}\n\nexport async function insertCampaigns(rows: CampaignInsert[]): Promise<void> {\n if (rows.length === 0) return;\n await inTransaction(async () => {\n for (const row of rows) {\n await insertCampaign(row);\n }\n });\n}\n\n// ============================================================\n// Vital Sign / Health Inserts\n// ============================================================\n\nexport interface VitalReadingInsert {\n segment_id?: string | null;\n vital_sign: string;\n score: number;\n status: string;\n components?: Record<string, unknown>;\n entity_details?: Record<string, unknown>[];\n dollar_value?: number | null;\n upload_batch_id?: string | null;\n}\n\nexport async function insertVitalReading(row: VitalReadingInsert): Promise<string> {\n const id = uuid();\n await run(\n `INSERT INTO vital_sign_readings (id, segment_id, vital_sign, score, status, components, entity_details, dollar_value, computed_at, upload_batch_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, row.segment_id ?? null, row.vital_sign, row.score, row.status, jsonStr(row.components), jsonStr(row.entity_details ?? []), row.dollar_value ?? null, now(), row.upload_batch_id ?? null],\n );\n return id;\n}\n\nexport async function insertVitalReadings(rows: VitalReadingInsert[]): Promise<void> {\n if (rows.length === 0) return;\n await inTransaction(async () => {\n for (const row of rows) {\n await insertVitalReading(row);\n }\n });\n}\n\nexport interface HealthReadingInsert {\n segment_id?: string | null;\n overall_score: number;\n overall_status: string;\n gating_vital_sign: string;\n vital_sign_scores?: Record<string, unknown>;\n total_value_at_risk?: number | null;\n upload_batch_id?: string | null;\n}\n\nexport async function insertHealthReading(row: HealthReadingInsert): Promise<string> {\n const id = uuid();\n await run(\n `INSERT INTO health_readings (id, segment_id, overall_score, overall_status, gating_vital_sign, vital_sign_scores, total_value_at_risk, computed_at, upload_batch_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, row.segment_id ?? null, row.overall_score, row.overall_status, row.gating_vital_sign, jsonStr(row.vital_sign_scores), row.total_value_at_risk ?? null, now(), row.upload_batch_id ?? null],\n );\n return id;\n}\n\nexport async function insertFinding(row: {\n upload_batch_id?: string | null;\n findings: unknown[];\n model_used?: string | null;\n provider_used?: string | null;\n failover?: boolean | null;\n raw_prompt?: string | null;\n analysis_lens?: string | null;\n}): Promise<string> {\n const id = uuid();\n await run(\n `INSERT INTO findings (id, upload_batch_id, findings, model_used, provider_used, failover, computed_at, raw_prompt, analysis_lens)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n row.upload_batch_id ?? null,\n jsonStr(row.findings),\n row.model_used ?? null,\n row.provider_used ?? null,\n row.failover ?? false,\n now(),\n row.raw_prompt ?? null,\n row.analysis_lens ?? \"gtm_health\",\n ],\n );\n return id;\n}\n\n// ============================================================\n// Segment Inserts\n// ============================================================\n\nexport async function insertSegment(row: {\n name: string;\n entity_type: string;\n filters: unknown[];\n is_auto_generated: boolean;\n}): Promise<string> {\n const id = uuid();\n const ts = now();\n await run(\n `INSERT INTO segments (id, name, entity_type, filters, is_auto_generated, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [id, row.name, row.entity_type, jsonStr(row.filters), row.is_auto_generated, ts, ts],\n );\n return id;\n}\n\n// ============================================================\n// Segment Queries\n// ============================================================\n\nexport async function findSegmentsByName(query: string): Promise<Array<{ id: string; name: string; entity_type: string; filters: string; is_auto_generated: boolean }>> {\n return all(\n `SELECT id, name, entity_type, filters, is_auto_generated FROM segments WHERE LOWER(name) LIKE LOWER(?) ORDER BY name`,\n [`%${query}%`],\n );\n}\n\nexport async function getSegmentByName(name: string): Promise<{ id: string; name: string; entity_type: string; filters: string; is_auto_generated: boolean } | null> {\n return get(\n `SELECT id, name, entity_type, filters, is_auto_generated FROM segments WHERE LOWER(name) = LOWER(?)`,\n [name],\n ) as any;\n}\n\nexport async function deleteSegment(id: string): Promise<void> {\n await run(`DELETE FROM vital_sign_readings WHERE segment_id = ?`, [id]);\n await run(`DELETE FROM health_readings WHERE segment_id = ?`, [id]);\n await run(`DELETE FROM segments WHERE id = ?`, [id]);\n}\n\n// ============================================================\n// Metric Reading Inserts\n// ============================================================\n\nexport interface MetricReadingInsert {\n segment_id?: string | null;\n metric: string;\n label: string;\n group_name: string;\n value?: number | null;\n formatted: string;\n status: string;\n benchmark_note?: string | null;\n components?: Record<string, unknown>;\n unavailable_reason?: string | null;\n confidence?: number | null;\n confidence_label?: string | null;\n period?: string | null;\n comparison?: string | null;\n reliability_gate?: Record<string, unknown> | null;\n estimation_method?: string | null;\n upload_batch_id?: string | null;\n}\n\nexport async function insertMetricReading(row: MetricReadingInsert): Promise<string> {\n const id = uuid();\n await run(\n `INSERT INTO metric_readings (id, segment_id, metric, label, group_name, value, formatted, status, benchmark_note, components, unavailable_reason, confidence, confidence_label, period, comparison, reliability_gate, estimation_method, computed_at, upload_batch_id)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, row.segment_id ?? null, row.metric, row.label, row.group_name, row.value ?? null, row.formatted, row.status, row.benchmark_note ?? null, jsonStr(row.components), row.unavailable_reason ?? null, row.confidence ?? null, row.confidence_label ?? null, row.period ?? null, row.comparison ?? null, jsonStr(row.reliability_gate), row.estimation_method ?? null, now(), row.upload_batch_id ?? null],\n );\n return id;\n}\n\nexport async function insertRevenueEvent(row: {\n organization_id?: string | null;\n period: string;\n amount: number;\n event_type: string;\n source_system: string;\n source_id?: string | null;\n raw_data?: Record<string, unknown>;\n}): Promise<string> {\n const id = uuid();\n await run(\n `INSERT INTO revenue_events (id, organization_id, period, amount, event_type, source_system, source_id, raw_data, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [id, row.organization_id ?? null, row.period, row.amount, row.event_type, row.source_system, row.source_id ?? null, jsonStr(row.raw_data ?? {}), now()],\n );\n return id;\n}\n\nexport async function getRevenueEventCount(): Promise<number> {\n try {\n const row = await get<{ count: number }>(`SELECT COUNT(*)::INTEGER as count FROM revenue_events`);\n return Number(row?.count ?? 0);\n } catch {\n return 0;\n }\n}\n\nexport async function insertMetricReadings(rows: MetricReadingInsert[]): Promise<void> {\n for (const row of rows) {\n await insertMetricReading(row);\n }\n}\n\nexport async function getLatestMetricReadings(segmentId?: string | null): Promise<Record<string, unknown>[]> {\n const segFilter = segmentId ? `segment_id = ?` : `segment_id IS NULL`;\n const params = segmentId ? [segmentId] : [];\n const latest = await get<{ upload_batch_id: string }>(\n `SELECT upload_batch_id FROM metric_readings WHERE ${segFilter} ORDER BY computed_at DESC LIMIT 1`,\n params,\n );\n if (!latest?.upload_batch_id) return [];\n return all(\n `SELECT * FROM metric_readings WHERE upload_batch_id = ? AND ${segFilter}`,\n [latest.upload_batch_id, ...(segmentId ? [segmentId] : [])],\n );\n}\n\n// ============================================================\n// CSV Upload Inserts\n// ============================================================\n\nexport async function insertCSVUpload(row: {\n source_system: string;\n original_filename: string;\n row_count?: number | null;\n column_mappings?: Record<string, string>;\n status: string;\n}): Promise<string> {\n const id = uuid();\n await run(\n `INSERT INTO csv_uploads (id, source_system, original_filename, row_count, column_mappings, status)\n VALUES (?, ?, ?, ?, ?, ?)`,\n [id, row.source_system, row.original_filename, row.row_count ?? null, jsonStr(row.column_mappings), row.status],\n );\n return id;\n}\n\nexport async function updateCSVUpload(id: string, updates: {\n status?: string;\n row_count?: number;\n processed_at?: string;\n error_message?: string | null;\n}): Promise<void> {\n const sets: string[] = [];\n const params: unknown[] = [];\n if (updates.status !== undefined) { sets.push(\"status = ?\"); params.push(updates.status); }\n if (updates.row_count !== undefined) { sets.push(\"row_count = ?\"); params.push(updates.row_count); }\n if (updates.processed_at !== undefined) { sets.push(\"processed_at = ?\"); params.push(updates.processed_at); }\n if (updates.error_message !== undefined) { sets.push(\"error_message = ?\"); params.push(updates.error_message); }\n if (sets.length === 0) return;\n params.push(id);\n await run(`UPDATE csv_uploads SET ${sets.join(\", \")} WHERE id = ?`, params);\n}\n\n// ============================================================\n// Action Proposal / Execution Inserts\n// ============================================================\n\nexport interface ActionProposalInsert {\n handle_title?: string;\n kind: string;\n title: string;\n summary: string;\n permission_class: ActionPermissionClass;\n status: ActionProposalStatus;\n target: ActionTarget;\n payload?: Record<string, unknown>;\n dry_run: ActionDryRun;\n source?: string;\n}\n\nfunction parseActionProposalRow(row: Record<string, unknown>): ActionProposal {\n return {\n id: row.id as string,\n handle: (row.handle as string | null) ?? row.id as string,\n kind: row.kind as string,\n title: row.title as string,\n summary: row.summary as string,\n permission_class: row.permission_class as ActionPermissionClass,\n status: row.status as ActionProposalStatus,\n target: parseJson<ActionTarget>(row.target, { connector_id: \"unknown\", connector_type: \"unknown\", operation: \"unknown\" }),\n payload: parseJson<Record<string, unknown>>(row.payload, {}),\n dry_run: parseJson<ActionDryRun>(row.dry_run, {\n mode: \"dry_run\",\n summary: \"\",\n would_execute: false,\n expected_mutations: [],\n risk_notes: [],\n }),\n source: row.source as string,\n created_at: row.created_at instanceof Date ? row.created_at.toISOString() : String(row.created_at),\n approved_at: row.approved_at\n ? (row.approved_at instanceof Date ? row.approved_at.toISOString() : String(row.approved_at))\n : null,\n approved_by: (row.approved_by as string | null) ?? null,\n };\n}\n\nfunction parseActionExecutionRow(row: Record<string, unknown>): ActionExecution {\n return {\n id: row.id as string,\n proposal_id: row.proposal_id as string,\n status: row.status as ActionExecution[\"status\"],\n receipt: parseJson<Record<string, unknown>>(row.receipt, {}),\n executed_at: row.executed_at instanceof Date ? row.executed_at.toISOString() : String(row.executed_at),\n };\n}\n\nexport async function insertActionProposal(row: ActionProposalInsert): Promise<string> {\n const id = uuid();\n const handle = await generateActionProposalHandle(row.handle_title ?? row.title);\n await run(\n `INSERT INTO action_proposals (id, handle, kind, title, summary, permission_class, status, target, payload, dry_run, source, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n handle,\n row.kind,\n row.title,\n row.summary,\n row.permission_class,\n row.status,\n jsonStr(row.target),\n jsonStr(row.payload),\n jsonStr(row.dry_run),\n row.source ?? \"manual\",\n now(),\n ],\n );\n return id;\n}\n\nasync function generateActionProposalHandle(title: string): Promise<string> {\n const date = new Date().toISOString().slice(0, 10);\n const baseSlug = slugifyHandle(title) || \"action-proposal\";\n const base = `${date}-${baseSlug}`;\n let candidate = base;\n for (let suffix = 2; suffix < 1000; suffix++) {\n const existing = await get<{ id: string }>(`SELECT id FROM action_proposals WHERE handle = ?`, [candidate]);\n if (!existing) return candidate;\n candidate = `${base}-${suffix}`;\n }\n return `${base}-${Date.now()}`;\n}\n\nfunction slugifyHandle(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64);\n}\n\nexport async function listActionProposals(limit = 20): Promise<ActionProposal[]> {\n const rows = await all(`SELECT * FROM action_proposals ORDER BY created_at DESC LIMIT ?`, [limit]);\n return rows.map(parseActionProposalRow);\n}\n\nexport async function getActionProposal(id: string): Promise<ActionProposal | null> {\n const row = await get(`SELECT * FROM action_proposals WHERE id = ? OR handle = ?`, [id, id]);\n return row ? parseActionProposalRow(row) : null;\n}\n\nexport async function updateActionProposalStatus(id: string, status: ActionProposalStatus, approvedBy?: string | null): Promise<void> {\n if (status === \"approved\") {\n await run(\n `UPDATE action_proposals SET status = ?, approved_at = ?, approved_by = ? WHERE id = ?`,\n [status, now(), approvedBy ?? \"local\", id],\n );\n return;\n }\n await run(`UPDATE action_proposals SET status = ? WHERE id = ?`, [status, id]);\n}\n\nexport async function insertActionExecution(row: {\n proposal_id: string;\n status: ActionExecution[\"status\"];\n receipt: Record<string, unknown>;\n}): Promise<string> {\n const id = uuid();\n await run(\n `INSERT INTO action_executions (id, proposal_id, status, receipt, executed_at)\n VALUES (?, ?, ?, ?, ?)`,\n [id, row.proposal_id, row.status, jsonStr(row.receipt), now()],\n );\n return id;\n}\n\nexport async function listActionExecutions(proposalId?: string): Promise<ActionExecution[]> {\n const rows = proposalId\n ? await all(`SELECT * FROM action_executions WHERE proposal_id = ? ORDER BY executed_at DESC`, [proposalId])\n : await all(`SELECT * FROM action_executions ORDER BY executed_at DESC LIMIT 20`);\n return rows.map(parseActionExecutionRow);\n}\n\n// ============================================================\n// Strategy Inserts / Queries\n// ============================================================\n\nexport interface StrategyInsert {\n slug: string;\n title: string;\n status: StrategyStatus;\n source_type: StrategySourceType;\n source_path?: string | null;\n goal: string;\n hypothesis: string;\n target_segment: string;\n priority: StrategyPriority;\n linked_play_ids: string[];\n success_metrics: StrategyMetric[];\n leading_indicators: StrategyMetric[];\n risks: string[];\n recommended_actions: string[];\n experiment_design: string;\n review_cadence: string;\n confidence: number;\n raw_excerpt: string;\n library_path?: string | null;\n}\n\nexport interface StrategySourceInsert {\n strategy_id: string;\n source_type: StrategySourceType;\n source_path?: string | null;\n content_hash: string;\n extracted_text_excerpt: string;\n metadata?: Record<string, unknown>;\n}\n\nfunction parseStrategyRow(row: Record<string, unknown>): Strategy {\n return {\n id: row.id as string,\n slug: row.slug as string,\n title: row.title as string,\n status: row.status as StrategyStatus,\n source_type: row.source_type as StrategySourceType,\n source_path: (row.source_path as string | null) ?? null,\n goal: row.goal as string,\n hypothesis: row.hypothesis as string,\n target_segment: row.target_segment as string,\n priority: row.priority as StrategyPriority,\n linked_play_ids: parseJson<string[]>(row.linked_play_ids, []),\n success_metrics: parseJson<StrategyMetric[]>(row.success_metrics, []),\n leading_indicators: parseJson<StrategyMetric[]>(row.leading_indicators, []),\n risks: parseJson<string[]>(row.risks, []),\n recommended_actions: parseJson<string[]>(row.recommended_actions, []),\n experiment_design: row.experiment_design as string,\n review_cadence: row.review_cadence as string,\n confidence: Number(row.confidence ?? 0.5),\n raw_excerpt: row.raw_excerpt as string,\n library_path: (row.library_path as string | null) ?? null,\n created_at: row.created_at instanceof Date ? row.created_at.toISOString() : String(row.created_at),\n updated_at: row.updated_at instanceof Date ? row.updated_at.toISOString() : String(row.updated_at),\n };\n}\n\nfunction parseStrategySourceRow(row: Record<string, unknown>): StrategySource {\n return {\n id: row.id as string,\n strategy_id: row.strategy_id as string,\n source_type: row.source_type as StrategySourceType,\n source_path: (row.source_path as string | null) ?? null,\n content_hash: row.content_hash as string,\n extracted_text_excerpt: row.extracted_text_excerpt as string,\n metadata: parseJson<Record<string, unknown>>(row.metadata, {}),\n created_at: row.created_at instanceof Date ? row.created_at.toISOString() : String(row.created_at),\n };\n}\n\nexport async function upsertStrategy(row: StrategyInsert): Promise<string> {\n const existing = await get<{ id: string }>(`SELECT id FROM strategies WHERE slug = ?`, [row.slug]);\n const id = existing?.id ?? uuid();\n const ts = now();\n if (existing) {\n await run(\n `UPDATE strategies SET\n title = ?, status = ?, source_type = ?, source_path = ?, goal = ?, hypothesis = ?,\n target_segment = ?, priority = ?, linked_play_ids = ?, success_metrics = ?,\n leading_indicators = ?, risks = ?, recommended_actions = ?, experiment_design = ?,\n review_cadence = ?, confidence = ?, raw_excerpt = ?, library_path = ?, updated_at = ?\n WHERE id = ?`,\n [\n row.title,\n row.status,\n row.source_type,\n row.source_path ?? null,\n row.goal,\n row.hypothesis,\n row.target_segment,\n row.priority,\n jsonStr(row.linked_play_ids),\n jsonStr(row.success_metrics),\n jsonStr(row.leading_indicators),\n jsonStr(row.risks),\n jsonStr(row.recommended_actions),\n row.experiment_design,\n row.review_cadence,\n row.confidence,\n row.raw_excerpt,\n row.library_path ?? null,\n ts,\n id,\n ],\n );\n return id;\n }\n\n await run(\n `INSERT INTO strategies (\n id, slug, title, status, source_type, source_path, goal, hypothesis, target_segment,\n priority, linked_play_ids, success_metrics, leading_indicators, risks, recommended_actions,\n experiment_design, review_cadence, confidence, raw_excerpt, library_path, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n row.slug,\n row.title,\n row.status,\n row.source_type,\n row.source_path ?? null,\n row.goal,\n row.hypothesis,\n row.target_segment,\n row.priority,\n jsonStr(row.linked_play_ids),\n jsonStr(row.success_metrics),\n jsonStr(row.leading_indicators),\n jsonStr(row.risks),\n jsonStr(row.recommended_actions),\n row.experiment_design,\n row.review_cadence,\n row.confidence,\n row.raw_excerpt,\n row.library_path ?? null,\n ts,\n ts,\n ],\n );\n return id;\n}\n\nexport async function insertStrategySource(row: StrategySourceInsert): Promise<string> {\n const id = uuid();\n await run(\n `INSERT INTO strategy_sources (id, strategy_id, source_type, source_path, content_hash, extracted_text_excerpt, metadata, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n row.strategy_id,\n row.source_type,\n row.source_path ?? null,\n row.content_hash,\n row.extracted_text_excerpt,\n jsonStr(row.metadata),\n now(),\n ],\n );\n return id;\n}\n\nexport async function getStrategyBySlugOrId(slugOrId: string): Promise<Strategy | null> {\n const row = await get(`SELECT * FROM strategies WHERE id = ? OR slug = ?`, [slugOrId, slugOrId]);\n return row ? parseStrategyRow(row) : null;\n}\n\nexport async function listStrategies(status?: StrategyStatus | \"all\"): Promise<Strategy[]> {\n const rows = status && status !== \"all\"\n ? await all(`SELECT * FROM strategies WHERE status = ? ORDER BY updated_at DESC`, [status])\n : await all(`SELECT * FROM strategies ORDER BY updated_at DESC`);\n return rows.map(parseStrategyRow);\n}\n\nexport async function listStrategySources(strategyId: string): Promise<StrategySource[]> {\n const rows = await all(`SELECT * FROM strategy_sources WHERE strategy_id = ? ORDER BY created_at DESC`, [strategyId]);\n return rows.map(parseStrategySourceRow);\n}\n\n// ============================================================\n// Query Helpers\n// ============================================================\n\nexport async function getEntityCounts(): Promise<Record<string, number>> {\n const rows = await all<{ table_name: string; cnt: number | bigint }>(`\n SELECT 'organizations' as table_name, COUNT(*) as cnt FROM organizations\n UNION ALL SELECT 'people', COUNT(*) FROM people\n UNION ALL SELECT 'opportunities', COUNT(*) FROM opportunities\n UNION ALL SELECT 'activities', COUNT(*) FROM activities\n UNION ALL SELECT 'campaigns', COUNT(*) FROM campaigns\n UNION ALL SELECT 'revenue_events', COUNT(*) FROM revenue_events\n `);\n const counts: Record<string, number> = {\n organizations: 0,\n people: 0,\n opportunities: 0,\n activities: 0,\n campaigns: 0,\n revenue_events: 0,\n };\n for (const row of rows) {\n counts[row.table_name] = Number(row.cnt ?? 0);\n }\n return counts;\n}\n\nexport async function getSegments(): Promise<Array<{ id: string; name: string; entity_type: string; filters: string; is_auto_generated: boolean }>> {\n return all(`SELECT id, name, entity_type, filters, is_auto_generated FROM segments ORDER BY name`);\n}\n\nexport async function getLatestHealthReading(): Promise<Record<string, unknown> | null> {\n return get(`SELECT * FROM health_readings WHERE segment_id IS NULL ORDER BY computed_at DESC LIMIT 1`);\n}\n\nexport async function getLatestVitalReadings(): Promise<Record<string, unknown>[]> {\n // Get readings from the latest batch\n const latest = await get<{ upload_batch_id: string }>(`SELECT upload_batch_id FROM vital_sign_readings WHERE segment_id IS NULL ORDER BY computed_at DESC LIMIT 1`);\n if (!latest?.upload_batch_id) return [];\n return all(`SELECT * FROM vital_sign_readings WHERE upload_batch_id = ? AND segment_id IS NULL`, [latest.upload_batch_id]);\n}\n\nexport async function getLatestFindings(lens: import(\"../types.js\").AnalysisLens = \"gtm_health\"): Promise<Record<string, unknown> | null> {\n return get(\n `SELECT * FROM findings WHERE analysis_lens = ? ORDER BY computed_at DESC LIMIT 1`,\n [lens],\n );\n}\n\n// ============================================================\n// Composite Loaders\n// ============================================================\n\nimport { DOLLAR_LABELS } from \"../output/formatters.js\";\nimport type { VitalSign, VitalSignStatus, HealthResult, SegmentResult, FindingEntry } from \"../types.js\";\n\nexport interface LatestDiagnosis {\n health: HealthResult;\n segments: SegmentResult[];\n findings: FindingEntry[];\n entityCounts: Record<string, number>;\n uploadBatchId: string;\n}\n\nfunction parseVitalRow(r: Record<string, unknown>) {\n const vs = r.vital_sign as VitalSign;\n return {\n vital_sign: vs,\n score: r.score as number,\n status: r.status as VitalSignStatus,\n components: typeof r.components === \"string\" ? JSON.parse(r.components) : (r.components as Record<string, unknown>),\n entity_details: typeof r.entity_details === \"string\" ? JSON.parse(r.entity_details) : (r.entity_details as Record<string, unknown>[]),\n dollar_value: (r.dollar_value as number) ?? null,\n dollar_label: DOLLAR_LABELS[vs] ?? null,\n };\n}\n\n/**\n * Load the latest diagnosis from DB — reconstructs HealthResult, segments, and findings.\n * Returns null if no diagnosis has been run yet.\n */\nexport async function loadLatestDiagnosis(): Promise<LatestDiagnosis | null> {\n const healthRow = await getLatestHealthReading();\n if (!healthRow) return null;\n\n const uploadBatchId = healthRow.upload_batch_id as string;\n const [vitalRows, findingsRow, entityCounts, segHealthRows, segVitalRows] = await Promise.all([\n getLatestVitalReadings(),\n getLatestFindings(\"gtm_health\"),\n getEntityCounts(),\n all(\n `SELECT hr.*, s.name as segment_name FROM health_readings hr\n JOIN segments s ON hr.segment_id = s.id\n WHERE hr.upload_batch_id = ? AND hr.segment_id IS NOT NULL`,\n [uploadBatchId],\n ),\n all(`SELECT * FROM vital_sign_readings WHERE upload_batch_id = ? AND segment_id IS NOT NULL`, [uploadBatchId]),\n ]);\n\n const vitals = vitalRows.map(parseVitalRow);\n\n const health: HealthResult = {\n overall_score: healthRow.overall_score as number,\n overall_status: healthRow.overall_status as VitalSignStatus,\n gating_vital_sign: healthRow.gating_vital_sign as VitalSign,\n vital_signs: vitals,\n total_value_at_risk: (healthRow.total_value_at_risk as number) ?? null,\n };\n\n const segVitalsById = new Map<string, Record<string, unknown>[]>();\n for (const row of segVitalRows) {\n const segmentId = row.segment_id as string;\n const rows = segVitalsById.get(segmentId) ?? [];\n rows.push(row);\n segVitalsById.set(segmentId, rows);\n }\n\n const segments: SegmentResult[] = segHealthRows.map((sr) => {\n const segmentId = sr.segment_id as string;\n const segVitals = segVitalsById.get(segmentId) ?? [];\n return {\n segment: { id: segmentId, name: sr.segment_name as string },\n result: {\n overall_score: sr.overall_score as number,\n overall_status: sr.overall_status as VitalSignStatus,\n gating_vital_sign: sr.gating_vital_sign as VitalSign,\n vital_signs: segVitals.map(parseVitalRow),\n },\n };\n });\n\n const findings: FindingEntry[] = findingsRow\n ? (typeof findingsRow.findings === \"string\" ? JSON.parse(findingsRow.findings) : findingsRow.findings as FindingEntry[])\n : [];\n\n return {\n health,\n segments,\n findings,\n entityCounts,\n uploadBatchId,\n };\n}\n\nexport async function getLatestMetricsFindings(): Promise<Record<string, unknown> | null> {\n return getLatestFindings(\"revenue_metrics\");\n}\n\nexport async function loadLatestMetricsAnalysis(): Promise<{\n metrics: Record<string, unknown>[];\n findings: FindingEntry[];\n uploadBatchId: string | null;\n} | null> {\n const metricRows = await getLatestMetricReadings();\n if (metricRows.length === 0) return null;\n\n const findingsRow = await getLatestMetricsFindings();\n const findings: FindingEntry[] = findingsRow\n ? (typeof findingsRow.findings === \"string\"\n ? JSON.parse(findingsRow.findings as string)\n : findingsRow.findings as FindingEntry[])\n : [];\n\n const uploadBatchId = (metricRows[0]?.upload_batch_id as string) ?? null;\n\n return { metrics: metricRows, findings, uploadBatchId };\n}\n\nexport { all, get, run } from \"./connection.js\";\n","import { getConnection, getConnectionGeneration, run } from \"./connection.js\";\n\nlet schemaInitialized = false;\nlet schemaConnectionGeneration = -1;\n\nconst SCHEMA_SQL = `\n-- Schema version tracking\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Organizations\nCREATE TABLE IF NOT EXISTS organizations (\n id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid()::VARCHAR,\n canonical_name VARCHAR NOT NULL,\n canonical_domain VARCHAR,\n canonical_id VARCHAR,\n source_system VARCHAR NOT NULL,\n source_id VARCHAR NOT NULL DEFAULT '',\n raw_data JSON DEFAULT '{}',\n metadata JSON DEFAULT '{}',\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- People\nCREATE TABLE IF NOT EXISTS people (\n id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid()::VARCHAR,\n canonical_name VARCHAR NOT NULL,\n canonical_email VARCHAR,\n canonical_id VARCHAR,\n organization_id VARCHAR,\n source_system VARCHAR NOT NULL,\n source_id VARCHAR NOT NULL DEFAULT '',\n raw_data JSON DEFAULT '{}',\n metadata JSON DEFAULT '{}',\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Opportunities\nCREATE TABLE IF NOT EXISTS opportunities (\n id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid()::VARCHAR,\n canonical_name VARCHAR NOT NULL,\n organization_id VARCHAR,\n owner_id VARCHAR,\n current_stage VARCHAR,\n amount DOUBLE,\n close_date VARCHAR,\n source_system VARCHAR NOT NULL,\n source_id VARCHAR NOT NULL DEFAULT '',\n raw_data JSON DEFAULT '{}',\n metadata JSON DEFAULT '{}',\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Activities\nCREATE TABLE IF NOT EXISTS activities (\n id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid()::VARCHAR,\n activity_type VARCHAR NOT NULL DEFAULT 'custom',\n occurred_at TIMESTAMP NOT NULL,\n person_id VARCHAR,\n organization_id VARCHAR,\n opportunity_id VARCHAR,\n source_system VARCHAR NOT NULL,\n source_id VARCHAR NOT NULL DEFAULT '',\n raw_data JSON DEFAULT '{}',\n metadata JSON DEFAULT '{}',\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Campaigns\nCREATE TABLE IF NOT EXISTS campaigns (\n id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid()::VARCHAR,\n canonical_name VARCHAR NOT NULL,\n campaign_type VARCHAR NOT NULL DEFAULT 'custom',\n source_system VARCHAR NOT NULL,\n source_id VARCHAR NOT NULL DEFAULT '',\n raw_data JSON DEFAULT '{}',\n metadata JSON DEFAULT '{}',\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- CSV Uploads\nCREATE TABLE IF NOT EXISTS csv_uploads (\n id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid()::VARCHAR,\n source_system VARCHAR NOT NULL,\n original_filename VARCHAR NOT NULL,\n row_count INTEGER,\n column_mappings JSON DEFAULT '{}',\n status VARCHAR NOT NULL DEFAULT 'uploaded',\n uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n processed_at TIMESTAMP,\n error_message TEXT\n);\n\n-- Segments\nCREATE TABLE IF NOT EXISTS segments (\n id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid()::VARCHAR,\n name VARCHAR NOT NULL,\n entity_type VARCHAR NOT NULL,\n filters JSON DEFAULT '[]',\n is_auto_generated BOOLEAN DEFAULT FALSE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\n-- Vital Sign Readings\nCREATE TABLE IF NOT EXISTS vital_sign_readings (\n id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid()::VARCHAR,\n segment_id VARCHAR,\n vital_sign VARCHAR NOT NULL,\n score DOUBLE NOT NULL,\n status VARCHAR NOT NULL,\n components JSON DEFAULT '{}',\n entity_details JSON DEFAULT '[]',\n computed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n upload_batch_id VARCHAR\n);\n\n-- Health Readings\nCREATE TABLE IF NOT EXISTS health_readings (\n id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid()::VARCHAR,\n segment_id VARCHAR,\n overall_score DOUBLE NOT NULL,\n overall_status VARCHAR NOT NULL,\n gating_vital_sign VARCHAR NOT NULL,\n vital_sign_scores JSON DEFAULT '{}',\n computed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n upload_batch_id VARCHAR\n);\n\n-- Findings\nCREATE TABLE IF NOT EXISTS findings (\n id VARCHAR PRIMARY KEY DEFAULT gen_random_uuid()::VARCHAR,\n upload_batch_id VARCHAR,\n findings JSON DEFAULT '[]',\n model_used VARCHAR,\n computed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n raw_prompt TEXT\n);\n\n-- Indexes\nCREATE INDEX IF NOT EXISTS idx_people_email ON people(canonical_email);\nCREATE INDEX IF NOT EXISTS idx_people_org ON people(organization_id);\nCREATE INDEX IF NOT EXISTS idx_orgs_domain ON organizations(canonical_domain);\nCREATE INDEX IF NOT EXISTS idx_opps_org ON opportunities(organization_id);\nCREATE INDEX IF NOT EXISTS idx_opps_owner ON opportunities(owner_id);\nCREATE INDEX IF NOT EXISTS idx_activities_person ON activities(person_id);\nCREATE INDEX IF NOT EXISTS idx_activities_org ON activities(organization_id);\nCREATE INDEX IF NOT EXISTS idx_activities_opp ON activities(opportunity_id);\nCREATE INDEX IF NOT EXISTS idx_activities_occurred ON activities(occurred_at);\nCREATE INDEX IF NOT EXISTS idx_vital_readings_batch ON vital_sign_readings(upload_batch_id);\nCREATE INDEX IF NOT EXISTS idx_health_readings_batch ON health_readings(upload_batch_id);\n`;\n\nasync function migrateSchema(): Promise<void> {\n const migrations = [\n `ALTER TABLE vital_sign_readings ADD COLUMN IF NOT EXISTS dollar_value DOUBLE`,\n `ALTER TABLE health_readings ADD COLUMN IF NOT EXISTS total_value_at_risk DOUBLE`,\n `CREATE TABLE IF NOT EXISTS metric_readings (\n id VARCHAR PRIMARY KEY,\n segment_id VARCHAR,\n metric VARCHAR NOT NULL,\n label VARCHAR NOT NULL,\n group_name VARCHAR NOT NULL,\n value DOUBLE,\n formatted VARCHAR NOT NULL,\n status VARCHAR NOT NULL DEFAULT 'neutral',\n benchmark_note VARCHAR,\n components JSON DEFAULT '{}',\n unavailable_reason VARCHAR,\n computed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n upload_batch_id VARCHAR\n )`,\n `CREATE INDEX IF NOT EXISTS idx_metric_readings_batch ON metric_readings(upload_batch_id)`,\n `CREATE TABLE IF NOT EXISTS action_proposals (\n id VARCHAR PRIMARY KEY,\n handle VARCHAR,\n kind VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n summary TEXT NOT NULL,\n permission_class VARCHAR NOT NULL,\n status VARCHAR NOT NULL,\n target JSON DEFAULT '{}',\n payload JSON DEFAULT '{}',\n dry_run JSON DEFAULT '{}',\n source VARCHAR NOT NULL DEFAULT 'manual',\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n approved_at TIMESTAMP,\n approved_by VARCHAR\n )`,\n `CREATE TABLE IF NOT EXISTS action_executions (\n id VARCHAR PRIMARY KEY,\n proposal_id VARCHAR NOT NULL,\n status VARCHAR NOT NULL,\n receipt JSON DEFAULT '{}',\n executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )`,\n `CREATE INDEX IF NOT EXISTS idx_action_proposals_status ON action_proposals(status)`,\n `ALTER TABLE action_proposals ADD COLUMN IF NOT EXISTS handle VARCHAR`,\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_action_proposals_handle ON action_proposals(handle)`,\n `CREATE INDEX IF NOT EXISTS idx_action_executions_proposal ON action_executions(proposal_id)`,\n `CREATE TABLE IF NOT EXISTS strategies (\n id VARCHAR PRIMARY KEY,\n slug VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n status VARCHAR NOT NULL DEFAULT 'draft',\n source_type VARCHAR NOT NULL,\n source_path VARCHAR,\n goal TEXT NOT NULL,\n hypothesis TEXT NOT NULL,\n target_segment TEXT NOT NULL,\n priority VARCHAR NOT NULL DEFAULT 'medium',\n linked_play_ids JSON DEFAULT '[]',\n success_metrics JSON DEFAULT '[]',\n leading_indicators JSON DEFAULT '[]',\n risks JSON DEFAULT '[]',\n recommended_actions JSON DEFAULT '[]',\n experiment_design TEXT NOT NULL,\n review_cadence VARCHAR NOT NULL,\n confidence DOUBLE NOT NULL DEFAULT 0.5,\n raw_excerpt TEXT NOT NULL,\n library_path VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )`,\n `CREATE TABLE IF NOT EXISTS strategy_sources (\n id VARCHAR PRIMARY KEY,\n strategy_id VARCHAR NOT NULL,\n source_type VARCHAR NOT NULL,\n source_path VARCHAR,\n content_hash VARCHAR NOT NULL,\n extracted_text_excerpt TEXT NOT NULL,\n metadata JSON DEFAULT '{}',\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )`,\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_strategies_slug ON strategies(slug)`,\n `CREATE INDEX IF NOT EXISTS idx_strategies_status ON strategies(status)`,\n `CREATE INDEX IF NOT EXISTS idx_strategy_sources_strategy ON strategy_sources(strategy_id)`,\n `ALTER TABLE metric_readings ADD COLUMN IF NOT EXISTS confidence DOUBLE`,\n `ALTER TABLE metric_readings ADD COLUMN IF NOT EXISTS confidence_label VARCHAR`,\n `ALTER TABLE metric_readings ADD COLUMN IF NOT EXISTS period VARCHAR`,\n `ALTER TABLE metric_readings ADD COLUMN IF NOT EXISTS comparison VARCHAR`,\n `ALTER TABLE metric_readings ADD COLUMN IF NOT EXISTS reliability_gate JSON`,\n `ALTER TABLE metric_readings ADD COLUMN IF NOT EXISTS estimation_method VARCHAR`,\n `ALTER TABLE findings ADD COLUMN IF NOT EXISTS analysis_lens VARCHAR DEFAULT 'gtm_health'`,\n `ALTER TABLE findings ADD COLUMN IF NOT EXISTS provider_used VARCHAR`,\n `ALTER TABLE findings ADD COLUMN IF NOT EXISTS failover BOOLEAN DEFAULT FALSE`,\n `CREATE TABLE IF NOT EXISTS revenue_events (\n id VARCHAR PRIMARY KEY,\n organization_id VARCHAR,\n period VARCHAR NOT NULL,\n amount DOUBLE NOT NULL,\n event_type VARCHAR NOT NULL,\n source_system VARCHAR,\n source_id VARCHAR,\n raw_data JSON DEFAULT '{}',\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )`,\n `CREATE INDEX IF NOT EXISTS idx_revenue_events_period ON revenue_events(period)`,\n `CREATE INDEX IF NOT EXISTS idx_revenue_events_org ON revenue_events(organization_id)`,\n ];\n for (const sql of migrations) {\n await run(sql + ';');\n }\n}\n\nexport async function initSchema(): Promise<void> {\n await getConnection();\n const currentGeneration = getConnectionGeneration();\n if (schemaInitialized && schemaConnectionGeneration === currentGeneration) return;\n // DuckDB requires statements executed one at a time\n // Strip comment-only lines before splitting on semicolons\n const cleaned = SCHEMA_SQL\n .split('\\n')\n .filter(line => !line.trim().startsWith('--'))\n .join('\\n');\n\n const statements = cleaned\n .split(';')\n .map(s => s.trim())\n .filter(s => s.length > 0);\n\n for (const stmt of statements) {\n await run(stmt + ';');\n }\n\n await migrateSchema();\n schemaInitialized = true;\n schemaConnectionGeneration = getConnectionGeneration();\n}\n","/**\n * Shared execution context passed into every handler + the REPL.\n *\n * Caches:\n * - session ID + session file path (for Last Activity persistence)\n * - lazily-computed FullComputeResult (reused across NL questions)\n * - current config snapshot\n */\n\nimport { basename, join, resolve, sep } from \"node:path\";\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, statSync, rmSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Interface as ReadlineInterface } from \"node:readline/promises\";\nimport type { LlmMessage } from \"../ai/llm/types.js\";\nimport { normalizeThread } from \"../ai/llm/thread-compat.js\";\nimport type { FullComputeResult } from \"../vitals/health-score.js\";\nimport type { Divergence } from \"../pipeline/divergence.js\";\nimport { buildExecutionOptions } from \"../io/context.js\";\nimport type { ExecutionOptions } from \"../io/types.js\";\nimport type { AnalysisLens, LlmSessionOverride, SessionAnalysis } from \"../types.js\";\nimport type { AnalysisScope, ChatAttachment, GapAuditResult } from \"../conversation/types.js\";\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface SessionMessage {\n role: \"user\" | \"agent\";\n content: string;\n at: string;\n}\n\n/**\n * Lifecycle of a point-in-time analysis:\n * new — session created, no data loaded / not yet diagnosed\n * analyzed — data loaded and diagnosed; ready for questions\n * delivered — an output / action was produced (the session reached action)\n * ended — user explicitly closed without producing an output (/end)\n * \"Unfinished\" work = stage \"analyzed\" (reached insight, never shipped).\n */\nexport type SessionStage = \"new\" | \"analyzed\" | \"delivered\" | \"ended\";\n\n/** What data a session is anchored to — the heart of the point-in-time model. */\nexport interface DatasetMeta {\n /** Human label, e.g. \"Acme Q2 export\" or \"hidden_crisis demo\". */\n label?: string;\n /** Where the data came from: a file path, \"demo:<scenario>\", etc. */\n source?: string;\n /** Entity counts captured at ingest time. */\n counts?: Record<string, number>;\n /** When the data was loaded. */\n ingested_at?: string;\n}\n\n/** A produced output / action taken from the analysis. */\nexport interface Deliverable {\n kind: string;\n at: string;\n path?: string;\n note?: string;\n}\n\nexport interface SessionFile {\n id: string;\n created_at: string;\n messages: SessionMessage[];\n ended_at?: string;\n exchange_count?: number;\n summary?: string;\n resumed_from?: string;\n name?: string;\n /** Lifecycle stage of this point-in-time analysis. */\n stage?: SessionStage;\n /** The dataset this session is anchored to. */\n dataset?: DatasetMeta;\n /** Outputs / actions produced from this analysis. */\n deliverables?: Deliverable[];\n /**\n * Compacted Anthropic message thread (text-only Q&A) for true cross-session\n * continuity. Re-seeded into the agent on resume/switch so it remembers the\n * actual prior exchanges, not just an 80-char summary.\n */\n thread?: LlmMessage[];\n /** Primary and completed analysis lenses for this session. */\n analysis?: SessionAnalysis;\n /** Conversation-first analysis scope. */\n scope?: AnalysisScope;\n /** Files ingested via chat. */\n attachments?: ChatAttachment[];\n /** Session-scoped LLM engine overrides (provider, tier, model). */\n llm?: LlmSessionOverride;\n}\n\nexport interface SessionListEntry {\n id: string;\n created_at: string;\n ended_at?: string;\n exchange_count: number;\n summary?: string;\n name?: string;\n stage?: SessionStage;\n dataset?: DatasetMeta;\n deliverables?: Deliverable[];\n analysis?: SessionAnalysis;\n mtime: number;\n}\n\nexport interface Context {\n /** Unique session ID — new one per REPL launch. */\n sessionId: string;\n /** Absolute path to the session file on disk. */\n sessionFile: string;\n /** True when running a single command and exiting. */\n oneShot: boolean;\n /** Output and process behavior for terminal, JSON, and agent use. */\n execution: ExecutionOptions;\n /** Lazily-computed health snapshot. Populated on first NL question. */\n snapshot: {\n computeResult: FullComputeResult | null;\n divergences: Divergence[];\n };\n /** In-memory session message log. Persisted to disk after each exchange. */\n messages: SessionMessage[];\n /**\n * Compacted cross-turn conversation thread (text-only Q&A) fed back into the\n * agent on every turn so it has continuity and never answers from a blank\n * slate. Persisted to the session file and rehydrated on resume/switch.\n */\n conversation: LlmMessage[];\n /**\n * When running inside the REPL, the REPL's readline interface is stored\n * here so interactive commands (wizards, confirms) can reuse it instead\n * of opening a second interface on stdin — two interfaces on the same\n * TTY produces double-echo keystrokes. Undefined in one-shot mode and\n * during first-run onboarding (before the REPL has started).\n */\n rl?: ReadlineInterface;\n /** Summary loaded from a resumed session. */\n resumedSessionSummary?: string;\n /** Session ID that was resumed. */\n resumedFromId?: string;\n /** Human-readable session name set via /name or /switch. */\n sessionName?: string;\n /** Absolute path of this session's dataset DB file (interactive REPL only). */\n datasetPath?: string;\n /** Lifecycle stage of the current point-in-time analysis. */\n stage: SessionStage;\n /** The dataset the current session is anchored to. */\n dataset?: DatasetMeta;\n /** Outputs / actions produced from the current analysis. */\n deliverables: Deliverable[];\n /** The most recent NL question + answer, for lightweight /rate feedback. */\n lastExchange?: { question: string; answer: string };\n /** Primary and completed analysis lenses. */\n analysis: SessionAnalysis;\n /** Active interactive wizard depth (REPL readline shared with prompts). */\n wizardDepth: number;\n /** True while masked secret entry owns stdin — REPL must not echo keypresses. */\n secretInputActive?: boolean;\n /** Conversation-first scope for this analysis. */\n scope?: AnalysisScope;\n /** Files ingested through chat. */\n attachments?: ChatAttachment[];\n /** Cached data gap audit (invalidated on ingest). */\n gapAudit?: GapAuditResult;\n /** User signaled deliverable intent — drives deliver phase. */\n deliverIntent?: boolean;\n /** Transient flag while formula compute runs. */\n computeInProgress?: boolean;\n /** Session-scoped LLM engine overrides — cleared on /new, persisted on resume. */\n llm?: LlmSessionOverride;\n /** True once the interactive REPL loop has started (false during first-run onboard). */\n replStarted?: boolean;\n /** Background update check when cache is stale (REPL startup). */\n pendingUpdateCheck?: Promise<import(\"../update/registry.js\").UpdateCheckResult | null>;\n}\n\n/** True when a report has been produced and the user can ask questions. */\nexport function isAnalysisReady(ctx: Context): boolean {\n if (ctx.stage !== \"analyzed\" || ctx.analysis.completed.length === 0) return false;\n if (!ctx.dataset) return false;\n const counts = ctx.dataset.counts ?? {};\n return Object.values(counts).some((n) => n > 0);\n}\n\n// ============================================================\n// Directories\n// ============================================================\n\nconst SESSION_ID_RE = /^\\d{4}-\\d{2}-\\d{2}-[a-f0-9]{4}$/i;\n\nfunction ntrpHomeDir(): string {\n return process.env.NTRP_HOME ? resolve(process.env.NTRP_HOME) : join(homedir(), \".ntrp\");\n}\n\nexport function getSessionsDir(): string {\n const dir = join(ntrpHomeDir(), \"sessions\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return dir;\n}\n\nexport function getDatasetsDir(): string {\n const dir = join(ntrpHomeDir(), \"datasets\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return dir;\n}\n\n/** Absolute path of the per-session dataset DB file for a session id. */\nexport function datasetPathForSession(id: string): string {\n return join(getDatasetsDir(), `${id}.duckdb`);\n}\n\n// ============================================================\n// Session lifecycle\n// ============================================================\n\nexport function makeSessionId(): string {\n const now = new Date();\n const date = now.toISOString().slice(0, 10);\n const uuid = randomUUID().slice(0, 4);\n return `${date}-${uuid}`;\n}\n\nfunction isValidSessionId(id: string): boolean {\n return SESSION_ID_RE.test(id);\n}\n\nfunction sessionPathForId(id: string): string | null {\n if (!isValidSessionId(id)) return null;\n const dir = resolve(getSessionsDir());\n const filePath = resolve(dir, `${id}.json`);\n if (filePath !== dir && !filePath.startsWith(dir + sep)) return null;\n return filePath;\n}\n\nexport function initContext(oneShot: boolean, execution?: Partial<ExecutionOptions>): Context {\n const sessionId = makeSessionId();\n const sessionFile = join(getSessionsDir(), `${sessionId}.json`);\n\n return {\n sessionId,\n sessionFile,\n oneShot,\n execution: buildExecutionOptions({\n mode: oneShot ? \"one_shot\" : \"interactive\",\n ...execution,\n }),\n snapshot: { computeResult: null, divergences: [] },\n messages: [],\n conversation: [],\n stage: \"new\",\n deliverables: [],\n analysis: defaultSessionAnalysis(),\n wizardDepth: 0,\n attachments: [],\n deliverIntent: false,\n computeInProgress: false,\n };\n}\n\nfunction buildSessionFile(ctx: Context): SessionFile {\n const file: SessionFile = {\n id: ctx.sessionId,\n created_at: ctx.messages[0]?.at ?? new Date().toISOString(),\n messages: ctx.messages,\n stage: ctx.stage,\n };\n if (ctx.sessionName) file.name = ctx.sessionName;\n if (ctx.dataset) file.dataset = ctx.dataset;\n if (ctx.deliverables.length > 0) file.deliverables = ctx.deliverables;\n if (ctx.conversation.length > 0) file.thread = ctx.conversation;\n if (ctx.resumedFromId) file.resumed_from = ctx.resumedFromId;\n if (ctx.analysis) file.analysis = ctx.analysis;\n if (ctx.scope) file.scope = ctx.scope;\n if (ctx.attachments && ctx.attachments.length > 0) file.attachments = ctx.attachments;\n if (ctx.llm && Object.keys(ctx.llm).length > 0) file.llm = ctx.llm;\n return file;\n}\n\nexport function defaultSessionAnalysis(primary: AnalysisLens = \"gtm_health\"): SessionAnalysis {\n return { primary, completed: [] };\n}\n\nexport function setPrimaryLens(ctx: Context, lens: AnalysisLens): void {\n ctx.analysis = { ...ctx.analysis, primary: lens };\n}\n\nexport function markLensCompleted(ctx: Context, lens: AnalysisLens): void {\n const completed = ctx.analysis.completed.includes(lens)\n ? ctx.analysis.completed\n : [...ctx.analysis.completed, lens];\n ctx.analysis = { ...ctx.analysis, completed };\n}\n\nexport function lensBadgeLabel(analysis?: SessionAnalysis): string {\n if (!analysis) return \"health\";\n const hasHealth = analysis.completed.includes(\"gtm_health\") || analysis.primary === \"gtm_health\";\n const hasMetrics = analysis.completed.includes(\"revenue_metrics\") || analysis.primary === \"revenue_metrics\";\n if (hasHealth && hasMetrics) return \"both\";\n if (hasMetrics) return \"metrics\";\n return \"health\";\n}\n\n/** Session lens context injected into NL / ask agent prompts. */\nexport function buildAnalysisBlock(ctx: Context): string {\n return [\n `Primary lens: ${ctx.analysis.primary}`,\n `Completed: ${ctx.analysis.completed.join(\", \") || \"none\"}`,\n `Badge: ${lensBadgeLabel(ctx.analysis)}`,\n ctx.analysis.coverage\n ? `Coverage: ${ctx.analysis.coverage.distinct_months} months, ${ctx.analysis.coverage.recommended_cadence} cadence`\n : null,\n ctx.analysis.data_source_type ? `Data source: ${ctx.analysis.data_source_type}` : null,\n ].filter(Boolean).join(\"\\n\");\n}\n\n/** Metrics-primary session with metrics done but no GTM health run yet. */\nexport function prefersMetricsFirstContext(ctx: Context): boolean {\n return (\n ctx.analysis.primary === \"revenue_metrics\" &&\n ctx.analysis.completed.includes(\"revenue_metrics\") &&\n !ctx.analysis.completed.includes(\"gtm_health\")\n );\n}\n\n/**\n * Rehydrate analysis lens state for headless / MCP paths that skip the REPL.\n * Prefers the most recent persisted session; falls back to DB lane signals.\n */\nexport async function hydrateAnalysisFromPersistedState(ctx: Context): Promise<void> {\n const sessions = listSessions({ limit: 10 });\n const withAnalysis = sessions.find(\n (s) =>\n s.analysis &&\n (s.analysis.completed.length > 0 ||\n s.analysis.primary !== \"gtm_health\" ||\n s.stage === \"analyzed\"),\n );\n if (withAnalysis?.analysis) {\n ctx.analysis = {\n ...defaultSessionAnalysis(withAnalysis.analysis.primary),\n ...withAnalysis.analysis,\n completed: [...withAnalysis.analysis.completed],\n };\n if (withAnalysis.stage) ctx.stage = withAnalysis.stage;\n if (withAnalysis.dataset) ctx.dataset = withAnalysis.dataset;\n return;\n }\n\n const { loadLatestDiagnosis, loadLatestMetricsAnalysis } = await import(\"../db/queries.js\");\n const [diagnosis, metrics] = await Promise.all([\n loadLatestDiagnosis(),\n loadLatestMetricsAnalysis(),\n ]);\n const completed: AnalysisLens[] = [];\n if (diagnosis) completed.push(\"gtm_health\");\n if (metrics?.metrics.length) completed.push(\"revenue_metrics\");\n if (completed.length === 0) return;\n\n let primary = ctx.analysis.primary;\n if (completed.includes(\"revenue_metrics\") && !completed.includes(\"gtm_health\")) {\n primary = \"revenue_metrics\";\n } else if (completed.includes(\"gtm_health\") && !completed.includes(\"revenue_metrics\")) {\n primary = \"gtm_health\";\n }\n ctx.analysis = { ...ctx.analysis, primary, completed };\n if (ctx.stage === \"new\") ctx.stage = \"analyzed\";\n}\n\n/** Headless agent context with session / DB analysis hydration. */\nexport async function initHeadlessAgentContext(): Promise<Context> {\n const ctx = initContext(true, { mode: \"headless\", output: \"json\" });\n await hydrateAnalysisFromPersistedState(ctx);\n return ctx;\n}\n\n/** Append a message to the session and persist to disk. */\nexport function recordMessage(ctx: Context, role: \"user\" | \"agent\", content: string): void {\n const msg: SessionMessage = { role, content, at: new Date().toISOString() };\n ctx.messages.push(msg);\n if (ctx.oneShot) return; // don't persist one-shot noise\n\n try {\n writeFileSync(ctx.sessionFile, JSON.stringify(buildSessionFile(ctx), null, 2) + \"\\n\");\n } catch {\n // best-effort; don't crash REPL\n }\n}\n\n/**\n * Persist the session's current stage/dataset/deliverables without requiring an\n * NL exchange. Called by /new and /handoff to checkpoint lifecycle progress so\n * the welcome dashboard can surface unfinished work accurately.\n */\nexport function saveSessionState(ctx: Context): void {\n if (ctx.oneShot) return;\n try {\n writeFileSync(ctx.sessionFile, JSON.stringify(buildSessionFile(ctx), null, 2) + \"\\n\");\n } catch {\n // best-effort\n }\n}\n\n// ============================================================\n// Last-activity lookup for the welcome dashboard\n// ============================================================\n\n/**\n * Find the most recent session file's modification time and return a\n * compact relative-time string (\"2h ago\", \"just now\", \"2026-04-11\").\n * Used on the welcome dashboard — the session mtime is the truest signal\n * of \"when did I last use ntrp\" because every REPL exchange touches it.\n */\nexport function getLastActivityRelative(): string | null {\n const dir = getSessionsDir();\n let mostRecent = 0;\n try {\n for (const name of readdirSync(dir)) {\n if (!name.endsWith(\".json\")) continue;\n const m = statSync(join(dir, name)).mtimeMs;\n if (m > mostRecent) mostRecent = m;\n }\n } catch {\n return null;\n }\n\n if (mostRecent === 0) return null;\n return formatRelativeTime(new Date(mostRecent));\n}\n\nfunction formatRelativeTime(then: Date): string {\n const diffMs = Date.now() - then.getTime();\n if (diffMs < 0) return \"just now\";\n const s = Math.floor(diffMs / 1000);\n if (s < 60) return \"just now\";\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ago`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h ago`;\n const d = Math.floor(h / 24);\n if (d < 7) return `${d}d ago`;\n // Older than a week — show the date\n return then.toISOString().slice(0, 10);\n}\n\n// ============================================================\n// Session close + listing\n// ============================================================\n\n/** Read and parse a session JSON file. Returns null on any error. */\nexport function loadSessionFile(id: string): SessionFile | null {\n const filePath = sessionPathForId(id);\n if (!filePath) return null;\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const session = JSON.parse(raw) as SessionFile;\n if (session.thread?.length) {\n session.thread = normalizeThread(session.thread as unknown[]);\n }\n return session;\n } catch {\n return null;\n }\n}\n\n/** List all session files, sorted by mtime desc. Optional limit. */\nexport function listSessions(opts?: { limit?: number }): SessionListEntry[] {\n const dir = getSessionsDir();\n const entries: SessionListEntry[] = [];\n try {\n const files = readdirSync(dir)\n .filter((name) => name.endsWith(\".json\"))\n .map((name) => {\n const filePath = join(dir, name);\n return { name, filePath, mtime: statSync(filePath).mtimeMs };\n })\n .sort((a, b) => b.mtime - a.mtime);\n const filesToRead = opts?.limit ? files.slice(0, opts.limit) : files;\n\n for (const { name, filePath, mtime } of filesToRead) {\n const id = basename(name, \".json\");\n if (!isValidSessionId(id)) continue;\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const session = JSON.parse(raw) as SessionFile;\n entries.push({\n id,\n created_at: session.created_at,\n ended_at: session.ended_at,\n exchange_count: session.exchange_count ?? Math.floor(session.messages.length / 2),\n summary: session.summary,\n name: session.name,\n stage: session.stage,\n dataset: session.dataset,\n deliverables: session.deliverables,\n analysis: session.analysis,\n mtime,\n });\n } catch {\n // skip malformed files\n }\n }\n } catch {\n return [];\n }\n entries.sort((a, b) => b.mtime - a.mtime);\n if (opts?.limit) return entries.slice(0, opts.limit);\n return entries;\n}\n\n/** Convenience: get the N most recent sessions. */\nexport function getRecentSessions(n: number): SessionListEntry[] {\n return listSessions({ limit: n });\n}\n\n/**\n * Sessions that reached insight but never shipped an output — \"unfinished\"\n * work the welcome flow nudges the user to pick back up. Excludes the active\n * session and delivered/empty ones.\n */\nexport function getUnfinishedSessions(excludeId?: string): SessionListEntry[] {\n return listSessions().filter(\n (s) =>\n s.id !== excludeId &&\n s.stage === \"analyzed\" &&\n (s.deliverables?.length ?? 0) === 0,\n );\n}\n\n/** True when a session has started work but is not closed or delivered. */\nexport function isSessionInProgress(s: SessionListEntry): boolean {\n if (s.stage === \"ended\") return false;\n if ((s.deliverables?.length ?? 0) > 0 || s.stage === \"delivered\") return false;\n if (s.stage === \"analyzed\") return true;\n return (s.exchange_count ?? 0) > 0 || !!s.dataset?.label;\n}\n\n/** Sessions still open — analyzed awaiting handoff, or new with data/exchanges. */\nexport function getActiveSessions(): SessionListEntry[] {\n return listSessions().filter(isSessionInProgress);\n}\n\n/**\n * Mark every in-progress session as ended, then rotate the REPL to a fresh shell.\n * Session JSON and dataset files are preserved on disk.\n */\nexport async function closeAllActiveSessions(\n ctx: Context,\n): Promise<{ closed: string[]; skipped: string[] }> {\n const active = getActiveSessions();\n const closed: string[] = [];\n const skipped: string[] = [];\n const endedAt = new Date().toISOString();\n\n for (const s of active) {\n if (s.id === ctx.sessionId) continue;\n const file = loadSessionFile(s.id);\n if (!file) {\n skipped.push(s.id);\n continue;\n }\n file.stage = \"ended\";\n file.ended_at = endedAt;\n const filePath = sessionPathForId(s.id);\n if (!filePath) {\n skipped.push(s.id);\n continue;\n }\n writeFileSync(filePath, JSON.stringify(file, null, 2) + \"\\n\");\n closed.push(s.id);\n }\n\n const currentActive = active.some((s) => s.id === ctx.sessionId);\n if (currentActive) {\n const alreadyClosed = ctx.stage === \"delivered\" || ctx.stage === \"ended\";\n const hasWork =\n ctx.stage === \"analyzed\" ||\n !!ctx.dataset ||\n ctx.messages.length > 0 ||\n ctx.deliverables.length > 0;\n\n if (!alreadyClosed && hasWork) {\n await endSession(ctx);\n if (!closed.includes(ctx.sessionId)) closed.push(ctx.sessionId);\n } else if (!alreadyClosed && (ctx.messages.length > 0 || !!ctx.dataset?.label)) {\n await endSession(ctx);\n if (!closed.includes(ctx.sessionId)) closed.push(ctx.sessionId);\n }\n }\n\n await rotateToFreshSession(ctx);\n const { initSchema } = await import(\"../db/schema.js\");\n await initSchema();\n\n return { closed, skipped };\n}\n\n/**\n * Most recently touched session with real work (skips empty shells).\n * listSessions() is already sorted by mtime desc.\n */\nexport function getLastWorkedSession(): SessionListEntry | null {\n for (const s of listSessions()) {\n if (\n (s.exchange_count ?? 0) > 0 ||\n s.stage === \"analyzed\" ||\n s.stage === \"delivered\" ||\n !!s.dataset?.label\n ) {\n return s;\n }\n }\n return null;\n}\n\n/** Finalize the session: compute exchange_count, set ended_at, generate AI summary, write file. */\nexport async function closeSession(ctx: Context): Promise<string | undefined> {\n return finalizeSession(ctx, ctx.stage);\n}\n\n/**\n * Close the current analysis without a handoff — marks stage \"ended\" so it\n * drops off the unfinished list. Preserves transcript, dataset anchor, and\n * optional AI summary like closeSession.\n */\nexport async function endSession(ctx: Context): Promise<string | undefined> {\n return finalizeSession(ctx, \"ended\");\n}\n\n/** Rotate to a brand-new empty session + dataset file (caller finalizes the prior session first). */\nexport async function rotateToFreshSession(ctx: Context): Promise<void> {\n const { setActiveDbPath } = await import(\"../db/connection.js\");\n const newId = makeSessionId();\n resetContextForSwitch(ctx, {\n sessionId: newId,\n sessionFile: join(getSessionsDir(), `${newId}.json`),\n messages: [],\n stage: \"new\",\n analysis: defaultSessionAnalysis(),\n llm: undefined,\n });\n ctx.datasetPath = datasetPathForSession(newId);\n await setActiveDbPath(ctx.datasetPath);\n}\n\nasync function finalizeSession(ctx: Context, stage: SessionStage): Promise<string | undefined> {\n if (ctx.oneShot) return undefined;\n\n const exchangeCount = Math.floor(ctx.messages.length / 2);\n const endedAt = new Date().toISOString();\n\n // Nothing happened in this session — no questions, no data, no output.\n // Don't leave an empty session file or an empty per-session dataset behind.\n if (\n ctx.messages.length === 0 &&\n ctx.stage === \"new\" &&\n !ctx.dataset &&\n ctx.deliverables.length === 0\n ) {\n if (ctx.datasetPath) {\n try {\n const { close } = await import(\"../db/connection.js\");\n await close();\n } catch { /* best-effort */ }\n for (const path of [ctx.datasetPath, `${ctx.datasetPath}.wal`]) {\n try { rmSync(path, { force: true }); } catch { /* best-effort */ }\n }\n }\n return undefined;\n }\n\n const file: SessionFile = {\n id: ctx.sessionId,\n created_at: ctx.messages[0]?.at ?? endedAt,\n messages: ctx.messages,\n ended_at: endedAt,\n exchange_count: exchangeCount,\n stage,\n };\n\n if (ctx.resumedFromId) {\n file.resumed_from = ctx.resumedFromId;\n }\n if (ctx.sessionName) {\n file.name = ctx.sessionName;\n }\n if (ctx.dataset) {\n file.dataset = ctx.dataset;\n }\n if (ctx.deliverables.length > 0) {\n file.deliverables = ctx.deliverables;\n }\n if (ctx.conversation.length > 0) {\n file.thread = ctx.conversation;\n }\n if (ctx.analysis) {\n file.analysis = ctx.analysis;\n }\n if (ctx.scope) {\n file.scope = ctx.scope;\n }\n if (ctx.attachments && ctx.attachments.length > 0) {\n file.attachments = ctx.attachments;\n }\n if (ctx.llm && Object.keys(ctx.llm).length > 0) {\n file.llm = ctx.llm;\n }\n\n // Session metadata only — no automatic AI summary or memory distillation on close.\n try {\n writeFileSync(ctx.sessionFile, JSON.stringify(file, null, 2) + \"\\n\");\n } catch {\n // best-effort\n }\n\n return undefined;\n}\n\n// ============================================================\n// Named-session helpers (for /name and /switch)\n// ============================================================\n\n/**\n * Resolve a session by full id, 4-char suffix, or name.\n * undefined = no match, null = ambiguous (message printed when printErrors is true).\n */\nexport function resolveSessionByToken(\n idArg: string,\n options?: { printErrors?: boolean },\n): SessionListEntry | null | undefined {\n const printErrors = options?.printErrors !== false;\n const all = listSessions();\n const lower = idArg.toLowerCase();\n let matches = all.filter((s) => s.id === idArg);\n if (matches.length === 0) matches = all.filter((s) => s.name?.toLowerCase() === lower);\n if (matches.length === 0 && idArg.length >= 4) {\n matches = all.filter((s) => s.id.endsWith(idArg));\n }\n if (matches.length === 0) return undefined;\n if (matches.length > 1) {\n if (printErrors) {\n console.log(\n ` Ambiguous \"${idArg}\" — matches ${matches.length} sessions. Use a longer id.`,\n );\n }\n return null;\n }\n return matches[0]!;\n}\n\n/** Find the most recent session with a given name (case-insensitive). */\nexport function findSessionByName(name: string): SessionListEntry | null {\n const lower = name.toLowerCase();\n const all = listSessions();\n return all.find((s) => s.name?.toLowerCase() === lower) ?? null;\n}\n\n/** Build a richer context string for a resumed/switched session: summary + last 3 user messages. */\nexport function buildSwitchContext(session: SessionFile): string {\n const parts: string[] = [];\n if (session.summary) parts.push(session.summary);\n\n const userMsgs = session.messages\n .filter((m) => m.role === \"user\")\n .slice(-3);\n for (const m of userMsgs) {\n parts.push(m.content.slice(0, 300));\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Mutate ctx in-place for a session switch. Resets session identity\n * and messages but preserves snapshot, rl, and oneShot.\n */\nexport function resetContextForSwitch(\n ctx: Context,\n opts: {\n sessionId: string;\n sessionFile: string;\n sessionName?: string;\n messages: SessionMessage[];\n conversation?: LlmMessage[];\n resumedFromId?: string;\n resumedSessionSummary?: string;\n stage?: SessionStage;\n dataset?: DatasetMeta;\n deliverables?: Deliverable[];\n analysis?: SessionAnalysis;\n scope?: AnalysisScope;\n attachments?: ChatAttachment[];\n llm?: LlmSessionOverride;\n },\n): void {\n ctx.sessionId = opts.sessionId;\n ctx.sessionFile = opts.sessionFile;\n ctx.sessionName = opts.sessionName;\n ctx.messages = opts.messages;\n ctx.conversation = opts.conversation ?? [];\n ctx.resumedFromId = opts.resumedFromId;\n ctx.resumedSessionSummary = opts.resumedSessionSummary;\n ctx.stage = opts.stage ?? \"new\";\n ctx.dataset = opts.dataset;\n ctx.deliverables = opts.deliverables ?? [];\n ctx.analysis = opts.analysis ?? defaultSessionAnalysis();\n ctx.scope = opts.scope;\n ctx.attachments = opts.attachments ?? [];\n ctx.llm = opts.llm;\n ctx.gapAudit = undefined;\n ctx.deliverIntent = false;\n ctx.computeInProgress = false;\n ctx.wizardDepth = 0;\n // The cached health snapshot belongs to the previous dataset — clear it so\n // the next question recomputes against the newly-bound dataset.\n ctx.snapshot = { computeResult: null, divergences: [] };\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join, resolve } from \"path\";\nimport type { CLIConfig } from \"../types.js\";\n\nconst NTRP_DIR = process.env.NTRP_HOME ? resolve(process.env.NTRP_HOME) : join(homedir(), \".ntrp\");\nconst CONFIG_PATH = join(NTRP_DIR, \"config.json\");\nlet cachedConfig: CLIConfig | null = null;\n\nexport function ntrpHome(): string {\n return NTRP_DIR;\n}\n\nfunction ensureDir(): void {\n if (!existsSync(NTRP_DIR)) {\n mkdirSync(NTRP_DIR, { recursive: true });\n }\n}\n\nexport function loadConfig(): CLIConfig {\n if (cachedConfig) return cachedConfig;\n ensureDir();\n if (!existsSync(CONFIG_PATH)) {\n cachedConfig = {};\n return cachedConfig;\n }\n try {\n cachedConfig = JSON.parse(readFileSync(CONFIG_PATH, \"utf-8\")) as CLIConfig;\n } catch {\n cachedConfig = {};\n }\n return cachedConfig;\n}\n\nexport function saveConfig(config: CLIConfig): void {\n ensureDir();\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\");\n cachedConfig = config;\n}\n\n/** Clear the in-memory config cache (e.g. after deleting config.json on disk). */\nexport function resetConfigCache(): void {\n cachedConfig = null;\n}\n\nexport function getConfigValue(key: string): string | undefined {\n // api-key is config-file only; env vars are never picked up automatically (see ai/repl-api.ts).\n if (key === \"api-key\") return loadConfig()[\"api-key\"];\n if (key === \"license-key\") return process.env.NTRP_LICENSE_KEY ?? (loadConfig() as Record<string, string | undefined>)[\"license-key\"];\n const config = loadConfig();\n return (config as Record<string, string | undefined>)[key];\n}\n\nexport function setConfigValue(key: string, value: string): void {\n const config = loadConfig();\n (config as Record<string, string>)[key] = value;\n saveConfig(config);\n}\n\nexport function deleteConfigValue(key: string): void {\n const config = loadConfig();\n delete (config as Record<string, unknown>)[key];\n saveConfig(config);\n}\n\nexport function getExportsDir(): string {\n const config = loadConfig();\n const dir = resolve(config[\"export-dir\"] ?? join(NTRP_DIR, \"exports\"));\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return dir;\n}\n\nexport function getStrategiesDir(): string {\n const dir = join(NTRP_DIR, \"strategies\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, \"README.md\"), `# Strategies\n\nThis directory holds your GTM strategy files. Each file describes a strategy you're executing.\n\n## How to use\n\n1. Create a markdown file for each active strategy (e.g., \\`multi-thread-q2.md\\`)\n2. Describe the goal, target segment, and success criteria\n3. Reference playbook plays that support this strategy\n4. After diagnosis, check if vital signs improved in the targeted area\n\n## Example\n\n\\`\\`\\`markdown\n# Multi-Thread Enterprise Deals — Q2\n\n**Goal:** Reduce single-threaded deals from 65% to under 30%\n**Segment:** Enterprise accounts > $100K\n**Play:** Multi-Thread Your Deals\n**Success metric:** Thread depth score > 70\n\\`\\`\\`\n`);\n }\n return dir;\n}\n\nexport function getMemoryDir(): string {\n const dir = join(NTRP_DIR, \"memory\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return dir;\n}\n\nexport function getKnowledgeDir(): string {\n const dir = join(NTRP_DIR, \"knowledge\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, \"README.md\"), `# Knowledge Packs\n\nDrop case studies, GTM frameworks, benchmark reports, or playbooks here as\nmarkdown, text, or PDF. NTRP ingests them with \\`/knowledge add <file>\\` and\nreferences the most relevant passages during analysis — so the agent can learn\nfrom work done outside this platform.\n\n## How to use\n\n1. Add a file: \\`/knowledge add ~/Downloads/plg-benchmarks-2026.pdf\\`\n2. List what's indexed: \\`/knowledge list\\`\n3. Ask a question — relevant passages are pulled in automatically.\n`);\n }\n return dir;\n}\n\nexport function getWinsDir(): string {\n const dir = join(NTRP_DIR, \"wins\");\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, \"README.md\"), `# Wins\n\nThis directory logs outcomes when a strategy or play succeeds. Each win creates a record that future diagnoses can reference.\n\n## How to use\n\n1. After executing a play, log the result here (e.g., \\`2026-04-clean-pipeline.md\\`)\n2. Include: what you did, what changed, before/after scores\n3. Future AI findings will reference wins to track improvement over time\n\n## Example\n\n\\`\\`\\`markdown\n# Pipeline Cleanup — April 2026\n\n**Play:** Clean Dead Pipeline\n**Before:** Freshness 29/100, $3.1M stale pipeline\n**After:** Freshness 72/100, removed 45 zombie deals\n**Impact:** Forecast accuracy improved from 62% to 84%\n\\`\\`\\`\n`);\n }\n return dir;\n}\n","/**\n * Typed LLM configuration loader with lazy migration for existing installs.\n */\n\nimport type { InferenceTier, LlmConfig, LlmProvider } from \"../types.js\";\nimport { loadConfig, saveConfig } from \"./store.js\";\n\nfunction parseProvider(raw: string | undefined): LlmProvider | undefined {\n if (raw === \"anthropic\" || raw === \"openai\") return raw;\n return undefined;\n}\n\nfunction parseTier(raw: string | undefined): InferenceTier | undefined {\n if (raw === \"high\" || raw === \"medium\" || raw === \"low\") return raw;\n return undefined;\n}\n\nfunction parseFailoverOrder(raw: string | undefined): LlmProvider[] {\n if (!raw?.trim()) return [\"openai\"];\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter((s): s is LlmProvider => s === \"anthropic\" || s === \"openai\");\n}\n\nfunction parseAutoFailover(raw: string | undefined): boolean {\n if (!raw) return false;\n const v = raw.trim().toLowerCase();\n return v === \"on\" || v === \"true\" || v === \"1\" || v === \"yes\";\n}\n\n/** Anthropic key — config file only (never env). */\nexport function getAnthropicApiKey(): string | undefined {\n return loadConfig()[\"api-key\"]?.trim() || undefined;\n}\n\n/** OpenAI key — config first, then OPENAI_API_KEY env (shared with embeddings). */\nexport function getOpenAiApiKey(): string | undefined {\n const fromConfig = loadConfig()[\"openai-api-key\"]?.trim();\n if (fromConfig) return fromConfig;\n return process.env.OPENAI_API_KEY?.trim() || undefined;\n}\n\nexport function hasProviderKey(provider: LlmProvider): boolean {\n if (provider === \"anthropic\") return !!getAnthropicApiKey();\n return !!getOpenAiApiKey();\n}\n\nexport function getAvailableProviders(): LlmProvider[] {\n const out: LlmProvider[] = [];\n if (hasProviderKey(\"anthropic\")) out.push(\"anthropic\");\n if (hasProviderKey(\"openai\")) out.push(\"openai\");\n return out;\n}\n\nexport function hasAnyLlmProvider(): boolean {\n return getAvailableProviders().length > 0;\n}\n\nlet migrated = false;\n\nfunction applyLazyMigration(config: ReturnType<typeof loadConfig>): void {\n if (migrated) return;\n migrated = true;\n\n let changed = false;\n const record = config as Record<string, string | undefined>;\n\n if (!record[\"llm-primary\"]) {\n if (record[\"api-key\"]) {\n record[\"llm-primary\"] = \"anthropic\";\n changed = true;\n } else if (record[\"openai-api-key\"] || process.env.OPENAI_API_KEY) {\n record[\"llm-primary\"] = \"openai\";\n changed = true;\n }\n }\n\n if (!record[\"llm-failover-order\"]) {\n record[\"llm-failover-order\"] = \"openai\";\n changed = true;\n }\n\n if (!record[\"llm-tier\"]) {\n record[\"llm-tier\"] = \"high\";\n changed = true;\n }\n\n // Dual-key installs: preserve prior implicit failover behavior once.\n if (!record[\"llm-auto-failover\"]) {\n const hasAnthropic = !!record[\"api-key\"];\n const hasOpenai = !!record[\"openai-api-key\"] || !!process.env.OPENAI_API_KEY;\n if (hasAnthropic && hasOpenai) {\n record[\"llm-auto-failover\"] = \"on\";\n changed = true;\n }\n }\n\n if (changed) saveConfig(config);\n}\n\n/** Ensure legacy api-key-only installs get llm-* defaults persisted. */\nexport function ensureLlmConfigMigrated(): void {\n applyLazyMigration(loadConfig());\n}\n\nexport function loadLlmConfig(): LlmConfig {\n const config = loadConfig();\n applyLazyMigration(config);\n\n const primary = parseProvider(config[\"llm-primary\"]) ?? \"anthropic\";\n const tier = parseTier(config[\"llm-tier\"]) ?? \"high\";\n const failoverOrder = parseFailoverOrder(config[\"llm-failover-order\"]);\n const modelOverride = config[\"llm-model-override\"]?.trim() || undefined;\n const autoFailover = parseAutoFailover(config[\"llm-auto-failover\"]);\n\n return {\n primary,\n failoverOrder: failoverOrder.filter((p) => p !== primary),\n tier,\n modelOverride,\n autoFailover,\n anthropicKey: getAnthropicApiKey(),\n openaiKey: getOpenAiApiKey(),\n };\n}\n\nexport function getProviderApiKey(provider: LlmProvider): string | undefined {\n if (provider === \"anthropic\") return getAnthropicApiKey();\n return getOpenAiApiKey();\n}\n\n/** Investigation harness — env overrides for CI. */\nexport function getInvestigationApiKey(provider: LlmProvider): string | undefined {\n if (provider === \"anthropic\") {\n return process.env.NTRP_INVESTIGATION_API_KEY?.trim() || getAnthropicApiKey();\n }\n return process.env.NTRP_INVESTIGATION_OPENAI_KEY?.trim() || getOpenAiApiKey();\n}\n","/**\n * Tiny argv parser — just enough for our slash commands.\n *\n * Supports:\n * --flag (boolean true when listed in `boolFlags`)\n * --no-flag (boolean false)\n * --option value (string)\n * --option=value (string)\n * -s value (string, short form)\n * -s (boolean true, if in `boolFlags`)\n * positional (anything not prefixed with -)\n *\n * The caller owns validation. Unknown flags are stored under their raw name.\n */\n\nexport interface Parsed {\n positional: string[];\n flags: Map<string, string | boolean>;\n}\n\nexport function parseArgs(args: string[], boolFlags: string[] = []): Parsed {\n const positional: string[] = [];\n const flags = new Map<string, string | boolean>();\n const boolSet = new Set(boolFlags);\n\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!;\n\n if (a === \"--\") {\n // Everything after -- is positional\n for (let j = i + 1; j < args.length; j++) positional.push(args[j]!);\n break;\n }\n\n if (a.startsWith(\"--\")) {\n const eqIdx = a.indexOf(\"=\");\n if (eqIdx !== -1) {\n flags.set(a.slice(2, eqIdx), a.slice(eqIdx + 1));\n continue;\n }\n const name = a.slice(2);\n if (name.startsWith(\"no-\")) {\n flags.set(name.slice(3), false);\n continue;\n }\n if (boolSet.has(name)) {\n flags.set(name, true);\n continue;\n }\n // Consume next token as value if it doesn't look like another flag\n const next = args[i + 1];\n if (next !== undefined && !next.startsWith(\"-\")) {\n flags.set(name, next);\n i++;\n } else {\n flags.set(name, true);\n }\n continue;\n }\n\n if (a.startsWith(\"-\") && a.length > 1) {\n const name = a.slice(1);\n if (boolSet.has(name)) {\n flags.set(name, true);\n continue;\n }\n const next = args[i + 1];\n if (next !== undefined && !next.startsWith(\"-\")) {\n flags.set(name, next);\n i++;\n } else {\n flags.set(name, true);\n }\n continue;\n }\n\n positional.push(a);\n }\n\n return { positional, flags };\n}\n\nexport function getString(flags: Map<string, string | boolean>, ...names: string[]): string | undefined {\n for (const n of names) {\n const v = flags.get(n);\n if (typeof v === \"string\") return v;\n }\n return undefined;\n}\n\nexport function getBool(flags: Map<string, string | boolean>, ...names: string[]): boolean {\n for (const n of names) {\n if (flags.get(n) === true) return true;\n }\n return false;\n}\n\n/** Returns true iff any of the given flag names was explicitly set to false. */\nexport function getFalse(flags: Map<string, string | boolean>, ...names: string[]): boolean {\n for (const n of names) {\n if (flags.get(n) === false) return true;\n }\n return false;\n}\n\nexport function getNumber(flags: Map<string, string | boolean>, ...names: string[]): number | undefined {\n const s = getString(flags, ...names);\n if (s === undefined) return undefined;\n const n = Number(s);\n return Number.isFinite(n) ? n : undefined;\n}\n","/**\n * REPL navigation commands that must work from any interactive surface\n * (main prompt, wizards, confirms, secret entry).\n */\n\nexport type GlobalReplCommand =\n | \"exit\"\n | \"help\"\n | \"home\"\n | \"clear\"\n | \"scratch\"\n | \"cleanup\"\n | \"deactivate-demo\";\n\nconst GLOBAL_COMMANDS = new Map<string, GlobalReplCommand>([\n [\"/exit\", \"exit\"],\n [\"/quit\", \"exit\"],\n [\"/help\", \"help\"],\n [\"/home\", \"home\"],\n [\"/clear\", \"clear\"],\n [\"/scratch\", \"scratch\"],\n [\"/cleanup\", \"cleanup\"],\n [\"/deactivate-demo\", \"deactivate-demo\"],\n]);\n\nexport function parseGlobalReplCommand(input: string): GlobalReplCommand | null {\n const first = input.trim().split(/\\s+/, 1)[0] ?? \"\";\n return GLOBAL_COMMANDS.get(first) ?? null;\n}\n\nexport function isGlobalReplCommand(input: string): boolean {\n return parseGlobalReplCommand(input) !== null;\n}\n\n/** Thrown from wizard prompts when the user invokes a global REPL command. */\nexport class GlobalReplCommandError extends Error {\n readonly command: GlobalReplCommand;\n\n constructor(command: GlobalReplCommand) {\n super(`Global REPL command: ${command}`);\n this.name = \"GlobalReplCommandError\";\n this.command = command;\n }\n}\n\nexport function assertNotGlobalReplCommand(input: string): void {\n const command = parseGlobalReplCommand(input);\n if (command) throw new GlobalReplCommandError(command);\n}\n","import chalk from \"chalk\";\nimport type { VitalSignStatus } from \"../types.js\";\nimport { VITAL_SIGN_LABELS } from \"../output/formatters.js\";\n\nexport { VITAL_SIGN_LABELS as VITAL_LABELS };\n\nexport const STATUS_COLORS: Record<VitalSignStatus, string> = {\n green: \"#22c55e\",\n yellow: \"#eab308\",\n red: \"#ef4444\",\n};\n\nexport const STATUS_DOTS: Record<VitalSignStatus, string> = {\n green: \"●\",\n yellow: \"●\",\n red: \"●\",\n};\n\nexport const DIM_DOT = \"○\";\n\nexport const SEVERITY_COLORS: Record<string, string> = {\n critical: \"#ef4444\",\n warning: \"#eab308\",\n info: \"#3b82f6\",\n};\n\n// Teal-to-cyan gradient — medical + technical feel\nexport const GRADIENT = [\n \"#0d9488\",\n \"#14b8a6\",\n \"#2dd4bf\",\n \"#22d3ee\",\n \"#67e8f9\",\n];\n\n// Semantic tokens for the shell UI\nexport const TOKENS = {\n accent: \"#14b8a6\",\n accentBright: \"#2dd4bf\",\n border: \"#334155\",\n borderMuted: \"#1e293b\",\n dim: \"#64748b\",\n text: \"#e2e8f0\",\n error: \"#ef4444\",\n warning: \"#eab308\",\n success: \"#22c55e\",\n info: \"#3b82f6\",\n} as const;\n\nexport type Token = keyof typeof TOKENS;\n\nexport type BadgeTone = \"success\" | \"warning\" | \"error\" | \"info\" | \"muted\" | \"accent\";\n\nexport function paint(token: Token, text: string): string {\n if (token === \"dim\") return chalk.dim(text);\n return chalk.hex(TOKENS[token])(text);\n}\n\nexport function bold(text: string): string {\n return chalk.bold(text);\n}\n\nexport function badge(label: string, tone: BadgeTone = \"muted\"): string {\n const normalized = ` ${label.toUpperCase()} `;\n switch (tone) {\n case \"success\":\n return chalk.hex(TOKENS.success)(normalized);\n case \"warning\":\n return chalk.hex(TOKENS.warning)(normalized);\n case \"error\":\n return chalk.hex(TOKENS.error)(normalized);\n case \"info\":\n return chalk.hex(TOKENS.info)(normalized);\n case \"accent\":\n return chalk.hex(TOKENS.accent)(normalized);\n case \"muted\":\n return chalk.dim(normalized);\n }\n}\n\nexport function sectionHeading(label: string): string {\n return `${paint(\"accent\", \"▸\")} ${paint(\"accent\", bold(label))}`;\n}\n\nexport function actionHint(label: string, command: string, detail?: string): string {\n const suffix = detail ? chalk.dim(` ${detail}`) : \"\";\n return `${chalk.dim(label)} ${paint(\"accent\", command)}${suffix}`;\n}\n\nexport function statusDot(status: VitalSignStatus): string {\n return STATUS_DOTS[status]!;\n}\n\n/** Inline bar: ████████░░ */\nexport function inlineBar(score: number, width = 20): string {\n const filled = Math.round((score / 100) * width);\n return \"█\".repeat(filled) + \"░\".repeat(width - filled);\n}\n\n/** Textured score bar with status coloring: ██▓▓░░░░ */\nexport function scoreBar(score: number, status: VitalSignStatus, width = 14): string {\n const filled = Math.round((score / 100) * width);\n const color = chalk.hex(STATUS_COLORS[status]);\n let filledPart = \"\";\n for (let i = 0; i < filled; i++) {\n filledPart += i % 2 === 0 ? \"█\" : \"▓\";\n }\n const emptyPart = \"░\".repeat(width - filled);\n return color(filledPart) + chalk.dim(emptyPart);\n}\n","/**\n * Readline prompt helpers for interactive wizards.\n *\n * IMPORTANT: we use a single long-lived readline Interface per wizard\n * session rather than creating/destroying one per question. Creating a\n * fresh interface for every prompt causes double-echo on stdin (both the\n * terminal and readline paint each keystroke) — the REPL uses a single\n * interface and works fine, so we match that pattern.\n *\n * Callers create a session via `createPromptSession()`, call any of the\n * four primitives on it, and `close()` it when the wizard ends. The\n * accent \"ntrp ›\" marker matches the REPL prompt style so wizards feel at\n * home inside the shell.\n */\n\nimport { createInterface, type Interface } from \"node:readline/promises\";\nimport { clearLine, cursorTo } from \"node:readline\";\nimport type { Context } from \"./context.js\";\nimport { assertNotGlobalReplCommand } from \"./repl-globals.js\";\nimport { paint, bold } from \"../ui/theme.js\";\nimport chalk from \"chalk\";\n\nfunction marker(): string {\n return paint(\"accent\", \"ntrp › \");\n}\n\nfunction secretPromptLine(question: string): string {\n return ` ${paint(\"accent\", \"▸\")} ${bold(question)} ${chalk.dim(\"(hidden — paste once, Enter)\")} `;\n}\n\n/** Strip bracketed-paste wrappers and other terminal escape noise from stdin chunks. */\nfunction stripTerminalArtifacts(input: string): string {\n return input\n .replace(/\\x1b\\[[0-9;]*[a-zA-Z~]/g, \"\")\n .replace(/\\x1b\\][^\\x07]*(\\x07|\\x1b\\\\)/g, \"\");\n}\n\ntype ReplLike = Interface & { line?: string; cursor?: number };\n\nfunction renderQuestion(question: string, defaultValue?: string): string {\n const base = ` ${marker()}${bold(question)}`;\n if (defaultValue !== undefined && defaultValue !== \"\") {\n return `${base} ${chalk.dim(`[${defaultValue}]`)} `;\n }\n return `${base} `;\n}\n\nexport interface Choice<T extends string> {\n value: T;\n label: string;\n description?: string;\n}\n\nexport interface MultiOption {\n label: string;\n description?: string;\n}\n\nexport interface PromptSession {\n ask(question: string, opts?: { default?: string }): Promise<string>;\n askRequired(question: string): Promise<string>;\n confirm(question: string, defaultYes?: boolean): Promise<boolean>;\n choose<T extends string>(question: string, choices: Choice<T>[], opts?: { default?: T }): Promise<T>;\n /**\n * Open-ended multiple-choice prompt (AskUserQuestion style):\n * - renders the question + numbered options + descriptions\n * - if the user types a number in range, returns the matching option label\n * - if the user types free text, returns the text as-is\n * - if the user hits enter with no input, returns \"\" (skip)\n * Used by the adaptive onboarding clarifying-question loop so the model\n * can drive follow-up questions without forcing the user into a rigid menu.\n */\n askMulti(question: string, options: MultiOption[]): Promise<string>;\n /** Hidden stdin entry for secrets (API keys, etc.). Optional confirm paste. */\n askSecret(question: string, opts?: { confirm?: boolean; maskChar?: string }): Promise<string>;\n close(): void;\n}\n\n/**\n * Create a prompt session.\n *\n * If `existing` is provided (e.g. the REPL's long-lived readline\n * interface), the session reuses it and `close()` becomes a no-op — the\n * caller retains ownership. This is CRITICAL: opening a second readline\n * interface on stdin while another is already active produces double-echo\n * keystrokes because both interfaces paint input characters.\n *\n * When called without `existing` (first-run onboarding, one-shot mode),\n * a fresh interface is created and `close()` tears it down.\n */\nexport function createPromptSession(existing?: Interface, ctx?: Context): PromptSession {\n const owned = existing === undefined;\n const rl: Interface =\n existing ??\n createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true,\n });\n\n if (ctx && existing) {\n ctx.wizardDepth = (ctx.wizardDepth ?? 0) + 1;\n }\n\n async function ask(question: string, opts: { default?: string } = {}): Promise<string> {\n const raw = (await rl.question(renderQuestion(question, opts.default))).trim();\n assertNotGlobalReplCommand(raw);\n if (!raw && opts.default !== undefined) return opts.default;\n return raw;\n }\n\n async function askRequired(question: string): Promise<string> {\n for (;;) {\n const raw = (await rl.question(renderQuestion(question))).trim();\n assertNotGlobalReplCommand(raw);\n if (raw) return raw;\n console.log(\" \" + chalk.red(\"This one is required.\"));\n }\n }\n\n async function confirm(question: string, defaultYes = false): Promise<boolean> {\n const hint = defaultYes ? \"Y/n\" : \"y/N\";\n const raw = (await rl.question(renderQuestion(question, hint))).trim();\n assertNotGlobalReplCommand(raw);\n const answer = raw.toLowerCase();\n if (!answer) return defaultYes;\n return answer === \"y\" || answer === \"yes\";\n }\n\n async function choose<T extends string>(\n question: string,\n choices: Choice<T>[],\n opts: { default?: T } = {},\n ): Promise<T> {\n if (choices.length === 0) throw new Error(\"choose() requires at least one choice\");\n console.log();\n console.log(\" \" + bold(question));\n const defaultIdx = opts.default\n ? choices.findIndex((c) => c.value === opts.default)\n : -1;\n choices.forEach((c, i) => {\n const num = paint(\"accent\", `${i + 1}.`);\n const active = i === defaultIdx ? chalk.dim(\" ← default\") : \"\";\n console.log(` ${num} ${c.label}${active}`);\n if (c.description) console.log(` ${chalk.dim(c.description)}`);\n });\n\n const defaultLabel = defaultIdx >= 0 ? String(defaultIdx + 1) : undefined;\n console.log();\n console.log(\" \" + chalk.dim(\"─\".repeat(40)));\n for (;;) {\n const raw = (await rl.question(renderQuestion(`Your pick [1-${choices.length}]`, defaultLabel))).trim();\n assertNotGlobalReplCommand(raw);\n const pick = raw || defaultLabel || \"\";\n const n = Number(pick);\n if (Number.isInteger(n) && n >= 1 && n <= choices.length) {\n return choices[n - 1]!.value;\n }\n console.log(\" \" + chalk.red(`Enter a number from 1 to ${choices.length}.`));\n }\n }\n\n async function askMulti(question: string, options: MultiOption[]): Promise<string> {\n if (options.length === 0) throw new Error(\"askMulti() requires at least one option\");\n console.log();\n console.log(\" \" + bold(question));\n options.forEach((o, i) => {\n const num = paint(\"accent\", `${i + 1}.`);\n console.log(` ${num} ${o.label}`);\n if (o.description) console.log(` ${chalk.dim(o.description)}`);\n });\n const hint = `Choose [1-${options.length}], type your own, or enter to skip`;\n const raw = (await rl.question(renderQuestion(hint))).trim();\n assertNotGlobalReplCommand(raw);\n if (!raw) return \"\";\n const n = Number(raw);\n if (Number.isInteger(n) && n >= 1 && n <= options.length) {\n return options[n - 1]!.label;\n }\n return raw;\n }\n\n async function readMaskedLine(prompt: string, maskChar = \"•\"): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new Error(\"Secret entry requires an interactive terminal.\");\n }\n\n const stdin = process.stdin;\n const replRl = rl as ReplLike;\n if (ctx) ctx.secretInputActive = true;\n\n if (replRl.line !== undefined) {\n replRl.line = \"\";\n replRl.cursor = 0;\n }\n\n if (stdin.isTTY) stdin.setRawMode(true);\n rl.pause();\n\n process.stdout.write(\"\\n\" + prompt);\n\n try {\n return await new Promise<string>((resolve, reject) => {\n let value = \"\";\n let settled = false;\n\n const cleanup = () => {\n stdin.off(\"data\", onData);\n if (stdin.isTTY && stdin.isRaw) stdin.setRawMode(false);\n clearLine(process.stdout, 0);\n cursorTo(process.stdout, 0);\n rl.resume();\n if (replRl.line !== undefined) {\n replRl.line = \"\";\n replRl.cursor = 0;\n }\n };\n\n const finish = (fn: () => void) => {\n if (settled) return;\n settled = true;\n try {\n cleanup();\n } finally {\n fn();\n }\n };\n\n stdin.resume();\n stdin.setEncoding(\"utf8\");\n\n const onData = (chunk: string) => {\n const cleaned = stripTerminalArtifacts(chunk);\n for (const char of cleaned) {\n if (char === \"\\r\" || char === \"\\n\") {\n finish(() => {\n process.stdout.write(\"\\n\");\n const trimmed = stripTerminalArtifacts(value).trim();\n assertNotGlobalReplCommand(trimmed);\n resolve(trimmed);\n });\n return;\n }\n if (char === \"\\u0003\") {\n finish(() => {\n process.stdout.write(\"\\n\");\n reject(new Error(\"Cancelled\"));\n });\n return;\n }\n if (char === \"\\u0004\") {\n finish(() => {\n process.stdout.write(\"\\n\");\n const trimmed = stripTerminalArtifacts(value).trim();\n assertNotGlobalReplCommand(trimmed);\n resolve(trimmed);\n });\n return;\n }\n if (char === \"\\u007f\" || char === \"\\b\") {\n if (value.length > 0) {\n value = value.slice(0, -1);\n if (maskChar) process.stdout.write(\"\\b \\b\");\n }\n continue;\n }\n if (char < \" \" && char !== \"\\t\") continue;\n value += char;\n if (maskChar) process.stdout.write(maskChar);\n }\n };\n\n stdin.on(\"data\", onData);\n });\n } finally {\n if (ctx) ctx.secretInputActive = false;\n }\n }\n\n async function askSecret(\n question: string,\n opts: { confirm?: boolean; maskChar?: string } = {},\n ): Promise<string> {\n const maskChar = opts.maskChar ?? \"•\";\n for (;;) {\n const value = await readMaskedLine(secretPromptLine(question), maskChar);\n if (!value) {\n console.log(\" \" + chalk.red(\"This one is required.\"));\n continue;\n }\n if (opts.confirm === false) return value;\n\n const preview = value.length <= 14 ? `${value.slice(0, 4)}…` : `${value.slice(0, 10)}…`;\n console.log(\" \" + chalk.dim(`Captured ${value.length} characters (${preview})`));\n const ok = await confirm(\"Save this key?\", false);\n if (ok) return value;\n console.log(\" \" + chalk.dim(\"Try again — paste the key once, then Enter.\"));\n }\n }\n\n return {\n ask,\n askRequired,\n confirm,\n choose,\n askMulti,\n askSecret,\n close: () => {\n if (ctx && existing) {\n ctx.wizardDepth = Math.max(0, (ctx.wizardDepth ?? 0) - 1);\n }\n if (owned) rl.close();\n },\n };\n}\n","/**\n * Shared confirmation UX for global admin commands.\n *\n * Every admin command must print a visible console.log banner before any\n * nested readline prompt — otherwise full-screen REPL redraw can hide prompts.\n */\n\nimport chalk from \"chalk\";\nimport type { Context } from \"./context.js\";\nimport { createPromptSession } from \"./prompts.js\";\n\nexport function printAdminBanner(title: string, detail?: string): void {\n console.log();\n console.log(\" \" + chalk.yellow.bold(title) + (detail ? chalk.dim(` ${detail}`) : \"\"));\n console.log();\n}\n\nexport interface RequireYesNoOptions {\n title: string;\n detail?: string;\n question?: string;\n defaultYes?: boolean;\n confirmedFlag?: boolean;\n oneShotHint?: string;\n}\n\nexport async function requireYesNo(ctx: Context, opts: RequireYesNoOptions): Promise<boolean> {\n const {\n title,\n detail,\n question = \"Proceed?\",\n defaultYes = false,\n confirmedFlag = false,\n oneShotHint = \"Re-run with --confirm to proceed.\",\n } = opts;\n\n if (confirmedFlag) return true;\n\n if (ctx.oneShot) {\n printAdminBanner(title, detail);\n console.log(chalk.dim(` ${oneShotHint}\\n`));\n process.exit(1);\n }\n\n printAdminBanner(title, detail);\n const prompts = createPromptSession(ctx.rl, ctx);\n try {\n return await prompts.confirm(question, defaultYes);\n } finally {\n prompts.close();\n }\n}\n\nexport interface RequireTypedWordOptions {\n title: string;\n detail?: string;\n word: string;\n confirmedFlag?: boolean;\n oneShotHint?: string;\n /** Extra lines printed before the type prompt (e.g. bullet list). */\n preamble?: () => void;\n}\n\nexport async function requireTypedWord(ctx: Context, opts: RequireTypedWordOptions): Promise<boolean> {\n const {\n title,\n detail,\n word,\n confirmedFlag = false,\n oneShotHint = \"Re-run with --confirm to proceed.\",\n preamble,\n } = opts;\n\n if (confirmedFlag) return true;\n\n if (ctx.oneShot) {\n if (preamble) preamble();\n else printAdminBanner(title, detail);\n console.log(chalk.dim(` ${oneShotHint}\\n`));\n process.exit(1);\n }\n\n if (preamble) {\n preamble();\n } else {\n printAdminBanner(title, detail);\n }\n\n console.log(\n \" \" + chalk.dim(`Type ${chalk.white(`\"${word}\"`)} exactly (case-sensitive) to proceed:`),\n );\n console.log();\n\n const prompts = createPromptSession(ctx.rl, ctx);\n try {\n const typed = await prompts.ask(`Enter \"${word}\"`);\n return typed.trim() === word;\n } finally {\n prompts.close();\n }\n}\n\nexport function printAdminCancelled(label: string, hint?: string): void {\n console.log();\n console.log(\" \" + chalk.dim(`${label} cancelled.${hint ? ` ${hint}` : \"\"}`));\n console.log();\n}\n","/**\n * Minimal factory reset — wipes config, profile, sessions, datasets, and\n * default DB while preserving memory, strategies, wins, exports, and audit.\n */\n\nimport { existsSync, rmSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { ntrpHome, resetConfigCache } from \"../config/store.js\";\n\nexport async function performScratchWipe(): Promise<{ removed: string[] }> {\n const home = ntrpHome();\n const removed: string[] = [];\n\n try {\n const { close } = await import(\"../db/connection.js\");\n await close();\n } catch {\n // best-effort\n }\n\n const targets: Array<{ path: string; kind: \"file\" | \"dir\" }> = [\n { path: join(home, \"config.json\"), kind: \"file\" },\n { path: join(home, \"profile.json\"), kind: \"file\" },\n { path: join(home, \"demo-taxonomy.json\"), kind: \"file\" },\n { path: join(home, \"update-check.json\"), kind: \"file\" },\n { path: join(home, \"ntrp.duckdb\"), kind: \"file\" },\n { path: join(home, \"ntrp.duckdb.wal\"), kind: \"file\" },\n { path: join(home, \"sessions\"), kind: \"dir\" },\n { path: join(home, \"datasets\"), kind: \"dir\" },\n ];\n\n for (const { path, kind } of targets) {\n if (!existsSync(path)) continue;\n try {\n if (kind === \"dir\") {\n rmSync(path, { recursive: true, force: true });\n } else {\n unlinkSync(path);\n }\n removed.push(path);\n } catch {\n // best-effort\n }\n }\n\n resetConfigCache();\n return { removed };\n}\n","/**\n * Company profile storage — mirrors the store.ts pattern but dedicated to\n * the structured business profile at ~/.ntrp/profile.json.\n *\n * Held separate from the flat key/value config.json so the existing\n * config-get/set path stays simple and the profile schema can evolve on\n * its own cadence.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CompanyProfile } from \"../types.js\";\nimport { ntrpHome } from \"./store.js\";\n\nconst NTRP_DIR = ntrpHome();\nconst PROFILE_PATH = join(NTRP_DIR, \"profile.json\");\n\nfunction ensureDir(): void {\n if (!existsSync(NTRP_DIR)) {\n mkdirSync(NTRP_DIR, { recursive: true });\n }\n}\n\nexport function profilePath(): string {\n return PROFILE_PATH;\n}\n\nexport function profileExists(): boolean {\n return existsSync(PROFILE_PATH);\n}\n\n/** True when a saved profile has the minimum fields needed for lens gates and AI context. */\nexport function isProfileConfigured(profile: CompanyProfile | null = loadProfile()): boolean {\n if (!profile) return false;\n return profile.company_name.trim().length > 0;\n}\n\nexport function loadProfile(): CompanyProfile | null {\n if (!existsSync(PROFILE_PATH)) return null;\n try {\n const parsed = JSON.parse(readFileSync(PROFILE_PATH, \"utf-8\")) as CompanyProfile;\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function saveProfile(profile: CompanyProfile): void {\n ensureDir();\n const now = new Date().toISOString();\n const toWrite: CompanyProfile = {\n ...profile,\n schema_version: 1,\n created_at: profile.created_at || now,\n updated_at: now,\n };\n writeFileSync(PROFILE_PATH, JSON.stringify(toWrite, null, 2) + \"\\n\");\n}\n\nexport function updateProfile(patch: Partial<CompanyProfile>): CompanyProfile {\n const existing = loadProfile();\n const now = new Date().toISOString();\n const merged: CompanyProfile = {\n schema_version: 1,\n company_name: \"\",\n industry: \"\",\n product_description: \"\",\n target_customer: \"\",\n sales_motion: \"mid_market\",\n created_at: now,\n updated_at: now,\n ...(existing ?? {}),\n ...patch,\n };\n saveProfile(merged);\n return merged;\n}\n","/**\n * Layout primitives — width-aware helpers for building ANSI dashboards.\n */\n\n// Strip ANSI escape codes so we can measure visible width\nconst ANSI_RE = /\\u001b\\[[0-9;]*m/g;\n\nexport function stripAnsi(text: string): string {\n return text.replace(ANSI_RE, \"\");\n}\n\nexport function visibleWidth(text: string): number {\n return stripAnsi(text).length;\n}\n\nexport function padRight(text: string, width: number): string {\n const gap = Math.max(0, width - visibleWidth(text));\n return `${text}${\" \".repeat(gap)}`;\n}\n\nexport function padLeft(text: string, width: number): string {\n const gap = Math.max(0, width - visibleWidth(text));\n return `${\" \".repeat(gap)}${text}`;\n}\n\nexport function truncateVisible(text: string, maxVisible: number, ellipsis = \"…\"): string {\n if (visibleWidth(text) <= maxVisible) return text;\n if (maxVisible <= ellipsis.length) return stripAnsi(text).slice(0, maxVisible);\n\n const target = maxVisible - ellipsis.length;\n let visible = 0;\n let i = 0;\n while (i < text.length && visible < target) {\n if (text[i] === \"\\u001b\") {\n const match = text.slice(i).match(/^\\u001B\\[[0-9;]*m/);\n if (match) {\n i += match[0]!.length;\n continue;\n }\n }\n visible++;\n i++;\n }\n return text.slice(0, i) + ellipsis;\n}\n\nexport function hr(width: number, ch = \"─\"): string {\n return ch.repeat(Math.max(0, width));\n}\n\n/** Wrap a string to word-boundaries within maxW columns. */\nexport function wrapWords(text: string, maxW: number): string[] {\n const words = text.split(/\\s+/).filter(Boolean);\n const lines: string[] = [];\n let cur = \"\";\n for (let word of words) {\n if (visibleWidth(word) > maxW) {\n if (cur) { lines.push(cur); cur = \"\"; }\n word = truncateVisible(word, maxW, maxW > 3 ? \"…\" : \"\");\n }\n const test = cur ? `${cur} ${word}` : word;\n if (cur && visibleWidth(test) > maxW) {\n lines.push(cur);\n cur = word;\n } else {\n cur = test;\n }\n }\n if (cur) lines.push(cur);\n return lines.length ? lines : [\"\"];\n}\n\n/** Two-column layout. Returns a single padded line. */\nexport function twoCol(\n left: string,\n right: string,\n leftW: number,\n rightW: number,\n divider = \" \",\n): string {\n return `${padRight(left, leftW)}${divider}${padRight(right, rightW)}`;\n}\n\n/** Terminal width, best-effort with sane default. */\nexport function termWidth(): number {\n return process.stdout.columns && process.stdout.columns > 0\n ? process.stdout.columns\n : 80;\n}\n","/**\n * Markdown → ANSI renderer for terminal output.\n *\n * Purpose-built for rich AI-generated answers in the REPL: bold / italic /\n * code inline, headings with dim underlines, bulleted + numbered lists,\n * blockquotes, fenced code blocks, and real cli-table3 tables (reflowed\n * from markdown pipe-tables so they actually align in a monospace terminal).\n *\n * Deliberately does not support:\n * - nested lists, images, HTML, footnotes, task lists\n * - links (rendered as plain text — terminals can't click them)\n * - heading depth (# / ## / ### all flatten to the same visual style)\n */\n\nimport chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport { termWidth, wrapWords, visibleWidth, hr } from \"./layout.js\";\n\nexport interface RenderOptions {\n /** Number of spaces to indent the entire rendered block. Default 2. */\n indent?: number;\n /** Visible width to wrap to. Default termWidth() - indent - 2. */\n width?: number;\n}\n\ntype Block =\n | { type: \"heading\"; text: string }\n | { type: \"hr\" }\n | { type: \"paragraph\"; text: string }\n | { type: \"ul\"; items: string[] }\n | { type: \"ol\"; items: string[] }\n | { type: \"blockquote\"; text: string }\n | { type: \"code\"; lines: string[] }\n | { type: \"table\"; header: string[]; rows: string[][] };\n\n/** Render a markdown string to an ANSI-styled, width-wrapped string. */\nexport function renderMarkdown(text: string, opts: RenderOptions = {}): string {\n const indent = opts.indent ?? 2;\n const width = Math.max(24, opts.width ?? termWidth() - indent - 2);\n\n const blocks = parseBlocks(text);\n const rendered = blocks\n .map((b) => renderBlock(b, width))\n .filter((s) => s.length > 0)\n .join(\"\\n\\n\");\n\n if (!rendered) return \"\";\n const pad = \" \".repeat(indent);\n return rendered\n .split(\"\\n\")\n .map((line) => pad + line)\n .join(\"\\n\");\n}\n\n/** Convenience: renderMarkdown + console.log with leading/trailing blank line. */\nexport function printMarkdown(text: string, opts?: RenderOptions): void {\n const out = renderMarkdown(text, opts);\n if (!out.trim()) return;\n console.log();\n console.log(out);\n console.log();\n}\n\n// --------------------------------------------------------------------\n// Block parsing\n// --------------------------------------------------------------------\n\nfunction parseBlocks(text: string): Block[] {\n const lines = text.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const blocks: Block[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i]!;\n const trimmed = line.trim();\n\n // Blank line\n if (!trimmed) {\n i++;\n continue;\n }\n\n // Fenced code block\n if (/^```/.test(trimmed)) {\n i++;\n const codeLines: string[] = [];\n while (i < lines.length && !/^```/.test(lines[i]!.trim())) {\n codeLines.push(lines[i]!);\n i++;\n }\n if (i < lines.length) i++; // consume closing fence\n blocks.push({ type: \"code\", lines: codeLines });\n continue;\n }\n\n // Horizontal rule\n if (/^(-{3,}|\\*{3,}|_{3,})$/.test(trimmed)) {\n blocks.push({ type: \"hr\" });\n i++;\n continue;\n }\n\n // Heading (# / ## / ### all flattened)\n const headingMatch = trimmed.match(/^#{1,6}\\s+(.*)$/);\n if (headingMatch) {\n blocks.push({ type: \"heading\", text: headingMatch[1]!.trim() });\n i++;\n continue;\n }\n\n // Table: pipe-row + separator row\n if (/^\\|.*\\|$/.test(trimmed)) {\n const next = (lines[i + 1] ?? \"\").trim();\n if (/^\\|[\\s\\-:|]+\\|$/.test(next)) {\n const header = splitTableRow(trimmed);\n i += 2; // consume header + separator\n const rows: string[][] = [];\n while (i < lines.length) {\n const t = lines[i]!.trim();\n if (!/^\\|.*\\|$/.test(t)) break;\n rows.push(splitTableRow(t));\n i++;\n }\n blocks.push({ type: \"table\", header, rows });\n continue;\n }\n }\n\n // Unordered list\n if (/^[-*]\\s+/.test(trimmed)) {\n const items: string[] = [];\n while (i < lines.length) {\n const t = lines[i]!.trim();\n const m = t.match(/^[-*]\\s+(.*)$/);\n if (!m) break;\n items.push(m[1]!);\n i++;\n }\n blocks.push({ type: \"ul\", items });\n continue;\n }\n\n // Ordered list\n if (/^\\d+\\.\\s+/.test(trimmed)) {\n const items: string[] = [];\n while (i < lines.length) {\n const t = lines[i]!.trim();\n const m = t.match(/^\\d+\\.\\s+(.*)$/);\n if (!m) break;\n items.push(m[1]!);\n i++;\n }\n blocks.push({ type: \"ol\", items });\n continue;\n }\n\n // Blockquote\n if (/^>\\s?/.test(trimmed)) {\n const quoteLines: string[] = [];\n while (i < lines.length) {\n const t = lines[i]!.trim();\n const m = t.match(/^>\\s?(.*)$/);\n if (!m) break;\n quoteLines.push(m[1]!);\n i++;\n }\n blocks.push({ type: \"blockquote\", text: quoteLines.join(\" \").trim() });\n continue;\n }\n\n // Paragraph — consume until a blank line or a new block boundary\n const paraLines: string[] = [];\n while (i < lines.length) {\n const t = lines[i]!.trim();\n if (!t) break;\n if (isBlockBoundary(t, lines[i + 1])) break;\n paraLines.push(t);\n i++;\n }\n if (paraLines.length > 0) {\n blocks.push({ type: \"paragraph\", text: paraLines.join(\" \") });\n }\n }\n\n return blocks;\n}\n\nfunction isBlockBoundary(line: string, nextLine: string | undefined): boolean {\n if (/^#{1,6}\\s+/.test(line)) return true;\n if (/^(-{3,}|\\*{3,}|_{3,})$/.test(line)) return true;\n if (/^```/.test(line)) return true;\n if (/^>\\s?/.test(line)) return true;\n if (/^[-*]\\s+/.test(line)) return true;\n if (/^\\d+\\.\\s+/.test(line)) return true;\n if (/^\\|.*\\|$/.test(line) && nextLine && /^\\|[\\s\\-:|]+\\|$/.test(nextLine.trim())) return true;\n return false;\n}\n\nfunction splitTableRow(line: string): string[] {\n const trimmed = line.trim().replace(/^\\|/, \"\").replace(/\\|$/, \"\");\n return trimmed.split(\"|\").map((s) => s.trim());\n}\n\n// --------------------------------------------------------------------\n// Block rendering\n// --------------------------------------------------------------------\n\nfunction renderBlock(block: Block, width: number): string {\n switch (block.type) {\n case \"paragraph\":\n return wrapWords(inline(block.text), width).join(\"\\n\");\n\n case \"heading\": {\n const styled = chalk.bold(inline(block.text));\n const barWidth = Math.min(width, Math.max(8, visibleWidth(styled)));\n return `${styled}\\n${chalk.dim(hr(barWidth))}`;\n }\n\n case \"hr\":\n return chalk.dim(hr(width));\n\n case \"ul\":\n return block.items\n .map((item) => {\n const lines = wrapWords(inline(item), Math.max(1, width - 4));\n return \" • \" + lines.join(\"\\n \");\n })\n .join(\"\\n\");\n\n case \"ol\": {\n const numWidth = String(block.items.length).length;\n return block.items\n .map((item, idx) => {\n const num = String(idx + 1).padStart(numWidth, \" \");\n const prefix = ` ${num}. `;\n const contIndent = \" \".repeat(prefix.length);\n const lines = wrapWords(inline(item), Math.max(1, width - prefix.length));\n return prefix + lines.join(\"\\n\" + contIndent);\n })\n .join(\"\\n\");\n }\n\n case \"blockquote\": {\n const lines = wrapWords(inline(block.text), Math.max(1, width - 2));\n return lines.map((l) => chalk.dim(\"│ \") + chalk.italic(l)).join(\"\\n\");\n }\n\n case \"code\":\n return block.lines.map((l) => chalk.cyan(` ${l}`)).join(\"\\n\");\n\n case \"table\":\n return renderTable(block.header, block.rows, width);\n }\n}\n\nfunction renderTable(header: string[], rows: string[][], width: number): string {\n const numCols = header.length;\n if (numCols === 0) return \"\";\n\n const styledHeader = header.map(inline);\n const styledRows = rows.map((r) => {\n const filled: string[] = [];\n for (let i = 0; i < numCols; i++) filled.push(inline(r[i] ?? \"\"));\n return filled;\n });\n\n // cli-table3 colWidth includes 1-char padding on each side plus its share\n // of the border. Budget total width across columns; clamp per-col to a\n // reasonable max so wide content wraps instead of stretching one column.\n const maxPerCol = Math.max(10, Math.floor((width - numCols - 1) / numCols));\n const colWidths = new Array(numCols).fill(0).map((_, i) => {\n const headerW = visibleWidth(styledHeader[i] ?? \"\");\n let dataW = 0;\n for (const row of styledRows) {\n const w = visibleWidth(row[i] ?? \"\");\n if (w > dataW) dataW = w;\n }\n const contentW = Math.max(headerW, dataW);\n return Math.min(maxPerCol, Math.max(10, contentW + 2));\n });\n\n const table = new Table({\n head: styledHeader,\n colWidths,\n style: { head: [], border: [] },\n wordWrap: true,\n });\n\n for (const row of styledRows) table.push(row);\n\n return table.toString();\n}\n\n// --------------------------------------------------------------------\n// Inline formatting\n// --------------------------------------------------------------------\n\n/**\n * Apply inline markdown styling: bold, italic, code, and link flattening.\n *\n * Order matters: code spans are protected first (so `**foo**` inside\n * backticks isn't bolded), then bold (greedy-with-char-class so `**a** **b**`\n * resolves cleanly), then italic, then links, then code is restored as cyan.\n */\nfunction inline(text: string): string {\n // 1. Protect inline code spans so their contents don't get processed\n const codeSpans: string[] = [];\n let out = text.replace(/`([^`]+)`/g, (_m, code: string) => {\n const idx = codeSpans.length;\n codeSpans.push(code);\n return `\\u0000CODE${idx}\\u0000`;\n });\n\n // 2. Bold **...** — character class prevents crossing a `*`, so adjacent\n // bold spans resolve independently\n out = out.replace(/\\*\\*([^*\\n]+?)\\*\\*/g, (_m, inner: string) => chalk.bold(inner));\n\n // 3. Italic *...* — requires non-asterisk/non-word boundary on the left\n // and no trailing asterisk on the right (to avoid eating leftover **)\n out = out.replace(/(^|[^*\\w])\\*([^*\\n]+?)\\*(?!\\*)/g, (_m, pre: string, inner: string) => `${pre}${chalk.italic(inner)}`);\n\n // 4. Italic _..._ — word-boundary aware\n out = out.replace(/(^|[^_\\w])_([^_\\n]+?)_(?!\\w)/g, (_m, pre: string, inner: string) => `${pre}${chalk.italic(inner)}`);\n\n // 5. Links [text](url) → just text (terminals can't click)\n out = out.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\");\n\n // 6. Restore code spans as cyan\n out = out.replace(/\\u0000CODE(\\d+)\\u0000/g, (_m, idx: string) => chalk.cyan(codeSpans[Number(idx)]!));\n\n return out;\n}\n","import chalk from \"chalk\";\nimport { GRADIENT } from \"./theme.js\";\nimport { visibleWidth, termWidth } from \"./layout.js\";\n\nconst LOGO_LINES = [\n \" ███╗ ██╗ ████████╗ ██████╗ ██████╗ \",\n \" ████╗ ██║ ╚══██╔══╝ ██╔══██╗ ██╔══██╗\",\n \" ██╔██╗ ██║ ██║ ██████╔╝ ██████╔╝\",\n \" ██║╚██╗██║ ██║ ██╔══██╗ ██╔═══╝ \",\n \" ██║ ╚████║ ██║ ██║ ██║ ██║ \",\n \" ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ \",\n];\n\n/** Gradient-painted NTRP ASCII logo. */\nexport function renderLogo(): string[] {\n return LOGO_LINES.map((line, i) => chalk.hex(GRADIENT[i % GRADIENT.length]!)(line));\n}\n\n/** Compact one-line header — gradient \"NTRP\" + dim version. */\nexport function printCompactHeader(version: string): void {\n const ntrp =\n chalk.hex(GRADIENT[0]!)(\"N\") +\n chalk.hex(GRADIENT[1]!)(\"T\") +\n chalk.hex(GRADIENT[2]!)(\"R\") +\n chalk.hex(GRADIENT[3]!)(\"P\");\n console.log();\n console.log(` ${ntrp} ${chalk.dim(`v${version}`)}`);\n console.log();\n}\n\n/** REPL header — full ASCII logo + version divider line, centered. */\nexport function printReplHeader(version: string): void {\n const width = termWidth();\n const cardW = Math.min(width - 2, 120);\n const innerW = cardW - 2;\n const outerPad = \" \".repeat(Math.max(0, Math.floor((width - cardW) / 2)));\n\n const logo = renderLogo();\n const maxLogoW = Math.max(...logo.map((l) => visibleWidth(l)));\n const logoOffset = \" \".repeat(Math.max(0, Math.floor((cardW - maxLogoW) / 2)));\n\n console.log();\n for (const line of logo) console.log(outerPad + logoOffset + line);\n console.log();\n\n const versionTag = ` v${version} `;\n const gap = Math.max(0, innerW - versionTag.length);\n const gapL = Math.floor(gap / 2);\n console.log(\n outerPad +\n chalk.dim(`╭${\"─\".repeat(gapL)}`) +\n chalk.dim(versionTag) +\n chalk.dim(`${\"─\".repeat(gap - gapL)}╮`),\n );\n console.log();\n}\n","/**\n * LLM access gate — when API spend is allowed and which keys are available.\n */\n\nimport type { Context } from \"../../cli/context.js\";\nimport {\n getAnthropicApiKey,\n getAvailableProviders,\n getInvestigationApiKey,\n getProviderApiKey,\n hasAnyLlmProvider,\n loadLlmConfig,\n} from \"../../config/llm-config.js\";\nimport type { LlmProvider } from \"../../types.js\";\n\nexport { getAnthropicApiKey, getAvailableProviders, hasAnyLlmProvider };\n\nexport function isReplInteractive(ctx: Context): boolean {\n return !ctx.oneShot && ctx.execution.mode === \"interactive\";\n}\n\nexport function isInvestigationMode(ctx: Context | undefined): boolean {\n return !!(ctx && ctx.execution.mode === \"investigation\");\n}\n\nexport function isHeadlessWithKeys(ctx: Context | undefined): boolean {\n return !!(ctx && (ctx.execution.mode === \"headless\" || ctx.oneShot) && hasAnyLlmProvider());\n}\n\nfunction resolvePrimaryApiKey(ctx?: Context): string | undefined {\n const { primary } = loadLlmConfig();\n if (isInvestigationMode(ctx)) {\n return getInvestigationApiKey(primary) ?? getInvestigationApiKey(\"anthropic\") ?? getInvestigationApiKey(\"openai\");\n }\n return getProviderApiKey(primary) ?? getProviderApiKey(\"anthropic\") ?? getProviderApiKey(\"openai\");\n}\n\nexport function canUseReplAi(ctx: Context | undefined): boolean {\n if (!ctx) return false;\n if (isInvestigationMode(ctx)) return hasAnyLlmProvider() || !!process.env.NTRP_INVESTIGATION_API_KEY;\n if (isReplInteractive(ctx)) return hasAnyLlmProvider();\n // Headless / MCP / one-shot with stored keys\n if (ctx.execution.mode === \"headless\" || ctx.oneShot) return hasAnyLlmProvider();\n return false;\n}\n\nexport function assertReplAi(ctx: Context | undefined): string {\n if (!ctx) {\n throw new Error(\n \"AI features require stored API keys. Run `ntrp`, then /config set api-key or /config set openai-api-key.\",\n );\n }\n if (!canUseReplAi(ctx)) {\n if (!hasAnyLlmProvider()) {\n throw new Error(\n \"No LLM API key configured. Run: /config set api-key (Anthropic) and/or /config set openai-api-key\",\n );\n }\n throw new Error(\n \"AI features run only in the interactive REPL or headless mode with stored keys.\",\n );\n }\n const key = resolvePrimaryApiKey(ctx);\n if (!key) {\n throw new Error(\"No LLM API key configured. Run: /config set api-key or /config set openai-api-key\");\n }\n return key;\n}\n\n/** Whether an env var is set (informational only — never used for normal API calls). */\nexport function hasEnvApiKeyHint(): boolean {\n return !!(\n process.env.ANTHROPIC_API_KEY ??\n process.env.NTRP_API_KEY ??\n process.env.OPENAI_API_KEY\n );\n}\n\nexport function describeLlmReadiness(): {\n providers: LlmProvider[];\n anthropic: boolean;\n openai: boolean;\n} {\n const providers = getAvailableProviders();\n return {\n providers,\n anthropic: providers.includes(\"anthropic\"),\n openai: providers.includes(\"openai\"),\n };\n}\n","/**\n * REPL / headless LLM access gate (re-exports llm/gate).\n */\n\nexport {\n assertReplAi,\n canUseReplAi,\n describeLlmReadiness,\n getAnthropicApiKey as getStoredApiKey,\n getAvailableProviders,\n hasAnyLlmProvider,\n hasEnvApiKeyHint,\n isInvestigationMode,\n isReplInteractive,\n} from \"./llm/gate.js\";\n","/**\n * DemoTaxonomy cache — reads/writes ~/.ntrp/demo-taxonomy.json.\n *\n * Mirrors src/config/profile.ts. The cache key is the profile's updated_at\n * timestamp: `/onboard` invalidates by bumping updated_at (and deleting the\n * file outright), so a stale taxonomy is quietly ignored on the next read.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { CompanyProfile } from \"../types.js\";\nimport type { DemoTaxonomy } from \"./taxonomy-schema.js\";\n\nconst NTRP_DIR = join(homedir(), \".ntrp\");\nconst TAXONOMY_PATH = join(NTRP_DIR, \"demo-taxonomy.json\");\n\nfunction ensureDir(): void {\n if (!existsSync(NTRP_DIR)) {\n mkdirSync(NTRP_DIR, { recursive: true });\n }\n}\n\nexport function taxonomyPath(): string {\n return TAXONOMY_PATH;\n}\n\n/**\n * Load the cached taxonomy if present AND its profile_updated_at matches\n * the given profile. Returns null on any miss (no file, parse error, stale).\n */\nexport function loadCachedTaxonomy(profile: CompanyProfile): DemoTaxonomy | null {\n if (!existsSync(TAXONOMY_PATH)) return null;\n try {\n const parsed = JSON.parse(readFileSync(TAXONOMY_PATH, \"utf-8\")) as DemoTaxonomy;\n if (!parsed || typeof parsed !== \"object\") return null;\n if (parsed.profile_updated_at !== profile.updated_at) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function saveCachedTaxonomy(taxonomy: DemoTaxonomy): void {\n ensureDir();\n writeFileSync(TAXONOMY_PATH, JSON.stringify(taxonomy, null, 2) + \"\\n\");\n}\n\n/** Delete the cached taxonomy file if it exists. No-op otherwise. */\nexport function invalidateTaxonomy(): void {\n if (existsSync(TAXONOMY_PATH)) {\n try {\n unlinkSync(TAXONOMY_PATH);\n } catch {\n // swallow — next save will overwrite\n }\n }\n}\n","import type { InferenceTier, LlmProvider, LlmSurface, LlmUsageMeta } from \"../../types.js\";\n\nexport type LlmErrorCode =\n | \"RATE_LIMIT\"\n | \"OVERLOADED\"\n | \"AUTH\"\n | \"CONTEXT_LENGTH\"\n | \"MODEL_NOT_FOUND\"\n | \"TIMEOUT\"\n | \"UNKNOWN\";\n\nexport class LlmError extends Error {\n constructor(\n public readonly code: LlmErrorCode,\n message: string,\n public readonly provider: LlmProvider,\n public readonly status?: number,\n ) {\n super(message);\n this.name = \"LlmError\";\n }\n}\n\nexport interface LlmToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface LlmMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_calls?: LlmToolCall[];\n /** Required when role is \"tool\". */\n tool_call_id?: string;\n}\n\nexport interface LlmToolSchema {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n}\n\nexport interface LlmCompletionRequest {\n surface: LlmSurface;\n messages: LlmMessage[];\n system?: string;\n tools?: LlmToolSchema[];\n max_tokens: number;\n}\n\nexport interface LlmCompletionResponse {\n text: string;\n tool_calls: LlmToolCall[];\n stop_reason: string;\n assistant_message: LlmMessage;\n}\n\nexport interface LlmCompletionOptions {\n tier?: InferenceTier;\n modelOverride?: string;\n onFailover?: (from: LlmProvider, to: LlmProvider, reason: LlmErrorCode) => void;\n}\n\nexport interface LlmCompletionResult {\n response: LlmCompletionResponse;\n meta: LlmUsageMeta;\n}\n\nexport type LlmStreamEvent =\n | { type: \"text_delta\"; text: string }\n | { type: \"done\"; response: LlmCompletionResponse; meta: LlmUsageMeta };\n","import type { LlmProvider } from \"../../types.js\";\nimport { LlmError, type LlmErrorCode } from \"./types.js\";\n\nexport function mapAnthropicError(err: unknown, provider: LlmProvider): LlmError {\n const e = err as { status?: number; error?: { type?: string; message?: string }; message?: string };\n const status = e.status;\n const type = e.error?.type ?? \"\";\n const message = e.error?.message ?? e.message ?? String(err);\n\n if (status === 401 || status === 403 || type === \"authentication_error\") {\n return new LlmError(\"AUTH\", message, provider, status);\n }\n if (status === 429 || type === \"rate_limit_error\") {\n return new LlmError(\"RATE_LIMIT\", message, provider, status);\n }\n if (status === 529 || type === \"overloaded_error\") {\n return new LlmError(\"OVERLOADED\", message, provider, status);\n }\n if (status === 503) {\n return new LlmError(\"OVERLOADED\", message, provider, status);\n }\n if (status === 404 || message.toLowerCase().includes(\"model\")) {\n return new LlmError(\"MODEL_NOT_FOUND\", message, provider, status);\n }\n if (message.toLowerCase().includes(\"context\") || message.toLowerCase().includes(\"token\")) {\n return new LlmError(\"CONTEXT_LENGTH\", message, provider, status);\n }\n return new LlmError(\"UNKNOWN\", message, provider, status);\n}\n\nexport function mapOpenAiError(err: unknown, provider: LlmProvider): LlmError {\n const e = err as { status?: number; code?: string; message?: string; error?: { code?: string; message?: string } };\n const status = e.status;\n const code = e.code ?? e.error?.code ?? \"\";\n const message = e.message ?? e.error?.message ?? String(err);\n\n if (status === 401 || status === 403 || code === \"invalid_api_key\") {\n return new LlmError(\"AUTH\", message, provider, status);\n }\n if (status === 429 || code === \"rate_limit_exceeded\") {\n return new LlmError(\"RATE_LIMIT\", message, provider, status);\n }\n if (status === 503 || code === \"server_error\") {\n return new LlmError(\"OVERLOADED\", message, provider, status);\n }\n if (status === 404 || code === \"model_not_found\") {\n return new LlmError(\"MODEL_NOT_FOUND\", message, provider, status);\n }\n if (code === \"context_length_exceeded\") {\n return new LlmError(\"CONTEXT_LENGTH\", message, provider, status);\n }\n return new LlmError(\"UNKNOWN\", message, provider, status);\n}\n\nexport function isFailoverEligible(code: LlmErrorCode): boolean {\n return code === \"RATE_LIMIT\" || code === \"OVERLOADED\" || code === \"TIMEOUT\" || code === \"MODEL_NOT_FOUND\";\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type { MessageParam, Tool } from \"@anthropic-ai/sdk/resources/messages/messages.js\";\nimport type { LlmProvider } from \"../../../types.js\";\nimport { mapAnthropicError } from \"../errors.js\";\nimport type {\n LlmCompletionRequest,\n LlmCompletionResponse,\n LlmMessage,\n LlmToolCall,\n LlmToolSchema,\n} from \"../types.js\";\n\nfunction toAnthropicTools(tools: LlmToolSchema[]): Tool[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters as Tool[\"input_schema\"],\n }));\n}\n\nfunction toAnthropicMessages(messages: LlmMessage[]): MessageParam[] {\n const out: MessageParam[] = [];\n for (const msg of messages) {\n if (msg.role === \"system\") continue;\n if (msg.role === \"tool\" || (msg.role === \"user\" && msg.tool_call_id)) {\n out.push({\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id ?? \"\",\n content: msg.content,\n },\n ],\n });\n continue;\n }\n if (msg.role === \"user\") {\n out.push({ role: \"user\", content: msg.content });\n continue;\n }\n if (msg.role === \"assistant\") {\n const blocks: Anthropic.Messages.ContentBlockParam[] = [];\n if (msg.content.trim()) {\n blocks.push({ type: \"text\", text: msg.content });\n }\n for (const tc of msg.tool_calls ?? []) {\n blocks.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.arguments,\n });\n }\n out.push({ role: \"assistant\", content: blocks });\n }\n }\n return out;\n}\n\nfunction parseResponse(content: Anthropic.Messages.ContentBlock[]): LlmCompletionResponse {\n const textParts: string[] = [];\n const tool_calls: LlmToolCall[] = [];\n for (const block of content) {\n if (block.type === \"text\") textParts.push(block.text);\n if (block.type === \"tool_use\") {\n tool_calls.push({\n id: block.id,\n name: block.name,\n arguments: (block.input as Record<string, unknown>) ?? {},\n });\n }\n }\n const text = textParts.join(\"\");\n return {\n text,\n tool_calls,\n stop_reason: tool_calls.length > 0 ? \"tool_use\" : \"end_turn\",\n assistant_message: { role: \"assistant\", content: text, tool_calls },\n };\n}\n\nexport async function anthropicComplete(\n apiKey: string,\n model: string,\n req: LlmCompletionRequest,\n): Promise<LlmCompletionResponse> {\n const provider: LlmProvider = \"anthropic\";\n const client = new Anthropic({ apiKey });\n try {\n const response = await client.messages.create({\n model,\n max_tokens: req.max_tokens,\n system: req.system,\n ...(req.tools && req.tools.length > 0 ? { tools: toAnthropicTools(req.tools) } : {}),\n messages: toAnthropicMessages(req.messages),\n });\n return parseResponse(response.content);\n } catch (err) {\n throw mapAnthropicError(err, provider);\n }\n}\n\nexport async function* anthropicStream(\n apiKey: string,\n model: string,\n req: LlmCompletionRequest,\n): AsyncGenerator<{ type: \"text_delta\"; text: string }> {\n const provider: LlmProvider = \"anthropic\";\n const client = new Anthropic({ apiKey });\n try {\n const stream = client.messages.stream({\n model,\n max_tokens: req.max_tokens,\n system: req.system,\n messages: toAnthropicMessages(req.messages),\n });\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && event.delta.type === \"text_delta\") {\n yield { type: \"text_delta\", text: event.delta.text };\n }\n }\n } catch (err) {\n throw mapAnthropicError(err, provider);\n }\n}\n","import OpenAI from \"openai\";\nimport type { ChatCompletionMessageParam, ChatCompletionTool } from \"openai/resources/chat/completions.js\";\nimport type { LlmProvider } from \"../../../types.js\";\nimport { mapOpenAiError } from \"../errors.js\";\nimport type {\n LlmCompletionRequest,\n LlmCompletionResponse,\n LlmMessage,\n LlmToolCall,\n LlmToolSchema,\n} from \"../types.js\";\n\nfunction toOpenAiTools(tools: LlmToolSchema[]): ChatCompletionTool[] {\n return tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }));\n}\n\nfunction toOpenAiMessages(system: string | undefined, messages: LlmMessage[]): ChatCompletionMessageParam[] {\n const out: ChatCompletionMessageParam[] = [];\n if (system) {\n out.push({ role: \"system\", content: system });\n }\n for (const msg of messages) {\n if (msg.role === \"system\") continue;\n if (msg.role === \"user\") {\n out.push({ role: \"user\", content: msg.content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({ role: \"tool\", tool_call_id: msg.tool_call_id ?? \"\", content: msg.content });\n continue;\n }\n if (msg.role === \"assistant\") {\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n out.push({\n role: \"assistant\",\n content: msg.content || null,\n tool_calls: msg.tool_calls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.name, arguments: JSON.stringify(tc.arguments) },\n })),\n });\n } else {\n out.push({ role: \"assistant\", content: msg.content });\n }\n }\n }\n return out;\n}\n\nfunction parseToolCalls(raw: OpenAI.Chat.Completions.ChatCompletionMessageToolCall[] | undefined): LlmToolCall[] {\n if (!raw) return [];\n const out: LlmToolCall[] = [];\n for (const tc of raw) {\n if (tc.type !== \"function\" || !(\"function\" in tc)) continue;\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments || \"{}\") as Record<string, unknown>;\n } catch {\n args = {};\n }\n out.push({ id: tc.id, name: tc.function.name, arguments: args });\n }\n return out;\n}\n\nfunction parseResponse(message: OpenAI.Chat.Completions.ChatCompletionMessage): LlmCompletionResponse {\n const text = message.content ?? \"\";\n const tool_calls = parseToolCalls(message.tool_calls);\n return {\n text,\n tool_calls,\n stop_reason: tool_calls.length > 0 ? \"tool_use\" : \"stop\",\n assistant_message: { role: \"assistant\", content: text, tool_calls },\n };\n}\n\nexport async function openaiComplete(\n apiKey: string,\n model: string,\n req: LlmCompletionRequest,\n): Promise<LlmCompletionResponse> {\n const provider: LlmProvider = \"openai\";\n const client = new OpenAI({ apiKey });\n try {\n const response = await client.chat.completions.create({\n model,\n max_tokens: req.max_tokens,\n messages: toOpenAiMessages(req.system, req.messages),\n ...(req.tools && req.tools.length > 0 ? { tools: toOpenAiTools(req.tools) } : {}),\n });\n const choice = response.choices[0];\n if (!choice?.message) {\n throw new Error(\"OpenAI returned no message\");\n }\n return parseResponse(choice.message);\n } catch (err) {\n if (err instanceof OpenAI.APIError) {\n throw mapOpenAiError(err, provider);\n }\n throw mapOpenAiError(err, provider);\n }\n}\n\nexport async function* openaiStream(\n apiKey: string,\n model: string,\n req: LlmCompletionRequest,\n): AsyncGenerator<{ type: \"text_delta\"; text: string }> {\n const provider: LlmProvider = \"openai\";\n const client = new OpenAI({ apiKey });\n try {\n const stream = await client.chat.completions.create({\n model,\n max_tokens: req.max_tokens,\n messages: toOpenAiMessages(req.system, req.messages),\n stream: true,\n });\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content;\n if (delta) yield { type: \"text_delta\", text: delta };\n }\n } catch (err) {\n if (err instanceof OpenAI.APIError) {\n throw mapOpenAiError(err, provider);\n }\n throw mapOpenAiError(err, provider);\n }\n}\n","/**\n * Bundled model catalog — ship updates with releases.\n * successor_id chains handle retired models without user intervention.\n */\n\nimport type { InferenceTier, LlmProvider, ModelCatalogEntry, ModelStatus } from \"../../types.js\";\n\nexport const CATALOG_VERSION = \"2026-06-10\";\n\nconst ENTRIES: ModelCatalogEntry[] = [\n {\n id: \"claude-opus-4-6\",\n provider: \"anthropic\",\n tier: \"high\",\n status: \"active\",\n successor_id: null,\n supports_tools: true,\n max_context_tokens: 200_000,\n display_name: \"Claude Opus 4.6\",\n relative_cost: 3,\n },\n {\n id: \"claude-sonnet-4-5-20250929\",\n provider: \"anthropic\",\n tier: \"medium\",\n status: \"active\",\n successor_id: null,\n supports_tools: true,\n max_context_tokens: 200_000,\n display_name: \"Claude Sonnet 4.5\",\n relative_cost: 2,\n },\n {\n id: \"claude-haiku-4-5-20251001\",\n provider: \"anthropic\",\n tier: \"low\",\n status: \"active\",\n successor_id: null,\n supports_tools: true,\n max_context_tokens: 200_000,\n display_name: \"Claude Haiku 4.5\",\n relative_cost: 1,\n },\n {\n id: \"gpt-4.1\",\n provider: \"openai\",\n tier: \"high\",\n status: \"active\",\n successor_id: null,\n supports_tools: true,\n max_context_tokens: 1_047_576,\n display_name: \"GPT-4.1\",\n relative_cost: 3,\n },\n {\n id: \"gpt-4.1-mini\",\n provider: \"openai\",\n tier: \"medium\",\n status: \"active\",\n successor_id: null,\n supports_tools: true,\n max_context_tokens: 1_047_576,\n display_name: \"GPT-4.1 Mini\",\n relative_cost: 2,\n },\n {\n id: \"gpt-4.1-nano\",\n provider: \"openai\",\n tier: \"low\",\n status: \"active\",\n successor_id: null,\n supports_tools: true,\n max_context_tokens: 1_047_576,\n display_name: \"GPT-4.1 Nano\",\n relative_cost: 1,\n },\n];\n\nconst byId = new Map(ENTRIES.map((e) => [e.id, e]));\n\nexport function getCatalogEntry(id: string): ModelCatalogEntry | undefined {\n return byId.get(id);\n}\n\nexport function listCatalogEntries(provider?: LlmProvider): ModelCatalogEntry[] {\n if (!provider) return [...ENTRIES];\n return ENTRIES.filter((e) => e.provider === provider);\n}\n\n/** Walk successor_id chain until an active model is found. */\nexport function resolveRetiredModel(id: string): string {\n const seen = new Set<string>();\n let current = id;\n while (true) {\n if (seen.has(current)) break;\n seen.add(current);\n const entry = byId.get(current);\n if (!entry) return current;\n if (entry.status === \"active\") return entry.id;\n if (!entry.successor_id) {\n const fallback = cheapestActiveInTier(entry.provider, entry.tier);\n return fallback?.id ?? current;\n }\n current = entry.successor_id;\n }\n return id;\n}\n\nfunction cheapestActiveInTier(provider: LlmProvider, tier: InferenceTier): ModelCatalogEntry | undefined {\n const candidates = ENTRIES.filter(\n (e) => e.provider === provider && e.tier === tier && e.status === \"active\",\n );\n if (candidates.length === 0) return undefined;\n return candidates.sort((a, b) => a.relative_cost - b.relative_cost)[0];\n}\n\nexport function getTierDefault(provider: LlmProvider, tier: InferenceTier): ModelCatalogEntry {\n const entry = cheapestActiveInTier(provider, tier);\n if (!entry) {\n throw new Error(`No active ${tier}-tier model for provider ${provider} in catalog`);\n }\n return entry;\n}\n\nexport function resolveModel(\n provider: LlmProvider,\n tier: InferenceTier,\n override?: string,\n): string {\n if (override) {\n const entry = byId.get(override);\n if (!entry) return resolveRetiredModel(override);\n if (entry.status === \"retired\") return resolveRetiredModel(override);\n return entry.id;\n }\n return getTierDefault(provider, tier).id;\n}\n\nexport function formatModelLabel(provider: LlmProvider, modelId: string): string {\n const entry = byId.get(modelId);\n return entry ? `${provider}/${entry.display_name}` : `${provider}/${modelId}`;\n}\n\nexport function listModelsByStatus(status?: ModelStatus): ModelCatalogEntry[] {\n if (!status) return [...ENTRIES];\n return ENTRIES.filter((e) => e.status === status);\n}\n","/**\n * Per-surface inference tier defaults.\n * User llm-tier applies only where allowUserTier is true.\n */\n\nimport type { InferenceTier, LlmSurface } from \"../../types.js\";\n\ninterface SurfaceSpec {\n defaultTier: InferenceTier;\n allowUserTier: boolean;\n}\n\nconst SURFACE_SPECS: Record<LlmSurface, SurfaceSpec> = {\n agentic_investigation: { defaultTier: \"high\", allowUserTier: true },\n agentic_fresh_brief: { defaultTier: \"medium\", allowUserTier: true },\n findings: { defaultTier: \"high\", allowUserTier: false },\n metrics_findings: { defaultTier: \"high\", allowUserTier: false },\n onboard: { defaultTier: \"high\", allowUserTier: false },\n demo_taxonomy: { defaultTier: \"high\", allowUserTier: false },\n csv_analyze: { defaultTier: \"medium\", allowUserTier: false },\n recap: { defaultTier: \"low\", allowUserTier: false },\n distill: { defaultTier: \"low\", allowUserTier: false },\n feedback: { defaultTier: \"low\", allowUserTier: false },\n strategy: { defaultTier: \"medium\", allowUserTier: false },\n};\n\nexport function tierForSurface(surface: LlmSurface, userTier: InferenceTier): InferenceTier {\n const spec = SURFACE_SPECS[surface];\n if (spec.allowUserTier) return userTier;\n return spec.defaultTier;\n}\n\nexport function getSurfaceDefaultTier(surface: LlmSurface): InferenceTier {\n return SURFACE_SPECS[surface].defaultTier;\n}\n","/**\n * Session-scoped LLM overrides — REPL engine choice for this session only.\n */\n\nimport type { Context } from \"../../cli/context.js\";\nimport { hasProviderKey, loadLlmConfig } from \"../../config/llm-config.js\";\nimport type { InferenceTier, LlmProvider, LlmSessionOverride, LlmSurface } from \"../../types.js\";\nimport { getCatalogEntry, resolveModel } from \"./catalog.js\";\nimport { tierForSurface } from \"./surfaces.js\";\n\nexport function ensureLlmSession(ctx: Context): LlmSessionOverride {\n if (!ctx.llm) ctx.llm = {};\n return ctx.llm;\n}\n\nexport function clearLlmSession(ctx: Context): void {\n ctx.llm = undefined;\n}\n\nexport function getSessionProvider(ctx: Context | undefined): LlmProvider | undefined {\n return ctx?.llm?.provider;\n}\n\nexport function getSessionTier(ctx: Context | undefined): InferenceTier | undefined {\n return ctx?.llm?.tier;\n}\n\nexport function getSessionModelOverride(ctx: Context | undefined): string | undefined {\n return ctx?.llm?.modelOverride;\n}\n\nexport function isSessionAutoFailover(ctx: Context | undefined): boolean | undefined {\n return ctx?.llm?.autoFailover;\n}\n\n/** Active engine: session override → config default → first available key. */\nexport function resolveActiveProvider(ctx?: Context): LlmProvider {\n const session = getSessionProvider(ctx);\n if (session && hasProviderKey(session)) return session;\n\n const cfg = loadLlmConfig();\n if (hasProviderKey(cfg.primary)) return cfg.primary;\n\n const available = ([\"anthropic\", \"openai\"] as LlmProvider[]).filter(hasProviderKey);\n if (available.length > 0) return available[0]!;\n return cfg.primary;\n}\n\nexport function resolveAutoFailoverEnabled(ctx?: Context): boolean {\n const session = isSessionAutoFailover(ctx);\n if (session !== undefined) return session;\n return loadLlmConfig().autoFailover;\n}\n\nexport function resolveEffectiveTier(ctx: Context | undefined, surface: LlmSurface): InferenceTier {\n const sessionTier = getSessionTier(ctx);\n const cfg = loadLlmConfig();\n const base = sessionTier ?? cfg.tier;\n return tierForSurface(surface, base);\n}\n\nexport function resolveEffectiveModelOverride(ctx?: Context): string | undefined {\n return getSessionModelOverride(ctx) ?? loadLlmConfig().modelOverride;\n}\n\nexport function resolveModelForActive(\n ctx: Context | undefined,\n surface: LlmSurface,\n): { provider: LlmProvider; tier: InferenceTier; modelId: string } {\n const provider = resolveActiveProvider(ctx);\n const tier = resolveEffectiveTier(ctx, surface);\n const override = resolveEffectiveModelOverride(ctx);\n const providerOverride =\n override && getCatalogEntry(override)?.provider === provider ? override : undefined;\n const modelId = resolveModel(provider, tier, providerOverride);\n return { provider, tier, modelId };\n}\n\n/** Provider order for a request: active first; failover peers only when enabled. */\nexport function resolveProviderOrder(ctx?: Context): LlmProvider[] {\n const active = resolveActiveProvider(ctx);\n const order: LlmProvider[] = [active];\n\n if (!resolveAutoFailoverEnabled(ctx)) return order;\n\n const cfg = loadLlmConfig();\n for (const p of cfg.failoverOrder) {\n if (p !== active && hasProviderKey(p) && !order.includes(p)) order.push(p);\n }\n for (const p of ([\"anthropic\", \"openai\"] as LlmProvider[])) {\n if (p !== active && hasProviderKey(p) && !order.includes(p)) order.push(p);\n }\n return order;\n}\n\nexport function formatActiveStack(ctx?: Context, surface: LlmSurface = \"agentic_investigation\"): string {\n const { provider, tier, modelId } = resolveModelForActive(ctx, surface);\n return `${provider} · ${tier} · ${modelId}`;\n}\n\nexport function formatActiveStackShort(ctx?: Context, surface: LlmSurface = \"agentic_investigation\"): string {\n const { provider, tier } = resolveModelForActive(ctx, surface);\n return `${provider} · ${tier}`;\n}\n\nexport function countAvailableEngines(): number {\n return ([\"anthropic\", \"openai\"] as LlmProvider[]).filter(hasProviderKey).length;\n}\n\nexport function availableEngineLabels(): string[] {\n return ([\"anthropic\", \"openai\"] as LlmProvider[]).filter(hasProviderKey);\n}\n\nexport function validateModelForProvider(modelId: string, provider: LlmProvider): string | null {\n const entry = getCatalogEntry(modelId);\n if (!entry) return null;\n if (entry.provider !== provider) {\n return `Model ${modelId} belongs to ${entry.provider}. Run /provider ${entry.provider} first.`;\n }\n return null;\n}\n","import {\n getAvailableProviders,\n getInvestigationApiKey,\n getProviderApiKey,\n hasAnyLlmProvider,\n loadLlmConfig,\n} from \"../../config/llm-config.js\";\nimport type { Context } from \"../../cli/context.js\";\nimport type { InferenceTier, LlmConfig, LlmProvider, LlmSurface } from \"../../types.js\";\nimport { getCatalogEntry, resolveModel } from \"./catalog.js\";\nimport {\n resolveActiveProvider,\n resolveEffectiveModelOverride,\n resolveEffectiveTier,\n resolveProviderOrder,\n} from \"./session-state.js\";\n\nexport interface CompletionContext {\n providerOrder: LlmProvider[];\n tier: InferenceTier;\n modelByProvider: Record<LlmProvider, string>;\n max_tokens: number;\n activeProvider: LlmProvider;\n}\n\nexport { getAvailableProviders, hasAnyLlmProvider, loadLlmConfig };\n\n/** @deprecated Use resolveProviderOrder(ctx) — kept for smoke/tests. */\nexport function getProviderOrder(config?: LlmConfig, ctx?: Context): LlmProvider[] {\n void config;\n return resolveProviderOrder(ctx);\n}\n\nexport function resolveCompletionContext(\n surface: LlmSurface,\n opts: { max_tokens?: number; tier?: InferenceTier; modelOverride?: string; ctx?: Context } = {},\n): CompletionContext {\n const activeProvider = resolveActiveProvider(opts.ctx);\n const tier = opts.tier ?? resolveEffectiveTier(opts.ctx, surface);\n const override = opts.modelOverride ?? resolveEffectiveModelOverride(opts.ctx);\n const providerOrder = resolveProviderOrder(opts.ctx);\n\n const modelByProvider = {} as Record<LlmProvider, string>;\n for (const provider of providerOrder) {\n const providerOverride =\n override && getCatalogEntry(override)?.provider === provider ? override : undefined;\n modelByProvider[provider] = resolveModel(provider, tier, providerOverride);\n }\n // Ensure active provider always has a model even if order is singleton\n if (!modelByProvider[activeProvider]) {\n const activeOverride =\n override && getCatalogEntry(override)?.provider === activeProvider ? override : undefined;\n modelByProvider[activeProvider] = resolveModel(activeProvider, tier, activeOverride);\n }\n\n return {\n providerOrder,\n tier,\n modelByProvider,\n max_tokens: opts.max_tokens ?? 4096,\n activeProvider,\n };\n}\n\nexport function getApiKeyForProvider(provider: LlmProvider, ctx?: Context): string | undefined {\n const investigation = ctx?.execution.mode === \"investigation\";\n if (investigation) return getInvestigationApiKey(provider);\n return getProviderApiKey(provider);\n}\n","import type { Context } from \"../../cli/context.js\";\nimport type { LlmProvider, LlmUsageMeta } from \"../../types.js\";\nimport { anthropicComplete, anthropicStream } from \"./adapters/anthropic.js\";\nimport { openaiComplete, openaiStream } from \"./adapters/openai.js\";\nimport { resolveModel } from \"./catalog.js\";\nimport { isFailoverEligible } from \"./errors.js\";\nimport type { LlmError } from \"./types.js\";\nimport { getApiKeyForProvider, getProviderOrder, resolveCompletionContext } from \"./resolver.js\";\nimport type {\n LlmCompletionOptions,\n LlmCompletionRequest,\n LlmCompletionResponse,\n LlmCompletionResult,\n LlmStreamEvent,\n} from \"./types.js\";\n\nasync function completeOnProvider(\n provider: LlmProvider,\n model: string,\n apiKey: string,\n req: LlmCompletionRequest,\n): Promise<LlmCompletionResponse> {\n if (provider === \"anthropic\") return anthropicComplete(apiKey, model, req);\n return openaiComplete(apiKey, model, req);\n}\n\nexport async function completeWithFailover(\n req: LlmCompletionRequest,\n opts: LlmCompletionOptions & { ctx?: Context } = {},\n): Promise<LlmCompletionResult> {\n const ctx = resolveCompletionContext(req.surface, {\n max_tokens: req.max_tokens,\n tier: opts.tier,\n modelOverride: opts.modelOverride,\n ctx: opts.ctx,\n });\n\n const providers = ctx.providerOrder;\n if (providers.length === 0) {\n throw new Error(\"No LLM provider configured. Set api-key and/or openai-api-key via /config.\");\n }\n\n let lastError: LlmError | undefined;\n let failoverFrom: LlmProvider | undefined;\n\n for (let i = 0; i < providers.length; i++) {\n const provider = providers[i]!;\n const apiKey = getApiKeyForProvider(provider, opts.ctx);\n if (!apiKey) continue;\n\n let model = ctx.modelByProvider[provider] ?? resolveModel(provider, ctx.tier, opts.modelOverride);\n\n try {\n const response = await completeOnProvider(provider, model, apiKey, req);\n const meta: LlmUsageMeta = {\n provider_used: provider,\n model_used: model,\n ...(failoverFrom ? { failover: true, failover_from: failoverFrom } : {}),\n };\n return { response, meta };\n } catch (err) {\n const llmErr = err as LlmError;\n if (llmErr.name !== \"LlmError\") throw err;\n lastError = llmErr;\n\n if (llmErr.code === \"MODEL_NOT_FOUND\") {\n model = resolveModel(provider, ctx.tier);\n try {\n const response = await completeOnProvider(provider, model, apiKey, req);\n const meta: LlmUsageMeta = {\n provider_used: provider,\n model_used: model,\n ...(failoverFrom ? { failover: true, failover_from: failoverFrom } : {}),\n };\n return { response, meta };\n } catch (retryErr) {\n const retryLlm = retryErr as LlmError;\n if (retryLlm.name === \"LlmError\") lastError = retryLlm;\n else throw retryErr;\n }\n }\n\n if (!isFailoverEligible(llmErr.code)) throw llmErr;\n\n const next = providers[i + 1];\n if (next) {\n failoverFrom = failoverFrom ?? provider;\n opts.onFailover?.(provider, next, llmErr.code);\n continue;\n }\n throw llmErr;\n }\n }\n\n throw lastError ?? new Error(\"No LLM provider available\");\n}\n\nexport async function* streamWithFailover(\n req: LlmCompletionRequest,\n opts: LlmCompletionOptions & { ctx?: Context } = {},\n): AsyncGenerator<LlmStreamEvent> {\n const cfg = resolveCompletionContext(req.surface, {\n max_tokens: req.max_tokens,\n tier: opts.tier,\n modelOverride: opts.modelOverride,\n ctx: opts.ctx,\n });\n\n const providers = getProviderOrder();\n if (providers.length === 0) {\n throw new Error(\"No LLM provider configured. Set api-key and/or openai-api-key via /config.\");\n }\n\n let lastError: LlmError | undefined;\n let failoverFrom: LlmProvider | undefined;\n\n for (let i = 0; i < providers.length; i++) {\n const provider = providers[i]!;\n const apiKey = getApiKeyForProvider(provider, opts.ctx);\n if (!apiKey) continue;\n\n const model = cfg.modelByProvider[provider] ?? resolveModel(provider, cfg.tier, opts.modelOverride);\n\n try {\n let fullText = \"\";\n const streamFn = provider === \"anthropic\" ? anthropicStream : openaiStream;\n for await (const event of streamFn(apiKey, model, req)) {\n if (event.type === \"text_delta\") {\n fullText += event.text;\n yield event;\n }\n }\n const meta: LlmUsageMeta = {\n provider_used: provider,\n model_used: model,\n ...(failoverFrom ? { failover: true, failover_from: failoverFrom } : {}),\n };\n yield {\n type: \"done\",\n response: {\n text: fullText,\n tool_calls: [],\n stop_reason: \"end_turn\",\n assistant_message: { role: \"assistant\", content: fullText },\n },\n meta,\n };\n return;\n } catch (err) {\n const llmErr = err as LlmError;\n if (llmErr.name !== \"LlmError\") throw err;\n lastError = llmErr;\n if (!isFailoverEligible(llmErr.code)) throw llmErr;\n const next = providers[i + 1];\n if (next) {\n failoverFrom = failoverFrom ?? provider;\n opts.onFailover?.(provider, next, llmErr.code);\n continue;\n }\n throw llmErr;\n }\n }\n\n throw lastError ?? new Error(\"No LLM provider available\");\n}\n","import type { Context } from \"../../cli/context.js\";\nimport type { LlmSurface, LlmUsageMeta } from \"../../types.js\";\nimport { completeWithFailover, streamWithFailover } from \"./failover.js\";\n\nexport async function llmCompleteText(\n surface: LlmSurface,\n system: string,\n userMessage: string,\n max_tokens: number,\n ctx?: Context,\n): Promise<{ text: string; model_used: string; provider_used: string }> {\n const { response, meta } = await completeWithFailover(\n {\n surface,\n system,\n messages: [{ role: \"user\", content: userMessage }],\n max_tokens,\n },\n { ctx },\n );\n return { text: response.text, model_used: meta.model_used, provider_used: meta.provider_used };\n}\n\nexport async function llmStreamText(\n surface: LlmSurface,\n system: string,\n userMessage: string,\n max_tokens: number,\n ctx?: Context,\n): Promise<{ text: string; model_used: string; provider_used: string }> {\n let fullText = \"\";\n let meta: LlmUsageMeta = { model_used: \"unknown\", provider_used: \"anthropic\", failover: false };\n for await (const event of streamWithFailover(\n {\n surface,\n system,\n messages: [{ role: \"user\", content: userMessage }],\n max_tokens,\n },\n { ctx },\n )) {\n if (event.type === \"text_delta\") fullText += event.text;\n if (event.type === \"done\") {\n fullText = event.response.text || fullText;\n meta = event.meta;\n }\n }\n return { text: fullText, model_used: meta.model_used, provider_used: meta.provider_used };\n}\n","/**\n * draftCompanyProfile — single-shot Anthropic call that takes a URL (or\n * company name) from the onboarding wizard and returns a deeply-researched\n * draft profile pulling on the model's training knowledge.\n *\n * The wizard now asks for only one thing up front — the company website —\n * and we derive everything else (including the canonical company name)\n * here. No tools, no streaming, no conversation: just JSON in, JSON out.\n */\n\nimport type { CompanyProfile, SalesMotion } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { assertReplAi } from \"./repl-api.js\";\nimport { llmCompleteText } from \"./llm/complete.js\";\n\nexport interface DraftSeed {\n /** Preferred: the company website (domain or full URL, normalized). */\n company_url?: string;\n /** Fallback when the operator types a plain company name instead of a URL. */\n company_name?: string;\n}\n\nconst SYSTEM_PROMPT = `You are a senior GTM researcher with deep recall of the B2B / SaaS / services landscape. Given a company website (or, as a fallback, a plain company name), you produce a rich, specific profile of the business so a pipeline-health tool can tailor every answer to their reality.\n\nRESEARCH DEPTH — this is the most important part:\n- Recognize the company from your training knowledge whenever possible. Pull on everything you know: product line, founding story, funding stage, acquisitions, known customers, pricing tiers, sales process, typical buyer titles, competitive landscape.\n- When you don't recognize the exact company, infer aggressively but conservatively from the URL, TLD, subdomain, naming conventions, and any industry signals. A domain like \"acmedental.com\" strongly suggests dental-industry B2B; \"quantumledger.io\" suggests a fintech/SaaS.\n- Think about the shape of their GTM: do they sell top-down to CIOs (enterprise), bottom-up to developers (PLG), to SMB owners (velocity), or mid-market (structured)?\n- Identify the most probable sales motion. Your guess becomes the wizard's default.\n- For known companies, be specific: reference real product names, real ICP, real buyer personas. For unknown ones, be honest — use generic-but-plausible descriptors and keep dollar figures as ranges.\n- NEVER invent specific revenue figures, customer counts, or headcount numbers. Stick to public ranges (\"$5K-$50K ACV\", \"~$250K+ ACV\", \"mid-market $20M-$200M revenue\", etc.).\n\nFIELDS — emit only the ones you're reasonably confident about; the wizard will ask the user interactively for anything you omit.\n\nREQUIRED (emit these whenever possible):\n- company_name: string — the canonical marketed name of the company (e.g. \"HashiCorp\", not \"hashicorp.com\")\n- industry: string — very specific; include both category and sub-category (e.g. \"B2B SaaS — infrastructure automation / developer tools\", \"B2B services — dental lab equipment & supplies\", \"Fintech — B2B embedded payments\")\n- product_description: string — 2-4 sentences describing what they sell, who pays for it, and how it's delivered (SaaS subscription, hardware + service, self-serve, etc.)\n- target_customer: string — plain-English ICP: company size, geography, persona titles, deal triggers. Be specific.\n- sales_motion: \"plg\" | \"smb_velocity\" | \"mid_market\" | \"enterprise\" — the motion most consistent with the product + ICP\n\nOPTIONAL (include only with reasonable confidence):\n- average_deal_size: string — a range like \"$5K-$50K ACV\", \"$45K-$120K (hardware + year 1 software)\", \"$250K+\"\n- sales_cycle_days: integer — median cycle length in days\n- primary_crm: \"salesforce\" | \"hubspot\" | \"pipedrive\" | \"other\" — only with a signal (brand tier, pricing, known choice)\n- engagement_tool: \"outreach\" | \"salesloft\" | \"apollo\" | \"none\" — same bar\n\nOUTPUT FORMAT — respond with STRICT JSON only, no preamble, no markdown fences, no commentary:\n{\n \"company_name\": \"string\",\n \"industry\": \"string\",\n \"product_description\": \"string\",\n \"target_customer\": \"string\",\n \"sales_motion\": \"plg\" | \"smb_velocity\" | \"mid_market\" | \"enterprise\",\n \"average_deal_size\": \"string\",\n \"sales_cycle_days\": number,\n \"primary_crm\": \"salesforce\" | \"hubspot\" | \"pipedrive\" | \"other\",\n \"engagement_tool\": \"outreach\" | \"salesloft\" | \"apollo\" | \"none\"\n}\n\nAny field you are not confident about MUST be omitted entirely (do not include it as null, empty string, or \"unknown\"). The wizard will fall through to scripted Q&A to fill gaps.`;\n\nconst ALLOWED_MOTIONS = new Set<SalesMotion>([\"plg\", \"smb_velocity\", \"mid_market\", \"enterprise\"]);\nconst ALLOWED_CRMS = new Set([\"salesforce\", \"hubspot\", \"pipedrive\", \"other\"]);\nconst ALLOWED_ENGAGEMENT = new Set([\"outreach\", \"salesloft\", \"apollo\", \"none\"]);\n\n/**\n * Call Anthropic to draft a profile from the wizard seed. Returns a\n * Partial<CompanyProfile> — any fields the model wasn't confident about\n * are simply absent. Throws on network / parse / API-key errors so the\n * caller can fall back to scripted Q&A.\n */\nexport async function draftCompanyProfile(seed: DraftSeed, ctx: Context): Promise<Partial<CompanyProfile>> {\n assertReplAi(ctx);\n\n if (!seed.company_url && !seed.company_name) {\n throw new Error(\"draftCompanyProfile requires a URL or a company name\");\n }\n\n const inputBlock = seed.company_url\n ? `Company website: ${seed.company_url}${seed.company_name ? `\\nCompany name (hint): ${seed.company_name}` : \"\"}`\n : `Company name: ${seed.company_name}`;\n\n const userMessage = `${inputBlock}\n\nResearch this company deeply using your training knowledge. Identify the canonical company name, what they sell, who buys it, and how they sell it. Emit the profile now as STRICT JSON.`;\n\n const { text } = await llmCompleteText(\"onboard\", SYSTEM_PROMPT, userMessage, 2048, ctx);\n\n const cleaned = stripFences(text);\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(\"AI response is not valid JSON\");\n }\n\n return validateDraft(parsed);\n}\n\nfunction stripFences(text: string): string {\n const trimmed = text.trim();\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n if (fenced) return fenced[1]!.trim();\n return trimmed;\n}\n\nfunction validateDraft(raw: Record<string, unknown>): Partial<CompanyProfile> {\n const out: Partial<CompanyProfile> = {};\n\n const str = (k: string): string | undefined => {\n const v = raw[k];\n return typeof v === \"string\" && v.trim().length > 0 ? v.trim() : undefined;\n };\n\n const companyName = str(\"company_name\");\n if (companyName) out.company_name = companyName;\n\n const industry = str(\"industry\");\n if (industry) out.industry = industry;\n\n const productDescription = str(\"product_description\");\n if (productDescription) out.product_description = productDescription;\n\n const targetCustomer = str(\"target_customer\");\n if (targetCustomer) out.target_customer = targetCustomer;\n\n const motion = str(\"sales_motion\")?.toLowerCase();\n if (motion && ALLOWED_MOTIONS.has(motion as SalesMotion)) {\n out.sales_motion = motion as SalesMotion;\n }\n\n const dealSize = str(\"average_deal_size\");\n if (dealSize) out.average_deal_size = dealSize;\n\n const cycleDays = raw[\"sales_cycle_days\"];\n if (typeof cycleDays === \"number\" && Number.isFinite(cycleDays) && cycleDays > 0) {\n out.sales_cycle_days = Math.round(cycleDays);\n }\n\n const crm = str(\"primary_crm\")?.toLowerCase();\n if (crm && ALLOWED_CRMS.has(crm)) out.primary_crm = crm;\n\n const engagement = str(\"engagement_tool\")?.toLowerCase();\n if (engagement && ALLOWED_ENGAGEMENT.has(engagement)) out.engagement_tool = engagement;\n\n return out;\n}\n","/**\n * profile-clarify — adaptive onboarding refinement.\n *\n * Two single-shot Anthropic calls that run AFTER draftCompanyProfile has\n * produced an initial research-based guess:\n *\n * 1. generateClarifyingQuestions(draft, userNote)\n * Given the draft and an optional free-form note from the operator,\n * produce 3-5 high-leverage questions (each with 3-5 concrete\n * options) that would materially sharpen NTRP's diagnosis. Modelled\n * after Claude Code's AskUserQuestion tool — short label + optional\n * description per option, always with a free-text escape hatch.\n *\n * 2. refineProfile(draft, userNote, answers)\n * Given the draft plus the user's note and Q&A answers, return an\n * updated Partial<CompanyProfile>. Fields the model isn't confident\n * about are simply omitted so the caller can merge without wiping\n * existing state.\n *\n * No tools, no streaming, no conversation — just JSON in, JSON out.\n */\n\nimport type { CompanyProfile, SalesMotion } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { assertReplAi } from \"./repl-api.js\";\nimport { llmCompleteText } from \"./llm/complete.js\";\n\nexport interface ClarifyingOption {\n label: string;\n description?: string;\n}\n\nexport interface ClarifyingQuestion {\n question: string;\n options: ClarifyingOption[];\n}\n\nexport interface ClarifyingAnswer {\n question: string;\n answer: string;\n}\n\nconst CLARIFY_SYSTEM_PROMPT = `You are a senior GTM researcher helping NTRP — a pipeline-health \"stethoscope\" — tune its understanding of a specific company before it diagnoses their sales funnel.\n\nYou already have a DRAFT profile from an initial research pass. The operator may also have added a free-form note about what matters to them. Your job: generate 3-5 CLARIFYING QUESTIONS that would materially change how NTRP reads this company's pipeline.\n\nPRINCIPLES\n- Ask about things that CHANGE the diagnosis, not trivia. Good: \"Which buyer persona closes most deals right now?\" Bad: \"What's your company tagline?\"\n- Prefer questions that let NTRP distinguish similar-looking pipelines (e.g. SMB vs mid-market at the same ACV, outbound-heavy vs inbound-heavy motions, single vs multi-product).\n- If the draft looks strong and the user's note is specific, ask fewer questions (3 is fine). If the draft is thin or the note hints at ambiguity, ask more (up to 5).\n- Each question MUST include 3-5 concrete options. Options should be crisp, distinct, non-overlapping. Add a short description when it helps the user pick.\n- Anchor options in this specific company's reality — use real buyer titles, real deal shapes, real motions based on what you know about them.\n- NEVER ask about company name, website, or industry — those are already locked.\n- NEVER ask multiple things in one question.\n- NEVER number questions or options in your output — the client renders numbering.\n\nOUTPUT FORMAT — respond with STRICT JSON only, no preamble, no markdown fences, no commentary:\n{\n \"questions\": [\n {\n \"question\": \"Plain-English question text ending with a question mark.\",\n \"options\": [\n { \"label\": \"Short crisp label\", \"description\": \"Optional one-line context\" },\n { \"label\": \"Another label\" }\n ]\n }\n ]\n}`;\n\nconst REFINE_SYSTEM_PROMPT = `You are a senior GTM researcher producing the FINAL company profile for NTRP. You already drafted an initial profile. The operator then optionally added a free-form note and answered a handful of clarifying questions. Your job: merge everything into a sharper profile.\n\nPRINCIPLES\n- Update fields where the operator's answers add clarity. Leave unchanged fields alone.\n- Use the user's own phrasing when they were specific — don't dilute with generic language.\n- If the operator described their personal scope (segments / divisions they own), populate user_scope as a single plain-English sentence in first person.\n- NEVER invent specific revenue, headcount, or customer-count numbers. Keep dollar figures as ranges.\n- Fields you're still not confident about MUST be omitted entirely (not null, not \"unknown\").\n\nREQUIRED (emit whenever possible):\n- company_name, industry, product_description, target_customer, sales_motion\n\nOPTIONAL:\n- average_deal_size, sales_cycle_days, primary_crm, engagement_tool, user_scope\n\nSALES MOTION values: \"plg\" | \"smb_velocity\" | \"mid_market\" | \"enterprise\"\nPRIMARY CRM values: \"salesforce\" | \"hubspot\" | \"pipedrive\" | \"other\"\nENGAGEMENT values: \"outreach\" | \"salesloft\" | \"apollo\" | \"none\"\n\nOUTPUT FORMAT — respond with STRICT JSON only, no preamble, no markdown fences, no commentary:\n{\n \"company_name\": \"string\",\n \"industry\": \"string\",\n \"product_description\": \"string\",\n \"target_customer\": \"string\",\n \"sales_motion\": \"mid_market\",\n \"average_deal_size\": \"string\",\n \"sales_cycle_days\": number,\n \"primary_crm\": \"salesforce\",\n \"engagement_tool\": \"outreach\",\n \"user_scope\": \"string\"\n}`;\n\nconst ALLOWED_MOTIONS = new Set<SalesMotion>([\"plg\", \"smb_velocity\", \"mid_market\", \"enterprise\"]);\nconst ALLOWED_CRMS = new Set([\"salesforce\", \"hubspot\", \"pipedrive\", \"other\"]);\nconst ALLOWED_ENGAGEMENT = new Set([\"outreach\", \"salesloft\", \"apollo\", \"none\"]);\n\nfunction stripFences(text: string): string {\n const trimmed = text.trim();\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n if (fenced) return fenced[1]!.trim();\n return trimmed;\n}\n\nfunction formatDraft(draft: Partial<CompanyProfile>): string {\n const parts: string[] = [];\n if (draft.company_name) parts.push(`Company: ${draft.company_name}`);\n if (draft.company_url) parts.push(`URL: ${draft.company_url}`);\n if (draft.industry) parts.push(`Industry: ${draft.industry}`);\n if (draft.product_description) parts.push(`Product: ${draft.product_description}`);\n if (draft.target_customer) parts.push(`Target customer: ${draft.target_customer}`);\n if (draft.sales_motion) parts.push(`Sales motion: ${draft.sales_motion}`);\n if (draft.average_deal_size) parts.push(`Avg deal size: ${draft.average_deal_size}`);\n if (draft.sales_cycle_days !== undefined) parts.push(`Sales cycle: ~${draft.sales_cycle_days} days`);\n if (draft.primary_crm) parts.push(`Primary CRM: ${draft.primary_crm}`);\n if (draft.engagement_tool) parts.push(`Engagement tool: ${draft.engagement_tool}`);\n if (draft.user_scope) parts.push(`User's scope: ${draft.user_scope}`);\n return parts.join(\"\\n\");\n}\n\n/**\n * Ask Claude to produce 3-5 clarifying questions tailored to the draft\n * profile and the user's free-form note. Returns an empty array on\n * network / parse errors so the caller can fall through gracefully.\n */\nexport async function generateClarifyingQuestions(\n draft: Partial<CompanyProfile>,\n userNote: string,\n ctx: Context,\n): Promise<ClarifyingQuestion[]> {\n assertReplAi(ctx);\n const draftBlock = formatDraft(draft);\n const note = userNote.trim();\n const userBlock = note ? `\\n\\nUSER NOTE — what they said matters to them:\\n\"${note}\"` : \"\";\n const userMessage = `DRAFT PROFILE:\\n${draftBlock}${userBlock}\\n\\nGenerate clarifying questions now as STRICT JSON.`;\n\n const { text } = await llmCompleteText(\"onboard\", CLARIFY_SYSTEM_PROMPT, userMessage, 2048, ctx);\n const cleaned = stripFences(text);\n let parsed: { questions?: unknown };\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(\"AI response is not valid JSON\");\n }\n\n if (!Array.isArray(parsed?.questions)) {\n throw new Error(\"AI response missing questions array\");\n }\n\n const out: ClarifyingQuestion[] = [];\n for (const q of parsed.questions as unknown[]) {\n if (typeof q !== \"object\" || q === null) continue;\n const rec = q as Record<string, unknown>;\n const question = typeof rec.question === \"string\" ? rec.question.trim() : \"\";\n if (!question) continue;\n if (!Array.isArray(rec.options)) continue;\n\n const options: ClarifyingOption[] = [];\n for (const o of rec.options as unknown[]) {\n if (typeof o !== \"object\" || o === null) continue;\n const orec = o as Record<string, unknown>;\n const label = typeof orec.label === \"string\" ? orec.label.trim() : \"\";\n if (!label) continue;\n const description = typeof orec.description === \"string\" ? orec.description.trim() : \"\";\n options.push(description ? { label, description } : { label });\n }\n if (options.length < 2) continue;\n\n out.push({ question, options });\n }\n\n return out;\n}\n\n/**\n * Ask Claude to merge the initial draft with the user's free-form note\n * and their answers to the clarifying questions. Returns a partial\n * profile — only fields the model is confident about are populated.\n */\nexport async function refineProfile(\n draft: Partial<CompanyProfile>,\n userNote: string,\n answers: ClarifyingAnswer[],\n ctx: Context,\n): Promise<Partial<CompanyProfile>> {\n assertReplAi(ctx);\n const draftBlock = formatDraft(draft);\n const note = userNote.trim();\n const userBlock = note ? `\\n\\nUSER NOTE:\\n\"${note}\"` : \"\";\n const answersBlock =\n answers.length > 0\n ? \"\\n\\nCLARIFYING Q&A:\\n\" +\n answers\n .map((a, i) => `${i + 1}. Q: ${a.question}\\n A: ${a.answer}`)\n .join(\"\\n\")\n : \"\";\n const userMessage = `DRAFT PROFILE:\\n${draftBlock}${userBlock}${answersBlock}\\n\\nEmit the refined profile now as STRICT JSON.`;\n\n const { text } = await llmCompleteText(\"onboard\", REFINE_SYSTEM_PROMPT, userMessage, 2048, ctx);\n const cleaned = stripFences(text);\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(\"AI response is not valid JSON\");\n }\n\n return validateRefined(parsed);\n}\n\nfunction validateRefined(raw: Record<string, unknown>): Partial<CompanyProfile> {\n const out: Partial<CompanyProfile> = {};\n const str = (k: string): string | undefined => {\n const v = raw[k];\n return typeof v === \"string\" && v.trim().length > 0 ? v.trim() : undefined;\n };\n\n const companyName = str(\"company_name\");\n if (companyName) out.company_name = companyName;\n\n const industry = str(\"industry\");\n if (industry) out.industry = industry;\n\n const productDescription = str(\"product_description\");\n if (productDescription) out.product_description = productDescription;\n\n const targetCustomer = str(\"target_customer\");\n if (targetCustomer) out.target_customer = targetCustomer;\n\n const motion = str(\"sales_motion\")?.toLowerCase();\n if (motion && ALLOWED_MOTIONS.has(motion as SalesMotion)) {\n out.sales_motion = motion as SalesMotion;\n }\n\n const dealSize = str(\"average_deal_size\");\n if (dealSize) out.average_deal_size = dealSize;\n\n const cycleDays = raw[\"sales_cycle_days\"];\n if (typeof cycleDays === \"number\" && Number.isFinite(cycleDays) && cycleDays > 0) {\n out.sales_cycle_days = Math.round(cycleDays);\n }\n\n const crm = str(\"primary_crm\")?.toLowerCase();\n if (crm && ALLOWED_CRMS.has(crm)) out.primary_crm = crm;\n\n const engagement = str(\"engagement_tool\")?.toLowerCase();\n if (engagement && ALLOWED_ENGAGEMENT.has(engagement)) out.engagement_tool = engagement;\n\n const userScope = str(\"user_scope\");\n if (userScope) out.user_scope = userScope;\n\n return out;\n}\n","/**\n * Profile Presets — Sales motion -> threshold overrides.\n *\n * Each SalesMotion maps to partial threshold overrides that shift\n * defaults to match that motion's typical patterns.\n */\n\nimport type { SalesMotion, ResolvedThresholds } from \"../types.js\";\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport const PROFILE_PRESETS: Record<SalesMotion, DeepPartial<ResolvedThresholds>> = {\n plg: {\n freshness: {\n people_window_days: 60,\n org_window_days: 60,\n opp_window_days: 21,\n },\n flow_rate: {\n green_days: 21,\n yellow_days: 45,\n stuck_days: 30,\n max_days: 60,\n },\n signal_to_noise: {\n lookback_days: 60,\n red_below: 25,\n green_above: 50,\n },\n thread_depth: {\n activity_window_days: 60,\n red_below: 30,\n green_above: 55,\n },\n },\n\n smb_velocity: {\n freshness: {\n people_window_days: 60,\n org_window_days: 60,\n },\n flow_rate: {\n green_days: 30,\n yellow_days: 60,\n stuck_days: 45,\n max_days: 90,\n },\n signal_to_noise: {\n lookback_days: 60,\n },\n thread_depth: {\n activity_window_days: 60,\n },\n },\n\n mid_market: {\n flow_rate: {\n green_days: 60,\n yellow_days: 120,\n stuck_days: 75,\n max_days: 150,\n },\n },\n\n enterprise: {\n freshness: {\n people_window_days: 120,\n org_window_days: 120,\n opp_window_days: 45,\n },\n flow_rate: {\n green_days: 90,\n yellow_days: 180,\n stuck_days: 90,\n max_days: 240,\n },\n signal_to_noise: {\n lookback_days: 120,\n },\n thread_depth: {\n activity_window_days: 120,\n multi_thread_threshold: 3,\n red_below: 50,\n green_above: 75,\n },\n },\n};\n","/**\n * Default Thresholds — Single source of truth for all vital sign constants.\n *\n * These are the exact values currently hardcoded in the five vital sign files.\n * Every vital sign computation falls back to these when no profile/baselines exist.\n */\n\nimport type { ResolvedThresholds } from \"../types.js\";\n\nexport const DEFAULT_THRESHOLDS: ResolvedThresholds = {\n freshness: {\n people_window_days: 90,\n org_window_days: 90,\n opp_window_days: 30,\n red_below: 60,\n green_above: 80,\n weights: { people: 0.35, organizations: 0.3, opportunities: 0.35 },\n },\n flow_rate: {\n green_days: 45,\n yellow_days: 90,\n stuck_days: 60,\n max_days: 120,\n },\n drop_rate: {\n marketing_systems: [\"hubspot\"],\n sales_systems: [\"salesforce\"],\n recency_days: 30,\n red_below: 60,\n green_above: 80,\n weights: { cross_system: 0.6, abandoned: 0.4 },\n },\n signal_to_noise: {\n lookback_days: 90,\n red_below: 40,\n green_above: 65,\n },\n thread_depth: {\n activity_window_days: 90,\n multi_thread_threshold: 2,\n red_below: 40,\n green_above: 65,\n },\n};\n","/**\n * Threshold Resolution Engine — CLI version.\n *\n * Merges three layers: defaults <- sales motion preset <- computed baselines.\n * Most specific wins. Returns a complete ResolvedThresholds object.\n *\n * CLI version: no Supabase — getResolvedThresholds just returns DEFAULT_THRESHOLDS.\n */\n\nimport type { SalesMotion, ResolvedThresholds } from \"../types.js\";\nimport { DEFAULT_THRESHOLDS } from \"./defaults.js\";\nimport { PROFILE_PRESETS } from \"./profile-presets.js\";\n\ntype DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P] };\n\n/**\n * Deep merge two objects. Source values override target values.\n * Only merges plain objects — arrays and primitives are replaced entirely.\n */\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n const sourceVal = source[key];\n if (sourceVal === undefined) continue;\n const targetVal = target[key];\n if (targetVal && typeof targetVal === \"object\" && !Array.isArray(targetVal) && sourceVal && typeof sourceVal === \"object\" && !Array.isArray(sourceVal)) {\n result[key] = deepMerge(targetVal as Record<string, unknown>, sourceVal as Record<string, unknown>);\n } else {\n result[key] = sourceVal;\n }\n }\n return result;\n}\n\n/**\n * Resolve thresholds by merging: defaults <- preset <- computed baselines.\n */\nexport function resolveThresholds(salesMotion: SalesMotion | null, computedBaselines: DeepPartial<ResolvedThresholds>): ResolvedThresholds {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let resolved: any = structuredClone(DEFAULT_THRESHOLDS);\n\n // Layer 2: Apply sales motion preset\n if (salesMotion && PROFILE_PRESETS[salesMotion]) {\n resolved = deepMerge(resolved, PROFILE_PRESETS[salesMotion] as Record<string, unknown>);\n }\n\n // Layer 3: Apply computed baselines (most specific)\n if (Object.keys(computedBaselines).length > 0) {\n resolved = deepMerge(resolved, computedBaselines as Record<string, unknown>);\n }\n\n return resolved as ResolvedThresholds;\n}\n\n/**\n * Get resolved thresholds for the CLI.\n * Reads sales-motion from config and applies the corresponding preset.\n */\nexport async function getResolvedThresholds(): Promise<ResolvedThresholds> {\n const { getConfigValue } = await import(\"../config/store.js\");\n const motion = getConfigValue(\"sales-motion\") as SalesMotion | undefined;\n return resolveThresholds(motion ?? null, {});\n}\n","/**\n * ntrp profile — set your sales motion (PLG, SMB, Mid-Market, Enterprise).\n */\n\nimport chalk from \"chalk\";\nimport { getConfigValue, setConfigValue } from \"../config/store.js\";\nimport { loadProfile } from \"../config/profile.js\";\nimport { PROFILE_PRESETS } from \"../baselines/profile-presets.js\";\nimport { DEFAULT_THRESHOLDS } from \"../baselines/defaults.js\";\nimport { resolveThresholds } from \"../baselines/resolve.js\";\nimport { parseArgs } from \"../cli/argparse.js\";\nimport { printMarkdown } from \"../ui/markdown.js\";\nimport { paint } from \"../ui/theme.js\";\nimport type { SalesMotion } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\n\nexport const PRESET_DESCRIPTIONS: Record<SalesMotion, string> = {\n plg: \"Product-Led Growth — shorter cycles, high volume, self-serve focus\",\n smb_velocity: \"SMB Velocity — fast sales cycles, quick close, volume-oriented\",\n mid_market: \"Mid-Market — moderate deal sizes, structured sales process\",\n enterprise: \"Enterprise — long cycles, large deals, multi-threaded engagement\",\n};\n\nexport const PRESET_LABELS: Record<SalesMotion, string> = {\n plg: \"PLG\",\n smb_velocity: \"SMB Velocity\",\n mid_market: \"Mid-Market\",\n enterprise: \"Enterprise\",\n};\n\nexport async function handler(args: string[], _ctx: Context): Promise<void> {\n const { positional } = parseArgs(args);\n const sub = positional[0] ?? \"show\";\n\n switch (sub) {\n case \"list\": return listProfiles();\n case \"set\": return setProfile(positional[1]);\n case \"show\": return showProfile();\n default: {\n console.error(chalk.red(` Unknown subcommand: ${sub}`));\n console.log(chalk.dim(\" Usage: /profile <list|set|show> [preset]\"));\n process.exit(1);\n }\n }\n}\n\nfunction listProfiles(): void {\n console.log();\n console.log(chalk.bold(\" Sales Motion Presets\"));\n console.log();\n\n const current = getConfigValue(\"sales-motion\");\n for (const [key, desc] of Object.entries(PRESET_DESCRIPTIONS)) {\n const marker = current === key ? chalk.green(\" (active)\") : \"\";\n console.log(` ${chalk.bold(PRESET_LABELS[key as SalesMotion].padEnd(16))} ${chalk.dim(desc)}${marker}`);\n console.log(chalk.dim(` ${\"\".padEnd(16)} id: ${key}`));\n }\n\n console.log();\n console.log(chalk.dim(\" Run /profile set <preset> to activate a profile.\"));\n console.log();\n}\n\nfunction setProfile(preset: string | undefined): void {\n if (!preset) {\n console.error(chalk.red(\" /profile set requires a preset.\"));\n console.error(chalk.dim(` Valid options: ${Object.keys(PROFILE_PRESETS).join(\", \")}`));\n process.exit(1);\n }\n\n const validPresets = Object.keys(PROFILE_PRESETS) as SalesMotion[];\n if (!validPresets.includes(preset as SalesMotion)) {\n console.error(chalk.red(`\\n Unknown preset: ${preset}`));\n console.error(chalk.dim(` Valid options: ${validPresets.join(\", \")}\\n`));\n process.exit(1);\n }\n\n const motion = preset as SalesMotion;\n setConfigValue(\"sales-motion\", motion);\n\n const resolved = resolveThresholds(motion, {});\n const defaults = DEFAULT_THRESHOLDS;\n\n console.log();\n console.log(chalk.green(` Profile set to ${PRESET_LABELS[motion]}`));\n console.log();\n\n const changes: string[] = [];\n if (resolved.freshness.people_window_days !== defaults.freshness.people_window_days) {\n changes.push(` Freshness window: ${defaults.freshness.people_window_days}d → ${resolved.freshness.people_window_days}d`);\n }\n if (resolved.flow_rate.green_days !== defaults.flow_rate.green_days) {\n changes.push(` Flow rate green: ${defaults.flow_rate.green_days}d → ${resolved.flow_rate.green_days}d`);\n }\n if (resolved.flow_rate.stuck_days !== defaults.flow_rate.stuck_days) {\n changes.push(` Stuck threshold: ${defaults.flow_rate.stuck_days}d → ${resolved.flow_rate.stuck_days}d`);\n }\n if (resolved.signal_to_noise.lookback_days !== defaults.signal_to_noise.lookback_days) {\n changes.push(` S/N lookback: ${defaults.signal_to_noise.lookback_days}d → ${resolved.signal_to_noise.lookback_days}d`);\n }\n if (resolved.thread_depth.activity_window_days !== defaults.thread_depth.activity_window_days) {\n changes.push(` Thread depth window: ${defaults.thread_depth.activity_window_days}d → ${resolved.thread_depth.activity_window_days}d`);\n }\n\n if (changes.length > 0) {\n console.log(chalk.dim(\" Threshold changes:\"));\n for (const c of changes) console.log(chalk.dim(c));\n } else {\n console.log(chalk.dim(\" No threshold changes from default.\"));\n }\n console.log();\n console.log(chalk.dim(\" Run /diagnose to see results with the new profile.\"));\n console.log();\n}\n\nfunction showProfile(): void {\n const companyProfile = loadProfile();\n const current = (companyProfile?.sales_motion ?? getConfigValue(\"sales-motion\")) as SalesMotion | undefined;\n\n if (companyProfile) {\n const lines: string[] = [];\n lines.push(`### ${companyProfile.company_name}`);\n lines.push(\"\");\n lines.push(`- **Industry:** ${companyProfile.industry}`);\n if (companyProfile.company_url) lines.push(`- **Website:** ${companyProfile.company_url}`);\n lines.push(`- **Product:** ${companyProfile.product_description}`);\n lines.push(`- **Target customer:** ${companyProfile.target_customer}`);\n lines.push(`- **Sales motion:** ${PRESET_LABELS[companyProfile.sales_motion]}`);\n if (companyProfile.average_deal_size) lines.push(`- **Avg deal size:** ${companyProfile.average_deal_size}`);\n if (companyProfile.sales_cycle_days !== undefined) lines.push(`- **Sales cycle:** ~${companyProfile.sales_cycle_days} days`);\n if (companyProfile.primary_crm) lines.push(`- **Primary CRM:** ${companyProfile.primary_crm}`);\n if (companyProfile.engagement_tool) lines.push(`- **Engagement tool:** ${companyProfile.engagement_tool}`);\n if (companyProfile.custom_context) lines.push(`- **Additional context:** ${companyProfile.custom_context}`);\n printMarkdown(lines.join(\"\\n\"));\n } else {\n console.log();\n console.log(chalk.bold(\" No company profile yet.\"));\n console.log(\" \" + chalk.dim(\"Run \") + paint(\"accent\", \"/onboard\") + chalk.dim(\" to set one up.\"));\n console.log();\n }\n\n if (current && PRESET_LABELS[current]) {\n console.log(chalk.bold(` Sales motion: ${PRESET_LABELS[current]}`));\n console.log(chalk.dim(` ${PRESET_DESCRIPTIONS[current]}`));\n } else {\n console.log(chalk.bold(\" Sales motion: Default\"));\n console.log(chalk.dim(\" No sales motion set. Using default thresholds.\"));\n }\n console.log();\n\n const resolved = resolveThresholds(current ?? null, {});\n\n console.log(chalk.dim(\" Key Thresholds:\"));\n console.log(chalk.dim(` Freshness window: ${resolved.freshness.people_window_days} days`));\n console.log(chalk.dim(` Flow rate (green): ${resolved.flow_rate.green_days} days`));\n console.log(chalk.dim(` Flow rate (stuck): ${resolved.flow_rate.stuck_days} days`));\n console.log(chalk.dim(` S/N lookback: ${resolved.signal_to_noise.lookback_days} days`));\n console.log(chalk.dim(` Thread depth window: ${resolved.thread_depth.activity_window_days} days`));\n console.log(chalk.dim(` Multi-thread min: ${resolved.thread_depth.multi_thread_threshold} contacts`));\n console.log();\n}\n","/**\n * /onboard — first-run (and re-run) wizard that builds a CompanyProfile.\n *\n * Flow:\n * 1. NTRP logo + intro\n * 2. API key gate (if missing)\n * 3. Single seed question: company website (or company name)\n * 4. Deep-research draft via draftCompanyProfile(seed)\n * 5. Sales motion confirmation (AI-suggested default)\n * 6. Fill any missing required fields\n * 7. Review + edit loop\n * 8. Optional user_scope (natural language, skippable)\n * 9. Save to ~/.ntrp/profile.json\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { printMarkdown } from \"../ui/markdown.js\";\nimport { paint, bold } from \"../ui/theme.js\";\nimport { renderLogo } from \"../ui/banner.js\";\nimport { termWidth, visibleWidth } from \"../ui/layout.js\";\nimport { createPromptSession, type Choice, type PromptSession } from \"../cli/prompts.js\";\nimport { hasAnyLlmProvider } from \"../ai/repl-api.js\";\nimport { setConfigValue } from \"../config/store.js\";\nimport type { LlmProvider } from \"../types.js\";\nimport { loadProfile, saveProfile, profileExists, isProfileConfigured } from \"../config/profile.js\";\nimport { parseArgs, getBool } from \"../cli/argparse.js\";\nimport { invalidateTaxonomy } from \"../demo/taxonomy-cache.js\";\nimport { draftCompanyProfile, type DraftSeed } from \"../ai/profile-draft.js\";\nimport {\n generateClarifyingQuestions,\n refineProfile,\n type ClarifyingAnswer,\n type ClarifyingQuestion,\n} from \"../ai/profile-clarify.js\";\nimport { PRESET_LABELS, PRESET_DESCRIPTIONS } from \"./profile.js\";\nimport type { CompanyProfile, SalesMotion } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\n\nconst SALES_MOTION_CHOICES: Choice<SalesMotion>[] = [\n { value: \"plg\", label: \"PLG — Product-Led Growth\", description: PRESET_DESCRIPTIONS.plg },\n { value: \"smb_velocity\", label: \"SMB Velocity — Fast cycles, high volume\", description: PRESET_DESCRIPTIONS.smb_velocity },\n { value: \"mid_market\", label: \"Mid-Market — Moderate deal sizes\", description: PRESET_DESCRIPTIONS.mid_market },\n { value: \"enterprise\", label: \"Enterprise — Long cycles, large deals\", description: PRESET_DESCRIPTIONS.enterprise },\n];\n\nconst CRM_CHOICES: Choice<string>[] = [\n { value: \"salesforce\", label: \"Salesforce\" },\n { value: \"hubspot\", label: \"HubSpot\" },\n { value: \"pipedrive\", label: \"Pipedrive\" },\n { value: \"other\", label: \"Other / None\" },\n];\n\nconst ENGAGEMENT_CHOICES: Choice<string>[] = [\n { value: \"outreach\", label: \"Outreach\" },\n { value: \"salesloft\", label: \"Salesloft\" },\n { value: \"apollo\", label: \"Apollo\" },\n { value: \"none\", label: \"None\" },\n];\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n const { flags } = parseArgs(args, [\"force\"]);\n const force = getBool(flags, \"force\");\n\n const priorProfile = loadProfile();\n const configured = isProfileConfigured(priorProfile);\n // After overwrite confirmation, `existing` is nulled out so none of the\n // old profile's fields (industry, user_scope, etc.) leak into the new\n // draft — overwriting means starting fresh, not merging.\n let existing: CompanyProfile | null = configured ? priorProfile : null;\n\n // Always lead with the brand — onboarding IS the NTRP first impression.\n printBrand();\n\n // Reuse the REPL's readline interface when running inside the REPL;\n // otherwise (first-run, one-shot) create our own. Opening a second\n // interface on stdin while another is live causes double-echo because\n // both paint each keystroke. session.close() is a no-op when reusing.\n const session = createPromptSession(ctx.rl, ctx);\n try {\n if (configured && !force) {\n console.log();\n console.log(\" \" + bold(`Profile already exists for ${priorProfile!.company_name}.`));\n const overwrite = await session.confirm(\"Overwrite this profile?\", false);\n if (!overwrite) {\n console.log(\" \" + chalk.dim(\"Keeping existing profile.\"));\n console.log(\" \" + chalk.dim(\"Re-run without prompts: \") + paint(\"accent\", \"/onboard --force\"));\n return;\n }\n // User chose to overwrite — treat this as a brand-new profile.\n existing = null;\n } else if (priorProfile && !configured) {\n console.log();\n console.log(\" \" + chalk.dim(\"Found an incomplete profile — finishing setup.\"));\n existing = null;\n }\n\n printIntro();\n\n // 1. LLM provider + API keys\n await ensureLlmKeys(session);\n\n // 2. Single seed question — prefer a URL, fall back to plain name.\n const siteOrName = await session.askRequired(\n \"What's your company website? (or company name)\",\n );\n\n const isUrlish = looksLikeUrl(siteOrName);\n const companyUrl = isUrlish ? normalizeUrl(siteOrName) : undefined;\n const seedName = isUrlish ? undefined : siteOrName.trim();\n\n const seed: DraftSeed = {\n ...(companyUrl ? { company_url: companyUrl } : {}),\n ...(seedName ? { company_name: seedName } : {}),\n };\n\n // 3. Deep research draft (with spinner)\n let draft = await draftWithSpinner(seed, ctx);\n\n // 4. Fill in any missing required fields via scripted fallback. The\n // research step already picked a sales_motion based on the draft;\n // we no longer ask for it up front — the adaptive refine step\n // below will surface it as a clarifying question if the model is\n // uncertain, and the edit loop lets the operator override.\n draft = await fillMissingFields(session, draft, existing);\n\n // 5. Build initial candidate profile. Canonical company name comes from\n // the draft when available — the model is much better at producing the\n // marketed name (\"HashiCorp\") than the user typing a URL.\n const canonicalName = draft.company_name ?? seedName ?? existing?.company_name ?? \"\";\n const salesMotion = draft.sales_motion ?? existing?.sales_motion ?? \"mid_market\";\n const now = new Date().toISOString();\n let candidate: CompanyProfile = {\n schema_version: 1,\n company_name: canonicalName,\n ...(companyUrl ? { company_url: companyUrl } : existing?.company_url ? { company_url: existing.company_url } : {}),\n industry: draft.industry ?? existing?.industry ?? \"\",\n product_description: draft.product_description ?? existing?.product_description ?? \"\",\n target_customer: draft.target_customer ?? existing?.target_customer ?? \"\",\n sales_motion: salesMotion,\n ...(draft.average_deal_size !== undefined ? { average_deal_size: draft.average_deal_size } : {}),\n ...(draft.sales_cycle_days !== undefined ? { sales_cycle_days: draft.sales_cycle_days } : {}),\n ...(draft.primary_crm !== undefined ? { primary_crm: draft.primary_crm } : {}),\n ...(draft.engagement_tool !== undefined ? { engagement_tool: draft.engagement_tool } : {}),\n ...(existing?.user_scope ? { user_scope: existing.user_scope } : {}),\n created_at: existing?.created_at ?? now,\n updated_at: now,\n };\n\n // 6. Show the initial draft immediately — this is the operator's\n // first look at what NTRP thinks it knows about their business.\n renderProfile(candidate);\n\n // 7. Adaptive refinement: ask one open question, then let the model\n // generate clarifying questions, then refine the draft with the\n // answers. Falls through silently on any AI error.\n candidate = await adaptiveRefine(session, candidate, ctx);\n\n // 8. Review + edit loop\n for (;;) {\n renderProfile(candidate);\n\n const action = (await session.ask(\"Looks good? [Y / edit / redraft]\", { default: \"Y\" })).toLowerCase();\n\n if (action === \"y\" || action === \"yes\" || action === \"\") break;\n\n if (action === \"redraft\") {\n const fresh = await draftWithSpinner(seed, ctx);\n candidate = applyDraft(candidate, fresh);\n continue;\n }\n\n if (action === \"edit\" || action === \"e\") {\n candidate = await editLoop(session, candidate);\n continue;\n }\n\n console.log(\" \" + chalk.red(`Unknown choice: ${action}`));\n }\n\n // 9. Save\n saveProfile(candidate);\n // Keep the sales-motion config key in sync so resolveThresholds() picks it up.\n setConfigValue(\"sales-motion\", candidate.sales_motion);\n // Profile changed → next /demo should rebuild the taxonomy from scratch.\n invalidateTaxonomy();\n\n console.log();\n console.log(\" \" + chalk.green(\"✓\") + \" \" + bold(`Profile saved for ${candidate.company_name}`));\n console.log(\" \" + chalk.dim(`~/.ntrp/profile.json`));\n console.log();\n\n return `Profile saved for ${candidate.company_name}`;\n } finally {\n session.close();\n }\n}\n\n// ------------------------------------------------------------\n// Draft + render helpers\n// ------------------------------------------------------------\n\nasync function draftWithSpinner(seed: DraftSeed, ctx: Context): Promise<Partial<CompanyProfile>> {\n const spinner = ora({ text: \"Researching your company…\", discardStdin: false }).start();\n try {\n const draft = await draftCompanyProfile(seed, ctx);\n spinner.succeed(\"Research complete\");\n return draft;\n } catch (err) {\n spinner.fail(\"Couldn't draft from AI — falling back to questions\");\n console.log(\" \" + chalk.dim(String((err as Error).message ?? err)));\n return {};\n }\n}\n\nasync function fillMissingFields(\n session: PromptSession,\n draft: Partial<CompanyProfile>,\n existing: CompanyProfile | null,\n): Promise<Partial<CompanyProfile>> {\n const out: Partial<CompanyProfile> = { ...draft };\n\n if (!out.company_name) {\n out.company_name = await session.askRequired(\"Company name (canonical)\");\n }\n if (!out.industry) {\n out.industry = await session.askRequired(\"Industry (e.g. B2B SaaS — developer tools)\");\n }\n if (!out.product_description) {\n out.product_description = await session.askRequired(\"Product description (2-3 sentences)\");\n }\n if (!out.target_customer) {\n out.target_customer = await session.askRequired(\"Target customer / ICP\");\n }\n\n // Optional pre-fills from existing only when draft was silent.\n if (out.average_deal_size === undefined && existing?.average_deal_size) {\n out.average_deal_size = existing.average_deal_size;\n }\n if (out.sales_cycle_days === undefined && existing?.sales_cycle_days) {\n out.sales_cycle_days = existing.sales_cycle_days;\n }\n if (out.primary_crm === undefined && existing?.primary_crm) {\n out.primary_crm = existing.primary_crm;\n }\n if (out.engagement_tool === undefined && existing?.engagement_tool) {\n out.engagement_tool = existing.engagement_tool;\n }\n\n return out;\n}\n\nfunction applyDraft(current: CompanyProfile, draft: Partial<CompanyProfile>): CompanyProfile {\n return {\n ...current,\n ...(draft.company_name ? { company_name: draft.company_name } : {}),\n ...(draft.industry ? { industry: draft.industry } : {}),\n ...(draft.product_description ? { product_description: draft.product_description } : {}),\n ...(draft.target_customer ? { target_customer: draft.target_customer } : {}),\n ...(draft.sales_motion ? { sales_motion: draft.sales_motion } : {}),\n ...(draft.average_deal_size !== undefined ? { average_deal_size: draft.average_deal_size } : {}),\n ...(draft.sales_cycle_days !== undefined ? { sales_cycle_days: draft.sales_cycle_days } : {}),\n ...(draft.primary_crm !== undefined ? { primary_crm: draft.primary_crm } : {}),\n ...(draft.engagement_tool !== undefined ? { engagement_tool: draft.engagement_tool } : {}),\n ...(draft.user_scope !== undefined ? { user_scope: draft.user_scope } : {}),\n ...(draft.custom_context !== undefined ? { custom_context: draft.custom_context } : {}),\n updated_at: new Date().toISOString(),\n };\n}\n\n// ------------------------------------------------------------\n// Adaptive refine — one free-form question, then AI-driven clarifying Q&A\n// ------------------------------------------------------------\n\nasync function adaptiveRefine(\n session: PromptSession,\n candidate: CompanyProfile,\n ctx: Context,\n): Promise<CompanyProfile> {\n console.log();\n console.log(\" \" + bold(\"Tell me what else matters.\"));\n console.log(\n \" \" +\n chalk.dim(\n \"Segments you own, deal triggers, unusual dynamics, anything the draft missed.\",\n ),\n );\n console.log(\" \" + chalk.dim(\"(Press enter to skip — I'll ask a few follow-ups either way.)\"));\n\n const userNote = await session.ask(\"Notes\", { default: \"\" });\n\n // Generate clarifying questions regardless of whether a note was given —\n // the model can still find high-leverage questions by inspecting the\n // draft alone. Falls through silently on any AI error.\n const questions = await clarifyWithSpinner(candidate, userNote, ctx);\n if (questions.length === 0) {\n return userNote.trim()\n ? applyNoteOnly(candidate, userNote)\n : candidate;\n }\n\n console.log();\n console.log(\" \" + bold(\"A few clarifying questions…\"));\n console.log(\" \" + chalk.dim(\"Pick a number, type your own answer, or press enter to skip.\"));\n\n const answers: ClarifyingAnswer[] = [];\n for (const q of questions) {\n const answer = await session.askMulti(q.question, q.options);\n if (answer.trim()) {\n answers.push({ question: q.question, answer: answer.trim() });\n }\n }\n\n // If the user gave us nothing — no note and skipped every question — we\n // have nothing to refine with, so skip the extra AI call entirely.\n if (!userNote.trim() && answers.length === 0) {\n return candidate;\n }\n\n const refined = await refineWithSpinner(candidate, userNote, answers, ctx);\n if (!refined) {\n return userNote.trim() ? applyNoteOnly(candidate, userNote) : candidate;\n }\n\n return applyDraft(candidate, refined);\n}\n\nasync function clarifyWithSpinner(\n candidate: CompanyProfile,\n userNote: string,\n ctx: Context,\n): Promise<ClarifyingQuestion[]> {\n const spinner = ora({ text: \"Generating clarifying questions…\", discardStdin: false }).start();\n try {\n const questions = await generateClarifyingQuestions(candidate, userNote, ctx);\n if (questions.length === 0) {\n spinner.info(\"No clarifying questions needed\");\n return [];\n }\n spinner.succeed(`Generated ${questions.length} clarifying question${questions.length === 1 ? \"\" : \"s\"}`);\n return questions;\n } catch (err) {\n spinner.fail(\"Couldn't generate clarifying questions\");\n console.log(\" \" + chalk.dim(String((err as Error).message ?? err)));\n return [];\n }\n}\n\nasync function refineWithSpinner(\n candidate: CompanyProfile,\n userNote: string,\n answers: ClarifyingAnswer[],\n ctx: Context,\n): Promise<Partial<CompanyProfile> | null> {\n const spinner = ora({ text: \"Refining your profile…\", discardStdin: false }).start();\n try {\n const refined = await refineProfile(candidate, userNote, answers, ctx);\n spinner.succeed(\"Profile refined\");\n return refined;\n } catch (err) {\n spinner.fail(\"Couldn't refine profile from answers\");\n console.log(\" \" + chalk.dim(String((err as Error).message ?? err)));\n return null;\n }\n}\n\n/**\n * If the refine AI call fails but the user did supply a free-form note,\n * at least capture their note as user_scope so the effort wasn't wasted.\n * This is a best-effort fallback — it's better to preserve the user's\n * input than silently drop it on the floor.\n */\nfunction applyNoteOnly(candidate: CompanyProfile, userNote: string): CompanyProfile {\n const trimmed = userNote.trim();\n if (!trimmed) return candidate;\n return {\n ...candidate,\n user_scope: trimmed,\n updated_at: new Date().toISOString(),\n };\n}\n\nfunction renderProfile(p: CompanyProfile): void {\n const lines = [\n \"### Draft Profile\",\n \"\",\n `1. **Company:** ${p.company_name}`,\n `2. **URL:** ${p.company_url ?? \"_(none)_\"}`,\n `3. **Industry:** ${p.industry}`,\n `4. **Product:** ${p.product_description}`,\n `5. **Target customer:** ${p.target_customer}`,\n `6. **Sales motion:** ${PRESET_LABELS[p.sales_motion]}`,\n `7. **Avg deal size:** ${p.average_deal_size ?? \"_(unknown)_\"}`,\n `8. **Sales cycle:** ${p.sales_cycle_days !== undefined ? `~${p.sales_cycle_days} days` : \"_(unknown)_\"}`,\n `9. **Primary CRM:** ${p.primary_crm ?? \"_(unknown)_\"}`,\n `10. **Engagement:** ${p.engagement_tool ?? \"_(unknown)_\"}`,\n `11. **Your scope:** ${p.user_scope ?? \"_(not set)_\"}`,\n `12. **Additional context:** ${p.custom_context ?? \"_(none)_\"}`,\n ].join(\"\\n\");\n printMarkdown(lines);\n}\n\n// ------------------------------------------------------------\n// Edit loop — \"which field? [number or 'done']\"\n// ------------------------------------------------------------\n\nconst EDIT_FIELDS = [\n \"company_name\",\n \"company_url\",\n \"industry\",\n \"product_description\",\n \"target_customer\",\n \"sales_motion\",\n \"average_deal_size\",\n \"sales_cycle_days\",\n \"primary_crm\",\n \"engagement_tool\",\n \"user_scope\",\n] as const;\n\nasync function editLoop(session: PromptSession, initial: CompanyProfile): Promise<CompanyProfile> {\n let p = initial;\n for (;;) {\n const raw = (await session.ask(`Which field? [1-${EDIT_FIELDS.length} or 'done']`, { default: \"done\" })).toLowerCase();\n if (!raw || raw === \"done\" || raw === \"d\") return p;\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1 || n > EDIT_FIELDS.length) {\n console.log(\" \" + chalk.red(`Enter a number from 1 to ${EDIT_FIELDS.length}.`));\n continue;\n }\n const field = EDIT_FIELDS[n - 1]!;\n p = await editField(session, p, field);\n }\n}\n\nasync function editField(session: PromptSession, p: CompanyProfile, field: typeof EDIT_FIELDS[number]): Promise<CompanyProfile> {\n switch (field) {\n case \"company_name\":\n return { ...p, company_name: await session.askRequired(\"Company name\") || p.company_name, updated_at: new Date().toISOString() };\n case \"company_url\": {\n const raw = await session.ask(\"Company website\", { default: p.company_url ?? \"\" });\n const url = raw ? normalizeUrl(raw) : undefined;\n return { ...p, ...(url ? { company_url: url } : { company_url: undefined }), updated_at: new Date().toISOString() };\n }\n case \"industry\":\n return { ...p, industry: await session.ask(\"Industry\", { default: p.industry }) || p.industry, updated_at: new Date().toISOString() };\n case \"product_description\":\n return { ...p, product_description: await session.ask(\"Product description\", { default: p.product_description }) || p.product_description, updated_at: new Date().toISOString() };\n case \"target_customer\":\n return { ...p, target_customer: await session.ask(\"Target customer\", { default: p.target_customer }) || p.target_customer, updated_at: new Date().toISOString() };\n case \"sales_motion\": {\n const motion = await session.choose<SalesMotion>(\n \"Sales motion\",\n SALES_MOTION_CHOICES,\n { default: p.sales_motion },\n );\n return { ...p, sales_motion: motion, updated_at: new Date().toISOString() };\n }\n case \"average_deal_size\":\n return { ...p, average_deal_size: await session.ask(\"Average deal size\", { default: p.average_deal_size ?? \"\" }) || p.average_deal_size, updated_at: new Date().toISOString() };\n case \"sales_cycle_days\": {\n const raw = await session.ask(\"Sales cycle (days)\", { default: p.sales_cycle_days?.toString() ?? \"\" });\n const n = Number(raw);\n if (raw && Number.isInteger(n) && n > 0) {\n return { ...p, sales_cycle_days: n, updated_at: new Date().toISOString() };\n }\n return p;\n }\n case \"primary_crm\": {\n const crm = await session.choose<string>(\n \"Primary CRM\",\n CRM_CHOICES,\n { default: p.primary_crm ?? \"other\" },\n );\n return { ...p, primary_crm: crm, updated_at: new Date().toISOString() };\n }\n case \"engagement_tool\": {\n const tool = await session.choose<string>(\n \"Engagement tool\",\n ENGAGEMENT_CHOICES,\n { default: p.engagement_tool ?? \"none\" },\n );\n return { ...p, engagement_tool: tool, updated_at: new Date().toISOString() };\n }\n case \"user_scope\": {\n const raw = await session.ask(\n \"Segments or divisions you own (plain English, enter to clear)\",\n { default: p.user_scope ?? \"\" },\n );\n const trimmed = raw.trim();\n if (!trimmed) {\n const { user_scope: _drop, ...rest } = p;\n return { ...rest, updated_at: new Date().toISOString() };\n }\n return { ...p, user_scope: trimmed, updated_at: new Date().toISOString() };\n }\n }\n}\n\n// ------------------------------------------------------------\n// Misc\n// ------------------------------------------------------------\n\nfunction printBrand(): void {\n const width = termWidth();\n const logo = renderLogo();\n const maxLogoW = Math.max(...logo.map((l) => visibleWidth(l)));\n const offset = \" \".repeat(Math.max(0, Math.floor((width - maxLogoW) / 2)));\n console.log();\n for (const line of logo) console.log(offset + line);\n console.log();\n}\n\nfunction printIntro(): void {\n console.log(\" \" + bold(\"Let's set up your company profile.\"));\n console.log(\" \" + chalk.dim(\"NTRP will research your business so every answer,\"));\n console.log(\" \" + chalk.dim(\"finding, and demo is tailored to your reality.\"));\n console.log();\n}\n\nasync function ensureLlmKeys(session: PromptSession): Promise<void> {\n if (hasAnyLlmProvider()) return;\n\n console.log();\n console.log(\" \" + chalk.dim(\"Onboarding uses AI to draft your profile.\"));\n console.log(\n \" \" + chalk.dim(\"Or run \")\n + paint(\"accent\", \"/config set api-key\")\n + chalk.dim(\" / \")\n + paint(\"accent\", \"/config set openai-api-key\")\n + chalk.dim(\" anytime.\"),\n );\n\n const first = await session.choose<LlmProvider>(\"Add your first LLM engine\", [\n { value: \"anthropic\", label: \"Anthropic (Claude)\", description: \"Strong tool-using investigation\" },\n { value: \"openai\", label: \"OpenAI (GPT)\", description: \"Full parity on all surfaces\" },\n ]);\n\n const firstLabel = first === \"anthropic\" ? \"Anthropic API key\" : \"OpenAI API key\";\n const firstKey = await session.askSecret(firstLabel, { confirm: true });\n if (first === \"anthropic\") setConfigValue(\"api-key\", firstKey);\n else setConfigValue(\"openai-api-key\", firstKey);\n setConfigValue(\"llm-primary\", first);\n setConfigValue(\"llm-tier\", \"high\");\n\n const second: LlmProvider = first === \"anthropic\" ? \"openai\" : \"anthropic\";\n setConfigValue(\"llm-failover-order\", second);\n setConfigValue(\"llm-auto-failover\", \"off\");\n\n const addSecond = await session.confirm(\n `Add a second engine (${second}) for switching in the REPL?`,\n false,\n );\n if (addSecond) {\n const secondLabel = second === \"anthropic\" ? \"Anthropic API key\" : \"OpenAI API key\";\n const secondKey = await session.askSecret(secondLabel, { confirm: true });\n if (second === \"anthropic\") setConfigValue(\"api-key\", secondKey);\n else setConfigValue(\"openai-api-key\", secondKey);\n\n const enableFailover = await session.confirm(\n \"Enable auto-failover on rate limits? (off = you choose engine with /provider)\",\n false,\n );\n if (enableFailover) setConfigValue(\"llm-auto-failover\", \"on\");\n } else {\n console.log(\n \" \" + chalk.dim(`Single engine — add ${second} later via /config set ${second === \"anthropic\" ? \"api-key\" : \"openai-api-key\"}.`),\n );\n }\n\n console.log(\" \" + paint(\"success\", \"✓\") + \" \" + chalk.dim(\"LLM engines configured. Use /provider to switch.\"));\n}\n\nfunction looksLikeUrl(raw: string): boolean {\n const t = raw.trim().toLowerCase();\n if (!t) return false;\n if (t.startsWith(\"http://\") || t.startsWith(\"https://\")) return true;\n // A dot with non-space chars on both sides is a reasonable URL heuristic\n // — \"acme.com\", \"foo.bar.io\", etc. — while \"Acme Corp\" fails the test.\n return /^[^\\s]+\\.[^\\s]+$/.test(t);\n}\n\nfunction normalizeUrl(raw: string): string {\n return raw\n .trim()\n .replace(/^https?:\\/\\//i, \"\")\n .replace(/\\/+$/, \"\");\n}\n\n// Explicit re-export so callers can check without importing from two modules.\nexport { profileExists };\n","/**\n * ntrp scratch — minimal factory reset (config, profile, sessions, datasets).\n */\n\nimport chalk from \"chalk\";\nimport { parseArgs, getBool } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport {\n defaultSessionAnalysis,\n rotateToFreshSession,\n} from \"../cli/context.js\";\nimport { printAdminCancelled, requireTypedWord } from \"../cli/admin-confirm.js\";\nimport { performScratchWipe } from \"../services/scratch-wipe.js\";\nimport { isProfileConfigured } from \"../config/profile.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport { paint } from \"../ui/theme.js\";\n\nfunction printScratchPreamble(): void {\n console.log();\n console.log(\" \" + chalk.yellow.bold(\"This will permanently remove:\"));\n console.log(\" \" + chalk.dim(\" • API key and all config.json settings\"));\n console.log(\" \" + chalk.dim(\" • Company profile (you'll re-onboard on next use)\"));\n console.log(\" \" + chalk.dim(\" • All sessions and datasets\"));\n console.log(\" \" + chalk.dim(\" • Demo taxonomy cache\"));\n console.log();\n console.log(\" \" + chalk.dim(\"Preserved: memory, strategies, wins, knowledge, exports, audit\"));\n console.log();\n}\n\nfunction resetContextAfterScratch(ctx: Context): void {\n ctx.messages = [];\n ctx.conversation = [];\n ctx.dataset = undefined;\n ctx.scope = undefined;\n ctx.gapAudit = undefined;\n ctx.deliverables = [];\n ctx.stage = \"new\";\n ctx.snapshot = { computeResult: null, divergences: [] };\n ctx.analysis = defaultSessionAnalysis();\n ctx.resumedFromId = undefined;\n ctx.resumedSessionSummary = undefined;\n ctx.sessionName = undefined;\n ctx.attachments = [];\n ctx.deliverIntent = false;\n ctx.computeInProgress = false;\n ctx.lastExchange = undefined;\n}\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n const { flags } = parseArgs(args, [\"confirm\"]);\n const confirmedFlag = getBool(flags, \"confirm\");\n\n const ok = await requireTypedWord(ctx, {\n title: \"Factory reset\",\n word: \"scratch\",\n confirmedFlag,\n preamble: printScratchPreamble,\n });\n\n if (!ok) {\n printAdminCancelled(\"Scratch\", 'Type \"scratch\" exactly to confirm.');\n return \"Scratch cancelled\";\n }\n\n await performScratchWipe();\n resetContextAfterScratch(ctx);\n await rotateToFreshSession(ctx);\n await initSchema();\n\n console.log();\n console.log(\" \" + paint(\"accent\", \"✓ Scratch complete\") + chalk.dim(\" — local config and data wiped.\"));\n console.log();\n\n if (ctx.oneShot) {\n console.log(\n \" \" + chalk.dim(\"Run \") + paint(\"accent\", \"ntrp\") + chalk.dim(\" interactively to complete onboarding.\\n\"),\n );\n return \"Scratch complete\";\n }\n\n if (!isProfileConfigured()) {\n console.log(\" \" + chalk.dim(\"Starting onboarding...\"));\n console.log();\n const { handler: onboard } = await import(\"./onboard.js\");\n await onboard([], ctx);\n return \"Scratch complete — onboarding started\";\n }\n\n return \"Scratch complete\";\n}\n","/**\n * ntrp cleanup — close all in-progress sessions.\n */\n\nimport chalk from \"chalk\";\nimport { parseArgs, getBool } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { closeAllActiveSessions, getActiveSessions } from \"../cli/context.js\";\nimport { printAdminCancelled, requireYesNo } from \"../cli/admin-confirm.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n if (ctx.oneShot) {\n console.error(chalk.red(\" /cleanup is for the interactive REPL only.\"));\n console.error(chalk.dim(\" Use session management commands in one-shot mode.\\n\"));\n return;\n }\n\n const { flags } = parseArgs(args, [\"confirm\"]);\n const confirmedFlag = getBool(flags, \"confirm\");\n\n const active = getActiveSessions();\n if (active.length === 0) {\n console.log();\n console.log(\" \" + chalk.dim(\"No active sessions — nothing to clean up.\"));\n console.log();\n return \"No active sessions\";\n }\n\n const count = active.length;\n const ok = await requireYesNo(ctx, {\n title: `Close ${count} active session${count === 1 ? \"\" : \"s\"}?`,\n detail: \"Sessions are marked ended — transcripts and datasets are kept.\",\n question: \"Proceed?\",\n confirmedFlag,\n });\n\n if (!ok) {\n printAdminCancelled(\"Cleanup\");\n return \"Cleanup cancelled\";\n }\n\n const { closed, skipped } = await closeAllActiveSessions(ctx);\n\n console.log();\n console.log(\n \" \" +\n paint(\"accent\", \"✓ Cleanup complete\") +\n chalk.dim(` — ${closed.length} session${closed.length === 1 ? \"\" : \"s\"} marked ended.`),\n );\n if (skipped.length > 0) {\n console.log(\" \" + chalk.dim(`Skipped ${skipped.length} session(s) that could not be updated.`));\n }\n console.log();\n\n return `Closed ${closed.length} session(s)`;\n}\n","/**\n * Demo feature toggle — persisted in config.json as demo-enabled.\n */\n\nimport chalk from \"chalk\";\nimport { loadConfig, saveConfig } from \"./store.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport const DEMO_DISABLED_MESSAGE =\n \"Demo generators are disabled. Run /config set demo-enabled true to re-enable.\";\n\nexport function printDemoDisabled(): void {\n console.log();\n console.log(\" \" + chalk.red(DEMO_DISABLED_MESSAGE));\n console.log(\n \" \" +\n chalk.dim(\"Re-enable with \") +\n paint(\"accent\", \"/config set demo-enabled true\") +\n chalk.dim(\".\"),\n );\n console.log();\n}\n\nexport function guardDemoEnabled(): boolean {\n if (isDemoEnabled()) return true;\n printDemoDisabled();\n return false;\n}\n\nexport function isDemoEnabled(): boolean {\n const config = loadConfig() as Record<string, unknown>;\n const value = config[\"demo-enabled\"];\n if (value === false || value === \"false\") return false;\n return true;\n}\n\nexport function setDemoEnabled(enabled: boolean): void {\n const config = loadConfig();\n (config as Record<string, unknown>)[\"demo-enabled\"] = enabled;\n saveConfig(config);\n}\n","/**\n * ntrp deactivate-demo — persistently disable demo data generators.\n */\n\nimport chalk from \"chalk\";\nimport { parseArgs, getBool } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { printAdminCancelled, requireYesNo } from \"../cli/admin-confirm.js\";\nimport { isDemoEnabled, setDemoEnabled } from \"../config/demo.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n const { flags } = parseArgs(args, [\"confirm\"]);\n const confirmedFlag = getBool(flags, \"confirm\");\n\n if (!isDemoEnabled()) {\n console.log();\n console.log(\" \" + chalk.dim(\"Demo generators are already disabled.\"));\n console.log(\n \" \" +\n chalk.dim(\"Re-enable with \") +\n paint(\"accent\", \"/config set demo-enabled true\") +\n chalk.dim(\".\"),\n );\n console.log();\n return \"Demo already disabled\";\n }\n\n const ok = await requireYesNo(ctx, {\n title: \"Disable all demo data generators?\",\n detail: '/ingest --demo, /new --demo, and \"use demo data\" will be blocked.',\n question: \"Proceed?\",\n confirmedFlag,\n oneShotHint: \"This will disable all demo data generators. Re-run with --confirm to proceed.\",\n });\n\n if (!ok) {\n printAdminCancelled(\"Deactivate-demo\");\n return \"Deactivate-demo cancelled\";\n }\n\n setDemoEnabled(false);\n\n console.log();\n console.log(\" \" + paint(\"accent\", \"✓ Demo generators disabled\"));\n console.log(\n \" \" +\n chalk.dim(\"Re-enable with \") +\n paint(\"accent\", \"/config set demo-enabled true\") +\n chalk.dim(\".\"),\n );\n console.log();\n\n return \"Demo disabled\";\n}\n","/**\n * Global admin commands — invokable at any REPL surface (including wizards).\n */\n\nimport type { Context } from \"./context.js\";\nimport type { GlobalReplCommand } from \"./repl-globals.js\";\nimport { tokenize } from \"./args.js\";\n\nexport async function runGlobalAdminCommand(\n command: GlobalReplCommand,\n line: string,\n ctx: Context,\n): Promise<string | void> {\n const tokens = tokenize(line);\n const args = tokens.slice(1);\n\n switch (command) {\n case \"scratch\": {\n const { handler } = await import(\"../commands/scratch.js\");\n return handler(args, ctx);\n }\n case \"cleanup\": {\n const { handler } = await import(\"../commands/cleanup.js\");\n return handler(args, ctx);\n }\n case \"deactivate-demo\": {\n const { handler } = await import(\"../commands/deactivate-demo.js\");\n return handler(args, ctx);\n }\n default:\n return undefined;\n }\n}\n\nexport function isGlobalAdminCommand(\n command: GlobalReplCommand,\n): command is \"scratch\" | \"cleanup\" | \"deactivate-demo\" {\n return command === \"scratch\" || command === \"cleanup\" || command === \"deactivate-demo\";\n}\n","/**\n * Post-action navigation — after structural REPL commands complete, decide\n * whether to auto-return to the welcome dashboard.\n */\n\nimport type { Context } from \"./context.js\";\n\nexport type PostActionNav = \"home\" | \"none\";\n\nconst HOME_COMMANDS = new Set([\n \"scratch\",\n \"onboard\",\n \"cleanup\",\n \"deactivate-demo\",\n \"end\",\n]);\n\nfunction isCancelledSummary(summary?: string): boolean {\n if (!summary) return false;\n return /cancel/i.test(summary);\n}\n\nexport function resolvePostAction(input: {\n command: string;\n summary?: string;\n ctx: Context;\n cancelled?: boolean;\n}): PostActionNav {\n const { command, summary, ctx, cancelled } = input;\n\n if (ctx.oneShot) return \"none\";\n if (cancelled || isCancelledSummary(summary)) return \"none\";\n if (command === \"onboard\" && !ctx.replStarted) return \"none\";\n if (HOME_COMMANDS.has(command)) return \"home\";\n return \"none\";\n}\n","export type OutputMode = \"terminal\" | \"json\" | \"markdown\" | \"ndjson\";\nexport type ExecutionMode = \"interactive\" | \"one_shot\" | \"headless\" | \"investigation\";\n\nexport const HEADLESS_SCHEMA_VERSION = \"ntrp.headless.v1\";\n\nexport enum ExitCode {\n Ok = 0,\n RuntimeError = 1,\n Usage = 2,\n Auth = 3,\n NoData = 4,\n}\n\nexport interface HeadlessWarning {\n code: string;\n message: string;\n details?: unknown;\n}\n\nexport interface HeadlessError {\n code: string;\n message: string;\n details?: unknown;\n}\n\nexport interface HeadlessEnvelope<T = unknown> {\n schema_version: typeof HEADLESS_SCHEMA_VERSION;\n command: string;\n status: \"ok\" | \"error\";\n generated_at: string;\n data?: T;\n warnings?: HeadlessWarning[];\n error?: HeadlessError;\n}\n\nexport interface ProgressEvent {\n type: \"progress\";\n command: string;\n phase: string;\n message?: string;\n at: string;\n data?: unknown;\n}\n\nexport interface ExecutionOptions {\n mode: ExecutionMode;\n output: OutputMode;\n progress: boolean;\n color: boolean;\n strictStdout: boolean;\n quiet: boolean;\n}\n","import { ExitCode, type HeadlessError } from \"./types.js\";\n\nexport class NtrpError extends Error {\n code: string;\n exitCode: ExitCode;\n details?: unknown;\n\n constructor(code: string, message: string, exitCode: ExitCode = ExitCode.RuntimeError, details?: unknown) {\n super(message);\n this.name = \"NtrpError\";\n this.code = code;\n this.exitCode = exitCode;\n this.details = details;\n }\n\n toHeadlessError(): HeadlessError {\n return {\n code: this.code,\n message: this.message,\n ...(this.details === undefined ? {} : { details: this.details }),\n };\n }\n}\n\nexport function toNtrpError(err: unknown, fallbackCode = \"runtime_error\"): NtrpError {\n if (err instanceof NtrpError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new NtrpError(fallbackCode, message, ExitCode.RuntimeError);\n}\n","import type { ExecutionOptions, HeadlessEnvelope, HeadlessWarning, ProgressEvent } from \"./types.js\";\nimport { HEADLESS_SCHEMA_VERSION } from \"./types.js\";\nimport { NtrpError, toNtrpError } from \"./errors.js\";\n\nfunction jsonSafe(value: unknown): unknown {\n if (typeof value === \"bigint\") return Number(value);\n if (value instanceof Date) return value.toISOString();\n if (Array.isArray(value)) return value.map(jsonSafe);\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, val]) => [key, jsonSafe(val)]),\n );\n }\n return value;\n}\n\nexport function envelope<T>(\n command: string,\n data: T,\n warnings?: HeadlessWarning[],\n): HeadlessEnvelope<T> {\n return {\n schema_version: HEADLESS_SCHEMA_VERSION,\n command,\n status: \"ok\",\n generated_at: new Date().toISOString(),\n data,\n ...(warnings && warnings.length > 0 ? { warnings } : {}),\n };\n}\n\nexport function errorEnvelope(command: string, err: unknown): HeadlessEnvelope {\n const ntrpError = toNtrpError(err);\n return {\n schema_version: HEADLESS_SCHEMA_VERSION,\n command,\n status: \"error\",\n generated_at: new Date().toISOString(),\n error: ntrpError.toHeadlessError(),\n };\n}\n\nexport function emitResult<T>(command: string, data: T, warnings?: HeadlessWarning[]): void {\n console.log(JSON.stringify(jsonSafe(envelope(command, data, warnings)), null, 2));\n}\n\nexport function emitError(command: string, err: unknown): never {\n const ntrpError = err instanceof NtrpError ? err : toNtrpError(err);\n console.log(JSON.stringify(jsonSafe(errorEnvelope(command, ntrpError)), null, 2));\n process.exit(ntrpError.exitCode);\n}\n\nexport function emitEvent(event: ProgressEvent): void {\n console.log(JSON.stringify(jsonSafe(event)));\n}\n\nexport function emitWarning(message: string, opts: ExecutionOptions, code = \"warning\", details?: unknown): void {\n if (opts.quiet) return;\n const warning = { code, message, ...(details === undefined ? {} : { details }) };\n if (opts.strictStdout) {\n console.error(JSON.stringify(jsonSafe(warning)));\n } else {\n console.warn(message);\n }\n}\n\nexport function isStructuredOutput(opts: ExecutionOptions): boolean {\n return opts.output === \"json\" || opts.output === \"ndjson\";\n}\n","/**\n * CSV parser using papaparse.\n * Parses CSV string → headers + typed rows.\n */\n\nimport Papa from \"papaparse\";\n\nexport interface ParsedCSV {\n headers: string[];\n rows: Record<string, string>[];\n rowCount: number;\n}\n\n/**\n * Parse a CSV string into headers and rows.\n * All values are strings — type coercion happens during import.\n */\nexport function parseCSV(content: string): ParsedCSV {\n const result = Papa.parse<Record<string, string>>(content, {\n header: true,\n skipEmptyLines: true,\n transformHeader: (h) => h.trim(),\n });\n\n return {\n headers: result.meta.fields ?? [],\n rows: result.data,\n rowCount: result.data.length,\n };\n}\n\n/**\n * Extract preview rows for the mapping UI.\n */\nexport function getPreviewRows(\n rows: Record<string, string>[],\n count: number = 5,\n): Record<string, string>[] {\n return rows.slice(0, count);\n}\n","/**\n * Default column mapping rules per source system per entity type.\n */\n\nimport type { ActivityType, CampaignType } from \"../types.js\";\n\nexport const ONTOLOGY_FIELDS: Record<string, string[]> = {\n organizations: [\"canonical_name\", \"canonical_domain\", \"source_id\"],\n people: [\"canonical_name\", \"canonical_email\", \"source_id\", \"organization_source_id\"],\n opportunities: [\"canonical_name\", \"amount\", \"current_stage\", \"close_date\", \"source_id\", \"organization_source_id\", \"owner_source_id\"],\n activities: [\"activity_type\", \"occurred_at\", \"source_id\", \"person_source_id\"],\n campaigns: [\"canonical_name\", \"campaign_type\", \"source_id\"],\n};\n\nexport type MappingRules = Record<string, string>;\n\nexport const DEFAULT_MAPPINGS: Record<string, Record<string, MappingRules>> = {\n salesforce: {\n organizations: { Name: \"canonical_name\", Website: \"canonical_domain\", Id: \"source_id\" },\n people: { Email: \"canonical_email\", FirstName: \"first_name\", LastName: \"last_name\", Id: \"source_id\", AccountId: \"organization_source_id\" },\n opportunities: { Name: \"canonical_name\", Amount: \"amount\", StageName: \"current_stage\", CloseDate: \"close_date\", Id: \"source_id\", AccountId: \"organization_source_id\", OwnerId: \"owner_source_id\" },\n activities: { TaskSubtype: \"activity_type\", ActivityDate: \"occurred_at\", Id: \"source_id\", WhoId: \"person_source_id\" },\n },\n hubspot: {\n organizations: { \"Company name\": \"canonical_name\", \"Company Domain Name\": \"canonical_domain\", \"Company ID\": \"source_id\" },\n people: { Email: \"canonical_email\", \"First Name\": \"first_name\", \"Last Name\": \"last_name\", \"Contact ID\": \"source_id\", \"Associated Company ID\": \"organization_source_id\" },\n activities: { Type: \"activity_type\", \"Created At\": \"occurred_at\", \"Engagement ID\": \"source_id\", \"Contact ID\": \"person_source_id\" },\n },\n outreach: {\n campaigns: { name: \"canonical_name\", id: \"source_id\" },\n activities: { type: \"activity_type\", created_at: \"occurred_at\", id: \"source_id\", prospect_id: \"person_source_id\" },\n },\n};\n\nexport const ACTIVITY_TYPE_MAP: Record<string, ActivityType> = {\n Call: \"call\", Email: \"email\", Task: \"custom\",\n CALL: \"call\", EMAIL: \"email\", MEETING: \"meeting\", NOTE: \"custom\", TASK: \"custom\",\n INCOMING_EMAIL: \"email\", FORWARDED_EMAIL: \"email\",\n call: \"call\", email: \"email\", sequence_step: \"email\",\n};\n\nexport const CAMPAIGN_TYPE_MAP: Record<string, CampaignType> = {\n outbound: \"email_sequence\", inbound: \"email_sequence\", trigger: \"email_sequence\",\n};\n\nexport function getDefaultMappings(sourceSystem: string, entityType: string): MappingRules {\n return DEFAULT_MAPPINGS[sourceSystem]?.[entityType] ?? {};\n}\n","/**\n * Auto-detect entity type from CSV column headers.\n */\n\nimport { getDefaultMappings, type MappingRules } from \"./csv-mappings.js\";\n\nexport interface DetectionResult {\n entityType: string;\n confidence: number;\n mappings: MappingRules;\n}\n\ninterface SignatureRule {\n entityType: string;\n required: string[];\n optional: string[];\n weight: number;\n}\n\nconst SIGNATURES: Record<string, SignatureRule[]> = {\n salesforce: [\n { entityType: \"organizations\", required: [\"Name\", \"Industry\"], optional: [\"AnnualRevenue\", \"BillingCountry\", \"Website\", \"NumberOfEmployees\"], weight: 1 },\n { entityType: \"people\", required: [\"FirstName\", \"LastName\", \"Email\"], optional: [\"AccountId\", \"Title\", \"Phone\"], weight: 1 },\n { entityType: \"opportunities\", required: [\"StageName\", \"Amount\", \"CloseDate\"], optional: [\"AccountId\", \"OwnerId\", \"Probability\"], weight: 1 },\n { entityType: \"activities\", required: [\"Subject\", \"ActivityDate\", \"TaskSubtype\"], optional: [\"WhoId\", \"WhatId\", \"Status\"], weight: 1 },\n ],\n hubspot: [\n { entityType: \"organizations\", required: [\"Company name\", \"Company Domain Name\"], optional: [\"Company ID\", \"Industry\", \"Annual Revenue\"], weight: 1 },\n { entityType: \"people\", required: [\"First Name\", \"Last Name\", \"Email\"], optional: [\"Contact ID\", \"Associated Company ID\", \"Lifecycle Stage\"], weight: 1 },\n { entityType: \"activities\", required: [\"Engagement ID\", \"Type\"], optional: [\"Timestamp\", \"Created At\", \"Contact ID\"], weight: 1 },\n ],\n outreach: [\n { entityType: \"campaigns\", required: [\"sequence_type\", \"step_count\"], optional: [\"name\", \"id\", \"enabled\"], weight: 1 },\n { entityType: \"activities\", required: [\"prospect_id\", \"prospect_email\"], optional: [\"type\", \"created_at\", \"subject\"], weight: 1 },\n ],\n};\n\nexport function detectEntityType(headers: string[], sourceSystem: string): DetectionResult | null {\n const rules = SIGNATURES[sourceSystem];\n if (!rules) return null;\n\n const headerSet = new Set(headers);\n let bestMatch: { rule: SignatureRule; score: number } | null = null;\n\n for (const rule of rules) {\n const requiredMatches = rule.required.filter((col) => headerSet.has(col)).length;\n const requiredTotal = rule.required.length;\n if (requiredMatches < Math.ceil(requiredTotal / 2)) continue;\n\n const optionalMatches = rule.optional.filter((col) => headerSet.has(col)).length;\n const optionalTotal = rule.optional.length;\n const score = (requiredMatches / requiredTotal) * 0.7 + (optionalTotal > 0 ? (optionalMatches / optionalTotal) * 0.3 : 0.3);\n\n if (!bestMatch || score > bestMatch.score) {\n bestMatch = { rule, score };\n }\n }\n\n if (!bestMatch) return null;\n\n const defaultMappings = getDefaultMappings(sourceSystem, bestMatch.rule.entityType);\n const mappings: MappingRules = {};\n for (const [csvCol, ontologyField] of Object.entries(defaultMappings)) {\n if (headerSet.has(csvCol)) {\n mappings[csvCol] = ontologyField;\n }\n }\n\n return {\n entityType: bestMatch.rule.entityType,\n confidence: Math.round(bestMatch.score * 100) / 100,\n mappings,\n };\n}\n","/**\n * CSV importer — rewritten for DuckDB.\n * Takes mapped rows + context → transforms & inserts via query helpers.\n */\n\nimport { ACTIVITY_TYPE_MAP, CAMPAIGN_TYPE_MAP, type MappingRules } from \"./csv-mappings.js\";\nimport * as db from \"../db/queries.js\";\nimport { all } from \"../db/connection.js\";\nimport type { ActivityType, CampaignType } from \"../types.js\";\n\nexport interface ImportParams {\n rows: Record<string, string>[];\n mappings: MappingRules;\n sourceSystem: string;\n entityType: string;\n}\n\nexport interface ImportResult {\n imported: number;\n errors: string[];\n}\n\nexport async function importRows(params: ImportParams): Promise<ImportResult> {\n switch (params.entityType) {\n case \"organizations\": return importOrganizations(params);\n case \"people\": return importPeople(params);\n case \"opportunities\": return importOpportunities(params);\n case \"activities\": return importActivities(params);\n case \"campaigns\": return importCampaigns(params);\n default: return { imported: 0, errors: [`Unknown entity type: ${params.entityType}`] };\n }\n}\n\nfunction reverseMap(mappings: MappingRules): Record<string, string> {\n const reversed: Record<string, string> = {};\n for (const [csvCol, ontologyField] of Object.entries(mappings)) {\n reversed[ontologyField] = csvCol;\n }\n return reversed;\n}\n\nfunction getMapped(row: Record<string, string>, fieldMap: Record<string, string>, field: string): string | undefined {\n const csvCol = fieldMap[field];\n if (!csvCol) return undefined;\n const val = row[csvCol];\n return val !== undefined && val !== \"\" ? val : undefined;\n}\n\nfunction buildMetadata(row: Record<string, string>, mappings: MappingRules): Record<string, unknown> {\n const mappedCols = new Set(Object.keys(mappings));\n const metadata: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n if (!mappedCols.has(key) && value !== undefined && value !== \"\") {\n metadata[key] = value;\n }\n }\n return metadata;\n}\n\nfunction stripUrl(url: string): string {\n return url.replace(/^https?:\\/\\//, \"\").replace(/^www\\./, \"\").replace(/\\/$/, \"\");\n}\n\nfunction parseTimestamp(value: string): string | null {\n if (!value) return null;\n const num = Number(value);\n if (!isNaN(num) && num > 1_000_000_000_000) return new Date(num).toISOString();\n if (!isNaN(num) && num > 1_000_000_000) return new Date(num * 1000).toISOString();\n const d = new Date(value);\n if (!isNaN(d.getTime())) return d.toISOString();\n return null;\n}\n\nasync function resolveSourceIds(table: string, sourceSystem: string, sourceIds: Set<string>): Promise<Map<string, string>> {\n const idMap = new Map<string, string>();\n if (sourceIds.size === 0) return idMap;\n const ids = Array.from(sourceIds);\n const placeholders = ids.map(() => \"?\").join(\", \");\n const rows = await all<{ id: string; source_id: string }>(\n `SELECT id, source_id FROM ${table} WHERE source_system = ? AND source_id IN (${placeholders})`,\n [sourceSystem, ...ids],\n );\n for (const row of rows) {\n idMap.set(row.source_id, row.id);\n }\n return idMap;\n}\n\nasync function importOrganizations(params: ImportParams): Promise<ImportResult> {\n const { rows, mappings, sourceSystem } = params;\n const errors: string[] = [];\n let imported = 0;\n const fieldMap = reverseMap(mappings);\n\n for (const row of rows) {\n const canonicalName = getMapped(row, fieldMap, \"canonical_name\");\n if (!canonicalName) { errors.push(\"Row missing canonical_name\"); continue; }\n const website = getMapped(row, fieldMap, \"canonical_domain\") ?? \"\";\n const canonicalDomain = stripUrl(website);\n\n await db.insertOrganization({\n canonical_name: canonicalName,\n canonical_domain: canonicalDomain || null,\n source_system: sourceSystem,\n source_id: getMapped(row, fieldMap, \"source_id\") ?? \"\",\n raw_data: row as Record<string, unknown>,\n metadata: buildMetadata(row, mappings),\n });\n imported++;\n }\n return { imported, errors };\n}\n\nasync function importPeople(params: ImportParams): Promise<ImportResult> {\n const { rows, mappings, sourceSystem } = params;\n const errors: string[] = [];\n let imported = 0;\n const fieldMap = reverseMap(mappings);\n\n const orgSourceIds = new Set<string>();\n for (const row of rows) {\n const orgSrcId = getMapped(row, fieldMap, \"organization_source_id\");\n if (orgSrcId) orgSourceIds.add(orgSrcId);\n }\n const orgIdMap = await resolveSourceIds(\"organizations\", sourceSystem, orgSourceIds);\n\n for (const row of rows) {\n const firstName = getMapped(row, fieldMap, \"first_name\") ?? \"\";\n const lastName = getMapped(row, fieldMap, \"last_name\") ?? \"\";\n const canonicalName = [firstName, lastName].filter(Boolean).join(\" \") || getMapped(row, fieldMap, \"canonical_name\") || \"\";\n if (!canonicalName) { errors.push(\"Row missing name fields\"); continue; }\n\n const orgSourceId = getMapped(row, fieldMap, \"organization_source_id\");\n await db.insertPerson({\n canonical_name: canonicalName,\n canonical_email: getMapped(row, fieldMap, \"canonical_email\") || null,\n organization_id: orgSourceId ? orgIdMap.get(orgSourceId) ?? null : null,\n source_system: sourceSystem,\n source_id: getMapped(row, fieldMap, \"source_id\") ?? \"\",\n raw_data: row as Record<string, unknown>,\n metadata: buildMetadata(row, mappings),\n });\n imported++;\n }\n return { imported, errors };\n}\n\nasync function importOpportunities(params: ImportParams): Promise<ImportResult> {\n const { rows, mappings, sourceSystem } = params;\n const errors: string[] = [];\n let imported = 0;\n const fieldMap = reverseMap(mappings);\n\n const orgSourceIds = new Set<string>();\n const ownerSourceIds = new Set<string>();\n for (const row of rows) {\n const o = getMapped(row, fieldMap, \"organization_source_id\");\n if (o) orgSourceIds.add(o);\n const w = getMapped(row, fieldMap, \"owner_source_id\");\n if (w) ownerSourceIds.add(w);\n }\n const orgIdMap = await resolveSourceIds(\"organizations\", sourceSystem, orgSourceIds);\n const ownerIdMap = await resolveSourceIds(\"people\", sourceSystem, ownerSourceIds);\n\n for (const row of rows) {\n const canonicalName = getMapped(row, fieldMap, \"canonical_name\");\n if (!canonicalName) { errors.push(\"Row missing canonical_name\"); continue; }\n const orgSourceId = getMapped(row, fieldMap, \"organization_source_id\");\n const ownerSourceId = getMapped(row, fieldMap, \"owner_source_id\");\n const amountStr = getMapped(row, fieldMap, \"amount\");\n\n await db.insertOpportunity({\n canonical_name: canonicalName,\n organization_id: orgSourceId ? orgIdMap.get(orgSourceId) ?? null : null,\n owner_id: ownerSourceId ? ownerIdMap.get(ownerSourceId) ?? null : null,\n current_stage: getMapped(row, fieldMap, \"current_stage\") || null,\n amount: amountStr ? parseFloat(amountStr) || null : null,\n close_date: getMapped(row, fieldMap, \"close_date\") || null,\n source_system: sourceSystem,\n source_id: getMapped(row, fieldMap, \"source_id\") ?? \"\",\n raw_data: row as Record<string, unknown>,\n metadata: buildMetadata(row, mappings),\n });\n imported++;\n }\n return { imported, errors };\n}\n\nasync function importActivities(params: ImportParams): Promise<ImportResult> {\n const { rows, mappings, sourceSystem } = params;\n const errors: string[] = [];\n let imported = 0;\n const fieldMap = reverseMap(mappings);\n\n const personSourceIds = new Set<string>();\n for (const row of rows) {\n const p = getMapped(row, fieldMap, \"person_source_id\");\n if (p) personSourceIds.add(p);\n }\n const personIdMap = await resolveSourceIds(\"people\", sourceSystem, personSourceIds);\n\n for (const row of rows) {\n const rawType = getMapped(row, fieldMap, \"activity_type\") ?? \"custom\";\n const activityType: ActivityType = ACTIVITY_TYPE_MAP[rawType] ?? \"custom\";\n const rawOccurredAt = getMapped(row, fieldMap, \"occurred_at\") ?? \"\";\n const occurredAt = parseTimestamp(rawOccurredAt);\n if (!occurredAt) { errors.push(\"Row missing or invalid occurred_at\"); continue; }\n const personSourceId = getMapped(row, fieldMap, \"person_source_id\");\n\n await db.insertActivity({\n activity_type: activityType,\n occurred_at: occurredAt,\n person_id: personSourceId ? personIdMap.get(personSourceId) ?? null : null,\n organization_id: null,\n opportunity_id: null,\n source_system: sourceSystem,\n source_id: getMapped(row, fieldMap, \"source_id\") ?? \"\",\n raw_data: row as Record<string, unknown>,\n metadata: buildMetadata(row, mappings),\n });\n imported++;\n }\n return { imported, errors };\n}\n\nasync function importCampaigns(params: ImportParams): Promise<ImportResult> {\n const { rows, mappings, sourceSystem } = params;\n const errors: string[] = [];\n let imported = 0;\n const fieldMap = reverseMap(mappings);\n\n for (const row of rows) {\n const canonicalName = getMapped(row, fieldMap, \"canonical_name\");\n if (!canonicalName) { errors.push(\"Row missing canonical_name\"); continue; }\n const rawType = row[\"sequence_type\"] ?? \"\";\n const campaignType: CampaignType = CAMPAIGN_TYPE_MAP[rawType] ?? \"email_sequence\";\n\n await db.insertCampaign({\n canonical_name: canonicalName,\n campaign_type: campaignType,\n source_system: sourceSystem,\n source_id: getMapped(row, fieldMap, \"source_id\") ?? \"\",\n raw_data: row as Record<string, unknown>,\n metadata: buildMetadata(row, mappings),\n });\n imported++;\n }\n return { imported, errors };\n}\n","/**\n * Identity Resolution — Exact Match (DuckDB version)\n */\n\nimport { all, run } from \"../db/connection.js\";\n\nexport interface ResolutionResult {\n resolved: number;\n peopleResolved: number;\n orgsResolved: number;\n}\n\nexport async function resolveIdentities(): Promise<ResolutionResult> {\n const orgsResolved = await resolveOrganizations();\n const peopleResolved = await resolvePeople();\n return { resolved: orgsResolved + peopleResolved, peopleResolved, orgsResolved };\n}\n\nasync function resolveOrganizations(): Promise<number> {\n let resolved = 0;\n const orgs = await all<{ id: string; canonical_domain: string; created_at: string }>(\n `SELECT id, canonical_domain, created_at FROM organizations WHERE canonical_id IS NULL AND canonical_domain IS NOT NULL ORDER BY created_at ASC`,\n );\n\n const groups = new Map<string, typeof orgs>();\n for (const org of orgs) {\n const key = org.canonical_domain.toLowerCase();\n const group = groups.get(key);\n if (group) group.push(org);\n else groups.set(key, [org]);\n }\n\n for (const [, group] of groups) {\n if (group.length <= 1) continue;\n const canonical = group[0]!;\n const duplicateIds = group.slice(1).map((d) => d.id);\n const placeholders = duplicateIds.map(() => \"?\").join(\", \");\n\n await run(`UPDATE organizations SET canonical_id = ? WHERE id IN (${placeholders})`, [canonical.id, ...duplicateIds]);\n await run(`UPDATE people SET organization_id = ? WHERE organization_id IN (${placeholders})`, [canonical.id, ...duplicateIds]);\n await run(`UPDATE opportunities SET organization_id = ? WHERE organization_id IN (${placeholders})`, [canonical.id, ...duplicateIds]);\n await run(`UPDATE activities SET organization_id = ? WHERE organization_id IN (${placeholders})`, [canonical.id, ...duplicateIds]);\n\n resolved += duplicateIds.length;\n }\n return resolved;\n}\n\nasync function resolvePeople(): Promise<number> {\n let resolved = 0;\n const people = await all<{ id: string; canonical_email: string; organization_id: string | null; created_at: string }>(\n `SELECT id, canonical_email, organization_id, created_at FROM people WHERE canonical_id IS NULL AND canonical_email IS NOT NULL ORDER BY created_at ASC`,\n );\n\n const groups = new Map<string, typeof people>();\n for (const person of people) {\n const key = person.canonical_email.toLowerCase();\n const group = groups.get(key);\n if (group) group.push(person);\n else groups.set(key, [person]);\n }\n\n for (const [, group] of groups) {\n if (group.length <= 1) continue;\n const canonical = group[0]!;\n const duplicates = group.slice(1);\n const duplicateIds = duplicates.map((d) => d.id);\n const placeholders = duplicateIds.map(() => \"?\").join(\", \");\n\n if (!canonical.organization_id) {\n const withOrg = duplicates.find((d) => d.organization_id);\n if (withOrg) {\n await run(`UPDATE people SET organization_id = ? WHERE id = ?`, [withOrg.organization_id, canonical.id]);\n }\n }\n\n await run(`UPDATE people SET canonical_id = ? WHERE id IN (${placeholders})`, [canonical.id, ...duplicateIds]);\n await run(`UPDATE activities SET person_id = ? WHERE person_id IN (${placeholders})`, [canonical.id, ...duplicateIds]);\n await run(`UPDATE opportunities SET owner_id = ? WHERE owner_id IN (${placeholders})`, [canonical.id, ...duplicateIds]);\n\n resolved += duplicateIds.length;\n }\n return resolved;\n}\n","/**\n * Seeded PRNG using mulberry32 algorithm.\n * All randomness in the generator flows through this — no Math.random().\n */\n\nexport interface SeededRandom {\n /** Returns a float in [0, 1) */\n next(): number;\n /** Returns an integer in [min, max] inclusive */\n nextInt(min: number, max: number): number;\n /** Pick a random element from an array */\n pick<T>(arr: readonly T[]): T;\n /** Shuffle an array in place (Fisher-Yates) */\n shuffle<T>(arr: T[]): T[];\n /** Returns true with the given probability (0-1) */\n chance(probability: number): boolean;\n /** Generate a deterministic UUID v4 */\n uuid(): string;\n /** Generate a random date between start and end */\n date(start: Date, end: Date): Date;\n /** Pick N unique elements from an array */\n pickN<T>(arr: readonly T[], n: number): T[];\n /** Generate a float in [min, max) */\n nextFloat(min: number, max: number): number;\n /** Weighted pick: items with associated weights */\n weightedPick<T>(items: readonly T[], weights: readonly number[]): T;\n}\n\nfunction mulberry32(seed: number): () => number {\n let a = seed | 0;\n return () => {\n a = (a + 0x6d2b79f5) | 0;\n let t = Math.imul(a ^ (a >>> 15), 1 | a);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport function createSeededRandom(seed: number): SeededRandom {\n const raw = mulberry32(seed);\n\n const rng: SeededRandom = {\n next: raw,\n\n nextInt(min: number, max: number): number {\n return Math.floor(raw() * (max - min + 1)) + min;\n },\n\n nextFloat(min: number, max: number): number {\n return raw() * (max - min) + min;\n },\n\n pick<T>(arr: readonly T[]): T {\n if (arr.length === 0) {\n throw new Error(\"Cannot pick from an empty array\");\n }\n return arr[Math.floor(raw() * arr.length)]!;\n },\n\n pickN<T>(arr: readonly T[], n: number): T[] {\n const copy = [...arr];\n rng.shuffle(copy);\n return copy.slice(0, Math.min(n, copy.length));\n },\n\n shuffle<T>(arr: T[]): T[] {\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(raw() * (i + 1));\n const current = arr[i]!;\n arr[i] = arr[j]!;\n arr[j] = current;\n }\n return arr;\n },\n\n chance(probability: number): boolean {\n return raw() < probability;\n },\n\n uuid(): string {\n const bytes = Array.from({ length: 16 }, () => Math.floor(raw() * 256));\n bytes[6] = (bytes[6]! & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8]! & 0x3f) | 0x80; // variant 1\n const hex = bytes.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32),\n ].join(\"-\");\n },\n\n date(start: Date, end: Date): Date {\n const s = start.getTime();\n const e = end.getTime();\n return new Date(s + raw() * (e - s));\n },\n\n weightedPick<T>(items: readonly T[], weights: readonly number[]): T {\n if (items.length === 0) {\n throw new Error(\"Cannot pick from an empty weighted item list\");\n }\n const total = weights.reduce((sum, w) => sum + w, 0);\n let r = raw() * total;\n for (let i = 0; i < items.length; i++) {\n r -= weights[i] ?? 0;\n if (r <= 0) return items[i]!;\n }\n return items[items.length - 1]!;\n },\n };\n\n return rng;\n}\n","/**\n * 5 scenario presets for the sample data generator.\n * Each amplifies a specific problem while maintaining baseline levels of all problems.\n */\n\nimport type { DemoScenario } from \"../types.js\";\nimport type { ScenarioParams } from \"./types.js\";\n\nconst BASELINE: Omit<ScenarioParams, \"key\" | \"label\" | \"description\" | \"story\"> = {\n enterpriseRatio: 0.2,\n midMarketRatio: 0.3,\n smbRatio: 0.5,\n\n staleContactRatio: 0.15,\n staleContactRatioEnterprise: 0.2,\n staleContactRatioSmb: 0.1,\n pastCloseDateRatio: 0.1,\n staleDays: 120,\n\n mqlDropRatio: 0.1,\n qualifiedNoOutreachRatio: 0.1,\n\n stuckDealRatio: 0.1,\n stuckInNegotiationDays: 45,\n avgDaysPerStageEnterprise: 25,\n avgDaysPerStageSmb: 8,\n\n activityVolumeMultiplier: 1.0,\n noiseActivityRatio: 0.15,\n\n singleThreadRatio: 0.2,\n loneWolfRepIndex: null,\n loneWolfSingleThreadRatio: 0.0,\n\n freshnessGapDays: 90,\n};\n\nexport const SCENARIOS: Record<string, ScenarioParams> = {\n hidden_crisis: {\n ...BASELINE,\n key: \"hidden_crisis\",\n label: \"The Hidden Crisis\",\n description: \"Overall health looks yellow but Enterprise is deep red, masked by strong SMB numbers.\",\n story: \"Your aggregate numbers look okay — but when you break it by segment, Enterprise is dying. 60% of enterprise contacts have gone dark, deals are single-threaded, and SMB is carrying the average.\",\n\n staleContactRatio: 0.3,\n staleContactRatioEnterprise: 0.6,\n staleContactRatioSmb: 0.1,\n singleThreadRatio: 0.5,\n enterpriseRatio: 0.3,\n midMarketRatio: 0.3,\n smbRatio: 0.4,\n },\n\n leaky_bucket: {\n ...BASELINE,\n key: \"leaky_bucket\",\n label: \"The Leaky Bucket\",\n description: \"Marketing generates plenty of leads but 40% vanish at handoff to sales.\",\n story: \"Marketing is doing its job — MQLs are flowing. But 40% of qualified leads never show up in sales workflows. They're falling through the cracks at handoff, and nobody's noticing because marketing reports MQL count and sales reports pipeline value.\",\n\n mqlDropRatio: 0.4,\n qualifiedNoOutreachRatio: 0.35,\n staleContactRatio: 0.2,\n },\n\n stale_pipeline: {\n ...BASELINE,\n key: \"stale_pipeline\",\n label: \"The Stale Pipeline\",\n description: \"Big pipeline number but half the deals are zombies stuck in late stages.\",\n story: \"The pipeline report says $5M. But look closer: half those deals have close dates in the past, 40% are stuck in Negotiation for 120+ days, and nobody's touching them. You're forecasting on fiction.\",\n\n pastCloseDateRatio: 0.5,\n stuckDealRatio: 0.4,\n stuckInNegotiationDays: 120,\n staleContactRatio: 0.25,\n staleDays: 90,\n },\n\n lone_wolf: {\n ...BASELINE,\n key: \"lone_wolf\",\n label: \"The Lone Wolf\",\n description: \"One rep has great numbers but every single deal is single-threaded.\",\n story: \"Your top rep is crushing it on paper — biggest pipeline, highest close rate. But every deal has exactly one contact. One champion goes on vacation, gets promoted, or leaves, and the entire pipeline collapses.\",\n\n loneWolfRepIndex: 0,\n loneWolfSingleThreadRatio: 1.0,\n singleThreadRatio: 0.15,\n },\n\n busy_bees: {\n ...BASELINE,\n key: \"busy_bees\",\n label: \"The Busy Bees\",\n description: \"High activity volume across the team, but most of it hits dead ends.\",\n story: \"Your team is busy. Activity metrics look great — calls are up, emails are up, meetings are up. But 60% of that activity is aimed at contacts with no associated pipeline. Reps are spraying, not aiming.\",\n\n activityVolumeMultiplier: 3.0,\n noiseActivityRatio: 0.6,\n staleContactRatio: 0.2,\n },\n};\n\nexport const SCENARIO_LIST = Object.values(SCENARIOS);\n\nexport function getScenario(key: string): ScenarioParams {\n const scenario = SCENARIOS[key];\n if (!scenario) {\n throw new Error(`Unknown scenario: ${key}. Valid: ${Object.keys(SCENARIOS).join(\", \")}`);\n }\n return scenario;\n}\n\n/** Scenario keys accepted by the demo generator (excludes research_blend). */\nexport const NAMED_DEMO_SCENARIOS = [\n \"hidden_crisis\",\n \"leaky_bucket\",\n \"stale_pipeline\",\n \"lone_wolf\",\n \"busy_bees\",\n] as const satisfies readonly DemoScenario[];\n\n/**\n * Resolve a --scenario flag or wizard answer into a scenario key.\n * - blank → undefined (caller picks random)\n * - \"hidden_crisis\" etc. → that key\n * - \"1\"-\"5\" → NAMED_DEMO_SCENARIOS[n-1] (menu-style input)\n * - anything else → null (invalid)\n */\nexport function resolveScenarioInput(\n raw: string | undefined,\n): DemoScenario | \"research_blend\" | undefined | null {\n const input = raw?.trim();\n if (!input) return undefined;\n if (input === \"research_blend\") return \"research_blend\";\n if ((NAMED_DEMO_SCENARIOS as readonly string[]).includes(input)) {\n return input as DemoScenario;\n }\n const n = Number(input);\n if (Number.isInteger(n) && n >= 1 && n <= NAMED_DEMO_SCENARIOS.length) {\n return NAMED_DEMO_SCENARIOS[n - 1]!;\n }\n return null;\n}\n\n/**\n * Named-scenario pool used by `pickRandomScenario`. Deliberately excludes\n * `research_blend` — the 5 named presets are the \"multiple potential\n * scenarios\" that /demo randomizes across.\n */\nconst RANDOM_POOL: DemoScenario[] = [\n \"hidden_crisis\",\n \"leaky_bucket\",\n \"stale_pipeline\",\n \"lone_wolf\",\n \"busy_bees\",\n];\n\n/**\n * Pick a fresh random scenario per /demo invocation. Uses Math.random() at\n * the CLI boundary (not the seeded RNG) so successive runs differ.\n */\nexport function pickRandomScenario(): DemoScenario {\n return RANDOM_POOL[Math.floor(Math.random() * RANDOM_POOL.length)]!;\n}\n\n/**\n * Creates a composite ScenarioParams by mixing BASELINE with moderate\n * problem seeding across all vital signs. CLI version always returns\n * the baseline blend (no company research integration).\n */\nexport function blendScenarios(_research: null): ScenarioParams {\n // Start from baseline with moderate problem seeding\n const blended: ScenarioParams = {\n ...BASELINE,\n key: \"research_blend\",\n label: \"Research-Derived Blend\",\n description: \"Realistic data with mild-to-moderate problems across all vital signs.\",\n story: \"Generated with default research blend. Problems are seeded across all vital signs at realistic levels.\",\n\n // Bump all problems slightly above baseline for discoverability\n staleContactRatio: 0.2,\n pastCloseDateRatio: 0.15,\n mqlDropRatio: 0.15,\n qualifiedNoOutreachRatio: 0.15,\n stuckDealRatio: 0.15,\n noiseActivityRatio: 0.2,\n singleThreadRatio: 0.25,\n };\n\n return blended;\n}\n","/**\n * Static data pools for realistic sample data generation.\n */\n\nexport const FIRST_NAMES = [\n \"James\", \"Mary\", \"Robert\", \"Patricia\", \"John\", \"Jennifer\", \"Michael\", \"Linda\",\n \"David\", \"Elizabeth\", \"William\", \"Barbara\", \"Richard\", \"Susan\", \"Joseph\", \"Jessica\",\n \"Thomas\", \"Sarah\", \"Christopher\", \"Karen\", \"Charles\", \"Lisa\", \"Daniel\", \"Nancy\",\n \"Matthew\", \"Betty\", \"Anthony\", \"Margaret\", \"Mark\", \"Sandra\", \"Donald\", \"Ashley\",\n \"Steven\", \"Kimberly\", \"Paul\", \"Emily\", \"Andrew\", \"Donna\", \"Joshua\", \"Michelle\",\n \"Kenneth\", \"Carol\", \"Kevin\", \"Amanda\", \"Brian\", \"Dorothy\", \"George\", \"Melissa\",\n \"Timothy\", \"Deborah\", \"Ronald\", \"Stephanie\", \"Edward\", \"Rebecca\", \"Jason\", \"Sharon\",\n \"Jeffrey\", \"Laura\", \"Ryan\", \"Cynthia\", \"Jacob\", \"Kathleen\", \"Gary\", \"Amy\",\n \"Nicholas\", \"Angela\", \"Eric\", \"Shirley\", \"Jonathan\", \"Anna\", \"Stephen\", \"Brenda\",\n \"Larry\", \"Pamela\", \"Justin\", \"Emma\", \"Scott\", \"Nicole\", \"Brandon\", \"Helen\",\n \"Benjamin\", \"Samantha\", \"Samuel\", \"Katherine\", \"Raymond\", \"Christine\", \"Gregory\", \"Debra\",\n \"Frank\", \"Rachel\", \"Alexander\", \"Carolyn\", \"Patrick\", \"Janet\", \"Jack\", \"Catherine\",\n \"Dennis\", \"Maria\", \"Jerry\", \"Heather\",\n] as const;\n\nexport const LAST_NAMES = [\n \"Smith\", \"Johnson\", \"Williams\", \"Brown\", \"Jones\", \"Garcia\", \"Miller\", \"Davis\",\n \"Rodriguez\", \"Martinez\", \"Hernandez\", \"Lopez\", \"Gonzalez\", \"Wilson\", \"Anderson\",\n \"Thomas\", \"Taylor\", \"Moore\", \"Jackson\", \"Martin\", \"Lee\", \"Perez\", \"Thompson\",\n \"White\", \"Harris\", \"Sanchez\", \"Clark\", \"Ramirez\", \"Lewis\", \"Robinson\", \"Walker\",\n \"Young\", \"Allen\", \"King\", \"Wright\", \"Scott\", \"Torres\", \"Nguyen\", \"Hill\",\n \"Flores\", \"Green\", \"Adams\", \"Nelson\", \"Baker\", \"Hall\", \"Rivera\", \"Campbell\",\n \"Mitchell\", \"Carter\", \"Roberts\", \"Gomez\", \"Phillips\", \"Evans\", \"Turner\", \"Diaz\",\n \"Parker\", \"Cruz\", \"Edwards\", \"Collins\", \"Reyes\", \"Stewart\", \"Morris\", \"Morales\",\n \"Murphy\", \"Cook\", \"Rogers\", \"Gutierrez\", \"Ortiz\", \"Morgan\", \"Cooper\", \"Peterson\",\n \"Bailey\", \"Reed\", \"Kelly\", \"Howard\", \"Ramos\", \"Kim\", \"Cox\", \"Ward\",\n \"Richardson\", \"Watson\", \"Brooks\", \"Chavez\", \"Wood\", \"James\", \"Bennett\", \"Gray\",\n \"Mendoza\", \"Ruiz\", \"Hughes\", \"Price\", \"Alvarez\", \"Castillo\", \"Sanders\", \"Patel\",\n \"Myers\", \"Long\", \"Ross\", \"Foster\",\n] as const;\n\nexport const INDUSTRIES = [\n \"SaaS\", \"Fintech\", \"Healthcare\", \"E-commerce\", \"Cybersecurity\",\n \"EdTech\", \"MarTech\", \"HR Tech\", \"Supply Chain\", \"Real Estate Tech\",\n \"Insurance\", \"Manufacturing\", \"Logistics\", \"Media & Entertainment\",\n \"Clean Energy\",\n] as const;\n\nexport const JOB_TITLES_CONTACT = [\n \"VP of Sales\", \"VP of Marketing\", \"VP of Engineering\", \"VP of Operations\",\n \"Director of Sales\", \"Director of Marketing\", \"Director of IT\",\n \"Head of Growth\", \"Head of Partnerships\", \"Head of Product\",\n \"Chief Revenue Officer\", \"Chief Marketing Officer\", \"Chief Technology Officer\",\n \"Chief Operating Officer\", \"Chief Financial Officer\",\n \"Sales Manager\", \"Marketing Manager\", \"Product Manager\", \"Account Executive\",\n \"Business Development Manager\", \"Customer Success Manager\",\n \"Senior Account Executive\", \"Enterprise Account Executive\",\n \"Regional Sales Director\", \"Marketing Operations Manager\",\n \"Demand Generation Manager\", \"Revenue Operations Manager\",\n \"Solutions Architect\", \"Technical Lead\", \"Procurement Manager\",\n] as const;\n\nexport const JOB_TITLES_REP = [\n \"Account Executive\", \"Senior Account Executive\", \"Enterprise Account Executive\",\n \"Business Development Representative\", \"Sales Development Representative\",\n \"Strategic Account Executive\", \"Regional Sales Manager\",\n] as const;\n\nexport const DEAL_VERBS = [\n \"Platform\", \"Suite\", \"License\", \"Implementation\", \"Migration\",\n \"Integration\", \"Expansion\", \"Renewal\", \"Upgrade\", \"Deployment\",\n] as const;\n\nexport const DEAL_MODIFIERS = [\n \"Enterprise\", \"Professional\", \"Standard\", \"Premium\", \"Custom\",\n \"Annual\", \"Multi-Year\", \"Pilot\", \"POC\", \"Full\",\n] as const;\n\nexport const STAGES_SALESFORCE = [\n \"Prospecting\",\n \"Qualification\",\n \"Needs Analysis\",\n \"Value Proposition\",\n \"Negotiation\",\n \"Closed Won\",\n \"Closed Lost\",\n] as const;\n\nexport const STAGES_HUBSPOT = [\n \"Appointment Scheduled\",\n \"Qualified to Buy\",\n \"Presentation Scheduled\",\n \"Decision Maker Bought-In\",\n \"Contract Sent\",\n \"Closed Won\",\n \"Closed Lost\",\n] as const;\n\nexport const LIFECYCLE_STAGES = [\n \"subscriber\", \"lead\", \"marketingqualifiedlead\", \"salesqualifiedlead\",\n \"opportunity\", \"customer\", \"evangelist\",\n] as const;\n\nexport const EMAIL_SUBJECTS_OUTREACH = [\n \"Quick question about {company}\",\n \"Intro: {rep} \\u2194 {contact}\",\n \"Following up on our conversation\",\n \"Next steps for {company}\",\n \"Resource: {industry} benchmark report\",\n \"Checking in on {deal}\",\n \"{company} \\u2014 meeting recap\",\n \"Can we schedule 15 minutes?\",\n \"Saw your post about {topic}\",\n \"Ideas for {company}'s {challenge}\",\n] as const;\n\nexport const CALL_DISPOSITIONS = [\n \"Connected\", \"Left Voicemail\", \"No Answer\", \"Busy\",\n \"Connected - Interested\", \"Connected - Not Interested\", \"Connected - Referred\",\n] as const;\n\nexport const MEETING_TYPES = [\n \"Discovery Call\", \"Demo\", \"Technical Review\", \"Negotiation\",\n \"Executive Alignment\", \"QBR\", \"Onboarding\", \"Check-in\",\n] as const;\n\nexport const COMPANY_SUFFIXES = [\n \"Inc\", \"Corp\", \"Technologies\", \"Solutions\", \"Systems\",\n \"Group\", \"Labs\", \"Software\", \"Analytics\", \"AI\",\n \"Digital\", \"Cloud\", \"Platform\", \"Networks\", \"Dynamics\",\n] as const;\n\nexport const COMPANY_PREFIXES = [\n \"Apex\", \"Pinnacle\", \"Quantum\", \"Nexus\", \"Vertex\",\n \"Catalyst\", \"Meridian\", \"Horizon\", \"Zenith\", \"Atlas\",\n \"Nova\", \"Vanguard\", \"Summit\", \"Prism\", \"Forge\",\n \"Pulse\", \"Orbit\", \"Stratos\", \"Core\", \"Flux\",\n \"Beacon\", \"Ridge\", \"Arc\", \"Tera\", \"Ion\",\n \"Helix\", \"Onyx\", \"Cobalt\", \"Ember\", \"Cipher\",\n] as const;\n\nexport const TOPICS = [\n \"digital transformation\", \"revenue operations\", \"pipeline velocity\",\n \"data quality\", \"team scaling\", \"go-to-market strategy\",\n \"customer retention\", \"market expansion\", \"product-led growth\",\n \"sales enablement\",\n] as const;\n\nexport const CHALLENGES = [\n \"pipeline visibility\", \"lead conversion\", \"rep productivity\",\n \"forecast accuracy\", \"customer churn\", \"data silos\",\n \"scaling challenges\", \"market positioning\", \"competitive pressure\",\n \"operational efficiency\",\n] as const;\n\nexport const SEQUENCE_NAMES = [\n \"Outbound - Enterprise\",\n \"Outbound - Mid-Market\",\n \"Inbound Follow-up\",\n \"Event Follow-up\",\n \"Re-engagement Campaign\",\n \"Competitive Displacement\",\n \"Expansion Opportunity\",\n \"Champion Change\",\n \"New Exec Alert\",\n \"Renewal Outreach\",\n] as const;\n\nexport const ORG_SIZES = [\"1-50\", \"51-200\", \"201-500\", \"501-1000\", \"1001-5000\", \"5000+\"] as const;\n\nexport const REGIONS = [\"North America\", \"EMEA\", \"APAC\", \"LATAM\"] as const;\n\n/**\n * Generate a realistic company domain from a company name.\n */\nexport function toDomain(companyName: string): string {\n return companyName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\")\n .slice(0, 20) + \".com\";\n}\n\n/**\n * Generate an email address from name parts and domain.\n */\nexport function toEmail(firstName: string, lastName: string, domain: string): string {\n return `${firstName.toLowerCase()}.${lastName.toLowerCase()}@${domain}`;\n}\n","/**\n * Organization factory — generates realistic account data.\n * Distributes enterprise/mid-market/SMB per scenario ratios.\n * Assigns each org to Salesforce or HubSpot as source system.\n */\n\nimport type { SeededRandom } from \"../seed.js\";\nimport type { ScenarioParams, GeneratedOrganization } from \"../types.js\";\nimport type { DemoTaxonomy } from \"../taxonomy-schema.js\";\nimport {\n COMPANY_PREFIXES,\n COMPANY_SUFFIXES,\n INDUSTRIES,\n REGIONS,\n toDomain,\n} from \"../data-pools.js\";\n\ninterface OrganizationFactoryParams {\n rng: SeededRandom;\n scenario: ScenarioParams;\n accountCount: number;\n companyIndustry: string;\n taxonomy?: DemoTaxonomy;\n}\n\nexport function generateOrganizations({\n rng,\n scenario,\n accountCount,\n companyIndustry,\n taxonomy,\n}: OrganizationFactoryParams): GeneratedOrganization[] {\n const orgs: GeneratedOrganization[] = [];\n\n const entRatio = taxonomy?.segment_distribution.enterprise ?? scenario.enterpriseRatio;\n const midRatio = taxonomy?.segment_distribution.mid_market ?? scenario.midMarketRatio;\n const enterpriseCount = Math.round(accountCount * entRatio);\n const midMarketCount = Math.round(accountCount * midRatio);\n const smbCount = accountCount - enterpriseCount - midMarketCount;\n\n const segments: Array<{ segment: \"enterprise\" | \"mid_market\" | \"smb\"; count: number }> = [\n { segment: \"enterprise\", count: enterpriseCount },\n { segment: \"mid_market\", count: midMarketCount },\n { segment: \"smb\", count: smbCount },\n ];\n\n // Use all prefixes, shuffled, to avoid duplicates\n const prefixSource = taxonomy?.company_name_prefixes ?? COMPANY_PREFIXES;\n const suffixSource = taxonomy?.company_name_suffixes ?? COMPANY_SUFFIXES;\n const prefixPool = rng.shuffle([...prefixSource]);\n let prefixIdx = 0;\n\n // Taxonomy-derived region pick: use weightedPick; fall through to uniform REGIONS.\n const regionKeys = taxonomy\n ? (Object.keys(taxonomy.region_weights) as Array<keyof typeof taxonomy.region_weights>)\n : null;\n const regionWeights = taxonomy\n ? regionKeys!.map((k) => taxonomy.region_weights[k])\n : null;\n\n for (const { segment, count } of segments) {\n for (let i = 0; i < count; i++) {\n // Generate unique company name\n const prefix = prefixPool[prefixIdx % prefixPool.length];\n prefixIdx++;\n const suffix = rng.pick(suffixSource);\n const name = `${prefix} ${suffix}`;\n const domain = toDomain(name);\n const localId = rng.uuid();\n const sourceId = `00${rng.uuid().replace(/-/g, \"\").slice(0, 15).toUpperCase()}`;\n\n // Industry: when taxonomy is present, always pick from its narrow pool.\n // Otherwise fall back to the old 30% companyIndustry heuristic.\n const industry = taxonomy\n ? rng.pick(taxonomy.industries)\n : rng.chance(0.3)\n ? companyIndustry\n : rng.pick(INDUSTRIES);\n\n const region = taxonomy\n ? rng.weightedPick(regionKeys as readonly string[], regionWeights as readonly number[])\n : rng.pick(REGIONS);\n const size = getOrgSize(segment, rng);\n const annualRevenue = getAnnualRevenue(segment, rng, taxonomy);\n\n // Source system split: taxonomy-derived probability when available,\n // else the legacy 80/20 Salesforce/HubSpot default.\n const sourceSystem = rng.chance(taxonomy?.salesforce_weight ?? 0.8)\n ? \"salesforce\" as const\n : \"hubspot\" as const;\n\n const rawData = sourceSystem === \"salesforce\"\n ? buildSalesforceRawData(name, domain, industry, size, region, annualRevenue, sourceId)\n : buildHubSpotRawData(name, domain, industry, size, region, annualRevenue, sourceId);\n\n orgs.push({\n localId,\n canonical_name: name,\n canonical_domain: domain,\n source_system: sourceSystem,\n source_id: sourceId,\n raw_data: rawData,\n metadata: {\n industry,\n size,\n region,\n segment,\n annual_revenue: annualRevenue,\n },\n });\n }\n }\n\n return rng.shuffle(orgs);\n}\n\nfunction getOrgSize(segment: string, rng: SeededRandom): string {\n switch (segment) {\n case \"enterprise\":\n return rng.pick([\"1001-5000\", \"5000+\"]);\n case \"mid_market\":\n return rng.pick([\"201-500\", \"501-1000\"]);\n default:\n return rng.pick([\"1-50\", \"51-200\"]);\n }\n}\n\nfunction getAnnualRevenue(segment: string, rng: SeededRandom, taxonomy?: DemoTaxonomy): number {\n // Rough heuristic: annual revenue ≈ 20x ACV for the segment. Better than\n // the hard-coded $1M-$500M ranges for profile-aware operators.\n if (taxonomy) {\n const bandKey = segment === \"enterprise\"\n ? \"enterprise\"\n : segment === \"mid_market\"\n ? \"mid_market\"\n : \"smb\";\n const band = taxonomy.deal_size_bands[bandKey];\n return rng.nextInt(band.min * 20, band.max * 20);\n }\n switch (segment) {\n case \"enterprise\":\n return rng.nextInt(50_000_000, 500_000_000);\n case \"mid_market\":\n return rng.nextInt(10_000_000, 50_000_000);\n default:\n return rng.nextInt(1_000_000, 10_000_000);\n }\n}\n\nfunction buildSalesforceRawData(\n name: string, domain: string, industry: string,\n size: string, region: string, annualRevenue: number, sourceId: string,\n): Record<string, unknown> {\n return {\n Id: sourceId,\n Name: name,\n Website: `https://${domain}`,\n Industry: industry,\n NumberOfEmployees: parseEmployeeCount(size),\n BillingCountry: regionToCountry(region),\n BillingState: \"CA\",\n AnnualRevenue: annualRevenue,\n Type: \"Prospect\",\n OwnerId: \"\",\n CreatedDate: \"\",\n LastModifiedDate: \"\",\n Description: `${name} - ${industry} company`,\n };\n}\n\nfunction buildHubSpotRawData(\n name: string, domain: string, industry: string,\n size: string, region: string, annualRevenue: number, sourceId: string,\n): Record<string, unknown> {\n return {\n \"Company ID\": sourceId,\n \"Company name\": name,\n \"Company Domain Name\": domain,\n Industry: industry,\n \"Number of Employees\": parseEmployeeCount(size),\n Country: regionToCountry(region),\n \"Annual Revenue\": annualRevenue,\n Type: \"PROSPECT\",\n \"Create Date\": \"\",\n \"Last Modified Date\": \"\",\n \"Company owner\": \"\",\n \"Lifecycle Stage\": \"lead\",\n };\n}\n\nfunction parseEmployeeCount(size: string): number {\n const map: Record<string, number> = {\n \"1-50\": 25, \"51-200\": 125, \"201-500\": 350,\n \"501-1000\": 750, \"1001-5000\": 3000, \"5000+\": 10000,\n };\n return map[size] ?? 100;\n}\n\nfunction regionToCountry(region: string): string {\n const map: Record<string, string> = {\n \"North America\": \"United States\",\n \"EMEA\": \"United Kingdom\",\n \"APAC\": \"Australia\",\n \"LATAM\": \"Brazil\",\n };\n return map[region] ?? \"United States\";\n}\n","/**\n * Whimsy name pool — a curated, hand-picked roster of recognizable real\n * figures from SAFE cultural domains (music, sports, film/TV). Used to give\n * generated reps / account owners a little delight instead of \"John Smith\".\n *\n * Mirrors the GOODBYES pattern in src/cli/repl.ts: a flat, audited static\n * list. Names are deliberately NOT AI-generated (hallucination / safety risk)\n * and NOT derived from the company config — this is a purely cosmetic layer\n * that sits on top of the config-driven data \"shape\".\n *\n * Curation rules:\n * - Safe domains only: music, sports, film/TV. NO politics, NO religion.\n * - Real names only (no stage names) so first/last split cleanly for emails.\n * - Single-word last names only — `toEmail` concatenates `first.last`, so a\n * space (e.g. \"Van Halen\") would produce an invalid email. Keep it clean.\n * - Paired as atomic units: \"James Hetfield\" stays together, never mixed into\n * \"James Hammett\".\n */\n\nimport type { SeededRandom } from \"./seed.js\";\n\nexport type WhimsyCategory = \"music\" | \"sports\" | \"film\";\n\nexport interface WhimsyFigure {\n first: string;\n last: string;\n category: WhimsyCategory;\n}\n\nexport const WHIMSY_FIGURES: readonly WhimsyFigure[] = [\n // ── Music (band members, real names — no stage names) ──\n { first: \"James\", last: \"Hetfield\", category: \"music\" },\n { first: \"Lars\", last: \"Ulrich\", category: \"music\" },\n { first: \"Kirk\", last: \"Hammett\", category: \"music\" },\n { first: \"Robert\", last: \"Trujillo\", category: \"music\" },\n { first: \"Myles\", last: \"Kennedy\", category: \"music\" },\n { first: \"Mark\", last: \"Tremonti\", category: \"music\" },\n { first: \"Scott\", last: \"Stapp\", category: \"music\" },\n { first: \"Dave\", last: \"Grohl\", category: \"music\" },\n { first: \"Taylor\", last: \"Hawkins\", category: \"music\" },\n { first: \"Eddie\", last: \"Vedder\", category: \"music\" },\n { first: \"Mike\", last: \"McCready\", category: \"music\" },\n { first: \"Stone\", last: \"Gossard\", category: \"music\" },\n { first: \"Geddy\", last: \"Lee\", category: \"music\" },\n { first: \"Alex\", last: \"Lifeson\", category: \"music\" },\n { first: \"Neil\", last: \"Peart\", category: \"music\" },\n { first: \"Robert\", last: \"Plant\", category: \"music\" },\n { first: \"Jimmy\", last: \"Page\", category: \"music\" },\n { first: \"Brian\", last: \"May\", category: \"music\" },\n { first: \"Roger\", last: \"Taylor\", category: \"music\" },\n { first: \"Adam\", last: \"Jones\", category: \"music\" },\n { first: \"Danny\", last: \"Carey\", category: \"music\" },\n { first: \"Chris\", last: \"Cornell\", category: \"music\" },\n { first: \"Angus\", last: \"Young\", category: \"music\" },\n { first: \"Chad\", last: \"Smith\", category: \"music\" },\n { first: \"Sammy\", last: \"Hagar\", category: \"music\" },\n { first: \"Maynard\", last: \"Keenan\", category: \"music\" },\n { first: \"Thom\", last: \"Yorke\", category: \"music\" },\n { first: \"Tony\", last: \"Iommi\", category: \"music\" },\n { first: \"Billie\", last: \"Armstrong\", category: \"music\" },\n { first: \"Bruce\", last: \"Dickinson\", category: \"music\" },\n { first: \"Stevie\", last: \"Nicks\", category: \"music\" },\n { first: \"Jon\", last: \"Jovi\", category: \"music\" },\n { first: \"Richie\", last: \"Sambora\", category: \"music\" },\n\n // ── Sports (legends, broadly uncontroversial) ──\n { first: \"Michael\", last: \"Jordan\", category: \"sports\" },\n { first: \"Wayne\", last: \"Gretzky\", category: \"sports\" },\n { first: \"Roger\", last: \"Federer\", category: \"sports\" },\n { first: \"Serena\", last: \"Williams\", category: \"sports\" },\n { first: \"Lionel\", last: \"Messi\", category: \"sports\" },\n { first: \"Peyton\", last: \"Manning\", category: \"sports\" },\n { first: \"Derek\", last: \"Jeter\", category: \"sports\" },\n { first: \"Sidney\", last: \"Crosby\", category: \"sports\" },\n { first: \"Mia\", last: \"Hamm\", category: \"sports\" },\n { first: \"Larry\", last: \"Bird\", category: \"sports\" },\n { first: \"Steph\", last: \"Curry\", category: \"sports\" },\n { first: \"Patrick\", last: \"Mahomes\", category: \"sports\" },\n { first: \"Jackie\", last: \"Robinson\", category: \"sports\" },\n { first: \"Bonnie\", last: \"Blair\", category: \"sports\" },\n { first: \"Peggy\", last: \"Fleming\", category: \"sports\" },\n { first: \"Tiger\", last: \"Woods\", category: \"sports\" },\n { first: \"Simone\", last: \"Biles\", category: \"sports\" },\n { first: \"Venus\", last: \"Williams\", category: \"sports\" },\n { first: \"Tom\", last: \"Brady\", category: \"sports\" },\n { first: \"Naomi\", last: \"Osaka\", category: \"sports\" },\n { first: \"Rafael\", last: \"Nadal\", category: \"sports\" },\n\n // ── Film / TV (well-known actors) ──\n { first: \"Tom\", last: \"Hanks\", category: \"film\" },\n { first: \"Meryl\", last: \"Streep\", category: \"film\" },\n { first: \"Denzel\", last: \"Washington\", category: \"film\" },\n { first: \"Harrison\", last: \"Ford\", category: \"film\" },\n { first: \"Sigourney\", last: \"Weaver\", category: \"film\" },\n { first: \"Keanu\", last: \"Reeves\", category: \"film\" },\n { first: \"Morgan\", last: \"Freeman\", category: \"film\" },\n { first: \"Bryan\", last: \"Cranston\", category: \"film\" },\n { first: \"Jeff\", last: \"Goldblum\", category: \"film\" },\n { first: \"Cate\", last: \"Blanchett\", category: \"film\" },\n { first: \"Viola\", last: \"Davis\", category: \"film\" },\n { first: \"Jodie\", last: \"Foster\", category: \"film\" },\n { first: \"Sandra\", last: \"Bullock\", category: \"film\" },\n { first: \"Idris\", last: \"Elba\", category: \"film\" },\n { first: \"Emma\", last: \"Stone\", category: \"film\" },\n { first: \"Steve\", last: \"Carell\", category: \"film\" },\n { first: \"Jennifer\", last: \"Aniston\", category: \"film\" },\n { first: \"Matt\", last: \"Damon\", category: \"film\" },\n { first: \"Julia\", last: \"Roberts\", category: \"film\" },\n { first: \"Leonardo\", last: \"DiCaprio\", category: \"film\" },\n { first: \"Aaron\", last: \"Paul\", category: \"film\" },\n { first: \"Gillian\", last: \"Anderson\", category: \"film\" },\n];\n\n/**\n * A stateful, deterministic, draw-without-replacement cursor over the whimsy\n * pool. Each `next()` returns a unique figure so the same celebrity never\n * shows up twice in one dataset. Returns `null` once the (optionally\n * category-filtered) pool is exhausted, so callers can fall back to the\n * generic name pools for any overflow.\n */\nexport interface FigureDrawer {\n next(): WhimsyFigure | null;\n}\n\nexport function createFigureDrawer(\n rng: SeededRandom,\n categories?: readonly WhimsyCategory[],\n): FigureDrawer {\n const pool = categories && categories.length > 0\n ? WHIMSY_FIGURES.filter((f) => categories.includes(f.category))\n : [...WHIMSY_FIGURES];\n const shuffled = rng.shuffle([...pool]);\n let idx = 0;\n\n return {\n next(): WhimsyFigure | null {\n if (idx >= shuffled.length) return null;\n return shuffled[idx++]!;\n },\n };\n}\n","/**\n * People factory — generates reps and contacts.\n * Some contacts are HubSpot-only (for Drop Rate detection).\n * Generates lifecycle stages, lead scores, realistic email addresses.\n */\n\nimport type { SeededRandom } from \"../seed.js\";\nimport type { ScenarioParams, GeneratedOrganization, GeneratedPerson } from \"../types.js\";\nimport type { DemoTaxonomy } from \"../taxonomy-schema.js\";\nimport {\n FIRST_NAMES,\n LAST_NAMES,\n JOB_TITLES_CONTACT,\n JOB_TITLES_REP,\n LIFECYCLE_STAGES,\n toEmail,\n} from \"../data-pools.js\";\nimport { createFigureDrawer } from \"../whimsy-names.js\";\n\ninterface PeopleFactoryParams {\n rng: SeededRandom;\n scenario: ScenarioParams;\n organizations: GeneratedOrganization[];\n repCount: number;\n contactsPerAccount: number;\n companyName: string;\n taxonomy?: DemoTaxonomy;\n /** When true (default), reps are named after recognizable cultural figures. */\n whimsy?: boolean;\n}\n\nexport function generatePeople({\n rng,\n scenario,\n organizations,\n repCount,\n contactsPerAccount,\n companyName,\n taxonomy,\n whimsy = true,\n}: PeopleFactoryParams): GeneratedPerson[] {\n const people: GeneratedPerson[] = [];\n\n // Whimsy layer: reps / account owners get drawn from a curated roster of\n // real figures (music, sports, film) without repeats. Purely cosmetic —\n // titles, segments, and economics stay config-driven. Falls back to the\n // generic name pools when disabled or once the roster is exhausted.\n const figures = whimsy ? createFigureDrawer(rng) : null;\n\n // Generate reps (internal sales team)\n const repDomain = companyName.toLowerCase().replace(/[^a-z0-9]+/g, \"\") + \".com\";\n for (let i = 0; i < repCount; i++) {\n const figure = figures?.next() ?? null;\n const firstName = figure?.first ?? rng.pick(FIRST_NAMES);\n const lastName = figure?.last ?? rng.pick(LAST_NAMES);\n const title = rng.pick(taxonomy?.rep_titles ?? JOB_TITLES_REP);\n const email = toEmail(firstName, lastName, repDomain);\n const sourceId = `005${rng.uuid().replace(/-/g, \"\").slice(0, 15).toUpperCase()}`;\n\n people.push({\n localId: rng.uuid(),\n canonical_name: `${firstName} ${lastName}`,\n canonical_email: email,\n organizationLocalId: null,\n source_system: \"salesforce\",\n source_id: sourceId,\n raw_data: {\n Id: sourceId,\n FirstName: firstName,\n LastName: lastName,\n Email: email,\n Title: title,\n Name: `${firstName} ${lastName}`,\n IsActive: true,\n UserType: \"Standard\",\n Profile: \"Sales User\",\n },\n metadata: {\n title,\n is_rep: true,\n rep_index: i,\n },\n });\n }\n\n // Generate contacts for each organization\n for (const org of organizations) {\n const numContacts = rng.nextInt(\n Math.max(1, contactsPerAccount - 1),\n contactsPerAccount + 2,\n );\n\n for (let i = 0; i < numContacts; i++) {\n const firstName = rng.pick(FIRST_NAMES);\n const lastName = rng.pick(LAST_NAMES);\n const email = toEmail(firstName, lastName, org.canonical_domain);\n // Segment-appropriate title when taxonomy is present — the single\n // biggest realism win: a mid-market fintech account closes with a\n // \"Head of People Ops\", not a random \"Director of Purchasing\".\n const title = taxonomy\n ? rng.pick(taxonomy.contact_titles_by_segment[org.metadata.segment])\n : rng.pick(JOB_TITLES_CONTACT);\n\n // Determine if this contact is HubSpot-only (for Drop Rate)\n const isHubSpotOnly = rng.chance(scenario.mqlDropRatio);\n const sourceSystem = isHubSpotOnly ? \"hubspot\" as const : org.source_system;\n\n const sourceId = sourceSystem === \"salesforce\"\n ? `003${rng.uuid().replace(/-/g, \"\").slice(0, 15).toUpperCase()}`\n : rng.uuid().replace(/-/g, \"\").slice(0, 12);\n\n // Lifecycle stage — HubSpot-only contacts often stuck at MQL\n const lifecycleStage = isHubSpotOnly\n ? \"marketingqualifiedlead\"\n : rng.pick(LIFECYCLE_STAGES);\n\n const leadScore = rng.nextInt(10, 100);\n\n // Determine staleness based on segment\n const segmentStaleRatio = org.metadata.segment === \"enterprise\"\n ? scenario.staleContactRatioEnterprise\n : org.metadata.segment === \"smb\"\n ? scenario.staleContactRatioSmb\n : scenario.staleContactRatio;\n const isStale = rng.chance(segmentStaleRatio);\n\n const rawData = sourceSystem === \"salesforce\"\n ? buildSalesforceContactRaw(firstName, lastName, email, title, sourceId, org)\n : buildHubSpotContactRaw(firstName, lastName, email, title, sourceId, lifecycleStage, leadScore, org);\n\n people.push({\n localId: rng.uuid(),\n canonical_name: `${firstName} ${lastName}`,\n canonical_email: email,\n organizationLocalId: org.localId,\n source_system: sourceSystem,\n source_id: sourceId,\n raw_data: rawData,\n metadata: {\n title,\n phone: `+1${rng.nextInt(200, 999)}${rng.nextInt(100, 999)}${rng.nextInt(1000, 9999)}`,\n lifecycle_stage: lifecycleStage,\n lead_score: leadScore,\n is_rep: false,\n is_stale: isStale,\n is_hubspot_only: isHubSpotOnly,\n },\n });\n }\n }\n\n return people;\n}\n\nfunction buildSalesforceContactRaw(\n firstName: string, lastName: string, email: string,\n title: string, sourceId: string, org: GeneratedOrganization,\n): Record<string, unknown> {\n return {\n Id: sourceId,\n FirstName: firstName,\n LastName: lastName,\n Email: email,\n Title: title,\n Name: `${firstName} ${lastName}`,\n AccountId: org.source_id,\n Account: { Name: org.canonical_name },\n Phone: \"\",\n MailingCity: \"\",\n MailingState: \"CA\",\n MailingCountry: \"US\",\n CreatedDate: \"\",\n LastModifiedDate: \"\",\n OwnerId: \"\",\n };\n}\n\nfunction buildHubSpotContactRaw(\n firstName: string, lastName: string, email: string,\n title: string, sourceId: string, lifecycleStage: string,\n leadScore: number, org: GeneratedOrganization,\n): Record<string, unknown> {\n return {\n \"Contact ID\": sourceId,\n \"First Name\": firstName,\n \"Last Name\": lastName,\n Email: email,\n \"Job Title\": title,\n \"Associated Company\": org.canonical_name,\n \"Associated Company ID\": org.source_id,\n \"Lifecycle Stage\": lifecycleStage,\n \"HubSpot Score\": leadScore,\n \"Create Date\": \"\",\n \"Last Modified Date\": \"\",\n \"Contact owner\": \"\",\n \"Lead Status\": lifecycleStage === \"marketingqualifiedlead\" ? \"New\" : \"Open\",\n };\n}\n","/**\n * Opportunity factory — generates deals with stage histories, amounts, close dates.\n * Seeds: stale pipeline, stuck deals, single-threaded deals, lone wolf patterns.\n */\n\nimport type { SeededRandom } from \"../seed.js\";\nimport type {\n ScenarioParams,\n GeneratedOrganization,\n GeneratedPerson,\n GeneratedOpportunity,\n StageHistoryEntry,\n} from \"../types.js\";\nimport type { DemoTaxonomy } from \"../taxonomy-schema.js\";\nimport { DEAL_VERBS, DEAL_MODIFIERS, STAGES_SALESFORCE } from \"../data-pools.js\";\n\ninterface OpportunityFactoryParams {\n rng: SeededRandom;\n scenario: ScenarioParams;\n organizations: GeneratedOrganization[];\n people: GeneratedPerson[];\n opportunityCount: number;\n activityMonths: number;\n taxonomy?: DemoTaxonomy;\n}\n\nexport function generateOpportunities({\n rng,\n scenario,\n organizations,\n people,\n opportunityCount,\n activityMonths,\n taxonomy,\n}: OpportunityFactoryParams): GeneratedOpportunity[] {\n const opportunities: GeneratedOpportunity[] = [];\n\n const reps = people.filter((p) => p.metadata.is_rep);\n if (reps.length === 0) return opportunities;\n\n // Filter orgs that have contacts (potential deals)\n const orgsWithContacts = organizations.filter((org) =>\n people.some((p) => p.organizationLocalId === org.localId && !p.metadata.is_rep),\n );\n if (orgsWithContacts.length === 0) return opportunities;\n\n const now = new Date();\n const startDate = new Date(now);\n startDate.setMonth(startDate.getMonth() - activityMonths);\n\n for (let i = 0; i < opportunityCount; i++) {\n const org = rng.pick(orgsWithContacts);\n const segment = org.metadata.segment;\n\n // Assign rep — lone wolf scenario overrides\n let rep: GeneratedPerson;\n if (\n scenario.loneWolfRepIndex !== null &&\n rng.chance(0.4) &&\n reps.length > scenario.loneWolfRepIndex\n ) {\n rep = reps[scenario.loneWolfRepIndex]!;\n } else {\n rep = rng.pick(reps);\n }\n\n // Deal amount based on org segment (taxonomy-aware if available)\n const amount = getDealAmount(segment, rng, taxonomy);\n\n // Generate deal name\n const verb = rng.pick(taxonomy?.deal_verbs ?? DEAL_VERBS);\n const modifier = rng.pick(taxonomy?.deal_modifiers ?? DEAL_MODIFIERS);\n const dealName = `${org.canonical_name} - ${modifier} ${verb}`;\n\n // Determine deal fate\n const isPastCloseDate = rng.chance(scenario.pastCloseDateRatio);\n const isStuck = rng.chance(scenario.stuckDealRatio);\n const isClosed = !isPastCloseDate && !isStuck && rng.chance(0.35);\n const isWon = isClosed && rng.chance(0.45);\n\n // Determine single-threading\n const repIndex = reps.indexOf(rep);\n const isSingleThreaded =\n scenario.loneWolfRepIndex !== null && repIndex === scenario.loneWolfRepIndex\n ? rng.chance(scenario.loneWolfSingleThreadRatio)\n : segment === \"enterprise\"\n ? rng.chance(scenario.singleThreadRatio * 1.5)\n : rng.chance(scenario.singleThreadRatio);\n\n // Build stage history\n const createdAt = rng.date(startDate, new Date(now.getTime() - 30 * 86400000));\n const { stages, currentStage, closeDate } = buildStageHistory({\n rng,\n scenario,\n segment,\n createdAt,\n now,\n isPastCloseDate,\n isStuck,\n isClosed,\n isWon,\n taxonomy,\n });\n\n const sourceId = `006${rng.uuid().replace(/-/g, \"\").slice(0, 15).toUpperCase()}`;\n\n const dealType = segment === \"enterprise\" && !isClosed\n ? \"New Business\"\n : segment === \"enterprise\"\n ? (rng.chance(0.25) ? \"Expansion\" : \"New Business\")\n : rng.pick([\"New Business\", \"Expansion\"]);\n\n const rawData = buildSalesforceOppRaw({\n sourceId,\n dealName,\n amount,\n currentStage,\n closeDate,\n org,\n rep,\n createdAt,\n dealType: isWon ? dealType : \"New Business\",\n });\n\n opportunities.push({\n localId: rng.uuid(),\n canonical_name: dealName,\n organizationLocalId: org.localId,\n ownerLocalId: rep.localId,\n current_stage: currentStage,\n amount,\n close_date: closeDate,\n source_system: \"salesforce\",\n source_id: sourceId,\n raw_data: rawData,\n metadata: {\n stage_history: stages,\n is_stale: isPastCloseDate,\n is_stuck: isStuck,\n is_single_threaded: isSingleThreaded,\n deal_type: isWon ? dealType : \"New Business\",\n created_at: createdAt.toISOString(),\n },\n });\n }\n\n return opportunities;\n}\n\nfunction getDealAmount(segment: string, rng: SeededRandom, taxonomy?: DemoTaxonomy): number {\n if (taxonomy) {\n const bandKey = segment === \"enterprise\"\n ? \"enterprise\"\n : segment === \"mid_market\"\n ? \"mid_market\"\n : \"smb\";\n const band = taxonomy.deal_size_bands[bandKey];\n return rng.nextInt(band.min, band.max);\n }\n switch (segment) {\n case \"enterprise\":\n return rng.nextInt(75_000, 500_000);\n case \"mid_market\":\n return rng.nextInt(25_000, 100_000);\n default:\n return rng.nextInt(5_000, 30_000);\n }\n}\n\ninterface StageHistoryParams {\n rng: SeededRandom;\n scenario: ScenarioParams;\n segment: string;\n createdAt: Date;\n now: Date;\n isPastCloseDate: boolean;\n isStuck: boolean;\n isClosed: boolean;\n isWon: boolean;\n taxonomy?: DemoTaxonomy;\n}\n\nfunction buildStageHistory({\n rng,\n scenario,\n segment,\n createdAt,\n now,\n isPastCloseDate,\n isStuck,\n isClosed,\n isWon,\n taxonomy,\n}: StageHistoryParams): {\n stages: StageHistoryEntry[];\n currentStage: string;\n closeDate: string;\n} {\n const stages: StageHistoryEntry[] = [];\n const avgDays = taxonomy\n ? segment === \"enterprise\"\n ? taxonomy.cycle_days_by_segment.enterprise\n : segment === \"smb\"\n ? taxonomy.cycle_days_by_segment.smb\n : taxonomy.cycle_days_by_segment.mid_market\n : segment === \"enterprise\"\n ? scenario.avgDaysPerStageEnterprise\n : segment === \"smb\"\n ? scenario.avgDaysPerStageSmb\n : (scenario.avgDaysPerStageEnterprise + scenario.avgDaysPerStageSmb) / 2;\n\n // Open stages (excluding Closed Won/Lost)\n const openStages = STAGES_SALESFORCE.slice(0, 5);\n let currentDate = new Date(createdAt);\n let stageIdx = 0;\n\n // How far through the pipeline does this deal get?\n let maxStageIdx: number;\n if (isClosed) {\n maxStageIdx = openStages.length; // Goes through all open stages\n } else if (isStuck) {\n maxStageIdx = rng.nextInt(2, 4); // Stuck in mid-to-late stages\n } else {\n maxStageIdx = rng.nextInt(1, openStages.length - 1);\n }\n\n for (stageIdx = 0; stageIdx <= maxStageIdx && stageIdx < openStages.length; stageIdx++) {\n const stage = openStages[stageIdx]!;\n const daysInStage = isStuck && stageIdx === maxStageIdx\n ? scenario.stuckInNegotiationDays + rng.nextInt(0, 30)\n : Math.max(1, Math.round(avgDays + rng.nextInt(-5, 10)));\n\n stages.push({\n stage,\n entered_at: currentDate.toISOString(),\n days_in_stage: daysInStage,\n });\n\n currentDate = new Date(currentDate.getTime() + daysInStage * 86400000);\n }\n\n // Determine current stage\n let currentStage: string;\n if (isClosed) {\n currentStage = isWon ? \"Closed Won\" : \"Closed Lost\";\n stages.push({\n stage: currentStage,\n entered_at: currentDate.toISOString(),\n days_in_stage: 0,\n });\n } else {\n currentStage = stages[stages.length - 1]!.stage;\n }\n\n // Close date\n let closeDate: string;\n if (isClosed) {\n closeDate = currentDate.toISOString().slice(0, 10);\n } else if (isPastCloseDate) {\n // Close date in the past\n const daysAgo = rng.nextInt(15, 90);\n const pastDate = new Date(now.getTime() - daysAgo * 86400000);\n closeDate = pastDate.toISOString().slice(0, 10);\n } else {\n // Close date in the future\n const daysOut = rng.nextInt(14, 120);\n const futureDate = new Date(now.getTime() + daysOut * 86400000);\n closeDate = futureDate.toISOString().slice(0, 10);\n }\n\n return { stages, currentStage, closeDate };\n}\n\ninterface OppRawParams {\n sourceId: string;\n dealName: string;\n amount: number;\n currentStage: string;\n closeDate: string;\n org: GeneratedOrganization;\n rep: GeneratedPerson;\n createdAt: Date;\n dealType: string;\n}\n\nfunction buildSalesforceOppRaw({\n sourceId, dealName, amount, currentStage, closeDate, org, rep, createdAt, dealType,\n}: OppRawParams): Record<string, unknown> {\n return {\n Id: sourceId,\n Name: dealName,\n Amount: amount,\n StageName: currentStage,\n CloseDate: closeDate,\n AccountId: org.source_id,\n \"Account.Name\": org.canonical_name,\n OwnerId: rep.source_id,\n \"Owner.Name\": rep.canonical_name,\n Probability: stageToProbability(currentStage),\n Type: dealType,\n LeadSource: \"Outbound\",\n ForecastCategory: stageToForecast(currentStage),\n IsClosed: currentStage.startsWith(\"Closed\"),\n IsWon: currentStage === \"Closed Won\",\n CreatedDate: createdAt.toISOString(),\n LastModifiedDate: new Date().toISOString(),\n };\n}\n\nfunction stageToProbability(stage: string): number {\n const map: Record<string, number> = {\n \"Prospecting\": 10, \"Qualification\": 20, \"Needs Analysis\": 40,\n \"Value Proposition\": 60, \"Negotiation\": 80,\n \"Closed Won\": 100, \"Closed Lost\": 0,\n };\n return map[stage] ?? 50;\n}\n\nfunction stageToForecast(stage: string): string {\n const map: Record<string, string> = {\n \"Prospecting\": \"Pipeline\", \"Qualification\": \"Pipeline\",\n \"Needs Analysis\": \"Best Case\", \"Value Proposition\": \"Commit\",\n \"Negotiation\": \"Commit\", \"Closed Won\": \"Closed\", \"Closed Lost\": \"Omitted\",\n };\n return map[stage] ?? \"Pipeline\";\n}\n","/**\n * Activity factory — generates emails, calls, meetings, form fills across source systems.\n * Seeds: freshness gaps, noise activities, busy bee volume.\n * Also generates Outreach campaigns (sequences).\n */\n\nimport type { SeededRandom } from \"../seed.js\";\nimport type {\n ScenarioParams,\n GeneratedOrganization,\n GeneratedPerson,\n GeneratedOpportunity,\n GeneratedActivity,\n GeneratedCampaign,\n} from \"../types.js\";\nimport type { ActivityType } from \"../../types.js\";\nimport type { DemoTaxonomy } from \"../taxonomy-schema.js\";\nimport {\n EMAIL_SUBJECTS_OUTREACH,\n CALL_DISPOSITIONS,\n MEETING_TYPES,\n SEQUENCE_NAMES,\n TOPICS,\n CHALLENGES,\n} from \"../data-pools.js\";\n\ninterface ActivityFactoryParams {\n rng: SeededRandom;\n scenario: ScenarioParams;\n organizations: GeneratedOrganization[];\n people: GeneratedPerson[];\n opportunities: GeneratedOpportunity[];\n activityMonths: number;\n taxonomy?: DemoTaxonomy;\n}\n\ninterface ActivityFactoryResult {\n activities: GeneratedActivity[];\n campaigns: GeneratedCampaign[];\n}\n\nexport function generateActivities({\n rng,\n scenario,\n organizations,\n people,\n opportunities,\n activityMonths,\n taxonomy,\n}: ActivityFactoryParams): ActivityFactoryResult {\n const activities: GeneratedActivity[] = [];\n const campaigns: GeneratedCampaign[] = [];\n\n const now = new Date();\n const startDate = new Date(now);\n startDate.setMonth(startDate.getMonth() - activityMonths);\n\n const contacts = people.filter((p) => !p.metadata.is_rep);\n const reps = people.filter((p) => p.metadata.is_rep);\n\n if (contacts.length === 0 || reps.length === 0) {\n return { activities, campaigns };\n }\n\n // Generate Outreach campaigns first\n const campaignCount = Math.min(SEQUENCE_NAMES.length, rng.nextInt(4, 8));\n for (let i = 0; i < campaignCount; i++) {\n const sourceId = rng.uuid();\n const sequenceName = SEQUENCE_NAMES[i]!;\n campaigns.push({\n localId: rng.uuid(),\n canonical_name: sequenceName,\n campaign_type: \"email_sequence\",\n source_system: \"outreach\",\n source_id: sourceId,\n raw_data: {\n id: sourceId,\n name: sequenceName,\n sequence_type: \"automatic\",\n enabled: true,\n step_count: rng.nextInt(3, 7),\n created_at: rng.date(startDate, now).toISOString(),\n },\n metadata: {\n status: \"active\",\n step_count: rng.nextInt(3, 7),\n enrolled_count: 0,\n },\n });\n }\n\n // Calculate target activities per contact\n const baseActivitiesPerContact = Math.round(activityMonths * 2.5);\n const targetPerContact = Math.round(\n baseActivitiesPerContact * scenario.activityVolumeMultiplier,\n );\n\n // Generate activities for contacts with pipeline (signal activities)\n const contactsWithPipeline = new Set<string>();\n for (const opp of opportunities) {\n const orgContacts = contacts.filter(\n (c) => c.organizationLocalId === opp.organizationLocalId,\n );\n for (const c of orgContacts) {\n contactsWithPipeline.add(c.localId);\n }\n }\n\n for (const contact of contacts) {\n const hasPipeline = contactsWithPipeline.has(contact.localId);\n const isStale = contact.metadata.is_stale as boolean;\n const isHubSpotOnly = contact.metadata.is_hubspot_only as boolean;\n\n // HubSpot-only contacts that were supposed to be handed off but weren't\n if (isHubSpotOnly && rng.chance(scenario.qualifiedNoOutreachRatio)) {\n // Only HubSpot marketing activities, no sales activities\n const numActivities = rng.nextInt(2, 5);\n for (let i = 0; i < numActivities; i++) {\n activities.push(\n generateHubSpotMarketingActivity(rng, contact, startDate, now),\n );\n }\n continue;\n }\n\n // Determine how many activities this contact gets\n let numActivities: number;\n if (isStale) {\n // Stale contacts: all activities happened before the freshness gap\n numActivities = rng.nextInt(1, 3);\n } else if (!hasPipeline && rng.chance(scenario.noiseActivityRatio)) {\n // Noise activities: aimed at contacts without pipeline\n numActivities = Math.round(targetPerContact * rng.nextFloat(0.5, 1.5));\n } else {\n numActivities = rng.nextInt(\n Math.max(1, Math.round(targetPerContact * 0.5)),\n Math.round(targetPerContact * 1.5),\n );\n }\n\n // Find associated opportunity (if any)\n const orgOpps = opportunities.filter(\n (o) => o.organizationLocalId === contact.organizationLocalId,\n );\n const assocOpp = orgOpps.length > 0 ? rng.pick(orgOpps) : null;\n\n // Determine date range for this contact's activities\n const activityEnd = isStale\n ? new Date(now.getTime() - scenario.freshnessGapDays * 86400000)\n : now;\n\n for (let i = 0; i < numActivities; i++) {\n const actDate = rng.date(startDate, activityEnd);\n const actType = pickActivityType(rng, contact.source_system);\n const sourceSystem = pickSourceSystem(rng, actType, contact.source_system);\n\n const isNoise = !hasPipeline;\n\n activities.push(\n buildActivity({\n rng,\n type: actType,\n date: actDate,\n contact,\n opp: assocOpp,\n sourceSystem,\n isNoise,\n campaigns,\n taxonomy,\n }),\n );\n }\n }\n\n // Update campaign enrolled counts\n for (const campaign of campaigns) {\n campaign.metadata.enrolled_count = activities.filter(\n (a) =>\n a.source_system === \"outreach\" &&\n a.raw_data[\"sequence_id\"] === campaign.source_id,\n ).length;\n }\n\n return { activities, campaigns };\n}\n\nfunction pickActivityType(rng: SeededRandom, sourceSystem: string): ActivityType {\n if (sourceSystem === \"hubspot\") {\n return rng.weightedPick(\n [\"email\", \"form_fill\", \"content_view\", \"meeting\"] as ActivityType[],\n [4, 3, 2, 1],\n );\n }\n return rng.weightedPick(\n [\"email\", \"call\", \"meeting\"] as ActivityType[],\n [5, 3, 2],\n );\n}\n\nfunction pickSourceSystem(\n rng: SeededRandom,\n actType: ActivityType,\n contactSource: string,\n): \"salesforce\" | \"hubspot\" | \"outreach\" {\n if (actType === \"form_fill\" || actType === \"content_view\") return \"hubspot\";\n if (contactSource === \"hubspot\" && rng.chance(0.6)) return \"hubspot\";\n if (actType === \"email\" && rng.chance(0.4)) return \"outreach\";\n return rng.chance(0.7) ? \"salesforce\" : \"hubspot\";\n}\n\nfunction generateHubSpotMarketingActivity(\n rng: SeededRandom,\n contact: GeneratedPerson,\n startDate: Date,\n endDate: Date,\n): GeneratedActivity {\n const actType = rng.pick([\"form_fill\", \"content_view\", \"email\"] as ActivityType[]);\n const date = rng.date(startDate, endDate);\n const sourceId = rng.uuid();\n\n return {\n localId: rng.uuid(),\n activity_type: actType,\n occurred_at: date.toISOString(),\n personLocalId: contact.localId,\n organizationLocalId: contact.organizationLocalId,\n opportunityLocalId: null,\n source_system: \"hubspot\",\n source_id: sourceId,\n raw_data: {\n \"Engagement ID\": sourceId,\n Type: actType === \"form_fill\" ? \"FORM_SUBMISSION\" : actType === \"content_view\" ? \"PAGE_VIEW\" : \"EMAIL\",\n \"Contact ID\": contact.source_id,\n Timestamp: date.getTime(),\n \"Created At\": date.toISOString(),\n Title: actType === \"form_fill\"\n ? \"Downloaded: GTM Strategy Guide\"\n : actType === \"content_view\"\n ? \"Viewed: Pricing Page\"\n : \"Marketing Email: Monthly Newsletter\",\n },\n metadata: {\n subject: actType === \"email\" ? \"Marketing Email\" : undefined,\n direction: \"inbound\" as const,\n is_noise: false,\n },\n };\n}\n\ninterface BuildActivityParams {\n rng: SeededRandom;\n type: ActivityType;\n date: Date;\n contact: GeneratedPerson;\n opp: GeneratedOpportunity | null;\n sourceSystem: \"salesforce\" | \"hubspot\" | \"outreach\";\n isNoise: boolean;\n campaigns: GeneratedCampaign[];\n taxonomy?: DemoTaxonomy;\n}\n\nfunction buildActivity({\n rng,\n type,\n date,\n contact,\n opp,\n sourceSystem,\n isNoise,\n campaigns,\n taxonomy,\n}: BuildActivityParams): GeneratedActivity {\n const sourceId = rng.uuid();\n const topic = rng.pick(taxonomy?.topics ?? TOPICS);\n const challenge = rng.pick(taxonomy?.challenges ?? CHALLENGES);\n\n let rawData: Record<string, unknown>;\n let metadata: GeneratedActivity[\"metadata\"];\n\n switch (sourceSystem) {\n case \"salesforce\":\n rawData = buildSalesforceTaskRaw(rng, type, date, contact, opp, sourceId);\n metadata = {\n subject: rawData[\"Subject\"] as string,\n direction: rng.pick([\"inbound\", \"outbound\"] as const),\n duration_minutes: type === \"call\" ? rng.nextInt(5, 45) : type === \"meeting\" ? rng.nextInt(15, 60) : undefined,\n outcome: type === \"call\" ? rng.pick(CALL_DISPOSITIONS) : undefined,\n is_noise: isNoise,\n };\n break;\n\n case \"hubspot\":\n rawData = buildHubSpotEngagementRaw(rng, type, date, contact, sourceId, topic);\n metadata = {\n subject: rawData[\"Title\"] as string,\n direction: type === \"form_fill\" || type === \"content_view\" ? \"inbound\" as const : rng.pick([\"inbound\", \"outbound\"] as const),\n duration_minutes: type === \"meeting\" ? rng.nextInt(15, 60) : undefined,\n is_noise: isNoise,\n };\n break;\n\n case \"outreach\": {\n const campaign = campaigns.length > 0 ? rng.pick(campaigns) : null;\n rawData = buildOutreachActivityRaw(rng, type, date, contact, sourceId, campaign, topic, challenge);\n metadata = {\n subject: rawData[\"subject\"] as string | undefined,\n direction: \"outbound\" as const,\n duration_minutes: type === \"call\" ? rng.nextInt(3, 30) : undefined,\n outcome: type === \"call\" ? rng.pick(CALL_DISPOSITIONS) : undefined,\n is_noise: isNoise,\n };\n break;\n }\n }\n\n return {\n localId: rng.uuid(),\n activity_type: type,\n occurred_at: date.toISOString(),\n personLocalId: contact.localId,\n organizationLocalId: contact.organizationLocalId,\n opportunityLocalId: opp?.localId ?? null,\n source_system: sourceSystem,\n source_id: sourceId,\n raw_data: rawData,\n metadata,\n };\n}\n\nfunction buildSalesforceTaskRaw(\n rng: SeededRandom, type: ActivityType, date: Date,\n contact: GeneratedPerson, opp: GeneratedOpportunity | null, sourceId: string,\n): Record<string, unknown> {\n const subject = type === \"call\"\n ? `Call with ${contact.canonical_name}`\n : type === \"meeting\"\n ? `${rng.pick(MEETING_TYPES)} - ${contact.canonical_name}`\n : `Email: Follow up with ${contact.canonical_name}`;\n\n return {\n Id: sourceId,\n Subject: subject,\n ActivityDate: date.toISOString().split(\"T\")[0],\n Status: \"Completed\",\n Priority: \"Normal\",\n TaskSubtype: type === \"call\" ? \"Call\" : type === \"meeting\" ? \"Event\" : \"Email\",\n WhoId: contact.source_id,\n WhatId: opp?.source_id ?? \"\",\n \"Who.Name\": contact.canonical_name,\n \"What.Name\": opp?.canonical_name ?? \"\",\n OwnerId: \"\",\n CreatedDate: date.toISOString(),\n LastModifiedDate: date.toISOString(),\n Description: `${type} activity with ${contact.canonical_name}`,\n CallDurationInSeconds: type === \"call\" ? rng.nextInt(60, 2700) : null,\n CallDisposition: type === \"call\" ? rng.pick(CALL_DISPOSITIONS) : null,\n };\n}\n\nfunction buildHubSpotEngagementRaw(\n rng: SeededRandom, type: ActivityType, date: Date,\n contact: GeneratedPerson, sourceId: string, topic: string,\n): Record<string, unknown> {\n const typeMap: Record<string, string> = {\n email: \"EMAIL\",\n call: \"CALL\",\n meeting: \"MEETING\",\n form_fill: \"FORM_SUBMISSION\",\n content_view: \"PAGE_VIEW\",\n custom: \"NOTE\",\n };\n\n const title = type === \"email\"\n ? `Email: ${topic}`\n : type === \"call\"\n ? `Call: ${contact.canonical_name}`\n : type === \"meeting\"\n ? `${rng.pick(MEETING_TYPES)}`\n : type === \"form_fill\"\n ? `Form: Downloaded ${topic} guide`\n : `Viewed: ${topic} page`;\n\n return {\n \"Engagement ID\": sourceId,\n Type: typeMap[type] ?? \"NOTE\",\n \"Contact ID\": contact.source_id,\n Timestamp: date.getTime(),\n \"Created At\": date.toISOString(),\n Title: title,\n Body: type === \"email\" ? `Discussion about ${topic}` : undefined,\n \"Duration (ms)\": type === \"call\" ? rng.nextInt(60000, 2700000) : type === \"meeting\" ? rng.nextInt(900000, 3600000) : undefined,\n Disposition: type === \"call\" ? rng.pick(CALL_DISPOSITIONS) : undefined,\n \"Meeting Outcome\": type === \"meeting\" ? \"COMPLETED\" : undefined,\n };\n}\n\nfunction buildOutreachActivityRaw(\n rng: SeededRandom, type: ActivityType, date: Date,\n contact: GeneratedPerson, sourceId: string,\n campaign: GeneratedCampaign | null,\n topic: string, challenge: string,\n): Record<string, unknown> {\n const subjectTemplate = rng.pick(EMAIL_SUBJECTS_OUTREACH);\n const subject = subjectTemplate\n .replace(\"{company}\", contact.canonical_name.split(\" \")[0] ?? contact.canonical_name)\n .replace(\"{rep}\", \"\")\n .replace(\"{contact}\", contact.canonical_name)\n .replace(\"{industry}\", topic)\n .replace(\"{deal}\", \"our partnership\")\n .replace(\"{topic}\", topic)\n .replace(\"{challenge}\", challenge);\n\n return {\n id: sourceId,\n type: type === \"call\" ? \"call\" : \"email\",\n direction: \"outbound\",\n subject,\n created_at: date.toISOString(),\n updated_at: date.toISOString(),\n prospect_id: contact.source_id,\n prospect_name: contact.canonical_name,\n prospect_email: contact.canonical_email,\n sequence_id: campaign?.source_id ?? null,\n sequence_name: campaign?.canonical_name ?? null,\n step_number: campaign ? rng.nextInt(1, campaign.metadata.step_count) : null,\n status: rng.pick([\"delivered\", \"opened\", \"replied\", \"bounced\"]),\n opened_at: rng.chance(0.6) ? new Date(date.getTime() + rng.nextInt(3600, 86400) * 1000).toISOString() : null,\n replied_at: rng.chance(0.15) ? new Date(date.getTime() + rng.nextInt(7200, 172800) * 1000).toISOString() : null,\n call_duration: type === \"call\" ? rng.nextInt(30, 1800) : null,\n call_disposition: type === \"call\" ? rng.pick(CALL_DISPOSITIONS) : null,\n };\n}\n","/**\n * SaaS history enrichment — layers realistic revenue motion on top of scenario data.\n * Adds closed-won history spread over 18+ months, expansion, churn, contraction,\n * and monthly revenue_events so metrics analysis is meaningful on demo data.\n */\n\nimport type { SeededRandom } from \"../seed.js\";\nimport type {\n GeneratedDataset,\n GeneratedOpportunity,\n GeneratedPerson,\n GeneratedOrganization,\n GeneratedRevenueEvent,\n StageHistoryEntry,\n} from \"../types.js\";\nimport type { DemoTaxonomy } from \"../taxonomy-schema.js\";\nimport { DEAL_MODIFIERS, DEAL_VERBS, STAGES_SALESFORCE } from \"../data-pools.js\";\n\ninterface EnrichmentParams {\n rng: SeededRandom;\n organizations: GeneratedOrganization[];\n people: GeneratedPerson[];\n existingOpportunities: GeneratedOpportunity[];\n historyMonths: number;\n taxonomy?: DemoTaxonomy;\n}\n\ninterface EnrichmentResult {\n opportunities: GeneratedOpportunity[];\n revenueEvents: GeneratedRevenueEvent[];\n}\n\nexport function enrichSaasHistory({\n rng,\n organizations,\n people,\n existingOpportunities,\n historyMonths,\n taxonomy,\n}: EnrichmentParams): EnrichmentResult {\n const reps = people.filter((p) => p.metadata.is_rep);\n if (reps.length === 0) return { opportunities: [], revenueEvents: [] };\n\n const orgsWithContacts = organizations.filter((org) =>\n people.some((p) => p.organizationLocalId === org.localId && !p.metadata.is_rep),\n );\n if (orgsWithContacts.length === 0) return { opportunities: [], revenueEvents: [] };\n\n const usedOrgIds = new Set(existingOpportunities.map((o) => o.organizationLocalId));\n const availableOrgs = rng.shuffle(\n orgsWithContacts.filter((o) => !usedOrgIds.has(o.localId) || rng.chance(0.3)),\n );\n\n const now = new Date();\n const opportunities: GeneratedOpportunity[] = [];\n const revenueEvents: GeneratedRevenueEvent[] = [];\n\n // ── 1. Steady new-logo wins across history (3–4 per month) ──\n const newLogoMonths = Math.max(historyMonths, 18);\n const newLogoOrgs = availableOrgs.slice(0, Math.min(60, availableOrgs.length));\n let orgIdx = 0;\n\n for (let m = newLogoMonths; m >= 1; m--) {\n const dealsThisMonth = rng.nextInt(2, 4);\n for (let d = 0; d < dealsThisMonth; d++) {\n const org = newLogoOrgs[orgIdx % newLogoOrgs.length]!;\n orgIdx++;\n const closeDate = monthEnd(now, m);\n const createdAt = new Date(closeDate);\n createdAt.setDate(createdAt.getDate() - rng.nextInt(45, 120));\n\n const opp = buildClosedWonDeal({\n rng,\n org,\n rep: rng.pick(reps),\n dealType: \"New Business\",\n amount: dealAmount(org.metadata.segment as string, rng, taxonomy),\n createdAt,\n closeDate,\n taxonomy,\n });\n opportunities.push(opp);\n revenueEvents.push(makeRevenueEvent(org.localId, closeDate, opp.amount, \"new\"));\n }\n }\n\n // ── 2. Expansion customers (prior win 12–18mo ago, expansion 2–10mo ago) ──\n const expansionOrgs = rng.shuffle(availableOrgs).slice(0, 12);\n for (const org of expansionOrgs) {\n const initialClose = monthEnd(now, rng.nextInt(14, 20));\n const initialCreated = new Date(initialClose);\n initialCreated.setDate(initialCreated.getDate() - rng.nextInt(60, 100));\n const baseAmount = dealAmount(org.metadata.segment as string, rng, taxonomy);\n\n const initial = buildClosedWonDeal({\n rng,\n org,\n rep: rng.pick(reps),\n dealType: \"New Business\",\n amount: baseAmount,\n createdAt: initialCreated,\n closeDate: initialClose,\n taxonomy,\n });\n opportunities.push(initial);\n revenueEvents.push(makeRevenueEvent(org.localId, initialClose, baseAmount, \"new\"));\n\n const expansionClose = monthEnd(now, rng.nextInt(2, 10));\n const expansionCreated = new Date(expansionClose);\n expansionCreated.setDate(expansionCreated.getDate() - rng.nextInt(30, 75));\n const expansionAmount = Math.round(baseAmount * rng.nextFloat(0.15, 0.45));\n\n const expansion = buildClosedWonDeal({\n rng,\n org,\n rep: rng.pick(reps),\n dealType: \"Expansion\",\n amount: expansionAmount,\n createdAt: expansionCreated,\n closeDate: expansionClose,\n taxonomy,\n nameSuffix: \"Expansion\",\n });\n opportunities.push(expansion);\n revenueEvents.push(makeRevenueEvent(org.localId, expansionClose, expansionAmount, \"expansion\"));\n }\n\n // ── 3. Churned customers (won 16–22mo ago, no recent activity, no open opps) ──\n const churnOrgs = rng.shuffle(availableOrgs).slice(12, 20);\n for (const org of churnOrgs) {\n const churnClose = monthEnd(now, rng.nextInt(16, 22));\n const churnCreated = new Date(churnClose);\n churnCreated.setDate(churnCreated.getDate() - rng.nextInt(50, 90));\n const churnAmount = dealAmount(org.metadata.segment as string, rng, taxonomy);\n\n const churnWin = buildClosedWonDeal({\n rng,\n org,\n rep: rng.pick(reps),\n dealType: \"New Business\",\n amount: churnAmount,\n createdAt: churnCreated,\n closeDate: churnClose,\n taxonomy,\n });\n opportunities.push(churnWin);\n revenueEvents.push(makeRevenueEvent(org.localId, churnClose, churnAmount, \"new\"));\n\n // Churn event ~12–14 months after initial win (no renewal)\n const churnEventDate = monthEnd(now, rng.nextInt(13, 15));\n revenueEvents.push(makeRevenueEvent(org.localId, churnEventDate, churnAmount, \"churn\"));\n }\n\n // ── 4. Contraction (renewal at 60–80% of prior contract) ──\n const contractionOrgs = rng.shuffle(availableOrgs).slice(20, 26);\n for (const org of contractionOrgs) {\n const initialClose = monthEnd(now, rng.nextInt(10, 14));\n const initialCreated = new Date(initialClose);\n initialCreated.setDate(initialCreated.getDate() - rng.nextInt(55, 95));\n const initialAmount = dealAmount(org.metadata.segment as string, rng, taxonomy);\n\n const initial = buildClosedWonDeal({\n rng,\n org,\n rep: rng.pick(reps),\n dealType: \"New Business\",\n amount: initialAmount,\n createdAt: initialCreated,\n closeDate: initialClose,\n taxonomy,\n });\n opportunities.push(initial);\n revenueEvents.push(makeRevenueEvent(org.localId, initialClose, initialAmount, \"new\"));\n\n const renewalClose = monthEnd(now, rng.nextInt(1, 6));\n const renewalCreated = new Date(renewalClose);\n renewalCreated.setDate(renewalCreated.getDate() - rng.nextInt(25, 60));\n const renewalAmount = Math.round(initialAmount * rng.nextFloat(0.6, 0.8));\n\n const renewal = buildClosedWonDeal({\n rng,\n org,\n rep: rng.pick(reps),\n dealType: \"Renewal\",\n amount: renewalAmount,\n createdAt: renewalCreated,\n closeDate: renewalClose,\n taxonomy,\n nameSuffix: \"Renewal\",\n });\n opportunities.push(renewal);\n revenueEvents.push(makeRevenueEvent(org.localId, renewalClose, renewalAmount, \"renewal\"));\n revenueEvents.push(\n makeRevenueEvent(org.localId, renewalClose, initialAmount - renewalAmount, \"contraction\"),\n );\n }\n\n return { opportunities, revenueEvents };\n}\n\n// ── Helpers ──\n\nfunction monthEnd(now: Date, monthsAgo: number): Date {\n const d = new Date(now);\n d.setMonth(d.getMonth() - monthsAgo);\n d.setDate(28);\n return d;\n}\n\nfunction periodKey(date: Date): string {\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, \"0\")}`;\n}\n\nfunction makeRevenueEvent(\n orgLocalId: string,\n date: Date,\n amount: number,\n eventType: string,\n): GeneratedRevenueEvent {\n return {\n organizationLocalId: orgLocalId,\n period: periodKey(date),\n amount,\n event_type: eventType,\n source_system: \"demo\",\n source_id: `rev-${eventType}-${orgLocalId.slice(0, 8)}-${periodKey(date)}`,\n raw_data: { generated: true, event_type: eventType },\n };\n}\n\nfunction dealAmount(segment: string, rng: SeededRandom, taxonomy?: DemoTaxonomy): number {\n if (taxonomy) {\n const bandKey = segment === \"enterprise\" ? \"enterprise\" : segment === \"mid_market\" ? \"mid_market\" : \"smb\";\n const band = taxonomy.deal_size_bands[bandKey];\n return rng.nextInt(band.min, band.max);\n }\n switch (segment) {\n case \"enterprise\":\n return rng.nextInt(75_000, 500_000);\n case \"mid_market\":\n return rng.nextInt(25_000, 100_000);\n default:\n return rng.nextInt(5_000, 30_000);\n }\n}\n\ninterface BuildDealParams {\n rng: SeededRandom;\n org: GeneratedOrganization;\n rep: GeneratedPerson;\n dealType: string;\n amount: number;\n createdAt: Date;\n closeDate: Date;\n taxonomy?: DemoTaxonomy;\n nameSuffix?: string;\n}\n\nfunction buildClosedWonDeal({\n rng,\n org,\n rep,\n dealType,\n amount,\n createdAt,\n closeDate,\n taxonomy,\n nameSuffix,\n}: BuildDealParams): GeneratedOpportunity {\n const verb = rng.pick(taxonomy?.deal_verbs ?? DEAL_VERBS);\n const modifier = rng.pick(taxonomy?.deal_modifiers ?? DEAL_MODIFIERS);\n const suffix = nameSuffix ? ` - ${nameSuffix}` : \"\";\n const dealName = `${org.canonical_name} - ${modifier} ${verb}${suffix}`;\n\n const stages: StageHistoryEntry[] = [];\n let currentDate = new Date(createdAt);\n for (const stage of STAGES_SALESFORCE.slice(0, 5)) {\n const days = rng.nextInt(5, 20);\n stages.push({ stage, entered_at: currentDate.toISOString(), days_in_stage: days });\n currentDate = new Date(currentDate.getTime() + days * 86400000);\n }\n stages.push({ stage: \"Closed Won\", entered_at: closeDate.toISOString(), days_in_stage: 0 });\n\n const sourceId = `006${rng.uuid().replace(/-/g, \"\").slice(0, 15).toUpperCase()}`;\n const closeDateStr = closeDate.toISOString().slice(0, 10);\n\n return {\n localId: rng.uuid(),\n canonical_name: dealName,\n organizationLocalId: org.localId,\n ownerLocalId: rep.localId,\n current_stage: \"Closed Won\",\n amount,\n close_date: closeDateStr,\n source_system: \"salesforce\",\n source_id: sourceId,\n raw_data: {\n Id: sourceId,\n Name: dealName,\n Amount: amount,\n StageName: \"Closed Won\",\n CloseDate: closeDateStr,\n AccountId: org.source_id,\n \"Account.Name\": org.canonical_name,\n OwnerId: rep.source_id,\n \"Owner.Name\": rep.canonical_name,\n Probability: 100,\n Type: dealType,\n LeadSource: \"Outbound\",\n ForecastCategory: \"Closed\",\n IsClosed: true,\n IsWon: true,\n CreatedDate: createdAt.toISOString(),\n LastModifiedDate: closeDate.toISOString(),\n },\n metadata: {\n stage_history: stages,\n is_stale: false,\n is_stuck: false,\n is_single_threaded: false,\n deal_type: dealType,\n created_at: createdAt.toISOString(),\n saas_enrichment: true,\n },\n };\n}\n\n/** Apply enrichment to an in-memory dataset (mutates opportunities array). */\nexport function applySaasEnrichment(\n dataset: GeneratedDataset,\n rng: SeededRandom,\n historyMonths: number,\n taxonomy?: DemoTaxonomy,\n): void {\n const { opportunities, revenueEvents } = enrichSaasHistory({\n rng,\n organizations: dataset.organizations,\n people: dataset.people,\n existingOpportunities: dataset.opportunities,\n historyMonths,\n taxonomy,\n });\n dataset.opportunities.push(...opportunities);\n dataset.revenueEvents = [...(dataset.revenueEvents ?? []), ...revenueEvents];\n}\n","/**\n * Salesforce CSV exporter.\n * Transforms generated dataset into Salesforce-format CSVs:\n * Accounts, Contacts, Opportunities, Tasks.\n */\n\nimport Papa from \"papaparse\";\nimport type { GeneratedDataset, CSVFile } from \"../types.js\";\n\nexport function exportSalesforceCSVs(dataset: GeneratedDataset): CSVFile[] {\n const files: CSVFile[] = [];\n\n // Salesforce Accounts\n const sfOrgs = dataset.organizations.filter((o) => o.source_system === \"salesforce\");\n if (sfOrgs.length > 0) {\n const rows = sfOrgs.map((org) => ({\n Id: org.source_id,\n Name: org.canonical_name,\n Website: `https://${org.canonical_domain}`,\n Industry: org.metadata.industry,\n NumberOfEmployees: org.raw_data[\"NumberOfEmployees\"],\n BillingCountry: org.raw_data[\"BillingCountry\"],\n BillingState: org.raw_data[\"BillingState\"],\n AnnualRevenue: org.metadata.annual_revenue,\n Type: \"Prospect\",\n Description: org.raw_data[\"Description\"],\n }));\n\n files.push({\n filename: \"Salesforce_Accounts.csv\",\n sourceSystem: \"salesforce\",\n entityType: \"organizations\",\n content: Papa.unparse(rows),\n rowCount: rows.length,\n });\n }\n\n // Salesforce Contacts\n const sfContacts = dataset.people.filter(\n (p) => p.source_system === \"salesforce\" && !p.metadata.is_rep,\n );\n const sfReps = dataset.people.filter(\n (p) => p.source_system === \"salesforce\" && p.metadata.is_rep,\n );\n\n if (sfContacts.length > 0) {\n const rows = sfContacts.map((person) => ({\n Id: person.source_id,\n FirstName: person.raw_data[\"FirstName\"],\n LastName: person.raw_data[\"LastName\"],\n Email: person.canonical_email,\n Title: person.metadata.title,\n Name: person.canonical_name,\n AccountId: findOrgSourceId(dataset, person.organizationLocalId),\n \"Account.Name\": findOrgName(dataset, person.organizationLocalId),\n Phone: person.metadata.phone,\n MailingState: \"CA\",\n MailingCountry: \"US\",\n }));\n\n files.push({\n filename: \"Salesforce_Contacts.csv\",\n sourceSystem: \"salesforce\",\n entityType: \"people\",\n content: Papa.unparse(rows),\n rowCount: rows.length,\n });\n }\n\n // Salesforce Opportunities\n if (dataset.opportunities.length > 0) {\n const rows = dataset.opportunities.map((opp) => {\n const rep = dataset.people.find((p) => p.localId === opp.ownerLocalId);\n return {\n Id: opp.source_id,\n Name: opp.canonical_name,\n Amount: opp.amount,\n StageName: opp.current_stage,\n CloseDate: opp.close_date,\n AccountId: findOrgSourceId(dataset, opp.organizationLocalId),\n \"Account.Name\": findOrgName(dataset, opp.organizationLocalId),\n OwnerId: rep?.source_id ?? \"\",\n \"Owner.Name\": rep?.canonical_name ?? \"\",\n Probability: opp.raw_data[\"Probability\"],\n Type: opp.raw_data[\"Type\"],\n LeadSource: opp.raw_data[\"LeadSource\"],\n ForecastCategory: opp.raw_data[\"ForecastCategory\"],\n IsClosed: opp.current_stage.startsWith(\"Closed\"),\n IsWon: opp.current_stage === \"Closed Won\",\n };\n });\n\n files.push({\n filename: \"Salesforce_Opportunities.csv\",\n sourceSystem: \"salesforce\",\n entityType: \"opportunities\",\n content: Papa.unparse(rows),\n rowCount: rows.length,\n });\n }\n\n // Salesforce Tasks (activities from SF)\n const sfActivities = dataset.activities.filter((a) => a.source_system === \"salesforce\");\n if (sfActivities.length > 0) {\n const rows = sfActivities.map((act) => ({\n Id: act.source_id,\n Subject: act.raw_data[\"Subject\"],\n ActivityDate: act.raw_data[\"ActivityDate\"],\n Status: \"Completed\",\n Priority: \"Normal\",\n TaskSubtype: act.raw_data[\"TaskSubtype\"],\n WhoId: act.raw_data[\"WhoId\"],\n WhatId: act.raw_data[\"WhatId\"],\n \"Who.Name\": act.raw_data[\"Who.Name\"],\n \"What.Name\": act.raw_data[\"What.Name\"],\n Description: act.raw_data[\"Description\"],\n CallDurationInSeconds: act.raw_data[\"CallDurationInSeconds\"],\n CallDisposition: act.raw_data[\"CallDisposition\"],\n }));\n\n files.push({\n filename: \"Salesforce_Tasks.csv\",\n sourceSystem: \"salesforce\",\n entityType: \"activities\",\n content: Papa.unparse(rows),\n rowCount: rows.length,\n });\n }\n\n return files;\n}\n\nfunction findOrgSourceId(dataset: GeneratedDataset, localId: string | null): string {\n if (!localId) return \"\";\n return dataset.organizations.find((o) => o.localId === localId)?.source_id ?? \"\";\n}\n\nfunction findOrgName(dataset: GeneratedDataset, localId: string | null): string {\n if (!localId) return \"\";\n return dataset.organizations.find((o) => o.localId === localId)?.canonical_name ?? \"\";\n}\n","/**\n * HubSpot CSV exporter.\n * Transforms generated dataset into HubSpot-format CSVs:\n * Companies, Contacts, Engagements.\n */\n\nimport Papa from \"papaparse\";\nimport type { GeneratedDataset, CSVFile } from \"../types.js\";\n\nexport function exportHubSpotCSVs(dataset: GeneratedDataset): CSVFile[] {\n const files: CSVFile[] = [];\n\n // HubSpot Companies\n const hsOrgs = dataset.organizations.filter((o) => o.source_system === \"hubspot\");\n // Also include orgs that have HubSpot contacts (cross-system presence)\n const hsContactOrgIds = new Set(\n dataset.people\n .filter((p) => p.source_system === \"hubspot\" && p.organizationLocalId)\n .map((p) => p.organizationLocalId),\n );\n const allHsOrgs = dataset.organizations.filter(\n (o) => o.source_system === \"hubspot\" || hsContactOrgIds.has(o.localId),\n );\n\n if (allHsOrgs.length > 0) {\n const rows = allHsOrgs.map((org) => ({\n \"Company ID\": org.source_id,\n \"Company name\": org.canonical_name,\n \"Company Domain Name\": org.canonical_domain,\n Industry: org.metadata.industry,\n \"Number of Employees\": org.raw_data[\"NumberOfEmployees\"] ?? org.raw_data[\"Number of Employees\"],\n Country: org.raw_data[\"BillingCountry\"] ?? org.raw_data[\"Country\"],\n \"Annual Revenue\": org.metadata.annual_revenue,\n Type: \"PROSPECT\",\n \"Lifecycle Stage\": \"lead\",\n }));\n\n files.push({\n filename: \"HubSpot_Companies.csv\",\n sourceSystem: \"hubspot\",\n entityType: \"organizations\",\n content: Papa.unparse(rows),\n rowCount: rows.length,\n });\n }\n\n // HubSpot Contacts\n const hsContacts = dataset.people.filter(\n (p) => p.source_system === \"hubspot\" && !p.metadata.is_rep,\n );\n if (hsContacts.length > 0) {\n const rows = hsContacts.map((person) => ({\n \"Contact ID\": person.source_id,\n \"First Name\": person.raw_data[\"First Name\"] ?? person.canonical_name.split(\" \")[0],\n \"Last Name\": person.raw_data[\"Last Name\"] ?? person.canonical_name.split(\" \").slice(1).join(\" \"),\n Email: person.canonical_email,\n \"Job Title\": person.metadata.title,\n \"Associated Company\": findOrgName(dataset, person.organizationLocalId),\n \"Associated Company ID\": findOrgSourceId(dataset, person.organizationLocalId),\n \"Lifecycle Stage\": person.metadata.lifecycle_stage ?? \"lead\",\n \"HubSpot Score\": person.metadata.lead_score ?? 0,\n \"Lead Status\": person.raw_data[\"Lead Status\"] ?? \"Open\",\n }));\n\n files.push({\n filename: \"HubSpot_Contacts.csv\",\n sourceSystem: \"hubspot\",\n entityType: \"people\",\n content: Papa.unparse(rows),\n rowCount: rows.length,\n });\n }\n\n // HubSpot Engagements\n const hsActivities = dataset.activities.filter((a) => a.source_system === \"hubspot\");\n if (hsActivities.length > 0) {\n const rows = hsActivities.map((act) => ({\n \"Engagement ID\": act.source_id,\n Type: act.raw_data[\"Type\"],\n \"Contact ID\": act.raw_data[\"Contact ID\"],\n Timestamp: act.raw_data[\"Timestamp\"],\n \"Created At\": act.occurred_at,\n Title: act.raw_data[\"Title\"],\n Body: act.raw_data[\"Body\"] ?? \"\",\n \"Duration (ms)\": act.raw_data[\"Duration (ms)\"] ?? \"\",\n Disposition: act.raw_data[\"Disposition\"] ?? \"\",\n \"Meeting Outcome\": act.raw_data[\"Meeting Outcome\"] ?? \"\",\n }));\n\n files.push({\n filename: \"HubSpot_Engagements.csv\",\n sourceSystem: \"hubspot\",\n entityType: \"activities\",\n content: Papa.unparse(rows),\n rowCount: rows.length,\n });\n }\n\n return files;\n}\n\nfunction findOrgSourceId(dataset: GeneratedDataset, localId: string | null): string {\n if (!localId) return \"\";\n return dataset.organizations.find((o) => o.localId === localId)?.source_id ?? \"\";\n}\n\nfunction findOrgName(dataset: GeneratedDataset, localId: string | null): string {\n if (!localId) return \"\";\n return dataset.organizations.find((o) => o.localId === localId)?.canonical_name ?? \"\";\n}\n","/**\n * Outreach CSV exporter.\n * Transforms generated dataset into Outreach-format CSVs:\n * Sequences, Activities (emails + calls).\n */\n\nimport Papa from \"papaparse\";\nimport type { GeneratedDataset, CSVFile } from \"../types.js\";\n\nexport function exportOutreachCSVs(dataset: GeneratedDataset): CSVFile[] {\n const files: CSVFile[] = [];\n\n // Outreach Sequences (campaigns)\n if (dataset.campaigns.length > 0) {\n const rows = dataset.campaigns.map((campaign) => ({\n id: campaign.source_id,\n name: campaign.canonical_name,\n sequence_type: campaign.raw_data[\"sequence_type\"],\n enabled: campaign.raw_data[\"enabled\"],\n step_count: campaign.metadata.step_count,\n enrolled_count: campaign.metadata.enrolled_count,\n created_at: campaign.raw_data[\"created_at\"],\n }));\n\n files.push({\n filename: \"Outreach_Sequences.csv\",\n sourceSystem: \"outreach\",\n entityType: \"campaigns\",\n content: Papa.unparse(rows),\n rowCount: rows.length,\n });\n }\n\n // Outreach Activities\n const orActivities = dataset.activities.filter((a) => a.source_system === \"outreach\");\n if (orActivities.length > 0) {\n const rows = orActivities.map((act) => ({\n id: act.source_id,\n type: act.raw_data[\"type\"],\n direction: act.raw_data[\"direction\"],\n subject: act.raw_data[\"subject\"],\n created_at: act.occurred_at,\n updated_at: act.raw_data[\"updated_at\"],\n prospect_id: act.raw_data[\"prospect_id\"],\n prospect_name: act.raw_data[\"prospect_name\"],\n prospect_email: act.raw_data[\"prospect_email\"],\n sequence_id: act.raw_data[\"sequence_id\"] ?? \"\",\n sequence_name: act.raw_data[\"sequence_name\"] ?? \"\",\n step_number: act.raw_data[\"step_number\"] ?? \"\",\n status: act.raw_data[\"status\"],\n opened_at: act.raw_data[\"opened_at\"] ?? \"\",\n replied_at: act.raw_data[\"replied_at\"] ?? \"\",\n call_duration: act.raw_data[\"call_duration\"] ?? \"\",\n call_disposition: act.raw_data[\"call_disposition\"] ?? \"\",\n }));\n\n files.push({\n filename: \"Outreach_Activities.csv\",\n sourceSystem: \"outreach\",\n entityType: \"activities\",\n content: Papa.unparse(rows),\n rowCount: rows.length,\n });\n }\n\n return files;\n}\n","/**\n * Main generator orchestrator — rewritten for DuckDB.\n * Takes DemoConfigPayload, runs factories, branches on outputFormat.\n * Direct mode: batch insert via DuckDB query helpers with FK resolution.\n * CSV mode: run exporters, return CSV files.\n */\n\nimport type { DemoConfigPayload, DemoScenario } from \"../types.js\";\nimport {\n insertOrganization,\n insertPerson,\n insertOpportunity,\n insertActivity,\n insertCampaign,\n insertRevenueEvent,\n} from \"../db/queries.js\";\nimport { createSeededRandom } from \"./seed.js\";\nimport { getScenario, blendScenarios } from \"./scenarios.js\";\nimport { generateOrganizations } from \"./factories/organizations.js\";\nimport { generatePeople } from \"./factories/people.js\";\nimport { generateOpportunities } from \"./factories/opportunities.js\";\nimport { generateActivities } from \"./factories/activities.js\";\nimport { applySaasEnrichment } from \"./factories/saas-enrichment.js\";\nimport { exportSalesforceCSVs } from \"./exporters/salesforce.js\";\nimport { exportHubSpotCSVs } from \"./exporters/hubspot.js\";\nimport { exportOutreachCSVs } from \"./exporters/outreach.js\";\nimport type { GeneratedDataset, GeneratorResult } from \"./types.js\";\n\n/**\n * Generate demo data from config.\n * Seed is derived from scenario + accountCount for determinism.\n */\nexport async function generateDemoData(\n config: DemoConfigPayload,\n): Promise<GeneratorResult> {\n // Deterministic seed from config\n const scenarioKey = config.scenario ?? \"research_blend\";\n const seedValue = hashString(`${scenarioKey}-${config.accountCount}-${config.companyName}`);\n const rng = createSeededRandom(seedValue);\n\n // Resolve scenario: named scenario or research-derived blend\n const scenario = scenarioKey === \"research_blend\"\n ? blendScenarios(null)\n : getScenario(scenarioKey);\n\n // Phase 1: Run factories to build in-memory dataset\n const organizations = generateOrganizations({\n rng,\n scenario,\n accountCount: config.accountCount,\n companyIndustry: config.industry,\n taxonomy: config.taxonomy,\n });\n\n const people = generatePeople({\n rng,\n scenario,\n organizations,\n repCount: config.repCount,\n contactsPerAccount: config.contactsPerAccount,\n companyName: config.companyName,\n taxonomy: config.taxonomy,\n whimsy: config.whimsy ?? true,\n });\n\n const opportunities = generateOpportunities({\n rng,\n scenario,\n organizations,\n people,\n opportunityCount: config.opportunityCount,\n activityMonths: config.activityMonths,\n taxonomy: config.taxonomy,\n });\n\n const { activities, campaigns } = generateActivities({\n rng,\n scenario,\n organizations,\n people,\n opportunities,\n activityMonths: config.activityMonths,\n taxonomy: config.taxonomy,\n });\n\n const dataset: GeneratedDataset = {\n organizations,\n people,\n opportunities,\n activities,\n campaigns,\n revenueEvents: [],\n };\n\n const enrichSaas = config.enrichSaas !== false;\n if (enrichSaas) {\n applySaasEnrichment(\n dataset,\n rng,\n config.saasHistoryMonths ?? Math.max(config.activityMonths, 18),\n config.taxonomy,\n );\n }\n\n // Phase 2: Output\n if (config.outputFormat === \"csvs\") {\n return generateCSVs(dataset);\n } else {\n return insertDirect(dataset);\n }\n}\n\nfunction generateCSVs(dataset: GeneratedDataset): GeneratorResult {\n const files = [\n ...exportSalesforceCSVs(dataset),\n ...exportHubSpotCSVs(dataset),\n ...exportOutreachCSVs(dataset),\n ];\n\n return { mode: \"csvs\", files };\n}\n\nasync function insertDirect(\n dataset: GeneratedDataset,\n): Promise<GeneratorResult> {\n // Build FK resolution maps: localId -> database UUID\n const orgIdMap = new Map<string, string>();\n const personIdMap = new Map<string, string>();\n const oppIdMap = new Map<string, string>();\n\n // 1. Insert organizations\n for (const org of dataset.organizations) {\n const dbId = await insertOrganization({\n canonical_name: org.canonical_name,\n canonical_domain: org.canonical_domain,\n source_system: org.source_system,\n source_id: org.source_id,\n raw_data: org.raw_data,\n metadata: org.metadata,\n });\n orgIdMap.set(org.localId, dbId);\n }\n\n // 2. Insert people\n for (const person of dataset.people) {\n const dbId = await insertPerson({\n canonical_name: person.canonical_name,\n canonical_email: person.canonical_email,\n organization_id: person.organizationLocalId\n ? orgIdMap.get(person.organizationLocalId) ?? null\n : null,\n source_system: person.source_system,\n source_id: person.source_id,\n raw_data: person.raw_data,\n metadata: person.metadata,\n });\n personIdMap.set(person.localId, dbId);\n }\n\n // 3. Insert opportunities (preserve historical created_at from factory metadata)\n for (const opp of dataset.opportunities) {\n const createdAt = (opp.metadata.created_at as string | undefined)\n ?? (opp.raw_data.CreatedDate as string | undefined);\n const dbId = await insertOpportunity({\n canonical_name: opp.canonical_name,\n organization_id: orgIdMap.get(opp.organizationLocalId) ?? null,\n owner_id: personIdMap.get(opp.ownerLocalId) ?? null,\n current_stage: opp.current_stage,\n amount: opp.amount,\n close_date: opp.close_date,\n source_system: opp.source_system,\n source_id: opp.source_id,\n raw_data: opp.raw_data,\n metadata: opp.metadata,\n created_at: createdAt,\n });\n oppIdMap.set(opp.localId, dbId);\n }\n\n // 4. Insert activities\n for (const act of dataset.activities) {\n await insertActivity({\n activity_type: act.activity_type,\n occurred_at: act.occurred_at,\n person_id: act.personLocalId\n ? personIdMap.get(act.personLocalId) ?? null\n : null,\n organization_id: act.organizationLocalId\n ? orgIdMap.get(act.organizationLocalId) ?? null\n : null,\n opportunity_id: act.opportunityLocalId\n ? oppIdMap.get(act.opportunityLocalId) ?? null\n : null,\n source_system: act.source_system,\n source_id: act.source_id,\n raw_data: act.raw_data,\n metadata: act.metadata,\n });\n }\n\n // 5. Insert campaigns\n for (const campaign of dataset.campaigns) {\n await insertCampaign({\n canonical_name: campaign.canonical_name,\n campaign_type: campaign.campaign_type,\n source_system: campaign.source_system,\n source_id: campaign.source_id,\n raw_data: campaign.raw_data,\n metadata: campaign.metadata,\n });\n }\n\n // 6. Insert revenue events (SaaS enrichment ledger)\n for (const event of dataset.revenueEvents ?? []) {\n await insertRevenueEvent({\n organization_id: orgIdMap.get(event.organizationLocalId) ?? null,\n period: event.period,\n amount: event.amount,\n event_type: event.event_type,\n source_system: event.source_system,\n source_id: event.source_id,\n raw_data: event.raw_data,\n });\n }\n\n return {\n mode: \"direct\",\n counts: {\n organizations: dataset.organizations.length,\n people: dataset.people.length,\n opportunities: dataset.opportunities.length,\n activities: dataset.activities.length,\n campaigns: dataset.campaigns.length,\n revenue_events: dataset.revenueEvents?.length ?? 0,\n },\n health: null,\n };\n}\n\nfunction hashString(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash + char) | 0;\n }\n return Math.abs(hash);\n}\n","import chalk from \"chalk\";\nimport { formatModelLabel } from \"../ai/llm/catalog.js\";\nimport type { LlmProvider, LlmUsageMeta } from \"../types.js\";\n\nexport function formatLlmAttribution(meta: Partial<LlmUsageMeta> & { model_used?: string }): string | null {\n if (!meta.model_used) return null;\n const provider = (meta.provider_used ?? \"anthropic\") as LlmProvider;\n let line = `via ${formatModelLabel(provider, meta.model_used)}`;\n if (meta.failover) {\n line += \" (auto-failover)\";\n }\n return line;\n}\n\nexport function printLlmAttribution(meta: Partial<LlmUsageMeta> & { model_used?: string }): void {\n const line = formatLlmAttribution(meta);\n if (line) console.log(chalk.dim(` ${line}`));\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport Table from \"cli-table3\";\nimport type { VitalSignStatus, FindingEntry, VitalSignResult, HealthResult, SegmentResult } from \"../types.js\";\nimport type { DiagnoseEvent, FullComputeResult } from \"../vitals/health-score.js\";\nimport { VITAL_SIGN_LABELS, formatScore, formatDollarValue, formatCurrency, type PipelineMetrics } from \"./formatters.js\";\nimport { printMarkdown } from \"../ui/markdown.js\";\nimport { actionHint, badge, paint, scoreBar, sectionHeading } from \"../ui/theme.js\";\nimport { padRight, truncateVisible } from \"../ui/layout.js\";\nimport { printLlmAttribution } from \"./llm-attribution.js\";\n\n// ============================================================\n// Shared helpers\n// ============================================================\n\n/** Center text within a fixed-width column. */\nfunction centerPad(text: string, width: number): string {\n if (text.length >= width) return text;\n const gap = width - text.length;\n const left = Math.floor(gap / 2);\n return \" \".repeat(left) + text + \" \".repeat(gap - left);\n}\n\nfunction statusColor(status: VitalSignStatus): (text: string) => string {\n switch (status) {\n case \"green\": return chalk.green;\n case \"yellow\": return chalk.yellow;\n case \"red\": return chalk.red;\n }\n}\n\nfunction statusDot(status: VitalSignStatus): string {\n return statusColor(status)(\"●\");\n}\n\nfunction statusBadge(status: VitalSignStatus): string {\n switch (status) {\n case \"green\": return badge(\"HEALTHY\", \"success\");\n case \"yellow\": return badge(\"WARNING\", \"warning\");\n case \"red\": return badge(\"CRITICAL\", \"error\");\n }\n}\n\nfunction printHeading(label: string, detail?: string): void {\n console.log(` ${sectionHeading(label)}${detail ? chalk.dim(` ${detail}`) : \"\"}`);\n}\n\nfunction printResultCard(title: string, rows: string[]): void {\n const width = 70;\n const inner = width - 4;\n const border = chalk.dim;\n console.log();\n console.log(` ${border(`╭${\"─\".repeat(width - 2)}╮`)}`);\n console.log(` ${border(\"│ \")}${padRight(sectionHeading(title), inner)}${border(\" │\")}`);\n console.log(` ${border(`├${\"─\".repeat(width - 2)}┤`)}`);\n for (const row of rows) {\n console.log(` ${border(\"│ \")}${padRight(truncateVisible(row, inner), inner)}${border(\" │\")}`);\n }\n console.log(` ${border(`╰${\"─\".repeat(width - 2)}╯`)}`);\n console.log();\n}\n\n/** Single vital-sign row: ● Label ██▓▓░░░░ 29 │ $3.1M pipeline at risk */\nfunction printVitalSignRow(vs: VitalSignResult): void {\n const dot = statusDot(vs.status);\n const label = VITAL_SIGN_LABELS[vs.vital_sign].padEnd(18);\n const bar = scoreBar(vs.score, vs.status);\n const score = String(Math.round(vs.score)).padStart(4);\n const impact =\n vs.dollar_value != null && vs.dollar_value > 0\n ? `${chalk.green(formatCurrency(vs.dollar_value))} ${chalk.dim(vs.dollar_label ?? \"\")}`\n : chalk.dim(\"—\");\n console.log(` ${dot} ${label} ${bar} ${chalk.bold(score)} ${chalk.dim(\"│\")} ${impact}`);\n}\n\n// ============================================================\n// Health summary + vital signs\n// ============================================================\n\nexport function printHealthSummary(result: HealthResult, _pipelineMetrics?: PipelineMetrics): void {\n const scoreStr = `${chalk.bold(String(Math.round(result.overall_score)))}${chalk.dim(\"/100\")}`;\n const impact = result.total_value_at_risk != null && result.total_value_at_risk > 0\n ? `${chalk.green(formatCurrency(result.total_value_at_risk))} ${chalk.dim(\"total at risk\")}`\n : chalk.dim(\"No dollar-weighted risk detected\");\n const next = result.overall_status === \"red\"\n ? actionHint(\"Next:\", \"/playbook\", \"review recommended plays\")\n : result.overall_status === \"yellow\"\n ? actionHint(\"Next:\", \"/diagnose --deep\", \"investigate the weak signal\")\n : actionHint(\"Next:\", \"/report\", \"export the clean snapshot\");\n\n printResultCard(\"Overall Health\", [\n `${chalk.dim(\"Score\")} ${scoreStr} ${statusBadge(result.overall_status)}`,\n `${chalk.dim(\"Gated by\")} ${paint(\"accent\", VITAL_SIGN_LABELS[result.gating_vital_sign])}`,\n `${chalk.dim(\"Revenue\")} ${impact}`,\n next,\n ]);\n}\n\nexport function printVitalSigns(vitals: VitalSignResult[]): void {\n console.log();\n printHeading(\"Vital Signs\");\n console.log();\n\n for (const vs of vitals) {\n printVitalSignRow(vs);\n }\n\n console.log();\n}\n\n// ============================================================\n// Segments\n// ============================================================\n\nexport function printSegmentSummary(segments: SegmentResult[]): void {\n if (segments.length === 0) return;\n\n printHeading(\"Segments\");\n console.log();\n\n for (const seg of segments) {\n const dot = statusDot(seg.result.overall_status);\n const name = seg.segment.name.padEnd(24);\n const score = String(Math.round(seg.result.overall_score)).padStart(4);\n const gating = chalk.dim(VITAL_SIGN_LABELS[seg.result.gating_vital_sign]);\n console.log(` ${dot} ${name} ${chalk.bold(score)} ${chalk.dim(\"│\")} ${gating}`);\n }\n\n console.log();\n}\n\n/**\n * Print the top-N most expensive problems across all segments.\n */\nexport function printTopProblems(segments: SegmentResult[], limit: number = 7): void {\n if (segments.length === 0) return;\n\n interface Problem {\n segment: string;\n vitalSignLabel: string;\n status: VitalSignStatus;\n score: number;\n dollarValue: number;\n dollarLabel: string;\n }\n\n const problems: Problem[] = [];\n for (const seg of segments) {\n for (const vs of seg.result.vital_signs) {\n if (vs.status === \"green\") continue;\n if (vs.dollar_value == null || vs.dollar_value <= 0) continue;\n problems.push({\n segment: seg.segment.name,\n vitalSignLabel: VITAL_SIGN_LABELS[vs.vital_sign],\n status: vs.status,\n score: vs.score,\n dollarValue: vs.dollar_value,\n dollarLabel: vs.dollar_label ?? \"\",\n });\n }\n }\n\n if (problems.length === 0) {\n printHeading(\"Top Problems\");\n console.log();\n console.log(\" \" + chalk.dim(\"No dollar-weighted problems found across segments.\"));\n console.log();\n return;\n }\n\n problems.sort((a, b) => b.dollarValue - a.dollarValue);\n const top = problems.slice(0, limit);\n\n // Compute column widths from data\n const segW = Math.max(\"Segment\".length, ...top.map((p) => p.segment.length));\n const vitalW = Math.max(\"Vital Sign\".length, ...top.map((p) => p.vitalSignLabel.length));\n const dollarStrs = top.map((p) => formatCurrency(p.dollarValue));\n const dollarW = Math.max(...dollarStrs.map((s) => s.length));\n const labelW = Math.max(\"\".length, ...top.map((p) => p.dollarLabel.length));\n const impactW = dollarW + 2 + labelW;\n\n console.log(\n ` ${sectionHeading(\"Top Problems\")}` +\n chalk.dim(` (${top.length} of ${problems.length})`),\n );\n console.log();\n\n // Column headers — centered within each column\n const segColW = 2 + segW; // \"● \" prefix occupies 2 chars\n const hSeg = centerPad(\"Segment\", segColW);\n const hVital = centerPad(\"Vital Sign\", vitalW);\n const hImpact = centerPad(\"Revenue Impact\", Math.max(impactW, \"Revenue Impact\".length));\n console.log(` ${chalk.dim(hSeg)} ${chalk.dim(hVital)} ${chalk.dim(hImpact)}`);\n console.log();\n\n for (let i = 0; i < top.length; i++) {\n const p = top[i]!;\n const dot = statusDot(p.status);\n const seg = p.segment.padEnd(segW);\n const vital = p.vitalSignLabel.padEnd(vitalW);\n const dollar = chalk.green(dollarStrs[i]!.padStart(dollarW));\n const label = chalk.dim(p.dollarLabel);\n console.log(` ${dot} ${seg} ${vital} ${dollar} ${label}`);\n }\n\n if (problems.length > top.length) {\n console.log();\n console.log(` ${chalk.dim(\"Run /diagnose --segment <name> to drill in\")}`);\n }\n console.log();\n}\n\n// ============================================================\n// AI Findings\n// ============================================================\n\nexport function printFindings(findings: FindingEntry[]): void {\n if (findings.length === 0) {\n console.log(chalk.dim(\" No findings generated.\"));\n return;\n }\n\n for (const finding of findings) {\n const sevColor =\n finding.severity === \"critical\" ? chalk.red : finding.severity === \"warning\" ? chalk.yellow : chalk.blue;\n const dot = sevColor(\"●\");\n const dollarTag =\n finding.dollar_value != null && finding.dollar_value > 0\n ? ` ${chalk.dim(\"·\")} ${chalk.green(formatDollarValue(finding.dollar_value))}`\n : \"\";\n console.log(` ${dot} ${chalk.bold(finding.segment)}${dollarTag}`);\n printMarkdown(finding.finding, { indent: 2 });\n if (finding.recommended_plays && finding.recommended_plays.length > 0) {\n for (const play of finding.recommended_plays) {\n console.log(\n ` ${chalk.dim(\"Consider:\")} ${paint(\"accent\", play.play_name)} ${chalk.dim(\"→\")} ${chalk.dim(\"/playbook \" + play.play_id)}`,\n );\n }\n }\n console.log();\n }\n}\n\n// ============================================================\n// Entity counts (kept as table — simple data grid)\n// ============================================================\n\nexport function printEntityCounts(counts: Record<string, number>): void {\n const table = new Table({\n head: [chalk.dim(\"Entity\"), chalk.dim(\"Count\")],\n colWidths: [20, 12],\n style: { head: [], border: [] },\n });\n\n for (const [entity, count] of Object.entries(counts)) {\n table.push([entity, count.toLocaleString()]);\n }\n\n console.log(table.toString());\n console.log();\n}\n\n// ============================================================\n// Segment list / detail / comparison\n// ============================================================\n\nexport function printSegmentList(segments: SegmentResult[], aggregate: HealthResult): void {\n if (segments.length === 0) {\n console.log(chalk.dim(\" No segments found. Try importing more data.\"));\n console.log();\n return;\n }\n\n const sorted = [...segments].sort((a, b) => a.result.overall_score - b.result.overall_score);\n\n printHeading(\"Segments\", `(${segments.length} total, worst-first)`);\n console.log();\n\n for (const seg of sorted) {\n const dot = statusDot(seg.result.overall_status);\n const name = seg.segment.name.padEnd(24);\n const bar = scoreBar(seg.result.overall_score, seg.result.overall_status, 10);\n const score = String(Math.round(seg.result.overall_score)).padStart(4);\n const delta = seg.result.overall_score - aggregate.overall_score;\n const deltaStr = (delta >= 0 ? chalk.green(`+${Math.round(delta)}`) : chalk.red(`${Math.round(delta)}`));\n const gating = chalk.dim(VITAL_SIGN_LABELS[seg.result.gating_vital_sign]);\n console.log(` ${dot} ${name} ${bar} ${chalk.bold(score)} ${deltaStr.padStart(12)} ${chalk.dim(\"│\")} ${gating}`);\n }\n\n console.log();\n}\n\nexport function printSegmentDetail(seg: SegmentResult, aggregate: HealthResult): void {\n const color = statusColor(seg.result.overall_status);\n console.log();\n printHeading(seg.segment.name);\n console.log(\n ` ${statusDot(seg.result.overall_status)} ${color(chalk.bold(formatScore(seg.result.overall_score)))}${chalk.dim(\"/100\")} ${chalk.dim(\"Gated by:\")} ${paint(\"accent\", VITAL_SIGN_LABELS[seg.result.gating_vital_sign])}`,\n );\n console.log();\n\n for (const vs of seg.result.vital_signs) {\n const aggVs = aggregate.vital_signs.find((a) => a.vital_sign === vs.vital_sign);\n const delta = aggVs ? vs.score - aggVs.score : 0;\n const deltaStr = (delta >= 0 ? chalk.green(`+${Math.round(delta)}`) : chalk.red(`${Math.round(delta)}`));\n\n const dot = statusDot(vs.status);\n const label = VITAL_SIGN_LABELS[vs.vital_sign].padEnd(18);\n const bar = scoreBar(vs.score, vs.status);\n const score = String(Math.round(vs.score)).padStart(4);\n const impact =\n vs.dollar_value != null && vs.dollar_value > 0\n ? `${chalk.green(formatCurrency(vs.dollar_value))} ${chalk.dim(vs.dollar_label ?? \"\")}`\n : chalk.dim(\"—\");\n console.log(` ${dot} ${label} ${bar} ${chalk.bold(score)} ${deltaStr.padStart(12)} ${chalk.dim(\"│\")} ${impact}`);\n }\n\n console.log();\n}\n\nexport function printSegmentComparison(segA: SegmentResult, segB: SegmentResult): void {\n const colorA = statusColor(segA.result.overall_status);\n const colorB = statusColor(segB.result.overall_status);\n console.log();\n printHeading(\"Segment Comparison\");\n console.log(\n ` ${colorA(chalk.bold(segA.segment.name))} ${chalk.dim(`(${formatScore(segA.result.overall_score)})`)} ${chalk.dim(\"vs\")} ${colorB(chalk.bold(segB.segment.name))} ${chalk.dim(`(${formatScore(segB.result.overall_score)})`)}`,\n );\n console.log();\n\n for (const vsA of segA.result.vital_signs) {\n const vsB = segB.result.vital_signs.find((v) => v.vital_sign === vsA.vital_sign);\n const scoreB = vsB?.score ?? 0;\n const statusB = (vsB?.status ?? \"red\") as VitalSignStatus;\n const delta = vsA.score - scoreB;\n const deltaStr = delta >= 0 ? chalk.green(`+${Math.round(delta)}`) : chalk.red(`${Math.round(delta)}`);\n const label = VITAL_SIGN_LABELS[vsA.vital_sign].padEnd(18);\n const barA = scoreBar(vsA.score, vsA.status, 8);\n const barB = scoreBar(scoreB, statusB, 8);\n\n console.log(\n ` ${label} ${barA} ${String(Math.round(vsA.score)).padStart(3)} ${chalk.dim(\"│\")} ${barB} ${String(Math.round(scoreB)).padStart(3)} ${deltaStr}`,\n );\n }\n\n console.log();\n}\n\n// ============================================================\n// Progressive diagnose renderer\n// ============================================================\n\n/** Convert a tool name like \"query_pipeline_risk\" to \"examining pipeline risk\". */\nfunction formatToolName(name: string): string {\n return name.replace(/_/g, \" \").replace(/^(get|query)\\s+/, \"examining \");\n}\n\nexport type FindingsStreamEvent =\n | { type: \"tool_call\"; name: string }\n | { type: \"finding\"; finding: FindingEntry }\n | {\n type: \"done\";\n findings: FindingEntry[];\n model_used: string;\n raw_prompt: string;\n provider_used?: string;\n failover?: boolean;\n };\n\nexport interface RenderDiagnoseStreamOptions {\n diagnoseGenerator: () => AsyncGenerator<DiagnoseEvent>;\n runFindings?: ((result: FullComputeResult) => AsyncGenerator<FindingsStreamEvent>) | null;\n storeFindings?: ((data: {\n findings: FindingEntry[];\n model_used: string;\n raw_prompt: string;\n provider_used?: string;\n failover?: boolean;\n }) => Promise<void>) | null;\n deep?: boolean;\n}\n\nexport interface DiagnoseStreamResult {\n fullResult: FullComputeResult;\n findings: FindingEntry[];\n}\n\n/**\n * Consume the DiagnoseEvent stream and render results progressively to stdout\n * using plain ANSI (ora + chalk + existing print* helpers). Works in both\n * TTY and piped modes.\n */\nexport async function renderDiagnoseStream(\n options: RenderDiagnoseStreamOptions,\n): Promise<DiagnoseStreamResult> {\n const { diagnoseGenerator, runFindings, storeFindings, deep } = options;\n\n // Header\n console.log();\n printHeading(\"Vital Signs\");\n console.log();\n\n const spinner = ora({ text: \"Prefetching snapshot…\", indent: 2, discardStdin: false }).start();\n\n let fullResult: FullComputeResult | null = null;\n\n try {\n for await (const event of diagnoseGenerator()) {\n switch (event.phase) {\n case \"snapshot\":\n spinner.text = \"Computing vital signs…\";\n break;\n case \"vital\": {\n spinner.stop();\n printVitalSignRow(event.result);\n spinner.start(\"Computing…\");\n break;\n }\n case \"aggregate\":\n spinner.text = \"Computing segments…\";\n break;\n case \"segment_progress\":\n spinner.text = `Segments: ${event.name} (${event.index}/${event.total})`;\n break;\n case \"segment_done\":\n break;\n case \"complete\":\n fullResult = event.result;\n break;\n }\n }\n spinner.stop();\n } catch (err) {\n spinner.fail(\"Diagnosis failed\");\n throw err;\n }\n\n if (!fullResult) {\n throw new Error(\"Diagnose stream ended without a complete event\");\n }\n\n // Overall health summary\n console.log();\n printHealthSummary(fullResult.aggregate);\n\n if (fullResult.segments.length > 0) {\n printTopProblems(fullResult.segments);\n }\n\n // Findings / agentic investigation\n let collectedFindings: FindingEntry[] = [];\n if (runFindings) {\n const findingsSpinner = ora({\n text: deep ? \"Investigating (agentic)…\" : \"Generating findings…\",\n indent: 2,\n discardStdin: false,\n }).start();\n\n let toolCalls = 0;\n let iterations = 0;\n let modelUsed = \"\";\n let providerUsed: string | undefined;\n let failover: boolean | undefined;\n let rawPrompt = \"\";\n try {\n for await (const event of runFindings(fullResult)) {\n if (event.type === \"tool_call\") {\n toolCalls++;\n findingsSpinner.text = formatToolName(event.name);\n } else if (event.type === \"finding\") {\n collectedFindings.push(event.finding);\n iterations++;\n findingsSpinner.text = `Found ${collectedFindings.length} finding${collectedFindings.length === 1 ? \"\" : \"s\"}…`;\n } else if (event.type === \"done\") {\n collectedFindings = event.findings;\n modelUsed = event.model_used;\n providerUsed = event.provider_used;\n failover = event.failover;\n rawPrompt = event.raw_prompt;\n }\n }\n findingsSpinner.stop();\n console.log(\n chalk.dim(` Investigating... called ${toolCalls} tools across ${iterations} iterations`),\n );\n console.log();\n\n if (storeFindings) {\n await storeFindings({\n findings: collectedFindings,\n model_used: modelUsed,\n raw_prompt: rawPrompt,\n provider_used: providerUsed,\n failover,\n });\n }\n\n printHeading(deep ? \"Investigation Findings\" : \"Findings\");\n console.log();\n printFindings(collectedFindings);\n printLlmAttribution({\n model_used: modelUsed,\n provider_used: providerUsed as import(\"../types.js\").LlmProvider | undefined,\n failover,\n });\n } catch (err) {\n findingsSpinner.fail(deep ? \"Agentic investigation failed\" : \"AI findings failed\");\n console.error(chalk.dim(String(err)));\n }\n }\n\n return { fullResult, findings: collectedFindings };\n}\n\n// ============================================================\n// Revenue Metrics renderer\n// ============================================================\n\nimport type { MetricResult, MetricGroup, MetricStatus as MStatus } from \"../metrics/types.js\";\n\nfunction metricStatusDot(status: MStatus): string {\n switch (status) {\n case \"green\": return chalk.green(\"●\");\n case \"yellow\": return chalk.yellow(\"●\");\n case \"red\": return chalk.red(\"●\");\n case \"neutral\": return chalk.dim(\"○\");\n }\n}\n\n/**\n * Print metrics grouped by MetricGroup — manual rows, no table borders.\n */\nexport function printMetricsTable(metrics: MetricResult[], groupOrder: MetricGroup[]): void {\n for (const group of groupOrder) {\n const groupMetrics = metrics.filter((m) => m.group === group);\n if (groupMetrics.length === 0) continue;\n\n printHeading(group);\n console.log();\n\n for (const m of groupMetrics) {\n const dot = m.unavailable_reason ? chalk.dim(\"○\") : metricStatusDot(m.status);\n const label = m.label.padEnd(28);\n const valueStr = m.unavailable_reason ? chalk.dim(\"--\") : chalk.bold(m.formatted);\n const confTag =\n m.confidence != null && m.confidence < 80 && m.confidence_label\n ? chalk.yellow(` ${m.confidence_label} (${m.confidence})`)\n : m.confidence != null && m.confidence_label === \"high\"\n ? chalk.dim(\" ✓\")\n : \"\";\n const note = m.unavailable_reason\n ? chalk.dim(m.unavailable_reason)\n : m.benchmark_note\n ? chalk.dim(m.benchmark_note)\n : \"\";\n console.log(` ${dot} ${label} ${valueStr}${confTag}${note ? \" \" + note : \"\"}`);\n if (m.reliability_gate?.requirements?.length && (m.confidence ?? 100) < 80) {\n const gate = m.reliability_gate.requirements[0];\n if (gate) {\n console.log(chalk.dim(` └ Gate: ${gate}`));\n }\n }\n }\n\n console.log();\n }\n}\n\nexport function printEntityDetails(details: Record<string, unknown>[], limit: number = 10): void {\n if (details.length === 0) return;\n\n const table = new Table({\n head: [chalk.dim(\"Name\"), chalk.dim(\"Type\"), chalk.dim(\"Issue\")],\n colWidths: [25, 15, 50],\n style: { head: [], border: [] },\n wordWrap: true,\n });\n\n for (const entity of details.slice(0, limit)) {\n table.push([\n String(entity.name ?? entity.id ?? \"—\"),\n String(entity.type ?? \"—\"),\n String(entity.issue ?? \"—\"),\n ]);\n }\n\n console.log(table.toString());\n if (details.length > limit) {\n console.log(chalk.dim(` ... and ${details.length - limit} more`));\n }\n console.log();\n}\n","/**\n * buildDemoTaxonomy — single-shot Anthropic call that takes a CompanyProfile\n * and returns a DemoTaxonomy: realistic buyer titles, industries, regions,\n * deal bands, and phrasing pools shaped to the operator's ICP.\n *\n * Mirrors src/ai/profile-draft.ts: no tools, no streaming, strict JSON in,\n * strict JSON out. Caller is responsible for caching and for gracefully\n * falling through to the hard-coded data-pools on failure.\n */\n\nimport type { CompanyProfile } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { assertReplAi } from \"./repl-api.js\";\nimport { llmCompleteText } from \"./llm/complete.js\";\nimport type { DemoTaxonomy } from \"../demo/taxonomy-schema.js\";\n\nconst SYSTEM_PROMPT = `You are a senior GTM market researcher. Given a company profile, produce a taxonomy of synthetic-but-plausible entities a pipeline-health tool would show this operator in their demo data.\n\nCORE PRINCIPLES:\n- All entities are SYNTHETIC. Do NOT reference real competitor names, real customer names, or real people. Company-name fragments should be domain-flavored but clearly made-up (e.g. for fintech: \"Vault\", \"Ledger\", \"Cred\", \"Pay\" — NOT \"Stripe\", \"Plaid\", \"Revolut\").\n- Shape every pool around the operator's actual ICP, sales motion, geography, and deal economics. A Rippling EMEA fintech operator should NOT see \"Director of Purchasing\" as a common buyer title and should NOT see LATAM as a dominant region.\n- Contact titles must be SEGMENT-REALISTIC:\n * Enterprise deals close with C-suite or SVPs (CFO, CPO, CHRO, SVP Finance, etc.)\n * Mid-market deals close with VPs and Heads-of (VP People Ops, Head of HR, Director of Finance)\n * SMB deals close with founders, COOs, or functional leads (Founder, COO, Head of Ops, Office Manager at the small end)\n- Deal size bands must be NUMERIC DOLLARS and consistent with \\`average_deal_size\\`. If the profile says \"$25K-$150K ACV\", the mid_market band should sit in the middle of that range, enterprise above, smb below. If no average_deal_size is provided, infer from sales_motion: plg ($1K-$15K SMB), smb_velocity ($5K-$30K SMB), mid_market ($15K-$150K mid), enterprise ($75K-$1M ENT).\n- Cycle days by segment must be NUMERIC (days per stage, not total cycle). Derive from \\`sales_cycle_days\\` when present — divide roughly by 5 stages. Otherwise infer from sales_motion: plg ~3 days/stage, smb_velocity ~5, mid_market ~15, enterprise ~30.\n- Region weights must respect \\`user_scope\\`. If the operator said \"EMEA division\", set EMEA >= 0.7. If \"North America mid-market\", set North America >= 0.7. If user_scope is absent or global, use a balanced weighting (NA 0.5, EMEA 0.25, APAC 0.15, LATAM 0.1). Weights should sum to ~1.\n- Segment distribution must respect \\`sales_motion\\`:\n * plg: smb 0.6, mid_market 0.3, enterprise 0.1\n * smb_velocity: smb 0.7, mid_market 0.25, enterprise 0.05\n * mid_market: mid_market 0.55, smb 0.3, enterprise 0.15\n * enterprise: enterprise 0.5, mid_market 0.35, smb 0.15\n Should sum to ~1.\n- \\`salesforce_weight\\` (probability an account comes from Salesforce vs HubSpot):\n * salesforce: 0.95\n * hubspot: 0.1\n * pipedrive: 0.5\n * other or unset: 0.7\n- Industries: narrow labels adjacent to the operator's ICP, not a generic pool. For a fintech operator, use labels like \"Digital Banking\", \"Neobank\", \"Payments Infrastructure\", \"Insurtech\", \"Regtech\", \"Crossborder Payments\", \"Wealth Management\", \"Lending Platforms\".\n- Company name prefixes: 15-20 synthetic fragments domain-flavored for the ICP. Blend real-word roots (\"Vault\", \"Ledger\", \"Cred\", \"Pay\", \"Mint\", \"Forge\") with invented tokens (\"Veltris\", \"Kaelo\", \"Nuvex\"). They must combine naturally with suffixes.\n- Company name suffixes: 6-10 generic corporate suffixes (\"Labs\", \"Digital\", \"Capital\", \"Cloud\", \"Systems\", \"Networks\", \"Group\", \"AI\").\n- Deal verbs and modifiers: domain-flavored phrases used in deal names. For a fintech HR ICP, verbs might include \"Rollout\", \"Consolidation\", \"Migration\", \"Implementation\"; modifiers might include \"Global\", \"Multi-Entity\", \"EMEA\", \"Payroll\".\n- Topics and challenges: 8-12 each, domain-appropriate subject matter for email/call context (e.g. \"payroll consolidation\", \"multi-entity reporting\", \"equity management\" for a fintech HR ICP).\n\nOUTPUT FORMAT — respond with STRICT JSON ONLY, no preamble, no markdown fences, no commentary. The JSON must match this exact shape:\n\n{\n \"contact_titles_by_segment\": {\n \"enterprise\": [\"string\", ...],\n \"mid_market\": [\"string\", ...],\n \"smb\": [\"string\", ...]\n },\n \"rep_titles\": [\"string\", ...],\n \"industries\": [\"string\", ...],\n \"company_name_prefixes\": [\"string\", ...],\n \"company_name_suffixes\": [\"string\", ...],\n \"region_weights\": {\n \"North America\": number,\n \"EMEA\": number,\n \"APAC\": number,\n \"LATAM\": number\n },\n \"segment_distribution\": {\n \"enterprise\": number,\n \"mid_market\": number,\n \"smb\": number\n },\n \"salesforce_weight\": number,\n \"deal_size_bands\": {\n \"enterprise\": { \"min\": number, \"max\": number },\n \"mid_market\": { \"min\": number, \"max\": number },\n \"smb\": { \"min\": number, \"max\": number }\n },\n \"cycle_days_by_segment\": {\n \"enterprise\": number,\n \"mid_market\": number,\n \"smb\": number\n },\n \"deal_verbs\": [\"string\", ...],\n \"deal_modifiers\": [\"string\", ...],\n \"topics\": [\"string\", ...],\n \"challenges\": [\"string\", ...]\n}\n\nEvery array must have AT LEAST 3 entries. All numeric fields must be positive. Emit JSON and nothing else.`;\n\n/**\n * Build a DemoTaxonomy for the given profile. Throws on network / parse /\n * validation errors so the caller can fall through to hard-coded pools.\n */\nexport async function buildDemoTaxonomy(profile: CompanyProfile, ctx: Context): Promise<DemoTaxonomy> {\n assertReplAi(ctx);\n\n const userMessage = `Company profile:\n\n- company_name: ${profile.company_name}\n- industry: ${profile.industry}\n- product_description: ${profile.product_description}\n- target_customer: ${profile.target_customer}\n- sales_motion: ${profile.sales_motion}\n- average_deal_size: ${profile.average_deal_size ?? \"(unknown)\"}\n- sales_cycle_days: ${profile.sales_cycle_days ?? \"(unknown)\"}\n- primary_crm: ${profile.primary_crm ?? \"(unknown)\"}\n- engagement_tool: ${profile.engagement_tool ?? \"(unknown)\"}\n- user_scope: ${profile.user_scope ?? \"(not set)\"}\n\nProduce the demo taxonomy now as STRICT JSON matching the schema in the system prompt.`;\n\n const { text } = await llmCompleteText(\"demo_taxonomy\", SYSTEM_PROMPT, userMessage, 4096, ctx);\n const cleaned = stripFences(text);\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(\"AI response is not valid JSON\");\n }\n\n return validateTaxonomy(parsed, profile);\n}\n\nfunction stripFences(text: string): string {\n const trimmed = text.trim();\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n if (fenced) return fenced[1]!.trim();\n return trimmed;\n}\n\n/**\n * Validate and normalize a parsed taxonomy payload. Throws on missing or\n * malformed fields; normalizes weight sums and clamps probabilities.\n */\nfunction validateTaxonomy(raw: Record<string, unknown>, profile: CompanyProfile): DemoTaxonomy {\n const strArray = (key: string, min = 3): string[] => {\n const v = raw[key];\n if (!Array.isArray(v)) throw new Error(`Missing or invalid array: ${key}`);\n const items = v.filter((x): x is string => typeof x === \"string\" && x.trim().length > 0);\n if (items.length < min) throw new Error(`${key} must have at least ${min} entries`);\n return items;\n };\n\n const num = (v: unknown, field: string): number => {\n if (typeof v !== \"number\" || !Number.isFinite(v)) {\n throw new Error(`Missing or invalid number: ${field}`);\n }\n return v;\n };\n\n const contactTitlesRaw = raw[\"contact_titles_by_segment\"];\n if (!contactTitlesRaw || typeof contactTitlesRaw !== \"object\") {\n throw new Error(\"Missing contact_titles_by_segment\");\n }\n const ct = contactTitlesRaw as Record<string, unknown>;\n const pickTitles = (k: string): string[] => {\n const arr = ct[k];\n if (!Array.isArray(arr)) throw new Error(`contact_titles_by_segment.${k} missing`);\n const items = arr.filter((x): x is string => typeof x === \"string\" && x.trim().length > 0);\n if (items.length < 3) throw new Error(`contact_titles_by_segment.${k} needs >= 3 entries`);\n return items;\n };\n\n const contact_titles_by_segment = {\n enterprise: pickTitles(\"enterprise\"),\n mid_market: pickTitles(\"mid_market\"),\n smb: pickTitles(\"smb\"),\n };\n\n const rep_titles = strArray(\"rep_titles\");\n const industries = strArray(\"industries\");\n const company_name_prefixes = strArray(\"company_name_prefixes\", 5);\n const company_name_suffixes = strArray(\"company_name_suffixes\", 3);\n const deal_verbs = strArray(\"deal_verbs\");\n const deal_modifiers = strArray(\"deal_modifiers\");\n const topics = strArray(\"topics\");\n const challenges = strArray(\"challenges\");\n\n // Region weights\n const rwRaw = raw[\"region_weights\"];\n if (!rwRaw || typeof rwRaw !== \"object\") throw new Error(\"Missing region_weights\");\n const rw = rwRaw as Record<string, unknown>;\n const na = num(rw[\"North America\"], \"region_weights.North America\");\n const emea = num(rw[\"EMEA\"], \"region_weights.EMEA\");\n const apac = num(rw[\"APAC\"], \"region_weights.APAC\");\n const latam = num(rw[\"LATAM\"], \"region_weights.LATAM\");\n const regionSum = na + emea + apac + latam;\n if (regionSum <= 0) throw new Error(\"region_weights must sum to > 0\");\n const region_weights = {\n \"North America\": na / regionSum,\n \"EMEA\": emea / regionSum,\n \"APAC\": apac / regionSum,\n \"LATAM\": latam / regionSum,\n };\n\n // Segment distribution\n const sdRaw = raw[\"segment_distribution\"];\n if (!sdRaw || typeof sdRaw !== \"object\") throw new Error(\"Missing segment_distribution\");\n const sd = sdRaw as Record<string, unknown>;\n const ent = num(sd[\"enterprise\"], \"segment_distribution.enterprise\");\n const mid = num(sd[\"mid_market\"], \"segment_distribution.mid_market\");\n const smb = num(sd[\"smb\"], \"segment_distribution.smb\");\n const segSum = ent + mid + smb;\n if (segSum <= 0) throw new Error(\"segment_distribution must sum to > 0\");\n const segment_distribution = {\n enterprise: ent / segSum,\n mid_market: mid / segSum,\n smb: smb / segSum,\n };\n\n // Salesforce weight — clamp to [0, 1]\n const sfw = num(raw[\"salesforce_weight\"], \"salesforce_weight\");\n const salesforce_weight = Math.max(0, Math.min(1, sfw));\n\n // Deal size bands\n const dsbRaw = raw[\"deal_size_bands\"];\n if (!dsbRaw || typeof dsbRaw !== \"object\") throw new Error(\"Missing deal_size_bands\");\n const dsb = dsbRaw as Record<string, unknown>;\n const pickBand = (k: string): { min: number; max: number } => {\n const band = dsb[k];\n if (!band || typeof band !== \"object\") throw new Error(`deal_size_bands.${k} missing`);\n const b = band as Record<string, unknown>;\n const min = num(b[\"min\"], `deal_size_bands.${k}.min`);\n const max = num(b[\"max\"], `deal_size_bands.${k}.max`);\n if (min <= 0 || max <= 0 || min > max) {\n throw new Error(`deal_size_bands.${k} invalid min/max`);\n }\n return { min: Math.round(min), max: Math.round(max) };\n };\n const deal_size_bands = {\n enterprise: pickBand(\"enterprise\"),\n mid_market: pickBand(\"mid_market\"),\n smb: pickBand(\"smb\"),\n };\n\n // Cycle days per segment\n const cdRaw = raw[\"cycle_days_by_segment\"];\n if (!cdRaw || typeof cdRaw !== \"object\") throw new Error(\"Missing cycle_days_by_segment\");\n const cd = cdRaw as Record<string, unknown>;\n const cycle_days_by_segment = {\n enterprise: Math.max(1, Math.round(num(cd[\"enterprise\"], \"cycle_days_by_segment.enterprise\"))),\n mid_market: Math.max(1, Math.round(num(cd[\"mid_market\"], \"cycle_days_by_segment.mid_market\"))),\n smb: Math.max(1, Math.round(num(cd[\"smb\"], \"cycle_days_by_segment.smb\"))),\n };\n\n return {\n schema_version: 1,\n profile_updated_at: profile.updated_at,\n contact_titles_by_segment,\n rep_titles,\n industries,\n company_name_prefixes,\n company_name_suffixes,\n region_weights,\n segment_distribution,\n salesforce_weight,\n deal_size_bands,\n cycle_days_by_segment,\n deal_verbs,\n deal_modifiers,\n topics,\n challenges,\n };\n}\n","/**\n * ntrp demo — generate demo data using scenario presets.\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { initSchema } from \"../db/schema.js\";\nimport { generateDemoData } from \"../demo/generator.js\";\nimport type { DemoConfigPayload, DemoScenario } from \"../types.js\";\nimport type { DemoTaxonomy } from \"../demo/taxonomy-schema.js\";\nimport { SCENARIO_LIST, getScenario, pickRandomScenario, resolveScenarioInput } from \"../demo/scenarios.js\";\nimport { printEntityCounts } from \"../output/terminal.js\";\nimport { parseArgs, getString, getNumber, getBool, getFalse } from \"../cli/argparse.js\";\nimport { canUseReplAi } from \"../ai/repl-api.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { loadProfile, isProfileConfigured } from \"../config/profile.js\";\nimport { loadCachedTaxonomy, saveCachedTaxonomy } from \"../demo/taxonomy-cache.js\";\nimport { buildDemoTaxonomy } from \"../ai/demo-taxonomy.js\";\nimport { paint, bold } from \"../ui/theme.js\";\nimport type { CompanyProfile } from \"../types.js\";\nimport { guardDemoEnabled } from \"../config/demo.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<boolean> {\n const { flags } = parseArgs(args, [\"list-scenarios\", \"regen-taxonomy\"]);\n const quiet = ctx.execution.quiet;\n\n if (getBool(flags, \"list-scenarios\")) {\n console.log(chalk.bold(\"\\n Available Scenarios:\\n\"));\n for (const s of SCENARIO_LIST) {\n console.log(` ${chalk.cyan(s.key.padEnd(20))} ${s.label}`);\n console.log(` ${chalk.dim(\" \".repeat(20))} ${s.description}\\n`);\n }\n return true;\n }\n\n if (!guardDemoEnabled()) return false;\n\n const profile = loadProfile();\n const skipProfile = getFalse(flags, \"profile\");\n if (!isProfileConfigured(profile) && !skipProfile) {\n console.error();\n console.error(\" \" + chalk.red(\"No company profile found.\"));\n console.error(\" \" + chalk.dim(\"Run \") + paint(\"accent\", \"/onboard\") + chalk.dim(\" first for a richer demo,\"));\n console.error(\" \" + chalk.dim(\"or pass \") + paint(\"accent\", \"--no-profile\") + chalk.dim(\" to skip.\"));\n console.error();\n markFailure(ctx);\n return false;\n }\n\n // Resolve scenario: explicit --scenario override OR random pick.\n const explicitScenario = getString(flags, \"scenario\", \"s\");\n const resolvedScenario = resolveScenarioInput(explicitScenario);\n if (resolvedScenario === null) {\n console.error(chalk.red(` Unknown scenario: ${explicitScenario}`));\n console.log(chalk.dim(` Valid: ${SCENARIO_LIST.map((s) => s.key).join(\", \")}`));\n markFailure(ctx);\n return false;\n }\n const scenario = resolvedScenario ?? pickRandomScenario();\n\n // Load or build the demo taxonomy. Runs only when a profile is present\n // and the user hasn't opted out via --no-profile. Failures degrade\n // silently to the hard-coded data-pools.\n const regenTaxonomy = getBool(flags, \"regen-taxonomy\");\n let taxonomy: DemoTaxonomy | undefined;\n if (isProfileConfigured(profile) && !skipProfile && canUseReplAi(ctx)) {\n taxonomy = await loadOrBuildTaxonomy(profile!, regenTaxonomy, ctx);\n }\n\n // Announce the chosen scenario (only when randomly picked — explicit\n // overrides stay quiet). Print AFTER taxonomy resolution so the two\n // spinners don't stomp on each other.\n if (!explicitScenario && !quiet) {\n const s = getScenario(scenario);\n console.log();\n console.log(\" \" + paint(\"accent\", \"✓ Scenario: \") + bold(s.label));\n console.log(\" \" + chalk.dim(s.story));\n console.log();\n }\n\n const spinner = quiet\n ? null\n : ora({ text: \"Initializing database...\", discardStdin: false }).start();\n try {\n await initSchema();\n\n const metricsLens = ctx.analysis.primary === \"revenue_metrics\";\n const config: DemoConfigPayload = {\n companyName: getString(flags, \"company\", \"c\") ?? profile?.company_name ?? \"Acme Corp\",\n industry: getString(flags, \"industry\", \"i\") ?? profile?.industry ?? \"SaaS\",\n scenario: scenario as DemoScenario,\n repCount: getNumber(flags, \"reps\", \"r\") ?? 5,\n accountCount: getNumber(flags, \"accounts\", \"a\") ?? 150,\n contactsPerAccount: 3,\n opportunityCount: getNumber(flags, \"opps\", \"o\") ?? (metricsLens ? 80 : 60),\n activityMonths: getNumber(flags, \"months\", \"m\") ?? (metricsLens ? 18 : 15),\n outputFormat: \"direct\",\n whimsy: !getFalse(flags, \"whimsy\"),\n enrichSaas: getFalse(flags, \"no-saas-enrich\") ? false : true,\n saasHistoryMonths: getNumber(flags, \"saas-months\") ?? (metricsLens ? 18 : 18),\n ...(taxonomy ? { taxonomy } : {}),\n };\n\n if (spinner) spinner.text = `Generating \"${scenario}\" scenario...`;\n const result = await generateDemoData(config);\n\n if (result.mode === \"direct\") {\n if (spinner) {\n spinner.succeed(`Generated demo data for \"${chalk.cyan(scenario)}\" scenario`);\n console.log();\n printEntityCounts(result.counts);\n }\n if (!quiet && ctx.analysis.primary !== \"revenue_metrics\") {\n console.log(chalk.dim(\"\\n Run /diagnose to compute vital signs.\\n\"));\n }\n }\n } catch (err) {\n if (spinner) spinner.fail(\"Generation failed\");\n console.error(chalk.red(String(err)));\n markFailure(ctx);\n return false;\n }\n\n return true;\n}\n\nfunction markFailure(ctx: Context): void {\n if (ctx.oneShot) {\n process.exitCode = 1;\n }\n}\n\n/**\n * Load the cached taxonomy if present and fresh; otherwise build a new one\n * from the profile via AI, save it, and return it. On any AI/network/parse\n * failure, returns `undefined` so the factories fall back to hard-coded\n * pools — the demo still runs, just with generic shape.\n */\nasync function loadOrBuildTaxonomy(\n profile: CompanyProfile,\n forceRegen: boolean,\n ctx: Context,\n): Promise<DemoTaxonomy | undefined> {\n if (!forceRegen) {\n const cached = loadCachedTaxonomy(profile);\n if (cached) return cached;\n }\n\n const spinnerText = forceRegen\n ? \"Rebuilding market taxonomy…\"\n : \"Researching your market taxonomy…\";\n const spinner = ora({ text: spinnerText, discardStdin: false }).start();\n try {\n const taxonomy = await buildDemoTaxonomy(profile, ctx);\n saveCachedTaxonomy(taxonomy);\n spinner.succeed(\"Market taxonomy ready\");\n return taxonomy;\n } catch (err) {\n spinner.fail(\"Couldn't build market taxonomy — using generic data pools\");\n console.log(\" \" + chalk.dim(String((err as Error).message ?? err)));\n return undefined;\n }\n}\n","/**\n * Classify ingested data as pipeline-native, revenue-ledger, or hybrid.\n */\n\nimport type { DataSnapshot } from \"../types.js\";\nimport type { DataSourceType } from \"../types.js\";\n\nconst LEDGER_HEADER_SIGNALS = [\n \"period\", \"mrr\", \"arr\", \"event_type\", \"event type\",\n \"churn\", \"expansion\", \"renewal\", \"revenue_type\", \"revenue type\",\n];\n\n/** Detect revenue-ledger shape from CSV headers (pre-ingest). */\nexport function detectRevenueLedgerHeaders(headers: string[]): boolean {\n const lower = headers.map((h) => h.toLowerCase().trim());\n const hasPeriod = lower.some((h) => h === \"period\" || h.includes(\"month\") || h.includes(\"billing_period\"));\n const hasAmount = lower.some((h) => h === \"mrr\" || h === \"arr\" || h === \"amount\" || h === \"revenue\");\n const hasType = lower.some((h) =>\n h === \"event_type\" || h === \"event type\" || h === \"type\" || h === \"revenue_type\",\n );\n const signalHits = lower.filter((h) =>\n LEDGER_HEADER_SIGNALS.some((s) => h.includes(s)),\n ).length;\n return (hasPeriod && hasAmount) || signalHits >= 2 || (hasAmount && hasType);\n}\n\n/** Classify from loaded snapshot + optional revenue_events count. */\nexport function classifyDataSource(\n snapshot: DataSnapshot,\n revenueEventCount = 0,\n): DataSourceType {\n const hasPipeline = snapshot.opportunities.length > 0;\n const hasLedger = revenueEventCount > 0;\n\n if (hasPipeline && hasLedger) return \"hybrid\";\n if (hasLedger) return \"revenue_ledger\";\n return \"pipeline\";\n}\n\nexport function dataSourceLabel(type: DataSourceType): string {\n switch (type) {\n case \"pipeline\": return \"pipeline-native\";\n case \"revenue_ledger\": return \"revenue ledger\";\n case \"hybrid\": return \"hybrid (pipeline + ledger)\";\n }\n}\n","/**\n * Import revenue ledger CSV rows into revenue_events.\n */\n\nimport * as db from \"../db/queries.js\";\n\nfunction pickField(row: Record<string, string>, keys: string[]): string {\n for (const k of keys) {\n for (const [header, val] of Object.entries(row)) {\n if (header.toLowerCase().trim() === k.toLowerCase() && val?.trim()) {\n return val.trim();\n }\n }\n }\n return \"\";\n}\n\nfunction pickAmount(row: Record<string, string>): number {\n const raw = pickField(row, [\"mrr\", \"arr\", \"amount\", \"revenue\"]);\n const n = Number(raw.replace(/[$,]/g, \"\"));\n return isNaN(n) ? 0 : n;\n}\n\nfunction normalizeEventType(raw: string): string {\n const s = raw.toLowerCase().trim();\n if (s.includes(\"churn\")) return \"churn\";\n if (s.includes(\"expansion\") || s.includes(\"upsell\")) return \"expansion\";\n if (s.includes(\"contraction\") || s.includes(\"downgrade\")) return \"contraction\";\n if (s.includes(\"renew\")) return \"renewal\";\n if (s.includes(\"new\")) return \"new\";\n return s || \"renewal\";\n}\n\nexport async function importRevenueRows(\n rows: Record<string, string>[],\n sourceSystem: string,\n): Promise<{ imported: number; errors: string[] }> {\n let imported = 0;\n const errors: string[] = [];\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]!;\n const period = pickField(row, [\"period\", \"month\", \"billing_period\", \"date\"]);\n const amount = pickAmount(row);\n const eventType = normalizeEventType(pickField(row, [\"event_type\", \"event type\", \"type\", \"revenue_type\"]));\n\n if (!period || amount === 0) {\n errors.push(`Row ${i + 1}: missing period or amount`);\n continue;\n }\n\n try {\n await db.insertRevenueEvent({\n period: period.slice(0, 7),\n amount,\n event_type: eventType,\n source_system: sourceSystem,\n source_id: pickField(row, [\"id\", \"source_id\"]) || `row-${i + 1}`,\n raw_data: row as unknown as Record<string, unknown>,\n });\n imported++;\n } catch (e) {\n errors.push(`Row ${i + 1}: ${String(e)}`);\n }\n }\n\n return { imported, errors };\n}\n","/**\n * ntrp ingest <file.csv> — parse, detect, map, and import a CSV file.\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport { initSchema } from \"../db/schema.js\";\nimport { parseCSV } from \"../pipeline/csv-parse.js\";\nimport { detectEntityType } from \"../pipeline/csv-detect.js\";\nimport { importRows } from \"../pipeline/importer.js\";\nimport { resolveIdentities } from \"../pipeline/resolver.js\";\nimport * as db from \"../db/queries.js\";\nimport { parseArgs, getString, getBool, getFalse } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { loadProfile } from \"../config/profile.js\";\nimport { paint } from \"../ui/theme.js\";\nimport { guardDemoEnabled } from \"../config/demo.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n const { positional, flags } = parseArgs(args, [\n \"skip-resolve\",\n \"demo\",\n \"list-scenarios\",\n \"regen-taxonomy\",\n ]);\n\n // `/ingest --demo` delegates to the demo generator. This is the preferred\n // entrypoint; `/demo` still exists but is hidden from the help listing.\n if (getBool(flags, \"demo\") || getBool(flags, \"list-scenarios\")) {\n if (getBool(flags, \"demo\") && !guardDemoEnabled()) return;\n const { handler: demoHandler } = await import(\"./generate.js\");\n const passthrough = args.filter((a) => a !== \"--demo\");\n await demoHandler(passthrough, ctx);\n return;\n }\n\n const file = positional[0];\n const source = getString(flags, \"source\", \"s\") ?? \"salesforce\";\n const skipResolve = getBool(flags, \"skip-resolve\");\n\n if (!file) {\n console.error(chalk.red(\" Usage: /ingest <file> [--source salesforce|hubspot|outreach]\"));\n console.error(chalk.dim(\" /ingest --demo [--scenario <name>]\"));\n process.exit(1);\n }\n\n if (!existsSync(file)) {\n console.error(chalk.red(` File not found: ${file}`));\n process.exit(1);\n }\n\n const profile = loadProfile();\n const skipProfile = getFalse(flags, \"profile\");\n if (!profile && !skipProfile) {\n console.error();\n console.error(\" \" + chalk.red(\"No company profile found.\"));\n console.error(\" \" + chalk.dim(\"Run \") + paint(\"accent\", \"/onboard\") + chalk.dim(\" first for better column mapping,\"));\n console.error(\" \" + chalk.dim(\"or pass \") + paint(\"accent\", \"--no-profile\") + chalk.dim(\" to skip.\"));\n console.error();\n process.exit(1);\n }\n\n const spinner = ora({ text: \"Initializing database...\", discardStdin: false }).start();\n try {\n await initSchema();\n spinner.text = \"Parsing CSV...\";\n\n const content = readFileSync(file, \"utf-8\");\n const { rows, headers } = parseCSV(content);\n\n if (rows.length === 0) {\n spinner.fail(\"CSV is empty\");\n process.exit(1);\n }\n\n const { detectRevenueLedgerHeaders } = await import(\"../metrics/classify-source.js\");\n if (detectRevenueLedgerHeaders(headers)) {\n spinner.text = \"Importing revenue ledger rows...\";\n const { importRevenueRows } = await import(\"../pipeline/revenue-importer.js\");\n const uploadId = await db.insertCSVUpload({\n source_system: source,\n original_filename: basename(file),\n row_count: rows.length,\n column_mappings: { entity_type: \"revenue_ledger\" },\n status: \"processing\",\n });\n const result = await importRevenueRows(rows, source);\n await db.updateCSVUpload(uploadId, {\n status: \"complete\",\n processed_at: new Date().toISOString(),\n row_count: result.imported,\n });\n spinner.succeed(\n `Imported ${chalk.bold(result.imported.toString())} revenue events from ${chalk.dim(basename(file))}`,\n );\n if (result.errors.length > 0) {\n console.log(chalk.yellow(` ${result.errors.length} rows skipped`));\n }\n if (ctx.analysis) {\n ctx.analysis.data_source_type = \"revenue_ledger\";\n }\n console.log(chalk.dim(\" Run \") + chalk.cyan(\"/metrics\") + chalk.dim(\" for SaaS metrics with ledger-backed retention.\"));\n return `${result.imported} revenue events from ${basename(file)}`;\n }\n\n spinner.text = \"Detecting entity type...\";\n const detection = detectEntityType(headers, source);\n if (!detection) {\n spinner.fail(`Could not auto-detect entity type for source: ${source}`);\n console.log(chalk.dim(\" Headers found: \" + headers.join(\", \")));\n process.exit(1);\n }\n\n spinner.text = `Importing ${rows.length} ${detection.entityType} rows...`;\n\n const uploadId = await db.insertCSVUpload({\n source_system: source,\n original_filename: basename(file),\n row_count: rows.length,\n column_mappings: detection.mappings,\n status: \"processing\",\n });\n\n const result = await importRows({\n rows,\n mappings: detection.mappings,\n sourceSystem: source,\n entityType: detection.entityType,\n });\n\n await db.updateCSVUpload(uploadId, {\n status: \"complete\",\n processed_at: new Date().toISOString(),\n row_count: result.imported,\n });\n\n spinner.succeed(\n `Imported ${chalk.bold(result.imported.toString())} ${detection.entityType} from ${chalk.dim(basename(file))} (${source})`,\n );\n\n if (result.errors.length > 0) {\n console.log(chalk.yellow(` ${result.errors.length} rows skipped`));\n for (const err of result.errors.slice(0, 3)) {\n console.log(chalk.dim(` - ${err}`));\n }\n if (result.errors.length > 3) {\n console.log(chalk.dim(` ... and ${result.errors.length - 3} more`));\n }\n }\n\n if (!skipResolve) {\n const resolveSpinner = ora({ text: \"Running identity resolution...\", discardStdin: false }).start();\n const resolved = await resolveIdentities();\n if (resolved.resolved > 0) {\n resolveSpinner.succeed(\n `Resolved ${resolved.resolved} duplicates (${resolved.orgsResolved} orgs, ${resolved.peopleResolved} people)`,\n );\n } else {\n resolveSpinner.succeed(\"No duplicates found\");\n }\n }\n\n return `${result.imported} ${detection.entityType} from ${basename(file)}`;\n } catch (err) {\n spinner.fail(\"Import failed\");\n console.error(chalk.red(String(err)));\n process.exit(1);\n }\n}\n","/**\n * Segment engine — filter + auto-generate for DuckDB.\n */\n\nimport type { Segment, SegmentFilter, DataSnapshot } from \"../types.js\";\nimport { all } from \"../db/connection.js\";\nimport { insertSegment } from \"../db/queries.js\";\n\nexport interface ComputeScope {\n orgIds: string[];\n peopleIds: string[];\n oppIds: string[];\n}\n\n/**\n * Resolve a segment's filters against a DataSnapshot to produce entity ID sets.\n */\nexport function resolveSegmentScopeFromSnapshot(\n segment: Segment,\n snapshot: DataSnapshot,\n): ComputeScope {\n const orgIds: string[] = [];\n const peopleIds: string[] = [];\n const oppIds: string[] = [];\n\n if (segment.entity_type === \"organizations\") {\n const filtered = filterEntities(snapshot.organizations, segment.filters);\n const orgIdSet = new Set(filtered.map((o) => o.id as string));\n orgIds.push(...orgIdSet);\n // Include people at these orgs\n for (const p of snapshot.people) {\n if (p.organization_id && orgIdSet.has(p.organization_id as string)) {\n peopleIds.push(p.id as string);\n }\n }\n // Include opps at these orgs\n for (const o of snapshot.opportunities) {\n if (o.organization_id && orgIdSet.has(o.organization_id as string)) {\n oppIds.push(o.id as string);\n }\n }\n } else if (segment.entity_type === \"opportunities\") {\n const filtered = filterEntities(snapshot.opportunities, segment.filters);\n oppIds.push(...filtered.map((o) => o.id as string));\n const orgIdSet = new Set<string>();\n for (const o of filtered) {\n if (o.organization_id) orgIdSet.add(o.organization_id as string);\n }\n orgIds.push(...orgIdSet);\n for (const p of snapshot.people) {\n if (p.organization_id && orgIdSet.has(p.organization_id as string)) {\n peopleIds.push(p.id as string);\n }\n }\n } else if (segment.entity_type === \"people\") {\n const filtered = filterEntities(snapshot.people, segment.filters);\n peopleIds.push(...filtered.map((p) => p.id as string));\n const orgIdSet = new Set<string>();\n for (const p of filtered) {\n if (p.organization_id) orgIdSet.add(p.organization_id as string);\n }\n orgIds.push(...orgIdSet);\n for (const o of snapshot.opportunities) {\n if (o.organization_id && orgIdSet.has(o.organization_id as string)) {\n oppIds.push(o.id as string);\n }\n }\n }\n\n return { orgIds, peopleIds, oppIds };\n}\n\nfunction filterEntities(\n entities: Record<string, unknown>[],\n filters: SegmentFilter[],\n): Record<string, unknown>[] {\n return entities.filter((entity) =>\n filters.every((f) => matchFilter(entity, f)),\n );\n}\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction matchFilter(entity: Record<string, unknown>, filter: SegmentFilter): boolean {\n const value = getNestedValue(entity, filter.field);\n switch (filter.operator) {\n case \"equals\":\n return String(value) === String(filter.value);\n case \"not_equals\":\n return String(value) !== String(filter.value);\n case \"greater_than\":\n return Number(value) > Number(filter.value);\n case \"less_than\":\n return Number(value) < Number(filter.value);\n case \"contains\":\n return String(value).toLowerCase().includes(String(filter.value).toLowerCase());\n case \"in\":\n return Array.isArray(filter.value) && filter.value.includes(String(value));\n default:\n return false;\n }\n}\n\n/**\n * Auto-generate segments from entity metadata.\n * Scans organizations for distinct industries, sizes, and regions.\n * Scans opportunities for distinct owners (reps) and amount buckets.\n */\nexport async function autoGenerateSegments(): Promise<number> {\n // Clear existing auto-generated segments\n await all(\"DELETE FROM segments WHERE is_auto_generated = true\");\n\n let count = 0;\n\n // Industry segments from organization metadata\n const industries = await all<{ industry: string; cnt: number }>(\n `SELECT json_extract_string(metadata, '$.industry') as industry, COUNT(*) as cnt\n FROM organizations\n WHERE json_extract_string(metadata, '$.industry') IS NOT NULL\n GROUP BY industry\n HAVING cnt >= 5\n ORDER BY cnt DESC`,\n );\n for (const row of industries) {\n await insertSegment({\n name: `Industry: ${row.industry}`,\n entity_type: \"organizations\",\n filters: [{ field: \"metadata.industry\", operator: \"equals\", value: row.industry }],\n is_auto_generated: true,\n });\n count++;\n }\n\n // Size segments from organization metadata\n const sizes = await all<{ size: string; cnt: number }>(\n `SELECT json_extract_string(metadata, '$.size') as size, COUNT(*) as cnt\n FROM organizations\n WHERE json_extract_string(metadata, '$.size') IS NOT NULL\n GROUP BY size\n HAVING cnt >= 5\n ORDER BY cnt DESC`,\n );\n for (const row of sizes) {\n await insertSegment({\n name: `Size: ${row.size}`,\n entity_type: \"organizations\",\n filters: [{ field: \"metadata.size\", operator: \"equals\", value: row.size }],\n is_auto_generated: true,\n });\n count++;\n }\n\n // Deal size buckets\n const oppCount = await all<{ cnt: number }>(\"SELECT COUNT(*) as cnt FROM opportunities\");\n if ((oppCount[0]?.cnt ?? 0) >= 10) {\n // Create Enterprise (>$100K) and SMB (≤$100K) segments\n await insertSegment({\n name: \"Enterprise Deals (>$100K)\",\n entity_type: \"opportunities\",\n filters: [{ field: \"amount\", operator: \"greater_than\", value: 100000 }],\n is_auto_generated: true,\n });\n count++;\n\n await insertSegment({\n name: \"SMB Deals (≤$100K)\",\n entity_type: \"opportunities\",\n filters: [{ field: \"amount\", operator: \"less_than\", value: 100001 }],\n is_auto_generated: true,\n });\n count++;\n }\n\n // Rep segments from opportunity owners\n const owners = await all<{ owner_id: string; owner_name: string; cnt: number }>(\n `SELECT o.owner_id, p.canonical_name as owner_name, COUNT(*) as cnt\n FROM opportunities o\n JOIN people p ON o.owner_id = p.id\n WHERE o.owner_id IS NOT NULL\n GROUP BY o.owner_id, p.canonical_name\n HAVING cnt >= 3\n ORDER BY cnt DESC`,\n );\n for (const row of owners) {\n await insertSegment({\n name: `Rep: ${row.owner_name}`,\n entity_type: \"opportunities\",\n filters: [{ field: \"owner_id\", operator: \"equals\", value: row.owner_id }],\n is_auto_generated: true,\n });\n count++;\n }\n\n return count;\n}\n","/**\n * Motion-specific SaaS metric benchmarks — parallel to profile-presets.ts.\n */\n\nimport type { SalesMotion } from \"../types.js\";\nimport type { MetricStatus } from \"../metrics/types.js\";\n\nexport interface MetricThreshold {\n green: number;\n yellow: number;\n}\n\nexport interface MetricBenchmarkSet {\n nrr: MetricThreshold;\n grr: MetricThreshold;\n win_rate: MetricThreshold;\n pipeline_coverage: MetricThreshold;\n magic_number: MetricThreshold;\n payback_months: MetricThreshold; // lower is better — inverted in status helpers\n}\n\nexport const METRICS_BENCHMARKS: Record<SalesMotion, MetricBenchmarkSet> = {\n plg: {\n nrr: { green: 110, yellow: 100 },\n grr: { green: 85, yellow: 75 },\n win_rate: { green: 25, yellow: 15 },\n pipeline_coverage: { green: 4.0, yellow: 2.5 },\n magic_number: { green: 1.0, yellow: 0.75 },\n payback_months: { green: 12, yellow: 18 },\n },\n smb_velocity: {\n nrr: { green: 105, yellow: 95 },\n grr: { green: 88, yellow: 78 },\n win_rate: { green: 22, yellow: 12 },\n pipeline_coverage: { green: 3.5, yellow: 2.0 },\n magic_number: { green: 0.9, yellow: 0.6 },\n payback_months: { green: 14, yellow: 20 },\n },\n mid_market: {\n nrr: { green: 100, yellow: 90 },\n grr: { green: 90, yellow: 80 },\n win_rate: { green: 20, yellow: 12 },\n pipeline_coverage: { green: 3.0, yellow: 2.0 },\n magic_number: { green: 0.75, yellow: 0.5 },\n payback_months: { green: 16, yellow: 22 },\n },\n enterprise: {\n nrr: { green: 95, yellow: 85 },\n grr: { green: 92, yellow: 82 },\n win_rate: { green: 15, yellow: 8 },\n pipeline_coverage: { green: 2.5, yellow: 1.5 },\n magic_number: { green: 0.6, yellow: 0.4 },\n payback_months: { green: 18, yellow: 24 },\n },\n};\n\nconst MOTION_LABELS: Record<SalesMotion, string> = {\n plg: \"PLG\",\n smb_velocity: \"SMB Velocity\",\n mid_market: \"Mid-Market\",\n enterprise: \"Enterprise\",\n};\n\nexport function resolveMetricBenchmarks(motion: SalesMotion | null | undefined): MetricBenchmarkSet {\n return METRICS_BENCHMARKS[motion ?? \"mid_market\"];\n}\n\nexport function motionBenchmarkLabel(motion: SalesMotion | null | undefined): string {\n return MOTION_LABELS[motion ?? \"mid_market\"];\n}\n\nexport function metricStatusHigherIsBetter(\n value: number,\n threshold: MetricThreshold,\n): MetricStatus {\n if (value >= threshold.green) return \"green\";\n if (value >= threshold.yellow) return \"yellow\";\n return \"red\";\n}\n\nexport function metricStatusLowerIsBetter(\n value: number,\n threshold: MetricThreshold,\n): MetricStatus {\n if (value <= threshold.green) return \"green\";\n if (value <= threshold.yellow) return \"yellow\";\n return \"red\";\n}\n","import type { VitalSignStatus } from \"../types.js\";\n\nexport function scoreToStatus(score: number, t: { green_above: number; red_below: number }): VitalSignStatus {\n if (score >= t.green_above) return \"green\";\n if (score >= t.red_below) return \"yellow\";\n return \"red\";\n}\n\nexport function isClosedStage(stage: string): boolean {\n const s = stage.toLowerCase();\n return s.includes(\"closed\") || s.includes(\"won\") || s.includes(\"lost\");\n}\n\nexport function sortByAmountDesc(arr: Record<string, unknown>[]): void {\n arr.sort((a, b) => ((b.amount as number) ?? 0) - ((a.amount as number) ?? 0));\n}\n","import type { FreshnessThresholds, DataSnapshot, VitalSignResult } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport { DEFAULT_THRESHOLDS } from \"../baselines/defaults.js\";\nimport { scoreToStatus, isClosedStage } from \"./shared.js\";\n\nexport function computeFreshness(\n snapshot: DataSnapshot,\n scope?: ComputeScope,\n thresholds?: FreshnessThresholds,\n): VitalSignResult {\n const t = thresholds ?? DEFAULT_THRESHOLDS.freshness;\n const now = new Date();\n\n const peopleCutoff = new Date(now.getTime() - t.people_window_days * 86400000).toISOString();\n const orgCutoff = new Date(now.getTime() - t.org_window_days * 86400000).toISOString();\n const oppCutoff = new Date(now.getTime() - t.opp_window_days * 86400000).toISOString();\n\n const allPeople = snapshot.people.filter((p) => {\n if (p.canonical_id != null) return false;\n if (scope?.peopleIds) return scope.peopleIds.includes(p.id as string);\n return true;\n });\n const activePeopleRows = snapshot.activities.filter(\n (a) => a.person_id != null && (a.occurred_at as string) >= peopleCutoff,\n );\n const allOrgs = snapshot.organizations.filter((o) => {\n if (o.canonical_id != null) return false;\n if (scope?.orgIds) return scope.orgIds.includes(o.id as string);\n return true;\n });\n const activeOrgRows = snapshot.activities.filter(\n (a) => a.organization_id != null && (a.occurred_at as string) >= orgCutoff,\n );\n const allOpps = snapshot.opportunities.filter((o) => {\n if (scope?.oppIds) return scope.oppIds.includes(o.id as string);\n return true;\n });\n const activeOppRows = snapshot.activities.filter(\n (a) => a.opportunity_id != null && (a.occurred_at as string) >= oppCutoff,\n );\n\n // People freshness\n const totalPeople = allPeople.length;\n const activePeopleIds = new Set(activePeopleRows.map((r) => r.person_id as string));\n const canonicalPeopleIds = new Set(allPeople.map((p) => p.id as string));\n const freshPeopleCount = [...activePeopleIds].filter((id) => canonicalPeopleIds.has(id)).length;\n const peopleFreshness = totalPeople > 0 ? (freshPeopleCount / totalPeople) * 100 : 100;\n\n const stalePeople = allPeople\n .filter((p) => !activePeopleIds.has(p.id as string))\n .slice(0, 25)\n .map((p) => ({ id: p.id, name: p.canonical_name, email: p.canonical_email, type: \"person\" as const, issue: `No activity in ${t.people_window_days} days` }));\n\n // Organization freshness\n const totalOrgs = allOrgs.length;\n const activeOrgIds = new Set(activeOrgRows.map((r) => r.organization_id as string));\n const canonicalOrgIds = new Set(allOrgs.map((o) => o.id as string));\n const freshOrgCount = [...activeOrgIds].filter((id) => canonicalOrgIds.has(id)).length;\n const orgFreshness = totalOrgs > 0 ? (freshOrgCount / totalOrgs) * 100 : 100;\n\n const staleOrgs = allOrgs\n .filter((o) => !activeOrgIds.has(o.id as string))\n .slice(0, 25)\n .map((o) => ({ id: o.id, name: o.canonical_name, domain: o.canonical_domain, type: \"organization\" as const, issue: `No activity in ${t.org_window_days} days` }));\n\n // Opportunity freshness\n const totalOpps = allOpps.length;\n const activeOppIds = new Set(activeOppRows.map((r) => r.opportunity_id as string));\n const today = now.toISOString().slice(0, 10);\n let freshOppCount = 0;\n const staleOpps: Record<string, unknown>[] = [];\n let staleOppTotalAmount = 0;\n\n for (const opp of allOpps) {\n const hasRecentActivity = activeOppIds.has(opp.id as string);\n const stage = (opp.current_stage as string) ?? \"\";\n const isClosed = isClosedStage(stage);\n const isPastDue = opp.close_date && (opp.close_date as string) < today && !isClosed;\n\n if (hasRecentActivity && !isPastDue) {\n freshOppCount++;\n } else {\n const issues: string[] = [];\n if (!hasRecentActivity) issues.push(`No activity in ${t.opp_window_days} days`);\n if (isPastDue) issues.push(`Close date ${opp.close_date} is in the past`);\n if (typeof opp.amount === \"number\") staleOppTotalAmount += opp.amount;\n if (staleOpps.length < 25) {\n staleOpps.push({ id: opp.id, name: opp.canonical_name, amount: opp.amount, close_date: opp.close_date, stage: opp.current_stage, type: \"opportunity\", issue: issues.join(\"; \") });\n }\n }\n }\n const oppFreshness = totalOpps > 0 ? (freshOppCount / totalOpps) * 100 : 100;\n\n const score = Math.round(peopleFreshness * t.weights.people + orgFreshness * t.weights.organizations + oppFreshness * t.weights.opportunities);\n\n return {\n vital_sign: \"freshness\",\n score,\n status: scoreToStatus(score, t),\n components: {\n people: { score: Math.round(peopleFreshness), total: totalPeople, fresh: freshPeopleCount, stale: totalPeople - freshPeopleCount, window_days: t.people_window_days },\n organizations: { score: Math.round(orgFreshness), total: totalOrgs, fresh: freshOrgCount, stale: totalOrgs - freshOrgCount, window_days: t.org_window_days },\n opportunities: { score: Math.round(oppFreshness), total: totalOpps, fresh: freshOppCount, stale: totalOpps - freshOppCount, window_days: t.opp_window_days },\n },\n entity_details: [...stalePeople, ...staleOrgs, ...staleOpps],\n dollar_value: staleOppTotalAmount > 0 ? staleOppTotalAmount : null,\n dollar_label: \"pipeline at risk\",\n };\n}\n","import type { VitalSignStatus, FlowRateThresholds, DataSnapshot, VitalSignResult } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport { DEFAULT_THRESHOLDS } from \"../baselines/defaults.js\";\nimport { isClosedStage, sortByAmountDesc } from \"./shared.js\";\n\nfunction flowScoreToStatus(avgDays: number, t: FlowRateThresholds): VitalSignStatus {\n if (avgDays <= t.green_days) return \"green\";\n if (avgDays <= t.yellow_days) return \"yellow\";\n return \"red\";\n}\n\nfunction daysToScore(avgDays: number, maxDays: number): number {\n return Math.max(0, Math.round(100 * (1 - avgDays / maxDays)));\n}\n\nexport function computeFlowRate(\n snapshot: DataSnapshot,\n scope?: ComputeScope,\n thresholds?: FlowRateThresholds,\n): VitalSignResult {\n const t = thresholds ?? DEFAULT_THRESHOLDS.flow_rate;\n const now = new Date();\n const today = now.toISOString().slice(0, 10);\n\n const allOpps = snapshot.opportunities.filter((o) => {\n if (scope?.oppIds) return scope.oppIds.includes(o.id as string);\n return true;\n });\n\n if (allOpps.length === 0) {\n return { vital_sign: \"flow_rate\", score: 100, status: \"green\", components: { message: \"No opportunities to measure\" }, entity_details: [], dollar_value: null, dollar_label: null };\n }\n\n const openOpps: typeof allOpps = [];\n const closedOpps: typeof allOpps = [];\n\n for (const opp of allOpps) {\n const stage = (opp.current_stage as string) ?? \"\";\n if (isClosedStage(stage)) closedOpps.push(opp);\n else openOpps.push(opp);\n }\n\n const openAges: number[] = [];\n const stuckDeals: Record<string, unknown>[] = [];\n let openTotalAmount = 0;\n\n for (const opp of openOpps) {\n const createdAt = new Date(opp.created_at as string);\n const ageDays = Math.floor((now.getTime() - createdAt.getTime()) / 86400000);\n openAges.push(ageDays);\n if (typeof opp.amount === \"number\") openTotalAmount += opp.amount;\n const lastUpdate = new Date(opp.updated_at as string);\n const daysSinceUpdate = Math.floor((now.getTime() - lastUpdate.getTime()) / 86400000);\n const isPastDue = opp.close_date && (opp.close_date as string) < today;\n if (daysSinceUpdate > t.stuck_days || isPastDue) {\n stuckDeals.push({ id: opp.id, name: opp.canonical_name, amount: opp.amount, stage: opp.current_stage, age_days: ageDays, days_since_update: daysSinceUpdate, close_date: opp.close_date, past_due: isPastDue, type: \"opportunity\", issue: isPastDue ? `Past due (close date ${opp.close_date}), ${daysSinceUpdate} days since last update` : `Stuck for ${daysSinceUpdate} days in \"${opp.current_stage}\"` });\n }\n }\n\n const stuckTotalAmount = stuckDeals.reduce((sum, d) => sum + (typeof d.amount === \"number\" ? d.amount : 0), 0);\n\n const cycleTimes: number[] = [];\n for (const opp of closedOpps) {\n const createdAt = new Date(opp.created_at as string);\n const closedAt = opp.close_date ? new Date(opp.close_date as string) : new Date(opp.updated_at as string);\n const days = Math.floor((closedAt.getTime() - createdAt.getTime()) / 86400000);\n if (days >= 0) cycleTimes.push(days);\n }\n\n const avgOpenAge = openAges.length > 0 ? openAges.reduce((a, b) => a + b, 0) / openAges.length : 0;\n const avgCycleTime = cycleTimes.length > 0 ? cycleTimes.reduce((a, b) => a + b, 0) / cycleTimes.length : 0;\n const medianCycleTime = cycleTimes.length > 0 ? cycleTimes.sort((a, b) => a - b)[Math.floor(cycleTimes.length / 2)]! : 0;\n\n const baseScore = daysToScore(avgOpenAge, t.max_days);\n const stuckPenalty = openOpps.length > 0 ? Math.round((stuckDeals.length / openOpps.length) * 20) : 0;\n const score = Math.max(0, baseScore - stuckPenalty);\n\n sortByAmountDesc(stuckDeals);\n\n return {\n vital_sign: \"flow_rate\", score, status: flowScoreToStatus(avgOpenAge, t),\n components: { open_deals: { count: openOpps.length, avg_age_days: Math.round(avgOpenAge), stuck_count: stuckDeals.length, stuck_threshold_days: t.stuck_days, total_amount: openTotalAmount, stuck_total_amount: stuckTotalAmount }, closed_deals: { count: closedOpps.length, avg_cycle_days: Math.round(avgCycleTime), median_cycle_days: medianCycleTime }, total_deals: allOpps.length },\n entity_details: stuckDeals.slice(0, 25),\n dollar_value: stuckTotalAmount > 0 ? stuckTotalAmount : null,\n dollar_label: \"stuck in pipeline\",\n };\n}\n","import type { DropRateThresholds, DataSnapshot, VitalSignResult } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport { DEFAULT_THRESHOLDS } from \"../baselines/defaults.js\";\nimport { scoreToStatus, isClosedStage, sortByAmountDesc } from \"./shared.js\";\n\nexport function computeDropRate(\n snapshot: DataSnapshot,\n scope?: ComputeScope,\n thresholds?: DropRateThresholds,\n): VitalSignResult {\n const t = thresholds ?? DEFAULT_THRESHOLDS.drop_rate;\n const now = new Date();\n const inactiveCutoff = new Date(now.getTime() - t.recency_days * 86400000).toISOString();\n\n let people = snapshot.people;\n const allOpps = snapshot.opportunities.filter((o) => {\n if (scope?.oppIds) return scope.oppIds.includes(o.id as string);\n return true;\n });\n const recentOppActivity = snapshot.activities.filter(\n (a) => a.opportunity_id != null && (a.occurred_at as string) >= inactiveCutoff,\n );\n\n if (scope?.peopleIds) {\n const scopeSet = new Set(scope.peopleIds);\n people = people.filter((p) => {\n const canonId = (p.canonical_id as string | null) ?? (p.id as string);\n return scopeSet.has(canonId);\n });\n }\n\n const canonicalSources = new Map<string, Set<string>>();\n const canonicalNames = new Map<string, { name: string; email: string | null }>();\n\n for (const p of people) {\n const canonId = (p.canonical_id as string | null) ?? (p.id as string);\n if (!canonicalSources.has(canonId)) canonicalSources.set(canonId, new Set());\n canonicalSources.get(canonId)!.add(p.source_system as string);\n if (!p.canonical_id) canonicalNames.set(canonId, { name: p.canonical_name as string, email: p.canonical_email as string | null });\n }\n\n let marketingOnlyCount = 0;\n let totalMarketingPeople = 0;\n const droppedPeople: Record<string, unknown>[] = [];\n\n for (const [canonId, systems] of canonicalSources) {\n const inMarketing = [...systems].some((s) => t.marketing_systems.includes(s));\n const inSales = [...systems].some((s) => t.sales_systems.includes(s));\n if (inMarketing) {\n totalMarketingPeople++;\n if (!inSales) {\n marketingOnlyCount++;\n const info = canonicalNames.get(canonId);\n if (droppedPeople.length < 25) {\n droppedPeople.push({ id: canonId, name: info?.name ?? \"Unknown\", email: info?.email, type: \"person\", source_systems: [...systems], issue: `Exists in ${[...systems].join(\", \")} but not in any sales system` });\n }\n }\n }\n }\n\n const crossSystemRetention = totalMarketingPeople > 0 ? ((totalMarketingPeople - marketingOnlyCount) / totalMarketingPeople) * 100 : 100;\n\n const activeOppIds = new Set((recentOppActivity).map((r) => r.opportunity_id as string));\n let abandonedCount = 0;\n const openOpps: typeof allOpps = [];\n const abandonedOpps: Record<string, unknown>[] = [];\n\n for (const opp of allOpps) {\n const stage = (opp.current_stage as string) ?? \"\";\n if (isClosedStage(stage)) continue;\n openOpps.push(opp);\n if (!activeOppIds.has(opp.id as string)) {\n abandonedCount++;\n if (abandonedOpps.length < 25) {\n abandonedOpps.push({ id: opp.id, name: opp.canonical_name, amount: opp.amount, stage: opp.current_stage, type: \"opportunity\", issue: `Open opportunity with no activity in ${t.recency_days} days` });\n }\n }\n }\n\n const oppRetention = openOpps.length > 0 ? ((openOpps.length - abandonedCount) / openOpps.length) * 100 : 100;\n const score = Math.round(crossSystemRetention * t.weights.cross_system + oppRetention * t.weights.abandoned);\n sortByAmountDesc(abandonedOpps);\n\n // Dollar value: estimate lost revenue at handoff using conversion rate math\n let dollarValue: number | null = null;\n const droppedEntityCount = marketingOnlyCount;\n\n // Compute conversion rate from closed-won opportunities\n let closedWonCount = 0;\n let closedWonAmountSum = 0;\n const totalOppsCreated = allOpps.length;\n\n for (const opp of allOpps) {\n const stage = ((opp.current_stage as string) ?? \"\").toLowerCase();\n if (stage.includes(\"closed\") && stage.includes(\"won\")) {\n closedWonCount++;\n if (typeof opp.amount === \"number\") closedWonAmountSum += opp.amount;\n }\n }\n\n if (closedWonCount > 0 && totalOppsCreated > 0 && droppedEntityCount > 0) {\n const conversionRate = closedWonCount / totalOppsCreated;\n const avgDealSize = closedWonAmountSum / closedWonCount;\n dollarValue = Math.round(droppedEntityCount * conversionRate * avgDealSize);\n } else if (droppedEntityCount > 0) {\n // Fallback: use drop percentage × total open pipeline value\n let totalOpenPipelineValue = 0;\n for (const opp of openOpps) {\n if (typeof opp.amount === \"number\") totalOpenPipelineValue += opp.amount;\n }\n const dropPercentage = totalMarketingPeople > 0 ? marketingOnlyCount / totalMarketingPeople : 0;\n const fallback = Math.round(dropPercentage * totalOpenPipelineValue);\n if (fallback > 0) dollarValue = fallback;\n }\n\n return {\n vital_sign: \"drop_rate\", score, status: scoreToStatus(score, t),\n components: { cross_system: { score: Math.round(crossSystemRetention), total_marketing_people: totalMarketingPeople, dropped_count: marketingOnlyCount, retained_count: totalMarketingPeople - marketingOnlyCount }, abandoned_opportunities: { score: Math.round(oppRetention), total_open: openOpps.length, abandoned_count: abandonedCount, active_count: openOpps.length - abandonedCount } },\n entity_details: [...droppedPeople, ...abandonedOpps],\n dollar_value: dollarValue,\n dollar_label: \"est. lost at handoff\",\n };\n}\n","import type { SignalToNoiseThresholds, DataSnapshot, VitalSignResult } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport { DEFAULT_THRESHOLDS } from \"../baselines/defaults.js\";\nimport { getConfigValue } from \"../config/store.js\";\nimport { scoreToStatus, isClosedStage } from \"./shared.js\";\n\nexport function computeSignalToNoise(\n snapshot: DataSnapshot,\n scope?: ComputeScope,\n thresholds?: SignalToNoiseThresholds,\n): VitalSignResult {\n const t = thresholds ?? DEFAULT_THRESHOLDS.signal_to_noise;\n const now = new Date();\n const lookbackCutoff = new Date(now.getTime() - t.lookback_days * 86400000).toISOString();\n\n const allOppsWithStage = snapshot.opportunities.filter((o) => {\n if (scope?.oppIds) return scope.oppIds.includes(o.id as string);\n return true;\n });\n const recentActivities = snapshot.activities.filter((a) => (a.occurred_at as string) >= lookbackCutoff);\n const pipelinePeopleSource = snapshot.people.filter((p) => p.canonical_id == null);\n\n const openOppOrgIds = new Set<string>();\n const openOppIds = new Set<string>();\n\n for (const opp of allOppsWithStage) {\n const stage = (opp.current_stage as string) ?? \"\";\n if (!isClosedStage(stage)) {\n openOppIds.add(opp.id as string);\n if (opp.organization_id) openOppOrgIds.add(opp.organization_id as string);\n }\n }\n\n const pipelinePeopleByOrg = new Set<string>();\n for (const p of pipelinePeopleSource) {\n if (p.organization_id && openOppOrgIds.has(p.organization_id as string)) {\n if (!scope?.peopleIds || scope.peopleIds.includes(p.id as string)) {\n pipelinePeopleByOrg.add(p.id as string);\n }\n }\n }\n\n let activities = recentActivities;\n if (scope?.peopleIds || scope?.orgIds) {\n const scopedPeople = scope?.peopleIds ? new Set(scope.peopleIds) : null;\n const scopedOrgs = scope?.orgIds ? new Set(scope.orgIds) : null;\n activities = activities.filter((act) => {\n const pid = act.person_id as string | null;\n const oid = act.organization_id as string | null;\n const oppId = act.opportunity_id as string | null;\n if (pid && scopedPeople?.has(pid)) return true;\n if (oid && scopedOrgs?.has(oid)) return true;\n if (oppId && openOppIds.has(oppId)) return true;\n return !scopedPeople && !scopedOrgs;\n });\n }\n\n if (activities.length === 0) {\n return { vital_sign: \"signal_to_noise\", score: 100, status: \"green\", components: { message: \"No recent activities to measure\" }, entity_details: [], dollar_value: null, dollar_label: null };\n }\n\n let signalCount = 0;\n let noiseCount = 0;\n const noisyActivities: Record<string, unknown>[] = [];\n\n for (const act of activities) {\n const pid = act.person_id as string | null;\n const oid = act.organization_id as string | null;\n const oppId = act.opportunity_id as string | null;\n const isSignal = (oppId && openOppIds.has(oppId)) || (pid && pipelinePeopleByOrg.has(pid)) || (oid && openOppOrgIds.has(oid));\n if (isSignal) signalCount++;\n else {\n noiseCount++;\n if (noisyActivities.length < 25) {\n noisyActivities.push({ id: act.id, type: \"activity\", activity_type: act.activity_type, occurred_at: act.occurred_at, person_id: act.person_id, organization_id: act.organization_id, issue: \"Activity not linked to any open pipeline\" });\n }\n }\n }\n\n const score = Math.round((signalCount / activities.length) * 100);\n\n // Dollar value: noiseCount × hoursPerActivity × repHourlyCost\n const repHourlyCost = Number(getConfigValue(\"rep_hourly_cost\")) || 75;\n const hoursPerActivity = Number(getConfigValue(\"hours_per_activity\")) || 0.25;\n const noiseDollarValue = noiseCount > 0 ? Math.round(noiseCount * hoursPerActivity * repHourlyCost) : null;\n\n return {\n vital_sign: \"signal_to_noise\", score, status: scoreToStatus(score, t),\n components: { signal_count: signalCount, noise_count: noiseCount, total_activities: activities.length, ratio: Math.round((signalCount / activities.length) * 100) / 100, open_opportunities: openOppIds.size, pipeline_orgs: openOppOrgIds.size, pipeline_people: pipelinePeopleByOrg.size },\n entity_details: noisyActivities,\n dollar_value: noiseDollarValue,\n dollar_label: \"misdirected effort\",\n };\n}\n","import type { ThreadDepthThresholds, DataSnapshot, VitalSignResult } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport { DEFAULT_THRESHOLDS } from \"../baselines/defaults.js\";\nimport { scoreToStatus, isClosedStage, sortByAmountDesc } from \"./shared.js\";\n\nexport function computeThreadDepth(\n snapshot: DataSnapshot,\n scope?: ComputeScope,\n thresholds?: ThreadDepthThresholds,\n): VitalSignResult {\n const t = thresholds ?? DEFAULT_THRESHOLDS.thread_depth;\n const now = new Date();\n const cutoff = new Date(now.getTime() - t.activity_window_days * 86400000).toISOString();\n\n const allOpps = snapshot.opportunities.filter((o) => {\n if (scope?.oppIds) return scope.oppIds.includes(o.id as string);\n return true;\n });\n const recentActivities = snapshot.activities.filter(\n (a) => a.person_id != null && (a.occurred_at as string) >= cutoff,\n );\n\n const openOpps = allOpps.filter((opp) => {\n const stage = (opp.current_stage as string) ?? \"\";\n return !isClosedStage(stage);\n });\n\n if (openOpps.length === 0) {\n return { vital_sign: \"thread_depth\", score: 100, status: \"green\", components: { message: \"No open opportunities to measure\" }, entity_details: [], dollar_value: null, dollar_label: null };\n }\n\n const directOppPeople = new Map<string, Set<string>>();\n const orgPeople = new Map<string, Set<string>>();\n\n for (const act of recentActivities) {\n const oppId = act.opportunity_id as string | null;\n const personId = act.person_id as string;\n const orgId = act.organization_id as string | null;\n if (oppId) {\n if (!directOppPeople.has(oppId)) directOppPeople.set(oppId, new Set());\n directOppPeople.get(oppId)!.add(personId);\n }\n if (orgId) {\n if (!orgPeople.has(orgId)) orgPeople.set(orgId, new Set());\n orgPeople.get(orgId)!.add(personId);\n }\n }\n\n let singleThreaded = 0;\n let multiThreaded = 0;\n let totalDepth = 0;\n let totalValue = 0;\n let weightedDepth = 0;\n let singleThreadedTotalAmount = 0;\n const singleThreadedDeals: Record<string, unknown>[] = [];\n\n for (const opp of openOpps) {\n const oppId = opp.id as string;\n const oppOrgId = opp.organization_id as string | null;\n const peopleDirect = directOppPeople.get(oppId) ?? new Set<string>();\n const peopleOrg = oppOrgId ? (orgPeople.get(oppOrgId) ?? new Set<string>()) : new Set<string>();\n const allActivePeople = new Set([...peopleDirect, ...peopleOrg]);\n const depth = allActivePeople.size;\n\n totalDepth += depth;\n const amount = (opp.amount as number) ?? 0;\n totalValue += amount;\n weightedDepth += depth * amount;\n\n if (depth < t.multi_thread_threshold) {\n singleThreaded++;\n if (typeof opp.amount === \"number\") singleThreadedTotalAmount += opp.amount;\n singleThreadedDeals.push({ id: opp.id, name: opp.canonical_name, amount: opp.amount, stage: opp.current_stage, thread_depth: depth, type: \"opportunity\", issue: depth === 0 ? \"No active contacts — zero-threaded\" : `Below threshold — only ${depth} active contact${depth === 1 ? \"\" : \"s\"} (need ${t.multi_thread_threshold})` });\n } else {\n multiThreaded++;\n }\n }\n\n const avgDepth = totalDepth / openOpps.length;\n const weightedAvgDepth = totalValue > 0 ? weightedDepth / totalValue : avgDepth;\n const multiThreadedPct = (multiThreaded / openOpps.length) * 100;\n const score = Math.round(multiThreadedPct);\n\n sortByAmountDesc(singleThreadedDeals);\n\n return {\n vital_sign: \"thread_depth\", score, status: scoreToStatus(score, t),\n components: { avg_thread_depth: Math.round(avgDepth * 10) / 10, weighted_avg_depth: Math.round(weightedAvgDepth * 10) / 10, single_threaded: singleThreaded, multi_threaded: multiThreaded, total_open_deals: openOpps.length, multi_thread_threshold: t.multi_thread_threshold, activity_window_days: t.activity_window_days },\n entity_details: singleThreadedDeals.slice(0, 25),\n dollar_value: singleThreadedTotalAmount > 0 ? singleThreadedTotalAmount : null,\n dollar_label: \"single-threaded\",\n };\n}\n","/**\n * GTM Health Score — DuckDB version.\n * Prefetches all data from DuckDB into a DataSnapshot, then runs\n * the same vital sign computation logic.\n */\n\nimport type { VitalSign, VitalSignStatus, Segment, ResolvedThresholds, DataSnapshot, VitalSignResult } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport { resolveSegmentScopeFromSnapshot } from \"../pipeline/segments.js\";\nimport { getResolvedThresholds } from \"../baselines/resolve.js\";\nimport { computeFreshness } from \"./freshness.js\";\nimport { computeFlowRate } from \"./flow-rate.js\";\nimport { computeDropRate } from \"./drop-rate.js\";\nimport { computeSignalToNoise } from \"./signal-to-noise.js\";\nimport { computeThreadDepth } from \"./thread-depth.js\";\nimport { all } from \"../db/connection.js\";\nimport * as db from \"../db/queries.js\";\n\nexport interface HealthComputeResult {\n overall_score: number;\n overall_status: VitalSignStatus;\n gating_vital_sign: VitalSign;\n vital_signs: VitalSignResult[];\n total_value_at_risk: number | null;\n}\n\nexport interface FullComputeResult {\n aggregate: HealthComputeResult;\n segments: { segment: Segment; result: HealthComputeResult }[];\n}\n\nexport type DiagnoseEvent =\n | { phase: \"snapshot\" }\n | { phase: \"vital\"; result: VitalSignResult }\n | { phase: \"aggregate\"; result: HealthComputeResult }\n | { phase: \"segment_progress\"; index: number; total: number; name: string }\n | { phase: \"segment_done\"; segment: Segment; result: HealthComputeResult }\n | { phase: \"complete\"; result: FullComputeResult };\n\n/** Convert any Date values in a row to ISO strings for consistent comparison. */\nfunction normalizeRow(row: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(row)) {\n out[k] = v instanceof Date ? v.toISOString() : v;\n }\n return out;\n}\n\n/** Prefetch all entity data from DuckDB into a DataSnapshot. */\nexport async function prefetchSnapshot(): Promise<DataSnapshot> {\n const [people, organizations, opportunities, activities] = await Promise.all([\n all(`SELECT * FROM people`),\n all(`SELECT * FROM organizations`),\n all(`SELECT * FROM opportunities`),\n all(`SELECT id, activity_type, occurred_at, person_id, organization_id, opportunity_id FROM activities`),\n ]);\n return {\n people: people.map(normalizeRow),\n organizations: organizations.map(normalizeRow),\n opportunities: opportunities.map(normalizeRow),\n activities: activities.map(normalizeRow),\n };\n}\n\nconst LAYERS: { layer: number; signs: VitalSign[] }[] = [\n { layer: 1, signs: [\"freshness\"] },\n { layer: 2, signs: [\"flow_rate\", \"drop_rate\"] },\n { layer: 3, signs: [\"signal_to_noise\"] },\n { layer: 4, signs: [\"thread_depth\"] },\n];\n\nfunction findGatingSign(results: VitalSignResult[]): { sign: VitalSign; status: VitalSignStatus } {\n const resultMap = new Map(results.map((r) => [r.vital_sign, r]));\n for (const layer of LAYERS) {\n for (const sign of layer.signs) {\n const result = resultMap.get(sign);\n if (result?.status === \"red\") return { sign, status: \"red\" };\n }\n for (const sign of layer.signs) {\n const result = resultMap.get(sign);\n if (result?.status === \"yellow\") return { sign, status: \"yellow\" };\n }\n }\n let lowestSign: VitalSign = \"freshness\";\n let lowestScore = 100;\n for (const r of results) {\n if (r.score < lowestScore) { lowestScore = r.score; lowestSign = r.vital_sign; }\n }\n return { sign: lowestSign, status: \"green\" };\n}\n\nfunction computeVitalSigns(\n snapshot: DataSnapshot,\n scope?: ComputeScope,\n thresholds?: ResolvedThresholds,\n): VitalSignResult[] {\n return [\n computeFreshness(snapshot, scope, thresholds?.freshness),\n computeFlowRate(snapshot, scope, thresholds?.flow_rate),\n computeDropRate(snapshot, scope, thresholds?.drop_rate),\n computeSignalToNoise(snapshot, scope, thresholds?.signal_to_noise),\n computeThreadDepth(snapshot, scope, thresholds?.thread_depth),\n ];\n}\n\nfunction buildHealthResult(vitalSigns: VitalSignResult[]): HealthComputeResult {\n const gating = findGatingSign(vitalSigns);\n const avgScore = Math.round(vitalSigns.reduce((sum, r) => sum + r.score, 0) / vitalSigns.length);\n const dollarSum = vitalSigns.reduce((sum, r) => sum + (r.dollar_value ?? 0), 0);\n const totalValueAtRisk = dollarSum > 0 ? dollarSum : null;\n return { overall_score: avgScore, overall_status: gating.status, gating_vital_sign: gating.sign, vital_signs: vitalSigns, total_value_at_risk: totalValueAtRisk };\n}\n\n/**\n * Compute aggregate + per-segment health scores and store in DuckDB.\n */\nexport async function computeFullHealth(uploadBatchId?: string): Promise<FullComputeResult> {\n const batchId = uploadBatchId ?? db.uuid();\n const thresholds = await getResolvedThresholds();\n const snapshot = await prefetchSnapshot();\n\n // Compute aggregate\n const aggregateVitals = computeVitalSigns(snapshot, undefined, thresholds);\n const aggregate = buildHealthResult(aggregateVitals);\n\n // Store aggregate readings\n await db.insertVitalReadings(\n aggregateVitals.map((vs) => ({\n segment_id: null, vital_sign: vs.vital_sign, score: vs.score, status: vs.status,\n components: vs.components, entity_details: vs.entity_details, dollar_value: vs.dollar_value,\n upload_batch_id: batchId,\n })),\n );\n await db.insertHealthReading({\n segment_id: null, overall_score: aggregate.overall_score, overall_status: aggregate.overall_status,\n gating_vital_sign: aggregate.gating_vital_sign,\n vital_sign_scores: Object.fromEntries(aggregateVitals.map((vs) => [vs.vital_sign, { score: vs.score, status: vs.status }])),\n total_value_at_risk: aggregate.total_value_at_risk,\n upload_batch_id: batchId,\n });\n\n // Get segments and compute per-segment\n const segRows = await db.getSegments();\n const segments: Segment[] = segRows.map((s) => ({\n id: s.id, name: s.name, entity_type: s.entity_type as Segment[\"entity_type\"],\n filters: typeof s.filters === \"string\" ? JSON.parse(s.filters) : s.filters,\n is_auto_generated: s.is_auto_generated, created_at: \"\", updated_at: \"\",\n }));\n\n const segmentResults: { segment: Segment; result: HealthComputeResult }[] = [];\n\n for (const segment of segments) {\n try {\n const scope = resolveSegmentScopeFromSnapshot(segment, snapshot);\n if (scope.orgIds.length === 0 && scope.peopleIds.length === 0 && scope.oppIds.length === 0) continue;\n\n const segVitals = computeVitalSigns(snapshot, scope, thresholds);\n const segResult = buildHealthResult(segVitals);\n\n await db.insertVitalReadings(\n segVitals.map((vs) => ({\n segment_id: segment.id, vital_sign: vs.vital_sign, score: vs.score, status: vs.status,\n components: vs.components, entity_details: vs.entity_details, dollar_value: vs.dollar_value,\n upload_batch_id: batchId,\n })),\n );\n await db.insertHealthReading({\n segment_id: segment.id, overall_score: segResult.overall_score, overall_status: segResult.overall_status,\n gating_vital_sign: segResult.gating_vital_sign,\n vital_sign_scores: Object.fromEntries(segVitals.map((vs) => [vs.vital_sign, { score: vs.score, status: vs.status }])),\n total_value_at_risk: segResult.total_value_at_risk,\n upload_batch_id: batchId,\n });\n\n segmentResults.push({ segment, result: segResult });\n } catch (e) {\n console.error(`Segment ${segment.name} computation failed:`, e);\n }\n }\n\n return { aggregate, segments: segmentResults };\n}\n\n/**\n * Streaming version of computeFullHealth — yields DiagnoseEvents as each\n * vital sign / segment computes, allowing a progressive UI to render progress.\n */\nexport async function* computeFullHealthStream(\n uploadBatchId?: string,\n): AsyncGenerator<DiagnoseEvent> {\n const batchId = uploadBatchId ?? db.uuid();\n const thresholds = await getResolvedThresholds();\n const snapshot = await prefetchSnapshot();\n\n yield { phase: \"snapshot\" };\n\n // Compute each vital sign individually so we can yield after each one\n const vitalFns = [\n () => computeFreshness(snapshot, undefined, thresholds.freshness),\n () => computeFlowRate(snapshot, undefined, thresholds.flow_rate),\n () => computeDropRate(snapshot, undefined, thresholds.drop_rate),\n () => computeSignalToNoise(snapshot, undefined, thresholds.signal_to_noise),\n () => computeThreadDepth(snapshot, undefined, thresholds.thread_depth),\n ];\n\n const aggregateVitals: VitalSignResult[] = [];\n for (const fn of vitalFns) {\n const result = fn();\n aggregateVitals.push(result);\n // Store in DB between yields — gives event loop time for re-renders\n await db.insertVitalReading({\n segment_id: null, vital_sign: result.vital_sign, score: result.score, status: result.status,\n components: result.components, entity_details: result.entity_details, dollar_value: result.dollar_value,\n upload_batch_id: batchId,\n });\n yield { phase: \"vital\", result };\n }\n\n const aggregate = buildHealthResult(aggregateVitals);\n await db.insertHealthReading({\n segment_id: null, overall_score: aggregate.overall_score, overall_status: aggregate.overall_status,\n gating_vital_sign: aggregate.gating_vital_sign,\n vital_sign_scores: Object.fromEntries(aggregateVitals.map((vs) => [vs.vital_sign, { score: vs.score, status: vs.status }])),\n total_value_at_risk: aggregate.total_value_at_risk,\n upload_batch_id: batchId,\n });\n yield { phase: \"aggregate\", result: aggregate };\n\n // Get segments and compute per-segment\n const segRows = await db.getSegments();\n const segments: Segment[] = segRows.map((s) => ({\n id: s.id, name: s.name, entity_type: s.entity_type as Segment[\"entity_type\"],\n filters: typeof s.filters === \"string\" ? JSON.parse(s.filters) : s.filters,\n is_auto_generated: s.is_auto_generated, created_at: \"\", updated_at: \"\",\n }));\n\n const segmentResults: { segment: Segment; result: HealthComputeResult }[] = [];\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]!;\n yield { phase: \"segment_progress\", index: i, total: segments.length, name: segment.name };\n\n try {\n const scope = resolveSegmentScopeFromSnapshot(segment, snapshot);\n if (scope.orgIds.length === 0 && scope.peopleIds.length === 0 && scope.oppIds.length === 0) continue;\n\n const segVitals = computeVitalSigns(snapshot, scope, thresholds);\n const segResult = buildHealthResult(segVitals);\n\n await db.insertVitalReadings(\n segVitals.map((vs) => ({\n segment_id: segment.id, vital_sign: vs.vital_sign, score: vs.score, status: vs.status,\n components: vs.components, entity_details: vs.entity_details, dollar_value: vs.dollar_value,\n upload_batch_id: batchId,\n })),\n );\n await db.insertHealthReading({\n segment_id: segment.id, overall_score: segResult.overall_score, overall_status: segResult.overall_status,\n gating_vital_sign: segResult.gating_vital_sign,\n vital_sign_scores: Object.fromEntries(segVitals.map((vs) => [vs.vital_sign, { score: vs.score, status: vs.status }])),\n total_value_at_risk: segResult.total_value_at_risk,\n upload_batch_id: batchId,\n });\n\n segmentResults.push({ segment, result: segResult });\n yield { phase: \"segment_done\", segment, result: segResult };\n } catch (e) {\n console.error(`Segment ${segment.name} computation failed:`, e);\n }\n }\n\n const fullResult: FullComputeResult = { aggregate, segments: segmentResults };\n yield { phase: \"complete\", result: fullResult };\n}\n","import type { DataSnapshot } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport type { MetricStatus } from \"./types.js\";\nimport type { MetricBenchmarkSet } from \"../baselines/metrics-benchmarks.js\";\nimport {\n metricStatusHigherIsBetter,\n metricStatusLowerIsBetter,\n resolveMetricBenchmarks,\n motionBenchmarkLabel,\n} from \"../baselines/metrics-benchmarks.js\";\nimport type { SalesMotion } from \"../types.js\";\n\n/** Filter opportunities by ComputeScope (or return all if no scope). */\nexport function scopeOpps(snapshot: DataSnapshot, scope?: ComputeScope): Record<string, unknown>[] {\n if (!scope) return snapshot.opportunities;\n const idSet = new Set(scope.oppIds);\n return snapshot.opportunities.filter((o) => idSet.has(o.id as string));\n}\n\n/** Filter organizations by ComputeScope (or return all if no scope). */\nexport function scopeOrgs(snapshot: DataSnapshot, scope?: ComputeScope): Record<string, unknown>[] {\n if (!scope) return snapshot.organizations;\n const idSet = new Set(scope.orgIds);\n return snapshot.organizations.filter((o) => idSet.has(o.id as string));\n}\n\nexport function isClosedWon(stage: string | null | undefined): boolean {\n if (!stage) return false;\n const s = stage.toLowerCase();\n return s === \"closed won\" || s === \"closedwon\" || s === \"closed-won\";\n}\n\nexport function isClosedLost(stage: string | null | undefined): boolean {\n if (!stage) return false;\n const s = stage.toLowerCase();\n return s === \"closed lost\" || s === \"closedlost\" || s === \"closed-lost\";\n}\n\nexport function isOpenStage(stage: string | null | undefined): boolean {\n if (!stage) return false;\n return !isClosedWon(stage) && !isClosedLost(stage);\n}\n\n/** Days between two date strings. */\nexport function daysBetween(a: string, b: string): number {\n const msA = new Date(a).getTime();\n const msB = new Date(b).getTime();\n return Math.abs(msB - msA) / (1000 * 60 * 60 * 24);\n}\n\n/** Default stage probabilities for weighted pipeline. */\nexport const STAGE_PROBABILITIES: Record<string, number> = {\n \"prospecting\": 0.10,\n \"qualification\": 0.20,\n \"discovery\": 0.30,\n \"proposal\": 0.50,\n \"negotiation\": 0.80,\n \"closed won\": 1.0,\n \"closed lost\": 0.0,\n};\n\n/** Get stage probability — check raw_data.Probability first, fall back to STAGE_PROBABILITIES. */\nexport function getStageProbability(opp: Record<string, unknown>): number {\n const rawData = opp.raw_data as Record<string, unknown> | undefined;\n if (rawData?.Probability != null) {\n const p = Number(rawData.Probability);\n if (!isNaN(p)) return p > 1 ? p / 100 : p;\n }\n const stage = ((opp.current_stage as string) ?? \"\").toLowerCase();\n return STAGE_PROBABILITIES[stage] ?? 0.25;\n}\n\n// ── Status threshold helpers (motion-aware) ──\n\nexport function resolveBenchmarksForMotion(motion?: SalesMotion | null): MetricBenchmarkSet {\n return resolveMetricBenchmarks(motion);\n}\n\nexport function nrrStatus(value: number, benchmarks = resolveMetricBenchmarks(\"mid_market\")): MetricStatus {\n return metricStatusHigherIsBetter(value, benchmarks.nrr);\n}\n\nexport function grrStatus(value: number, benchmarks = resolveMetricBenchmarks(\"mid_market\")): MetricStatus {\n return metricStatusHigherIsBetter(value, benchmarks.grr);\n}\n\nexport function winRateStatus(value: number, benchmarks = resolveMetricBenchmarks(\"mid_market\")): MetricStatus {\n return metricStatusHigherIsBetter(value, benchmarks.win_rate);\n}\n\nexport function pipelineCoverageStatus(value: number, benchmarks = resolveMetricBenchmarks(\"mid_market\")): MetricStatus {\n return metricStatusHigherIsBetter(value, benchmarks.pipeline_coverage);\n}\n\nexport function motionBenchmarkNote(\n metricKey: keyof MetricBenchmarkSet,\n motion?: SalesMotion | null,\n): string {\n const b = resolveMetricBenchmarks(motion);\n const label = motionBenchmarkLabel(motion);\n const t = b[metricKey];\n if (metricKey === \"payback_months\") {\n return `${label} benchmark: <${t.green} months`;\n }\n return `${label} benchmark: >${t.green}${metricKey.includes(\"rate\") || metricKey === \"nrr\" || metricKey === \"grr\" ? \"%\" : \"x\"}`;\n}\n","/**\n * Scan dataset history depth and recommend analysis cadence.\n */\n\nimport type {\n CompanyProfile,\n DataCoverage,\n DataSnapshot,\n DataSourceType,\n MetricsCadence,\n MetricsComparison,\n SalesMotion,\n} from \"../types.js\";\nimport { isClosedWon } from \"./helpers.js\";\nimport { dataSourceLabel } from \"./classify-source.js\";\n\nfunction distinctMonths(dates: string[]): number {\n const months = new Set<string>();\n for (const d of dates) {\n if (!d) continue;\n const dt = new Date(d);\n if (isNaN(dt.getTime())) continue;\n months.add(`${dt.getUTCFullYear()}-${String(dt.getUTCMonth() + 1).padStart(2, \"0\")}`);\n }\n return months.size;\n}\n\nfunction distinctQuarters(dates: string[]): number {\n const quarters = new Set<string>();\n for (const d of dates) {\n if (!d) continue;\n const dt = new Date(d);\n if (isNaN(dt.getTime())) continue;\n const q = Math.floor(dt.getUTCMonth() / 3) + 1;\n quarters.add(`${dt.getUTCFullYear()}-Q${q}`);\n }\n return quarters.size;\n}\n\nfunction defaultCadence(motion: SalesMotion, salesCycleDays?: number): MetricsCadence {\n if (salesCycleDays && salesCycleDays > 90) return \"quarterly\";\n if (motion === \"plg\" || motion === \"smb_velocity\") return \"monthly\";\n return \"quarterly\";\n}\n\nfunction eligibleComparisons(months: number, quarters: number): MetricsComparison[] {\n const out: MetricsComparison[] = [\"snapshot\"];\n if (months >= 2) out.push(\"mom\");\n if (quarters >= 2) out.push(\"qoq\");\n if (months >= 6) out.push(\"ttm\");\n if (months >= 13) out.push(\"yoy\");\n return out;\n}\n\nexport function scanDataCoverage(\n snapshot: DataSnapshot,\n sourceType: DataSourceType,\n profile: CompanyProfile | null,\n revenueEventCount = 0,\n): DataCoverage {\n const closedWon = snapshot.opportunities.filter((o) =>\n isClosedWon(o.current_stage as string),\n );\n\n const closeDates = closedWon\n .map((o) => o.close_date as string | null)\n .filter((d): d is string => !!d);\n\n const sorted = [...closeDates].sort();\n const earliest = sorted[0] ?? null;\n const latest = sorted[sorted.length - 1] ?? null;\n\n const months = distinctMonths(closeDates);\n const quarters = distinctQuarters(closeDates);\n\n const orgWins = new Map<string, number>();\n for (const o of closedWon) {\n const orgId = o.organization_id as string | null;\n if (!orgId) continue;\n orgWins.set(orgId, (orgWins.get(orgId) ?? 0) + 1);\n }\n const orgsWithMultiple = [...orgWins.values()].filter((n) => n >= 2).length;\n\n let dealTypeCount = 0;\n for (const o of closedWon) {\n const meta = o.metadata as Record<string, unknown> | undefined;\n if (meta?.deal_type) dealTypeCount++;\n }\n const hasDealType = closedWon.length > 0 && dealTypeCount / closedWon.length >= 0.2;\n\n const motion = profile?.sales_motion ?? \"mid_market\";\n const recommended_cadence = defaultCadence(motion, profile?.sales_cycle_days);\n\n const warnings: string[] = [];\n if (months < 3) {\n warnings.push(\"Less than 3 months of close history — trends are directional only\");\n }\n if (!hasDealType && sourceType !== \"revenue_ledger\") {\n warnings.push(\"No deal_type metadata — expansion ARR inferred from org deal order\");\n }\n if (sourceType === \"pipeline\" && closedWon.length > 0) {\n warnings.push(\"Pipeline-only data — upload a revenue ledger for higher-confidence retention metrics\");\n }\n if (revenueEventCount === 0 && sourceType === \"revenue_ledger\") {\n warnings.push(\"Revenue ledger detected but no events imported yet\");\n }\n\n return {\n earliest_close_date: earliest,\n latest_close_date: latest,\n distinct_months: months,\n distinct_quarters: quarters,\n closed_won_count: closedWon.length,\n orgs_with_multiple_wins: orgsWithMultiple,\n has_deal_type_metadata: hasDealType,\n has_revenue_events: revenueEventCount > 0,\n recommended_cadence,\n eligible_comparisons: eligibleComparisons(months, quarters),\n warnings,\n };\n}\n\nexport function coverageTier(coverage: DataCoverage): string {\n if (coverage.distinct_months >= 13 || coverage.distinct_quarters >= 5) return \"board_ready\";\n if (coverage.distinct_months >= 6 || coverage.distinct_quarters >= 3) return \"reportable\";\n if (coverage.distinct_months >= 3 || coverage.distinct_quarters >= 2) return \"directional\";\n return \"snapshot\";\n}\n\nexport function formatCoverageHeader(\n sourceType: DataSourceType,\n coverage: DataCoverage,\n): string {\n const tier = coverageTier(coverage);\n const span = coverage.distinct_months > 0\n ? `${coverage.distinct_months} months`\n : \"no close history\";\n return `Data: ${dataSourceLabel(sourceType)} · ${span} · ${coverage.recommended_cadence} cadence · ${tier} tier`;\n}\n","/**\n * Build shared context for metrics computation (coverage, benchmarks, source type).\n */\n\nimport type { DataCoverage, DataSnapshot, DataSourceType, SalesMotion } from \"../types.js\";\nimport type { MetricBenchmarkSet } from \"../baselines/metrics-benchmarks.js\";\nimport { resolveMetricBenchmarks } from \"../baselines/metrics-benchmarks.js\";\nimport { loadProfile } from \"../config/profile.js\";\nimport { prefetchSnapshot } from \"../vitals/health-score.js\";\nimport * as db from \"../db/queries.js\";\nimport { classifyDataSource } from \"./classify-source.js\";\nimport { scanDataCoverage } from \"./coverage.js\";\n\nexport interface MetricsComputeContext {\n snapshot: DataSnapshot;\n coverage: DataCoverage;\n sourceType: DataSourceType;\n salesMotion: SalesMotion;\n benchmarks: MetricBenchmarkSet;\n revenueEventCount: number;\n}\n\nexport async function buildMetricsComputeContext(): Promise<MetricsComputeContext> {\n const snapshot = await prefetchSnapshot();\n const profile = loadProfile();\n const revenueEventCount = await db.getRevenueEventCount();\n const sourceType = classifyDataSource(snapshot, revenueEventCount);\n const coverage = scanDataCoverage(snapshot, sourceType, profile, revenueEventCount);\n const salesMotion = profile?.sales_motion ?? \"mid_market\";\n\n return {\n snapshot,\n coverage,\n sourceType,\n salesMotion,\n benchmarks: resolveMetricBenchmarks(salesMotion),\n revenueEventCount,\n };\n}\n","/**\n * Revenue metrics: ARR, New ARR, Expansion ARR, Churned ARR, Contraction ARR.\n * Derived from opportunities + organizations data.\n */\n\nimport type { DataSnapshot } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport type { MetricResult } from \"./types.js\";\nimport { scopeOpps, isClosedWon } from \"./helpers.js\";\nimport { formatCurrency } from \"../output/formatters.js\";\nimport type { MetricBenchmarkSet } from \"../baselines/metrics-benchmarks.js\";\n\nexport function computeRevenueMetrics(\n snapshot: DataSnapshot,\n scope?: ComputeScope,\n _benchmarks?: MetricBenchmarkSet,\n): MetricResult[] {\n const opps = scopeOpps(snapshot, scope);\n\n const closedWon = opps.filter((o) => isClosedWon(o.current_stage as string));\n const arr = closedWon.reduce((sum, o) => sum + ((o.amount as number) ?? 0), 0);\n\n // Group closed-won by organization for retention logic\n const orgWins = new Map<string, Record<string, unknown>[]>();\n for (const o of closedWon) {\n const orgId = o.organization_id as string | null;\n if (!orgId) continue;\n if (!orgWins.has(orgId)) orgWins.set(orgId, []);\n orgWins.get(orgId)!.push(o);\n }\n\n // Classify each closed-won deal as New or Expansion\n let newArr = 0;\n let expansionArr = 0;\n\n for (const o of closedWon) {\n const orgId = o.organization_id as string | null;\n const amount = (o.amount as number) ?? 0;\n const metadata = o.metadata as Record<string, unknown> | undefined;\n const dealType = metadata?.deal_type as string | undefined;\n\n if (dealType === \"Expansion\") {\n expansionArr += amount;\n } else if (dealType === \"New Business\") {\n newArr += amount;\n } else if (orgId) {\n // Fallback: if org has more than one closed-won deal, later ones are expansion\n const orgDeals = orgWins.get(orgId) ?? [];\n if (orgDeals.length > 1) {\n // Sort by created_at to determine first deal\n const sorted = [...orgDeals].sort((a, b) =>\n new Date(a.created_at as string).getTime() - new Date(b.created_at as string).getTime(),\n );\n if (o === sorted[0]) {\n newArr += amount;\n } else {\n expansionArr += amount;\n }\n } else {\n newArr += amount;\n }\n } else {\n newArr += amount;\n }\n }\n\n // Churned ARR: orgs with prior closed-won but no active opps or recent closed-won in trailing 12mo\n const now = new Date();\n const twelveMonthsAgo = new Date(now);\n twelveMonthsAgo.setMonth(twelveMonthsAgo.getMonth() - 12);\n\n let churnedArr = 0;\n const churnedOrgs: string[] = [];\n\n for (const [orgId, deals] of orgWins) {\n const recentWon = deals.some((d) => {\n const closeDate = d.close_date as string | null;\n if (!closeDate) return false;\n return new Date(closeDate) >= twelveMonthsAgo;\n });\n if (recentWon) continue;\n\n // Check for active open opps at this org\n const hasActiveOpp = opps.some(\n (o) => o.organization_id === orgId && !isClosedWon(o.current_stage as string) &&\n !(o.current_stage as string || \"\").toLowerCase().includes(\"lost\"),\n );\n if (hasActiveOpp) continue;\n\n // This org has churned — sum their historical ARR\n const orgAmount = deals.reduce((sum, d) => sum + ((d.amount as number) ?? 0), 0);\n churnedArr += orgAmount;\n churnedOrgs.push(orgId);\n }\n\n // Contraction ARR: orgs where latest closed-won < prior closed-won\n let contractionArr = 0;\n for (const [orgId, deals] of orgWins) {\n if (churnedOrgs.includes(orgId)) continue;\n if (deals.length < 2) continue;\n\n const sorted = [...deals].sort((a, b) =>\n new Date(a.created_at as string).getTime() - new Date(b.created_at as string).getTime(),\n );\n const latest = sorted[sorted.length - 1]!;\n const prior = sorted[sorted.length - 2]!;\n const latestAmt = (latest.amount as number) ?? 0;\n const priorAmt = (prior.amount as number) ?? 0;\n if (latestAmt < priorAmt) {\n contractionArr += priorAmt - latestAmt;\n }\n }\n\n return [\n {\n metric: \"arr\",\n label: \"ARR\",\n group: \"Revenue\",\n value: arr,\n formatted: formatCurrency(arr),\n status: \"neutral\",\n components: { closed_won_count: closedWon.length },\n },\n {\n metric: \"new_arr\",\n label: \"New ARR\",\n group: \"Revenue\",\n value: newArr,\n formatted: formatCurrency(newArr),\n status: \"neutral\",\n components: {},\n },\n {\n metric: \"expansion_arr\",\n label: \"Expansion ARR\",\n group: \"Revenue\",\n value: expansionArr,\n formatted: formatCurrency(expansionArr),\n status: \"neutral\",\n components: {},\n },\n {\n metric: \"churned_arr\",\n label: \"Churned ARR\",\n group: \"Revenue\",\n value: churnedArr,\n formatted: formatCurrency(churnedArr),\n status: churnedArr > 0 ? \"red\" : \"green\",\n components: { churned_org_count: churnedOrgs.length },\n },\n {\n metric: \"contraction_arr\",\n label: \"Contraction ARR\",\n group: \"Revenue\",\n value: contractionArr,\n formatted: formatCurrency(contractionArr),\n status: contractionArr > 0 ? \"yellow\" : \"green\",\n components: {},\n },\n ];\n}\n","/**\n * Retention metrics: GRR and NRR.\n * Accepts optional revenue results to avoid recomputing ARR breakdown.\n */\n\nimport type { DataSnapshot } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport type { MetricResult } from \"./types.js\";\nimport { computeRevenueMetrics } from \"./revenue.js\";\nimport { nrrStatus, grrStatus, motionBenchmarkNote } from \"./helpers.js\";\nimport type { MetricBenchmarkSet } from \"../baselines/metrics-benchmarks.js\";\nimport { resolveMetricBenchmarks } from \"../baselines/metrics-benchmarks.js\";\n\nfunction coverageSample(rev: MetricResult[]): number {\n const arr = rev.find((m) => m.metric === \"arr\");\n return typeof arr?.components.closed_won_count === \"number\"\n ? arr.components.closed_won_count as number\n : 0;\n}\n\nexport function computeRetentionMetrics(\n snapshot: DataSnapshot,\n scope?: ComputeScope,\n revenueResults?: MetricResult[],\n benchmarks = resolveMetricBenchmarks(\"mid_market\"),\n): MetricResult[] {\n const rev = revenueResults ?? computeRevenueMetrics(snapshot, scope);\n\n const arrResult = rev.find((m) => m.metric === \"arr\");\n const expansionResult = rev.find((m) => m.metric === \"expansion_arr\");\n const churnedResult = rev.find((m) => m.metric === \"churned_arr\");\n const contractionResult = rev.find((m) => m.metric === \"contraction_arr\");\n\n const totalArr = arrResult?.value ?? 0;\n const expansion = expansionResult?.value ?? 0;\n const churned = churnedResult?.value ?? 0;\n const contraction = contractionResult?.value ?? 0;\n\n // Starting ARR = current ARR + churned + contraction - expansion\n const startingArr = totalArr + churned + contraction - expansion;\n\n let grrValue: number | null = null;\n let nrrValue: number | null = null;\n let grrFormatted = \"--\";\n let nrrFormatted = \"--\";\n let grrStat: MetricResult[\"status\"] = \"neutral\";\n let nrrStat: MetricResult[\"status\"] = \"neutral\";\n let grrUnavailable: string | undefined;\n let nrrUnavailable: string | undefined;\n\n if (startingArr > 0) {\n grrValue = Math.round(((startingArr - churned - contraction) / startingArr) * 100);\n nrrValue = Math.round(((startingArr - churned - contraction + expansion) / startingArr) * 100);\n grrFormatted = `${grrValue}%`;\n nrrFormatted = `${nrrValue}%`;\n grrStat = grrStatus(grrValue, benchmarks);\n nrrStat = nrrStatus(nrrValue, benchmarks);\n } else {\n grrUnavailable = \"Insufficient closed-won data to compute\";\n nrrUnavailable = \"Insufficient closed-won data to compute\";\n }\n\n return [\n {\n metric: \"grr\",\n label: \"Gross Revenue Retention\",\n group: \"Retention\",\n value: grrValue,\n formatted: grrFormatted,\n status: grrStat,\n benchmark_note: motionBenchmarkNote(\"grr\", undefined) + \" (pipeline-inferred)\",\n components: { starting_arr: startingArr, churned, contraction, sample_size: rev.find((m) => m.metric === \"arr\")?.components.closed_won_count ?? 0 },\n unavailable_reason: grrUnavailable,\n },\n {\n metric: \"nrr\",\n label: \"Net Revenue Retention\",\n group: \"Retention\",\n value: nrrValue,\n formatted: nrrFormatted,\n status: nrrStat,\n benchmark_note: motionBenchmarkNote(\"nrr\", undefined) + \" · above 100% = growing from existing customers\",\n components: { starting_arr: startingArr, churned, contraction, expansion, sample_size: coverageSample(rev) },\n unavailable_reason: nrrUnavailable,\n },\n ];\n}\n","/**\n * Pipeline metrics: Coverage, Weighted Pipeline, Pipeline Created, Pipeline Velocity.\n */\n\nimport type { DataSnapshot } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport type { MetricResult } from \"./types.js\";\nimport { scopeOpps, isClosedWon, isOpenStage, daysBetween, getStageProbability, pipelineCoverageStatus, motionBenchmarkNote } from \"./helpers.js\";\nimport { formatCurrency } from \"../output/formatters.js\";\nimport type { MetricBenchmarkSet } from \"../baselines/metrics-benchmarks.js\";\nimport { resolveMetricBenchmarks } from \"../baselines/metrics-benchmarks.js\";\n\nexport function computePipelineMetrics(\n snapshot: DataSnapshot,\n scope?: ComputeScope,\n benchmarks = resolveMetricBenchmarks(\"mid_market\"),\n): MetricResult[] {\n const opps = scopeOpps(snapshot, scope);\n const now = new Date();\n const ninetyDaysAgo = new Date(now);\n ninetyDaysAgo.setDate(ninetyDaysAgo.getDate() - 90);\n const ninetyDaysAgoStr = ninetyDaysAgo.toISOString();\n\n const openOpps = opps.filter((o) => isOpenStage(o.current_stage as string));\n const closedWon = opps.filter((o) => isClosedWon(o.current_stage as string));\n\n // Trailing 90d closed-won\n const recentWon = closedWon.filter((o) => {\n const closeDate = o.close_date as string | null;\n if (!closeDate) return false;\n return new Date(closeDate) >= ninetyDaysAgo;\n });\n const recentWonTotal = recentWon.reduce((sum, o) => sum + ((o.amount as number) ?? 0), 0);\n\n // Open pipeline total\n const openPipelineTotal = openOpps.reduce((sum, o) => sum + ((o.amount as number) ?? 0), 0);\n\n // ── Pipeline Coverage ──\n let coverageValue: number | null = null;\n let coverageFormatted = \"--\";\n let coverageStatus: MetricResult[\"status\"] = \"neutral\";\n let coverageUnavailable: string | undefined;\n\n if (recentWonTotal > 0) {\n coverageValue = Math.round((openPipelineTotal / recentWonTotal) * 10) / 10;\n coverageFormatted = `${coverageValue.toFixed(1)}x`;\n coverageStatus = pipelineCoverageStatus(coverageValue, benchmarks);\n } else if (openPipelineTotal > 0) {\n coverageFormatted = \"∞ (no recent closed-won)\";\n coverageStatus = \"neutral\";\n } else {\n coverageUnavailable = \"No open or recently closed deals\";\n }\n\n // ── Weighted Pipeline ──\n const weightedTotal = openOpps.reduce((sum, o) => {\n const amount = (o.amount as number) ?? 0;\n const prob = getStageProbability(o);\n return sum + amount * prob;\n }, 0);\n\n // ── Pipeline Created (trailing 90d) ──\n const recentlyCreated = opps.filter((o) => {\n const created = o.created_at as string | null;\n if (!created) return false;\n return created >= ninetyDaysAgoStr;\n });\n const pipelineCreatedTotal = recentlyCreated.reduce((sum, o) => sum + ((o.amount as number) ?? 0), 0);\n\n // ── Pipeline Velocity ──\n // velocity = (# opps × avg deal × win rate) / avg cycle days\n const wonWithDates = closedWon.filter((o) => o.close_date && o.created_at);\n const totalClosed = closedWon.length + opps.filter((o) => {\n const s = (o.current_stage as string || \"\").toLowerCase();\n return s.includes(\"lost\");\n }).length;\n\n let velocityValue: number | null = null;\n let velocityFormatted = \"--\";\n let velocityUnavailable: string | undefined;\n\n if (wonWithDates.length >= 3 && totalClosed > 0) {\n const avgDeal = closedWon.reduce((sum, o) => sum + ((o.amount as number) ?? 0), 0) / closedWon.length;\n const winRate = closedWon.length / totalClosed;\n const cycleDays = wonWithDates.reduce((sum, o) => {\n return sum + daysBetween(o.created_at as string, o.close_date as string);\n }, 0) / wonWithDates.length;\n\n if (cycleDays > 0) {\n velocityValue = Math.round((openOpps.length * avgDeal * winRate) / cycleDays);\n velocityFormatted = `${formatCurrency(velocityValue)}/day`;\n }\n }\n if (velocityValue == null) {\n velocityUnavailable = \"Requires 3+ closed-won deals with dates\";\n }\n\n return [\n {\n metric: \"pipeline_coverage\",\n label: \"Pipeline Coverage\",\n group: \"Pipeline\",\n value: coverageValue,\n formatted: coverageFormatted,\n status: coverageStatus,\n benchmark_note: motionBenchmarkNote(\"pipeline_coverage\", undefined),\n components: { open_pipeline: openPipelineTotal, trailing_90d_won: recentWonTotal },\n unavailable_reason: coverageUnavailable,\n },\n {\n metric: \"weighted_pipeline\",\n label: \"Weighted Pipeline\",\n group: \"Pipeline\",\n value: weightedTotal,\n formatted: formatCurrency(weightedTotal),\n status: \"neutral\",\n components: { open_deals: openOpps.length },\n },\n {\n metric: \"pipeline_created\",\n label: \"Pipeline Created (90d)\",\n group: \"Pipeline\",\n value: pipelineCreatedTotal,\n formatted: formatCurrency(pipelineCreatedTotal),\n status: \"neutral\",\n components: { deals_created: recentlyCreated.length },\n },\n {\n metric: \"pipeline_velocity\",\n label: \"Pipeline Velocity\",\n group: \"Pipeline\",\n value: velocityValue,\n formatted: velocityFormatted,\n status: \"neutral\",\n components: { open_deals: openOpps.length, won_count: closedWon.length, total_closed: totalClosed },\n unavailable_reason: velocityUnavailable,\n },\n ];\n}\n","/**\n * Sales efficiency metrics: Win Rate, Avg Deal Size, Avg Sales Cycle, Stage Conversion.\n */\n\nimport type { DataSnapshot } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport type { MetricResult } from \"./types.js\";\nimport { scopeOpps, isClosedWon, isClosedLost, daysBetween, winRateStatus, motionBenchmarkNote } from \"./helpers.js\";\nimport { formatCurrency } from \"../output/formatters.js\";\nimport type { MetricBenchmarkSet } from \"../baselines/metrics-benchmarks.js\";\nimport { resolveMetricBenchmarks } from \"../baselines/metrics-benchmarks.js\";\n\nexport function computeSalesEfficiencyMetrics(\n snapshot: DataSnapshot,\n scope?: ComputeScope,\n benchmarks = resolveMetricBenchmarks(\"mid_market\"),\n): MetricResult[] {\n const opps = scopeOpps(snapshot, scope);\n\n const closedWon = opps.filter((o) => isClosedWon(o.current_stage as string));\n const closedLost = opps.filter((o) => isClosedLost(o.current_stage as string));\n const totalClosed = closedWon.length + closedLost.length;\n\n // ── Win Rate ──\n let winRateValue: number | null = null;\n let winRateFormatted = \"--\";\n let winRateStat: MetricResult[\"status\"] = \"neutral\";\n let winRateUnavailable: string | undefined;\n\n if (totalClosed > 0) {\n winRateValue = Math.round((closedWon.length / totalClosed) * 100);\n winRateFormatted = `${winRateValue}%`;\n winRateStat = winRateStatus(winRateValue, benchmarks);\n } else {\n winRateUnavailable = \"No closed deals to compute win rate\";\n }\n\n // ── Avg Deal Size ──\n let avgDealValue: number | null = null;\n let avgDealFormatted = \"--\";\n let avgDealUnavailable: string | undefined;\n\n if (closedWon.length > 0) {\n avgDealValue = Math.round(\n closedWon.reduce((sum, o) => sum + ((o.amount as number) ?? 0), 0) / closedWon.length,\n );\n avgDealFormatted = formatCurrency(avgDealValue);\n } else {\n avgDealUnavailable = \"No closed-won deals\";\n }\n\n // ── Avg Sales Cycle ──\n const wonWithDates = closedWon.filter((o) => o.close_date && o.created_at);\n let avgCycleValue: number | null = null;\n let avgCycleFormatted = \"--\";\n let avgCycleUnavailable: string | undefined;\n\n if (wonWithDates.length > 0) {\n const totalDays = wonWithDates.reduce((sum, o) => {\n return sum + daysBetween(o.created_at as string, o.close_date as string);\n }, 0);\n avgCycleValue = Math.round(totalDays / wonWithDates.length);\n avgCycleFormatted = `${avgCycleValue} days`;\n } else {\n avgCycleUnavailable = \"No closed-won deals with dates\";\n }\n\n // ── Stage Conversion Rates ──\n const stageOrder = [\"Prospecting\", \"Qualification\", \"Discovery\", \"Proposal\", \"Negotiation\", \"Closed Won\"];\n const stageConversions: Record<string, { from: number; to: number; rate: number }> = {};\n let overallConversion: number | null = null;\n let conversionFormatted = \"--\";\n let conversionUnavailable: string | undefined;\n\n // Try to use stage_history from metadata\n let hasStageHistory = false;\n for (const opp of opps) {\n const metadata = opp.metadata as Record<string, unknown> | undefined;\n const history = metadata?.stage_history as Array<{ stage: string }> | undefined;\n if (history && history.length > 0) {\n hasStageHistory = true;\n break;\n }\n }\n\n if (hasStageHistory) {\n // Count transitions from stage_history\n const transitionCounts = new Map<string, { entered: number; advanced: number }>();\n\n for (const opp of opps) {\n const metadata = opp.metadata as Record<string, unknown> | undefined;\n const history = metadata?.stage_history as Array<{ stage: string; entered_at?: string }> | undefined;\n if (!history || history.length === 0) continue;\n\n for (let i = 0; i < history.length; i++) {\n const stage = history[i]!.stage;\n if (!transitionCounts.has(stage)) {\n transitionCounts.set(stage, { entered: 0, advanced: 0 });\n }\n transitionCounts.get(stage)!.entered++;\n if (i < history.length - 1) {\n transitionCounts.get(stage)!.advanced++;\n } else if (isClosedWon(opp.current_stage as string)) {\n transitionCounts.get(stage)!.advanced++;\n }\n }\n }\n\n for (let i = 0; i < stageOrder.length - 1; i++) {\n const from = stageOrder[i]!;\n const to = stageOrder[i + 1]!;\n const counts = transitionCounts.get(from);\n if (counts && counts.entered > 0) {\n const rate = Math.round((counts.advanced / counts.entered) * 100);\n stageConversions[`${from} → ${to}`] = { from: counts.entered, to: counts.advanced, rate };\n }\n }\n\n // Overall: Prospecting → Closed Won\n const prospecting = transitionCounts.get(\"Prospecting\");\n const wonCount = closedWon.length;\n if (prospecting && prospecting.entered > 0) {\n overallConversion = Math.round((wonCount / prospecting.entered) * 100);\n conversionFormatted = `${overallConversion}%`;\n }\n }\n\n if (overallConversion == null) {\n if (totalClosed > 0) {\n // Fallback: just use win rate as overall conversion proxy\n overallConversion = winRateValue;\n conversionFormatted = winRateValue != null ? `${winRateValue}% (win rate proxy)` : \"--\";\n } else {\n conversionUnavailable = \"No stage history or closed deals available\";\n }\n }\n\n return [\n {\n metric: \"win_rate\",\n label: \"Win Rate\",\n group: \"Sales Efficiency\",\n value: winRateValue,\n formatted: winRateFormatted,\n status: winRateStat,\n benchmark_note: \"B2B SaaS benchmark: 20-30%\",\n components: { won: closedWon.length, lost: closedLost.length, total_closed: totalClosed },\n unavailable_reason: winRateUnavailable,\n },\n {\n metric: \"avg_deal_size\",\n label: \"Avg Deal Size\",\n group: \"Sales Efficiency\",\n value: avgDealValue,\n formatted: avgDealFormatted,\n status: \"neutral\",\n components: { deal_count: closedWon.length },\n unavailable_reason: avgDealUnavailable,\n },\n {\n metric: \"avg_sales_cycle\",\n label: \"Avg Sales Cycle\",\n group: \"Sales Efficiency\",\n value: avgCycleValue,\n formatted: avgCycleFormatted,\n status: \"neutral\",\n components: { deals_with_dates: wonWithDates.length },\n unavailable_reason: avgCycleUnavailable,\n },\n {\n metric: \"stage_conversion\",\n label: \"Stage Conversion\",\n group: \"Sales Efficiency\",\n value: overallConversion,\n formatted: conversionFormatted,\n status: \"neutral\",\n components: { stage_rates: stageConversions },\n unavailable_reason: conversionUnavailable,\n },\n ];\n}\n","/**\n * Unit economics metrics: LTV Proxy, CAC, LTV:CAC, Payback Months, Magic Number.\n * Most degrade gracefully when data is unavailable.\n */\n\nimport type { DataSnapshot } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport type { MetricResult } from \"./types.js\";\nimport { formatCurrency } from \"../output/formatters.js\";\n\ninterface UnitEconomicsDeps {\n avg_deal_size?: number | null;\n grr?: number | null;\n}\n\nimport type { MetricBenchmarkSet } from \"../baselines/metrics-benchmarks.js\";\nimport { metricStatusHigherIsBetter, metricStatusLowerIsBetter } from \"../baselines/metrics-benchmarks.js\";\n\nexport function computeUnitEconomicsMetrics(\n _snapshot: DataSnapshot,\n _scope?: ComputeScope,\n deps?: UnitEconomicsDeps,\n benchmarks?: MetricBenchmarkSet,\n): MetricResult[] {\n const avgDeal = deps?.avg_deal_size ?? null;\n const grrPct = deps?.grr ?? null;\n\n // ── LTV Proxy ──\n let ltvValue: number | null = null;\n let ltvFormatted = \"--\";\n let ltvUnavailable: string | undefined;\n\n if (avgDeal != null && avgDeal > 0 && grrPct != null && grrPct < 100) {\n const churnRate = (100 - grrPct) / 100;\n ltvValue = Math.round(avgDeal / churnRate);\n ltvFormatted = formatCurrency(ltvValue);\n } else if (grrPct != null && grrPct >= 100) {\n ltvUnavailable = \"GRR >= 100% implies zero churn — LTV is infinite\";\n } else {\n ltvUnavailable = \"Requires avg deal size and GRR to compute\";\n }\n\n // ── CAC ── (requires campaign spend data we don't have)\n const cacUnavailable = \"Requires campaign spend data\";\n\n // ── LTV:CAC Ratio ──\n const ltvCacUnavailable = \"Requires campaign spend data\";\n\n // ── Payback Months ──\n const paybackUnavailable = \"Requires campaign spend data\";\n\n // ── Magic Number ──\n const magicUnavailable = \"Requires campaign spend data\";\n\n return [\n {\n metric: \"ltv_proxy\",\n label: \"LTV (Proxy)\",\n group: \"Unit Economics\",\n value: ltvValue,\n formatted: ltvFormatted,\n status: \"neutral\",\n benchmark_note: ltvValue != null ? \"LTV = Avg Deal / Churn Rate\" : undefined,\n components: { avg_deal_size: avgDeal, grr_pct: grrPct },\n unavailable_reason: ltvUnavailable,\n },\n {\n metric: \"cac\",\n label: \"CAC\",\n group: \"Unit Economics\",\n value: null,\n formatted: \"--\",\n status: \"neutral\",\n components: {},\n unavailable_reason: cacUnavailable,\n },\n {\n metric: \"ltv_cac_ratio\",\n label: \"LTV:CAC Ratio\",\n group: \"Unit Economics\",\n value: null,\n formatted: \"--\",\n status: \"neutral\",\n benchmark_note: \"Best-in-class: 3x+\",\n components: {},\n unavailable_reason: ltvCacUnavailable,\n },\n {\n metric: \"payback_months\",\n label: \"Payback Months\",\n group: \"Unit Economics\",\n value: null,\n formatted: \"--\",\n status: \"neutral\",\n benchmark_note: \"Healthy SaaS: <18 months\",\n components: {},\n unavailable_reason: paybackUnavailable,\n },\n {\n metric: \"magic_number\",\n label: \"Magic Number\",\n group: \"Unit Economics\",\n value: null,\n formatted: \"--\",\n status: \"neutral\",\n benchmark_note: \">0.75 = efficient growth\",\n components: {},\n unavailable_reason: magicUnavailable,\n },\n ];\n}\n","/**\n * Deterministic confidence scoring and reliability gates per metric.\n */\n\nimport type {\n ConfidenceLabel,\n DataCoverage,\n DataSourceType,\n ReliabilityGate,\n ReliabilityTier,\n} from \"../types.js\";\nimport type { EstimationMethod } from \"./types.js\";\n\nexport interface ConfidenceInput {\n metric: string;\n coverage: DataCoverage;\n sourceType: DataSourceType;\n sampleSize: number;\n hasMetadata: boolean;\n estimationMethod?: EstimationMethod;\n}\n\nconst METRIC_MIN_SAMPLES: Record<string, number> = {\n arr: 1,\n new_arr: 1,\n expansion_arr: 1,\n churned_arr: 1,\n contraction_arr: 1,\n grr: 5,\n nrr: 5,\n win_rate: 10,\n pipeline_coverage: 3,\n pipeline_velocity: 3,\n avg_deal_size: 3,\n avg_sales_cycle: 3,\n magic_number: 1,\n payback_months: 1,\n ltv_cac: 1,\n};\n\nconst LEDGER_PREFERRED = new Set([\"nrr\", \"grr\", \"churned_arr\", \"contraction_arr\", \"expansion_arr\", \"new_arr\", \"arr\"]);\n\nfunction tierFromCoverage(coverage: DataCoverage, sampleSize: number, minSample: number): ReliabilityTier {\n if (coverage.distinct_months >= 13 || coverage.distinct_quarters >= 5) {\n if (sampleSize >= minSample * 2) return \"board_ready\";\n }\n if (coverage.distinct_months >= 6 || coverage.distinct_quarters >= 3) {\n if (sampleSize >= minSample) return \"reportable\";\n }\n if (coverage.distinct_months >= 3 || coverage.distinct_quarters >= 2) {\n return \"directional\";\n }\n return \"snapshot\";\n}\n\nfunction nextTier(current: ReliabilityTier): ReliabilityTier | null {\n const order: ReliabilityTier[] = [\"snapshot\", \"directional\", \"reportable\", \"board_ready\"];\n const idx = order.indexOf(current);\n return idx < order.length - 1 ? order[idx + 1]! : null;\n}\n\nfunction gateRequirements(\n metric: string,\n current: ReliabilityTier,\n coverage: DataCoverage,\n sourceType: DataSourceType,\n): string[] {\n const reqs: string[] = [];\n const next = nextTier(current);\n if (!next) return reqs;\n\n if (next === \"directional\" && coverage.distinct_months < 3) {\n reqs.push(`${3 - coverage.distinct_months} more month(s) of close history`);\n }\n if (next === \"reportable\") {\n if (coverage.distinct_months < 6) {\n reqs.push(`${6 - coverage.distinct_months} more month(s) for reportable ${metric}`);\n }\n if (coverage.closed_won_count < 10) {\n reqs.push(`${10 - coverage.closed_won_count} more closed-won deals`);\n }\n if (!coverage.has_deal_type_metadata && LEDGER_PREFERRED.has(metric)) {\n reqs.push(\"deal_type tags on opportunities (New Business / Expansion)\");\n }\n }\n if (next === \"board_ready\") {\n if (coverage.distinct_months < 13) {\n reqs.push(`${13 - coverage.distinct_months} more month(s) for YoY comparison`);\n }\n if (LEDGER_PREFERRED.has(metric) && sourceType !== \"revenue_ledger\" && sourceType !== \"hybrid\") {\n reqs.push(\"revenue ledger CSV for authoritative retention metrics\");\n }\n }\n return reqs;\n}\n\nfunction confidenceLabel(score: number): ConfidenceLabel {\n if (score >= 80) return \"high\";\n if (score >= 55) return \"medium\";\n if (score >= 30) return \"low\";\n return \"estimated\";\n}\n\nexport function scoreMetricConfidence(input: ConfidenceInput): {\n confidence: number;\n confidence_label: ConfidenceLabel;\n reliability_gate: ReliabilityGate;\n estimation_method: EstimationMethod;\n} {\n const minSample = METRIC_MIN_SAMPLES[input.metric] ?? 3;\n const sampleScore = Math.min(100, (input.sampleSize / minSample) * 40);\n\n let sourceScore = 25;\n if (LEDGER_PREFERRED.has(input.metric)) {\n if (input.sourceType === \"revenue_ledger\" || input.sourceType === \"hybrid\") sourceScore = 25;\n else if (input.estimationMethod === \"pipeline_inferred\") sourceScore = 12;\n else sourceScore = 8;\n }\n\n const depthTarget = input.metric === \"nrr\" || input.metric === \"grr\" ? 13 : 6;\n const depthScore = Math.min(20, (input.coverage.distinct_months / depthTarget) * 20);\n\n const metaScore = input.hasMetadata ? 15 : (input.coverage.has_deal_type_metadata ? 10 : 5);\n\n const confidence = Math.round(Math.min(100, sampleScore + sourceScore + depthScore + metaScore));\n const current_tier = tierFromCoverage(input.coverage, input.sampleSize, minSample);\n\n const estimation_method: EstimationMethod =\n input.estimationMethod ??\n (input.sourceType === \"revenue_ledger\" || input.sourceType === \"hybrid\"\n ? \"ledger\"\n : \"pipeline_inferred\");\n\n return {\n confidence,\n confidence_label: confidenceLabel(confidence),\n reliability_gate: {\n current_tier,\n next_tier: nextTier(current_tier),\n requirements: gateRequirements(input.metric, current_tier, input.coverage, input.sourceType),\n },\n estimation_method,\n };\n}\n\nexport function enrichMetricWithConfidence<T extends {\n metric: string;\n components: Record<string, unknown>;\n}>(\n result: T,\n coverage: DataCoverage,\n sourceType: DataSourceType,\n): T & {\n confidence: number;\n confidence_label: ConfidenceLabel;\n reliability_gate: ReliabilityGate;\n estimation_method: EstimationMethod;\n} {\n const sampleSize = typeof result.components.closed_won_count === \"number\"\n ? result.components.closed_won_count as number\n : typeof result.components.sample_size === \"number\"\n ? result.components.sample_size as number\n : coverage.closed_won_count;\n\n const scored = scoreMetricConfidence({\n metric: result.metric,\n coverage,\n sourceType,\n sampleSize,\n hasMetadata: coverage.has_deal_type_metadata,\n });\n\n return { ...result, ...scored };\n}\n","/**\n * Period bucketing and timeseries metrics for MoM/QoQ/YoY analysis.\n */\n\nimport type { MetricsComparison, MetricsCadence } from \"../types.js\";\nimport type { DataSnapshot } from \"../types.js\";\nimport { isClosedWon } from \"./helpers.js\";\nimport type { MetricResult } from \"./types.js\";\n\nexport interface PeriodBucket {\n period: string;\n closed_won_total: number;\n closed_won_count: number;\n new_arr: number;\n expansion_arr: number;\n}\n\nfunction periodKey(date: string, cadence: MetricsCadence): string | null {\n const dt = new Date(date);\n if (isNaN(dt.getTime())) return null;\n const y = dt.getUTCFullYear();\n const m = dt.getUTCMonth();\n if (cadence === \"monthly\" || cadence === \"weekly\") {\n return `${y}-${String(m + 1).padStart(2, \"0\")}`;\n }\n if (cadence === \"quarterly\") {\n const q = Math.floor(m / 3) + 1;\n return `${y}-Q${q}`;\n }\n return `${y}`;\n}\n\nfunction classifyDealType(\n opp: Record<string, unknown>,\n orgFirstWin: Map<string, string>,\n): \"new\" | \"expansion\" {\n const meta = opp.metadata as Record<string, unknown> | undefined;\n const dealType = meta?.deal_type as string | undefined;\n if (dealType === \"Expansion\") return \"expansion\";\n if (dealType === \"New Business\") return \"new\";\n const orgId = opp.organization_id as string | null;\n if (!orgId) return \"new\";\n const firstId = orgFirstWin.get(orgId);\n return firstId === opp.id ? \"new\" : \"expansion\";\n}\n\nexport function bucketClosedWonByPeriod(\n snapshot: DataSnapshot,\n cadence: MetricsCadence = \"quarterly\",\n): PeriodBucket[] {\n const closedWon = snapshot.opportunities.filter((o) =>\n isClosedWon(o.current_stage as string) && o.close_date,\n );\n\n const orgFirstWin = new Map<string, string>();\n const byOrg = new Map<string, Record<string, unknown>[]>();\n for (const o of closedWon) {\n const orgId = o.organization_id as string | null;\n if (!orgId) continue;\n if (!byOrg.has(orgId)) byOrg.set(orgId, []);\n byOrg.get(orgId)!.push(o);\n }\n for (const [orgId, deals] of byOrg) {\n const sorted = [...deals].sort(\n (a, b) => new Date(a.created_at as string).getTime() - new Date(b.created_at as string).getTime(),\n );\n if (sorted[0]) orgFirstWin.set(orgId, sorted[0].id as string);\n }\n\n const buckets = new Map<string, PeriodBucket>();\n\n for (const o of closedWon) {\n const key = periodKey(o.close_date as string, cadence);\n if (!key) continue;\n const amount = (o.amount as number) ?? 0;\n const kind = classifyDealType(o, orgFirstWin);\n\n if (!buckets.has(key)) {\n buckets.set(key, { period: key, closed_won_total: 0, closed_won_count: 0, new_arr: 0, expansion_arr: 0 });\n }\n const b = buckets.get(key)!;\n b.closed_won_total += amount;\n b.closed_won_count += 1;\n if (kind === \"expansion\") b.expansion_arr += amount;\n else b.new_arr += amount;\n }\n\n return [...buckets.values()].sort((a, b) => a.period.localeCompare(b.period));\n}\n\nexport interface TimeseriesPoint {\n period: string;\n value: number | null;\n formatted: string;\n confidence: number;\n delta_vs_prior: number | null;\n}\n\nexport function computeMetricTimeseries(\n metric: string,\n snapshot: DataSnapshot,\n cadence: MetricsCadence = \"quarterly\",\n comparison: MetricsComparison = \"qoq\",\n): TimeseriesPoint[] {\n const buckets = bucketClosedWonByPeriod(snapshot, cadence);\n const points: TimeseriesPoint[] = [];\n\n for (let i = 0; i < buckets.length; i++) {\n const b = buckets[i]!;\n let value: number | null = null;\n let formatted = \"--\";\n\n switch (metric) {\n case \"new_arr\":\n value = b.new_arr;\n formatted = `$${Math.round(value).toLocaleString()}`;\n break;\n case \"expansion_arr\":\n value = b.expansion_arr;\n formatted = `$${Math.round(value).toLocaleString()}`;\n break;\n case \"closed_won_total\":\n case \"arr\":\n value = b.closed_won_total;\n formatted = `$${Math.round(value).toLocaleString()}`;\n break;\n default:\n value = b.closed_won_total;\n formatted = `$${Math.round(value).toLocaleString()}`;\n }\n\n const prior = i > 0 ? points[i - 1]?.value : null;\n const delta = prior != null && value != null && prior !== 0\n ? Math.round(((value - prior) / Math.abs(prior)) * 100)\n : null;\n\n const confidence = Math.min(90, 30 + b.closed_won_count * 8);\n\n points.push({ period: b.period, value, formatted, confidence, delta_vs_prior: delta });\n }\n\n if (comparison === \"yoy\" && cadence === \"monthly\" && points.length < 13) {\n return points.slice(-Math.min(points.length, 6));\n }\n\n return points;\n}\n\nexport function applyPeriodOverlay(\n metrics: MetricResult[],\n snapshot: DataSnapshot,\n cadence: MetricsCadence,\n): MetricResult[] {\n const arrSeries = computeMetricTimeseries(\"arr\", snapshot, cadence);\n const latest = arrSeries[arrSeries.length - 1];\n if (!latest) return metrics;\n\n return metrics.map((m) => {\n if (m.metric !== \"arr\") return m;\n return {\n ...m,\n period: latest.period,\n comparison: cadence === \"quarterly\" ? \"qoq\" as const : \"mom\" as const,\n components: { ...m.components, period_arr: latest.value, periods_available: arrSeries.length },\n };\n });\n}\n","/**\n * Metrics orchestrator — parallel to src/vitals/health-score.ts.\n * Computes all 5 metric groups, stores results in DuckDB, handles segments.\n */\n\nimport type { Segment } from \"../types.js\";\nimport type { ComputeScope } from \"../pipeline/segments.js\";\nimport { resolveSegmentScopeFromSnapshot } from \"../pipeline/segments.js\";\nimport * as db from \"../db/queries.js\";\nimport type { MetricResult, MetricsComputeResult, FullMetricsResult, MetricsEvent } from \"./types.js\";\nimport type { MetricsComputeContext } from \"./context.js\";\nimport { buildMetricsComputeContext } from \"./context.js\";\nimport { computeRevenueMetrics } from \"./revenue.js\";\nimport { computeRetentionMetrics } from \"./retention.js\";\nimport { computePipelineMetrics } from \"./pipeline.js\";\nimport { computeSalesEfficiencyMetrics } from \"./sales-efficiency.js\";\nimport { computeUnitEconomicsMetrics } from \"./unit-economics.js\";\nimport type { DataSnapshot } from \"../types.js\";\nimport { enrichMetricWithConfidence } from \"./confidence.js\";\nimport { applyPeriodOverlay } from \"./periods.js\";\n\nfunction computeAllMetrics(\n snapshot: DataSnapshot,\n ctx: MetricsComputeContext,\n scope?: ComputeScope,\n): MetricResult[] {\n const { benchmarks, coverage, sourceType } = ctx;\n\n const revenue = computeRevenueMetrics(snapshot, scope, benchmarks);\n const retention = computeRetentionMetrics(snapshot, scope, revenue, benchmarks);\n const pipeline = computePipelineMetrics(snapshot, scope, benchmarks);\n const salesEfficiency = computeSalesEfficiencyMetrics(snapshot, scope, benchmarks);\n\n const avgDealResult = salesEfficiency.find((m) => m.metric === \"avg_deal_size\");\n const grrResult = retention.find((m) => m.metric === \"grr\");\n const unitEconomics = computeUnitEconomicsMetrics(snapshot, scope, {\n avg_deal_size: avgDealResult?.value ?? null,\n grr: grrResult?.value ?? null,\n }, benchmarks);\n\n let metrics = [...revenue, ...retention, ...pipeline, ...salesEfficiency, ...unitEconomics];\n\n metrics = applyPeriodOverlay(metrics, snapshot, coverage.recommended_cadence);\n\n return metrics.map((m) => enrichMetricWithConfidence(m, coverage, sourceType));\n}\n\nasync function storeMetrics(metrics: MetricResult[], segmentId: string | null, batchId: string): Promise<void> {\n await db.insertMetricReadings(\n metrics.map((m) => ({\n segment_id: segmentId,\n metric: m.metric,\n label: m.label,\n group_name: m.group,\n value: m.value,\n formatted: m.formatted,\n status: m.status,\n benchmark_note: m.benchmark_note,\n components: m.components,\n unavailable_reason: m.unavailable_reason,\n confidence: m.confidence,\n confidence_label: m.confidence_label,\n period: m.period,\n comparison: m.comparison,\n reliability_gate: m.reliability_gate as Record<string, unknown> | undefined,\n estimation_method: m.estimation_method,\n upload_batch_id: batchId,\n })),\n );\n}\n\n/**\n * Compute aggregate + per-segment metrics and store in DuckDB.\n */\nexport async function computeFullMetrics(): Promise<FullMetricsResult> {\n const batchId = db.uuid();\n const mctx = await buildMetricsComputeContext();\n const now = new Date().toISOString();\n\n const aggregateMetrics = computeAllMetrics(mctx.snapshot, mctx);\n await storeMetrics(aggregateMetrics, null, batchId);\n const aggregate: MetricsComputeResult = { metrics: aggregateMetrics, computed_at: now };\n\n const segRows = await db.getSegments();\n const segments: Segment[] = segRows.map((s) => ({\n id: s.id, name: s.name, entity_type: s.entity_type as Segment[\"entity_type\"],\n filters: typeof s.filters === \"string\" ? JSON.parse(s.filters) : s.filters,\n is_auto_generated: s.is_auto_generated, created_at: \"\", updated_at: \"\",\n }));\n\n const segmentResults: { segment: Segment; result: MetricsComputeResult }[] = [];\n\n for (const segment of segments) {\n try {\n const scope = resolveSegmentScopeFromSnapshot(segment, mctx.snapshot);\n if (scope.orgIds.length === 0 && scope.peopleIds.length === 0 && scope.oppIds.length === 0) continue;\n\n const segMetrics = computeAllMetrics(mctx.snapshot, mctx, scope);\n await storeMetrics(segMetrics, segment.id, batchId);\n segmentResults.push({ segment, result: { metrics: segMetrics, computed_at: now } });\n } catch (e) {\n console.error(`Segment ${segment.name} metrics computation failed:`, e);\n }\n }\n\n return { aggregate, segments: segmentResults };\n}\n\n/**\n * Streaming version — yields MetricsEvents for progressive rendering.\n */\nexport async function* computeFullMetricsStream(): AsyncGenerator<MetricsEvent> {\n const batchId = db.uuid();\n const mctx = await buildMetricsComputeContext();\n const snapshot = mctx.snapshot;\n const now = new Date().toISOString();\n\n yield { phase: \"snapshot\" };\n\n const aggregateMetrics = computeAllMetrics(snapshot, mctx);\n\n for (const group of [\"Revenue\", \"Retention\", \"Pipeline\", \"Sales Efficiency\", \"Unit Economics\"] as const) {\n yield { phase: \"group\", group, metrics: aggregateMetrics.filter((m) => m.group === group) };\n }\n await storeMetrics(aggregateMetrics, null, batchId);\n const aggregate: MetricsComputeResult = { metrics: aggregateMetrics, computed_at: now };\n yield { phase: \"aggregate\", result: aggregate };\n\n const segRows = await db.getSegments();\n const segments: Segment[] = segRows.map((s) => ({\n id: s.id, name: s.name, entity_type: s.entity_type as Segment[\"entity_type\"],\n filters: typeof s.filters === \"string\" ? JSON.parse(s.filters) : s.filters,\n is_auto_generated: s.is_auto_generated, created_at: \"\", updated_at: \"\",\n }));\n\n const segmentResults: { segment: Segment; result: MetricsComputeResult }[] = [];\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i]!;\n yield { phase: \"segment_progress\", index: i, total: segments.length, name: segment.name };\n\n try {\n const scope = resolveSegmentScopeFromSnapshot(segment, snapshot);\n if (scope.orgIds.length === 0 && scope.peopleIds.length === 0 && scope.oppIds.length === 0) continue;\n\n const segMetrics = computeAllMetrics(snapshot, mctx, scope);\n await storeMetrics(segMetrics, segment.id, batchId);\n const result: MetricsComputeResult = { metrics: segMetrics, computed_at: now };\n segmentResults.push({ segment, result });\n yield { phase: \"segment_done\", segment, result };\n } catch (e) {\n console.error(`Segment ${segment.name} metrics computation failed:`, e);\n }\n }\n\n yield { phase: \"complete\", result: { aggregate, segments: segmentResults } };\n}\n\nexport { buildMetricsComputeContext } from \"./context.js\";\n","/**\n * Playbook — recommended actions triggered by vital sign thresholds.\n * TypeScript constant (not JSON) to avoid tsup bundling issues.\n *\n * The five seed plays below are augmented at runtime by \"learned\" plays the\n * user adds (from their own experience or external case studies), stored at\n * ~/.ntrp/memory/plays.jsonl.\n */\n\nimport { existsSync, readFileSync, appendFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getMemoryDir } from \"../config/store.js\";\nimport type { AnalysisLens, VitalSign } from \"../types.js\";\n\nexport interface Play {\n id: string;\n name: string;\n trigger_vital_sign?: VitalSign;\n trigger_metric?: string;\n trigger_lens?: AnalysisLens;\n trigger_condition: string;\n why: string;\n steps: string[];\n tools_that_help: string[];\n expected_outcome: string;\n /** \"seed\" for the built-in five, \"learned\" for user/case-study additions. */\n source?: \"seed\" | \"learned\";\n}\n\nconst PLAYBOOK: Play[] = [\n {\n id: \"multi-thread-deals\",\n name: \"Multi-Thread Your Deals\",\n trigger_vital_sign: \"thread_depth\",\n trigger_condition: \"thread_depth score < 2 (most deals have ≤1 active contact)\",\n why: \"Single-threaded deals die when your one contact goes dark, changes roles, or loses budget authority. Every deal needs at least 2 active contacts to survive.\",\n steps: [\n \"Pull the list of single-threaded deals from entity_details\",\n \"For each deal, identify the existing contact and their role\",\n \"Research the account org chart for a second entry point (champion, economic buyer, or technical evaluator)\",\n \"Send a warm intro or multi-thread via your existing contact\",\n \"Log the new contact as an activity linked to the opportunity\",\n ],\n tools_that_help: [\"LinkedIn Sales Navigator\", \"Org chart tools\", \"CRM contact roles\"],\n expected_outcome: \"Thread depth score rises above threshold; single-threaded deal count drops by 50%+ within 2 weeks\",\n },\n {\n id: \"clean-dead-pipeline\",\n name: \"Clean Dead Pipeline\",\n trigger_vital_sign: \"freshness\",\n trigger_condition: \"freshness score < 60\",\n why: \"Stale accounts and zombie deals inflate your pipeline number but deliver zero revenue. They waste forecasting accuracy and hide the real health of your business.\",\n steps: [\n \"Export the stale opportunities list from entity_details\",\n \"For each stale deal: contact the prospect within 48 hours or move to Closed Lost\",\n \"For stale contacts: send a re-engagement sequence or archive\",\n \"For stale organizations: verify they still match your ICP; archive if not\",\n \"Set a recurring pipeline hygiene review (weekly 15-min scrub)\",\n ],\n tools_that_help: [\"CRM bulk update\", \"Email sequences\", \"Pipeline review meeting template\"],\n expected_outcome: \"Freshness score jumps 20+ points; pipeline accuracy improves; forecast confidence increases\",\n },\n {\n id: \"fix-handoff-gap\",\n name: \"Fix the Handoff Gap\",\n trigger_vital_sign: \"drop_rate\",\n trigger_condition: \"drop_rate score indicates >30% of marketing leads not reaching sales\",\n why: \"Every lead that marketing generates but sales never sees is wasted budget and lost revenue. The marketing→sales handoff is the #1 leak in most GTM motions.\",\n steps: [\n \"Audit the marketing→sales handoff: which leads exist only in marketing systems?\",\n \"Check lead routing rules — are MQLs being assigned to active reps?\",\n \"Verify SLA: how quickly are handed-off leads being touched by sales?\",\n \"Fix routing gaps: unassigned territories, inactive rep queues, missing automation\",\n \"Set up a weekly handoff report showing marketing-only leads\",\n ],\n tools_that_help: [\"Lead routing audit\", \"SLA dashboard\", \"Marketing→Sales sync tool\"],\n expected_outcome: \"Drop rate improves 15+ points; marketing-only lead count drops by 60%+\",\n },\n {\n id: \"retarget-effort\",\n name: \"Retarget Misdirected Effort\",\n trigger_vital_sign: \"signal_to_noise\",\n trigger_condition: \"signal_to_noise score < 50% (majority of activities not linked to pipeline)\",\n why: \"When reps spend more than half their time on activities unconnected to open pipeline, they're burning hours that could be closing deals. Every noisy activity is time stolen from revenue.\",\n steps: [\n \"Review the noisy activities from entity_details — what types dominate?\",\n \"Identify root cause: are reps prospecting dead accounts? Logging admin tasks? Working closed deals?\",\n \"Create a 'focus list' of pipeline-linked accounts for each rep\",\n \"Set activity targets: 80% of weekly activities should touch open pipeline\",\n \"Remove or automate low-value activities that generate noise\",\n ],\n tools_that_help: [\"Activity reports by rep\", \"Focus account lists\", \"CRM activity rules\"],\n expected_outcome: \"Signal-to-noise ratio improves to 70%+; rep productivity increases measurably\",\n },\n {\n id: \"unstick-pipeline\",\n name: \"Unstick the Pipeline\",\n trigger_vital_sign: \"flow_rate\",\n trigger_condition: \"flow_rate score < 50 (high average deal age or many stuck deals)\",\n why: \"Stuck deals block revenue and demoralize reps. A deal that hasn't moved in 14+ days is either dead or needs intervention — either way, inaction is the worst choice.\",\n steps: [\n \"Pull stuck deals sorted by amount (highest value first)\",\n \"For each stuck deal: identify the blocker (no next step? waiting on prospect? internal approval?)\",\n \"Create a specific next action with a deadline for each stuck deal\",\n \"Escalate deals stuck >30 days to manager review\",\n \"Consider past-due deals: update close dates or move to Closed Lost\",\n ],\n tools_that_help: [\"Deal inspection reports\", \"Next-step templates\", \"Manager escalation workflow\"],\n expected_outcome: \"Flow rate score improves 15+ points; stuck deal count drops by 40%+ within 2 weeks\",\n },\n {\n id: \"reduce-logo-churn\",\n name: \"Reduce Logo Churn\",\n trigger_metric: \"grr\",\n trigger_lens: \"revenue_metrics\",\n trigger_condition: \"GRR below motion benchmark or churned ARR elevated\",\n why: \"Revenue leaking from existing customers is the most expensive problem — you already paid to acquire them.\",\n steps: [\n \"Identify churned and at-risk accounts from retention metrics\",\n \"Segment churn by deal size, tenure, and product usage patterns\",\n \"Launch save plays for accounts showing contraction signals\",\n \"Audit renewal process: timing, stakeholders, and success criteria\",\n \"Implement early-warning triggers 90 days before renewal\",\n ],\n tools_that_help: [\"CS platform\", \"Renewal calendar\", \"NPS/CSAT surveys\"],\n expected_outcome: \"GRR improves toward motion benchmark within 2 quarters\",\n },\n {\n id: \"accelerate-expansion\",\n name: \"Accelerate Expansion\",\n trigger_metric: \"nrr\",\n trigger_lens: \"revenue_metrics\",\n trigger_condition: \"NRR below 100% with low expansion ARR\",\n why: \"Growing from installed base is cheaper than new logo acquisition — low expansion means untapped wallet share.\",\n steps: [\n \"List accounts with single-product adoption and upsell potential\",\n \"Map expansion triggers (seat growth, new use cases, tier upgrades)\",\n \"Assign expansion targets to CS and AE teams by account tier\",\n \"Create packaged upsell offers with clear ROI narratives\",\n \"Track expansion pipeline separately from new business\",\n ],\n tools_that_help: [\"Account plans\", \"Usage analytics\", \"Expansion playbooks\"],\n expected_outcome: \"Expansion ARR grows 20%+ quarter over quarter\",\n },\n {\n id: \"fix-renewal-process\",\n name: \"Fix the Renewal Process\",\n trigger_metric: \"contraction_arr\",\n trigger_lens: \"revenue_metrics\",\n trigger_condition: \"Contraction ARR > 0\",\n why: \"Downgrades are usually a process failure — late engagement, wrong stakeholders, or missing value proof.\",\n steps: [\n \"Pull all contraction events and categorize root cause\",\n \"Standardize renewal timeline: 120/90/60/30-day checkpoints\",\n \"Ensure economic buyer is engaged before renewal date\",\n \"Build ROI recap deck template for every renewal\",\n \"Escalate contractions >20% to leadership review\",\n ],\n tools_that_help: [\"Renewal workflow\", \"QBR templates\", \"Value realization reports\"],\n expected_outcome: \"Contraction ARR drops 50%+ within 2 quarters\",\n },\n {\n id: \"rebalance-pipeline-mix\",\n name: \"Rebalance Pipeline Mix\",\n trigger_metric: \"pipeline_coverage\",\n trigger_lens: \"revenue_metrics\",\n trigger_condition: \"Pipeline coverage red while win rate is healthy\",\n why: \"Strong win rate with weak coverage means qualification works but top-of-funnel is starving the machine.\",\n steps: [\n \"Compare pipeline created vs closed-won by source and segment\",\n \"Identify segments with coverage below benchmark\",\n \"Shift marketing and SDR effort toward under-covered segments\",\n \"Set weekly pipeline-created targets by rep\",\n \"Review discounting and stage inflation masking thin pipeline\",\n ],\n tools_that_help: [\"Pipeline analytics\", \"Marketing attribution\", \"Capacity planning\"],\n expected_outcome: \"Pipeline coverage reaches motion benchmark within 90 days\",\n },\n {\n id: \"compress-sales-cycle\",\n name: \"Compress the Sales Cycle\",\n trigger_metric: \"avg_sales_cycle\",\n trigger_lens: \"revenue_metrics\",\n trigger_condition: \"Avg sales cycle exceeds profile sales_cycle_days by 50%+\",\n why: \"Deals aging past your motion's norm tie up capacity and push revenue into future quarters.\",\n steps: [\n \"Analyze cycle time by stage — find where deals stall longest\",\n \"Implement stage-exit criteria with required next steps\",\n \"Introduce mutual action plans for deals past midpoint\",\n \"Escalate deals exceeding 2x median cycle to manager review\",\n \"Remove low-probability aged deals to free rep capacity\",\n ],\n tools_that_help: [\"Stage duration reports\", \"MAP templates\", \"Deal coaching\"],\n expected_outcome: \"Median cycle time drops 20%+ within one quarter\",\n },\n {\n id: \"improve-magic-number\",\n name: \"Improve Magic Number\",\n trigger_metric: \"magic_number\",\n trigger_lens: \"revenue_metrics\",\n trigger_condition: \"Magic number below motion benchmark (when spend data available)\",\n why: \"Low S&M efficiency means you're buying growth too expensively — burn rate outpaces sustainable unit economics.\",\n steps: [\n \"Calculate magic number by channel and segment\",\n \"Cut spend on channels with magic number below 0.5\",\n \"Double down on highest-efficiency acquisition motions\",\n \"Align CAC targets to motion-specific payback thresholds\",\n \"Review rep ramp time and quota attainment curves\",\n ],\n tools_that_help: [\"Finance model\", \"Channel ROI dashboard\", \"CAC by source\"],\n expected_outcome: \"Magic number improves toward benchmark within 2 quarters\",\n },\n];\n\nconst PLAYS_FILE = \"plays.jsonl\";\n\nfunction playsPath(): string {\n return join(getMemoryDir(), PLAYS_FILE);\n}\n\n/** Read user/case-study-learned plays from the memory store. */\nexport function getCustomPlays(): Play[] {\n const path = playsPath();\n if (!existsSync(path)) return [];\n const out: Play[] = [];\n for (const line of readFileSync(path, \"utf-8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const play = JSON.parse(trimmed) as Play;\n out.push({ ...play, source: \"learned\" });\n } catch {\n // skip malformed lines\n }\n }\n return out;\n}\n\nfunction slugifyPlayName(name: string): string {\n const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\").slice(0, 48);\n return slug || `play-${Date.now()}`;\n}\n\nexport interface AddPlayInput {\n name: string;\n trigger_vital_sign: VitalSign;\n trigger_condition?: string;\n why: string;\n steps: string[];\n tools_that_help?: string[];\n expected_outcome?: string;\n}\n\n/** Persist a learned play. Returns the stored play. */\nexport function addCustomPlay(input: AddPlayInput): Play {\n const existingIds = new Set(getAllPlays().map((p) => p.id));\n let id = slugifyPlayName(input.name);\n let n = 2;\n while (existingIds.has(id)) id = `${slugifyPlayName(input.name)}-${n++}`;\n\n const play: Play = {\n id,\n name: input.name,\n trigger_vital_sign: input.trigger_vital_sign,\n trigger_condition: input.trigger_condition ?? `Relevant when ${input.trigger_vital_sign} needs attention`,\n why: input.why,\n steps: input.steps,\n tools_that_help: input.tools_that_help ?? [],\n expected_outcome: input.expected_outcome ?? \"Improvement in the targeted vital sign\",\n source: \"learned\",\n };\n\n try {\n appendFileSync(playsPath(), JSON.stringify(play) + \"\\n\");\n } catch {\n // best-effort\n }\n return play;\n}\n\n/** All plays: the five seed plays plus any learned plays. */\nexport function getAllPlays(): Play[] {\n return [...PLAYBOOK, ...getCustomPlays()];\n}\n\nexport function getPlaybook(): Play[] {\n return getAllPlays();\n}\n\nexport function getPlaysForVitalSign(sign: VitalSign): Play[] {\n return getAllPlays().filter((p) => p.trigger_vital_sign === sign);\n}\n\nexport function getPlaysForMetric(metric: string): Play[] {\n return getAllPlays().filter((p) => p.trigger_metric === metric);\n}\n\nexport function getMetricsPlays(): Play[] {\n return getAllPlays().filter((p) => p.trigger_lens === \"revenue_metrics\" || p.trigger_metric);\n}\n\nexport function getPlayById(id: string): Play | undefined {\n return getAllPlays().find((p) => p.id === id);\n}\n","import { loadProfile } from \"../config/profile.js\";\nimport { getCustomPlays } from \"../data/playbook.js\";\n\n/**\n * Render the current CompanyProfile as a compact markdown block suitable\n * for prepending to a system prompt. Returns an empty string when no\n * profile exists — the caller should handle that case by simply omitting\n * the context section rather than printing a placeholder.\n */\nexport function buildCompanyProfileBlock(): string {\n const p = loadProfile();\n if (!p) return \"\";\n\n const lines: string[] = [];\n lines.push(`- Company: ${p.company_name}${p.company_url ? ` (${p.company_url})` : \"\"}`);\n lines.push(`- Industry: ${p.industry}`);\n lines.push(`- Product: ${p.product_description}`);\n lines.push(`- Target customer: ${p.target_customer}`);\n lines.push(`- Sales motion: ${p.sales_motion}`);\n if (p.average_deal_size) lines.push(`- Avg deal size: ${p.average_deal_size}`);\n if (p.sales_cycle_days !== undefined) lines.push(`- Typical sales cycle: ~${p.sales_cycle_days} days`);\n if (p.primary_crm) lines.push(`- Primary CRM: ${p.primary_crm}`);\n if (p.engagement_tool) lines.push(`- Engagement tool: ${p.engagement_tool}`);\n if (p.user_scope) lines.push(`- User's scope: ${p.user_scope}`);\n if (p.custom_context) lines.push(`- Additional context: ${p.custom_context}`);\n return lines.join(\"\\n\");\n}\n\n/**\n * ANALYST INSTINCT — the consultant's intuition layer.\n *\n * This is the \"20% that delivers 80% of the value\" when working with a\n * world-class analyst: connecting symptoms into a single root cause,\n * reasoning in causal chains to the outcome an executive actually fears,\n * ruthless prioritization, triage, and naming the pattern. Derived from\n * observing how a sharp operator actually interrogates their pipeline —\n * not a list of metrics, but a way of thinking. Injected into every\n * analyst-facing system prompt so these instincts fire by default, not\n * only when the user thinks to ask for them.\n */\nexport const ANALYST_INSTINCT_BLOCK = `A search box returns numbers; a world-class analyst returns insight. The instincts below are what separate the two. Bring them PROACTIVELY — surface the connection, the chain, and the priority without waiting to be asked, because the user often doesn't know to ask.\n\n- ROOT CAUSE OVER SYMPTOM LIST. GTM problems are rarely independent — they're usually one failure wearing several masks. When two or more vital signs are red or yellow, your first instinct is to ask \"is this the same underlying problem showing up in different places?\" and, when it is, name the single cause. (Classic shape: a broken lead handoff starves reps of new pipeline → they work only what they can already see → everything else ages into stale, zombie deals → the forecast inflates with deals nobody is touching → the quarter is quietly at risk. One cause, four symptoms.)\n- THINK IN CAUSAL CHAINS AND SECOND-ORDER EFFECTS. Don't stop at \"freshness is low.\" Ask what caused it and what it causes next, and trace the chain all the way to the thing an executive loses sleep over — forecast accuracy, the quarter, cash, rep capacity, board credibility. State the chain in plain language.\n- PRIORITIZE BY MONEY AND TIME-TO-IMPACT. Instinctively rank by dollars at stake and by what is fixable this week versus this quarter. Lead with \"the single most expensive problem\" and \"the fastest dollar to recover.\"\n- TRIAGE: SAVEABLE VERSUS ALREADY DEAD. When you look at a pool of at-risk dollars, split it — what is genuinely recoverable with action now, and what is fiction that should be cleared so the forecast tells the truth. Put a number on each bucket.\n- DECOMPOSE ALONG THE DIMENSION THAT EXPLAINS THE NUMBER. A bad aggregate is an average hiding a story. Reach for the cut most likely to be actionable — by rep, by source, by stage, by deal age, by segment — and surface the one where the problem concentrates.\n- SMELL-TEST EXTREME NUMBERS. A 0% or a 100% is rarely a \"score\" — it is usually a broken pipe or a definition problem. Flag structurally implausible numbers as systems failures, not as metrics.\n- NAME THE PATTERN. Connect what you see to a recognizable GTM failure mode (\"reps only fish in the pond they can see,\" \"happy-ears forecast,\" \"marketing-sourced demand dying in the handoff gap\"). A named pattern travels, and it signals you have seen this before.\n- ANTICIPATE THE NEXT QUESTION. Close by teeing up the single sharpest next cut — the question the user would ask next if they were as fluent as you — not a generic \"want me to dig deeper?\"\n\nRestraint matters: NTRP is a stethoscope, not a surgeon. Observe, connect, and recommend — but sharpen the substance, never pad the length.`;\n\nexport const VITAL_SIGNS_BLOCK = `- freshness: Data recency. Low = stale contacts, zombie deals. Dollar value = pipeline at risk from stale accounts.\n- flow_rate: Deal velocity. Low = stuck pipeline, slow progression. Dollar value = amount stuck in pipeline.\n- drop_rate: Handoff retention. Low = leads vanishing between marketing and sales. Dollar value = estimated lost revenue at handoff.\n- signal_to_noise: Activity efficiency. Low = effort aimed at dead ends. Dollar value = cost of misdirected effort.\n- thread_depth: Deal resilience. Low = single-threaded deals, fragile pipeline. Dollar value = amount in single-threaded deals.`;\n\nexport const PLAYBOOK_BLOCK = `- \"Multi-Thread Your Deals\" (id: multi-thread-deals) — when thread_depth is low\n- \"Clean Dead Pipeline\" (id: clean-dead-pipeline) — when freshness is low\n- \"Fix the Handoff Gap\" (id: fix-handoff-gap) — when drop_rate is high\n- \"Retarget Misdirected Effort\" (id: retarget-effort) — when signal_to_noise is low\n- \"Unstick the Pipeline\" (id: unstick-pipeline) — when flow_rate is low`;\n\n/**\n * The playbook block including any learned plays the user has added (from their\n * own experience or ingested case studies). Falls back to the seed plays only.\n */\nexport function buildPlaybookBlock(): string {\n const custom = getCustomPlays();\n if (custom.length === 0) return PLAYBOOK_BLOCK;\n const learned = custom\n .map((p) => `- \"${p.name}\" (id: ${p.id}, learned) — when ${p.trigger_vital_sign} needs attention: ${p.why}`)\n .join(\"\\n\");\n return `${PLAYBOOK_BLOCK}\\nLearned plays (added from this team's experience and ingested case studies — recommend these when they fit):\\n${learned}`;\n}\n\nexport const METRICS_BLOCK = `Revenue metrics measure GTM output — the standard SaaS metrics:\n- ARR: Total closed-won revenue. New ARR + Expansion ARR = growth; Churned + Contraction = leakage.\n- NRR (Net Revenue Retention): >100% means growing from existing customers. Best-in-class: 110%+.\n- GRR (Gross Revenue Retention): Measures churn + contraction only. Best-in-class: >90%.\n- Pipeline Coverage: Open pipeline / trailing-90d won. 3x+ for predictable revenue.\n- Weighted Pipeline: Sum of (amount × stage probability) for open deals.\n- Pipeline Velocity: Revenue throughput per day = (opps × avg deal × win rate) / avg cycle days.\n- Win Rate: closed-won / (won + lost). B2B SaaS benchmark: 20-30%.\n- Avg Deal Size & Avg Sales Cycle: baseline metrics for efficiency.\n- Stage Conversion Rates: per-stage advancement rates from pipeline stages.\n- Unit Economics: LTV proxy, CAC (requires spend data), LTV:CAC, Payback, Magic Number.`;\n\nexport const FINDINGS_SCHEMA_BLOCK = `[\n {\n \"severity\": \"critical\" | \"warning\" | \"info\",\n \"segment\": \"segment name or 'Overall'\",\n \"finding\": \"Plain-english insight with specific numbers AND dollar values. 2-3 sentences max.\",\n \"vital_signs\": {\"vital_sign_name\": score, ...},\n \"entity_count\": number_of_affected_entities,\n \"recommended_focus\": \"vital_sign_name\",\n \"dollar_value\": number_or_null,\n \"recommended_plays\": [{\"play_id\": \"play-id\", \"play_name\": \"Play Name\", \"rationale\": \"Why this play helps\"}]\n }\n]`;\n","/**\n * Shared helpers for parsing JSON from LLM text responses.\n * Models often wrap arrays in markdown fences or add a short preamble —\n * always extract the outermost balanced `[...]` before parsing.\n */\n\n/** Strip ```json fences and trim. */\nexport function stripJsonFences(text: string): string {\n const trimmed = text.trim();\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n if (fenced) return fenced[1]!.trim();\n return trimmed.replace(/```(?:json)?\\s*/gi, \"\").replace(/```/g, \"\").trim();\n}\n\n/**\n * Parse a JSON array from free-form model output.\n * Returns null when no valid array can be extracted (distinct from `[]`).\n */\nexport function parseJsonArrayFromText(text: string): unknown[] | null {\n const cleaned = stripJsonFences(text);\n const start = cleaned.indexOf(\"[\");\n if (start === -1) return null;\n\n let depth = 0;\n let end = -1;\n for (let i = start; i < cleaned.length; i++) {\n if (cleaned[i] === \"[\") depth++;\n else if (cleaned[i] === \"]\") {\n depth--;\n if (depth === 0) {\n end = i;\n break;\n }\n }\n }\n if (end === -1) return null;\n\n try {\n const parsed = JSON.parse(cleaned.slice(start, end + 1));\n return Array.isArray(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n","import type { Context } from \"../cli/context.js\";\nimport type { DataCoverage, MetricsFindingEntry } from \"../types.js\";\nimport { assertReplAi } from \"./repl-api.js\";\nimport { llmCompleteText } from \"./llm/complete.js\";\nimport type { MetricResult } from \"../metrics/types.js\";\nimport type { DataSourceType } from \"../types.js\";\nimport {\n METRICS_BLOCK,\n buildCompanyProfileBlock,\n ANALYST_INSTINCT_BLOCK,\n} from \"./prompt-parts.js\";\nimport { getMetricsPlays } from \"../data/playbook.js\";\nimport { motionBenchmarkLabel } from \"../baselines/metrics-benchmarks.js\";\nimport { loadProfile } from \"../config/profile.js\";\nimport { parseJsonArrayFromText } from \"./json-response.js\";\nimport { dataSourceLabel } from \"../metrics/classify-source.js\";\n\nexport interface MetricsFindingsInput {\n metrics: MetricResult[];\n coverage: DataCoverage;\n data_source_type: DataSourceType;\n}\n\nfunction buildMetricsPlaybookBlock(): string {\n const plays = getMetricsPlays();\n return plays\n .map((p) => `- \"${p.name}\" (id: ${p.id}) — when ${p.trigger_condition}: ${p.why}`)\n .join(\"\\n\");\n}\n\nfunction buildSystemPrompt(): string {\n const profile = loadProfile();\n const profileBlock = buildCompanyProfileBlock();\n const motionLabel = motionBenchmarkLabel(profile?.sales_motion);\n\n return `You are a SaaS metrics analyst. You interpret revenue, retention, and efficiency metrics for a specific company.\n\n${profileBlock ? `COMPANY CONTEXT:\\n${profileBlock}\\n\\n` : \"\"}Benchmark calibrations use the ${motionLabel} sales motion — reference company-specific deal size and cycle when judging whether metrics are healthy.\n\nMETRICS REFERENCE:\n${METRICS_BLOCK}\n\nMETRICS PLAYS — recommend when triggers match:\n${buildMetricsPlaybookBlock()}\n\nANALYST INSTINCT:\n${ANALYST_INSTINCT_BLOCK}\n\nRespond with JSON only — an array of finding objects:\n[\n {\n \"severity\": \"critical\" | \"warning\" | \"info\",\n \"segment\": \"Overall\",\n \"finding\": \"Plain-english insight with specific numbers. Reference confidence when below 80. 2-3 sentences max.\",\n \"vital_signs\": {},\n \"entity_count\": 0,\n \"recommended_focus\": \"nrr\",\n \"metric\": \"nrr\",\n \"confidence\": 68,\n \"dollar_value\": null,\n \"recommended_plays\": [{\"play_id\": \"play-id\", \"play_name\": \"Play Name\", \"rationale\": \"Why\"}]\n }\n]\n\nRules:\n- Maximum 8 findings\n- Always cite confidence scores when provided on metrics\n- Flag reliability_gate requirements when metrics are below reportable tier\n- Calibrate to ${motionLabel} benchmarks, not generic SaaS averages\n- Recommend metrics plays by name when appropriate\n- Do not recommend running /diagnose or /metrics — next-step navigation is handled outside findings`;\n}\n\nexport async function generateMetricsFindings(input: MetricsFindingsInput, ctx: Context): Promise<{\n findings: MetricsFindingEntry[];\n model_used: string;\n raw_prompt: string;\n}> {\n assertReplAi(ctx);\n\n const payload = {\n data_source: dataSourceLabel(input.data_source_type),\n coverage: input.coverage,\n metrics: Object.fromEntries(\n input.metrics\n .filter((m) => m.value != null || m.unavailable_reason)\n .map((m) => [m.metric, {\n label: m.label,\n formatted: m.formatted,\n status: m.status,\n confidence: m.confidence,\n confidence_label: m.confidence_label,\n reliability_gate: m.reliability_gate,\n estimation_method: m.estimation_method,\n benchmark_note: m.benchmark_note,\n unavailable: m.unavailable_reason,\n }]),\n ),\n };\n\n const userMessage = JSON.stringify(payload, null, 2);\n\n const { text, model_used } = await llmCompleteText(\n \"metrics_findings\",\n buildSystemPrompt(),\n userMessage,\n 4096,\n ctx,\n );\n const parsed = parseJsonArrayFromText(text);\n if (parsed === null) throw new Error(\"AI response is not valid JSON\");\n return { findings: parsed as MetricsFindingEntry[], model_used, raw_prompt: userMessage };\n}\n\nexport async function* streamMetricsFindings(input: MetricsFindingsInput, ctx: Context): AsyncGenerator<{\n type: \"finding\";\n finding: MetricsFindingEntry;\n} | {\n type: \"done\";\n findings: MetricsFindingEntry[];\n model_used: string;\n raw_prompt: string;\n}> {\n const result = await generateMetricsFindings(input, ctx);\n for (const finding of result.findings) {\n yield { type: \"finding\", finding };\n }\n yield {\n type: \"done\",\n findings: result.findings,\n model_used: result.model_used,\n raw_prompt: result.raw_prompt,\n };\n}\n","/**\n * Recommend companion analysis lens when data supports it.\n */\n\nimport chalk from \"chalk\";\nimport type { AnalysisLens, DataSourceType, SessionAnalysis } from \"../types.js\";\nimport type { DataCoverage } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport interface CompanionInput {\n analysis: SessionAnalysis;\n coverage: DataCoverage;\n opportunityCount: number;\n activityCount: number;\n sourceType: DataSourceType;\n}\n\nexport function getCompanionRecommendation(input: CompanionInput): AnalysisLens | null {\n const { analysis, coverage, opportunityCount, activityCount, sourceType } = input;\n const completed = new Set(analysis.completed);\n\n if (!completed.has(\"revenue_metrics\")) {\n const hasPipeline = sourceType === \"pipeline\" || sourceType === \"hybrid\";\n if (hasPipeline && coverage.distinct_months >= 3 && coverage.closed_won_count > 0) {\n return \"revenue_metrics\";\n }\n }\n\n if (!completed.has(\"gtm_health\")) {\n if (opportunityCount > 0 && activityCount > 0) {\n return \"gtm_health\";\n }\n }\n\n return null;\n}\n\nexport type CompanionCommand = \"diagnose\" | \"metrics\" | \"new\";\n\n/** One-line bridge after compute — signals question mode. */\nexport function printAnalysisComplete(lens: AnalysisLens): void {\n const label = lens === \"revenue_metrics\" ? \"SaaS metrics\" : \"Pipeline health\";\n console.log(\n \" \" +\n chalk.green(`✓ ${label} ready`) +\n chalk.dim(\" — type a question below \") +\n paint(\"accent\", \"(no slash needed)\"),\n );\n}\n\n/** Banner when running the other view (not the session primary). */\nexport function printCompanionBanner(invoked: CompanionCommand, primary: AnalysisLens): void {\n if (invoked === \"diagnose\" && primary === \"revenue_metrics\") {\n console.log();\n console.log(\n \" \" +\n chalk.dim(\"Other view — \") +\n chalk.bold(\"pipeline health\") +\n chalk.dim(\" (this session started with SaaS metrics)\"),\n );\n console.log();\n return;\n }\n if (invoked === \"metrics\" && primary === \"gtm_health\") {\n console.log();\n console.log(\n \" \" +\n chalk.dim(\"Other view — \") +\n chalk.bold(\"SaaS metrics\") +\n chalk.dim(\" (this session started with pipeline health)\"),\n );\n console.log();\n }\n}\n\n/** Curiosity-first footer — get users asking questions immediately. */\nexport function printCompanionFooter(\n ctx: Context,\n companion: AnalysisLens | null,\n options: {\n justCompleted: AnalysisLens;\n suggestedAsks?: string[];\n } = { justCompleted: \"gtm_health\" },\n): void {\n const { justCompleted, suggestedAsks } = options;\n const completed = new Set(ctx.analysis.completed);\n\n printAnalysisComplete(justCompleted);\n\n console.log();\n console.log(\" \" + chalk.bold(\"Try asking\"));\n\n const defaults =\n justCompleted === \"revenue_metrics\"\n ? [\n \"Why is NRR showing 100%?\",\n \"Which deals drove ARR this quarter?\",\n \"Is our pipeline coverage realistic?\",\n ]\n : [\n \"Which deals are stuck the longest?\",\n \"Where are we losing leads in the handoff?\",\n \"What should I fix first?\",\n ];\n\n const asks = (suggestedAsks?.length ? suggestedAsks : defaults).slice(0, 3);\n for (const q of asks) {\n console.log(chalk.dim(` \"${q}\"`));\n }\n\n console.log();\n const extras: string[] = [];\n if (companion === \"gtm_health\" && !completed.has(\"gtm_health\")) {\n extras.push(`${paint(\"accent\", \"/diagnose\")} for the other view`);\n } else if (companion === \"revenue_metrics\" && !completed.has(\"revenue_metrics\")) {\n extras.push(`${paint(\"accent\", \"/metrics\")} for the other view`);\n }\n extras.push(`${paint(\"accent\", \"/handoff\")} to export`);\n if (justCompleted === \"revenue_metrics\") {\n extras.push(`${paint(\"accent\", \"/metrics --findings\")} for AI depth`);\n } else {\n extras.push(`${paint(\"accent\", \"/diagnose --findings\")} for AI depth`);\n }\n console.log(\" \" + chalk.dim(\"Also: \") + chalk.dim(extras.join(\" · \")));\n console.log();\n}\n\n/** Resolve companion recommendation from current DB + session state. */\nexport async function resolveCompanionRecommendation(ctx: Context): Promise<AnalysisLens | null> {\n const { buildMetricsComputeContext } = await import(\"./compute.js\");\n const { getEntityCounts } = await import(\"../db/queries.js\");\n const mctx = await buildMetricsComputeContext();\n const counts = await getEntityCounts();\n return getCompanionRecommendation({\n analysis: ctx.analysis,\n coverage: mctx.coverage,\n opportunityCount: counts.opportunities ?? 0,\n activityCount: counts.activities ?? 0,\n sourceType: mctx.sourceType,\n });\n}\n","import { initSchema } from \"../db/schema.js\";\nimport { autoGenerateSegments } from \"../pipeline/segments.js\";\nimport { insertFinding, getEntityCounts } from \"../db/queries.js\";\nimport { computeFullMetrics, buildMetricsComputeContext } from \"../metrics/compute.js\";\nimport { streamMetricsFindings } from \"../ai/metrics-findings.js\";\nimport { canUseReplAi } from \"../ai/repl-api.js\";\nimport type { Context } from \"../cli/context.js\";\nimport type { MetricsAnalysisResult } from \"../metrics/types.js\";\nimport type { MetricsFindingEntry, SessionAnalysis } from \"../types.js\";\nimport { getCompanionRecommendation } from \"../metrics/companion.js\";\nimport { formatCoverageHeader } from \"../metrics/coverage.js\";\n\nexport interface MetricsAnalysisOptions {\n findings?: boolean;\n segment?: string;\n sessionAnalysis?: SessionAnalysis;\n onProgress?: (phase: \"computing\" | \"findings\") => void;\n ctx?: Context;\n}\n\nexport async function runMetricsAnalysis(\n options: MetricsAnalysisOptions = {},\n): Promise<MetricsAnalysisResult> {\n await initSchema();\n await autoGenerateSegments();\n\n options.onProgress?.(\"computing\");\n const mctx = await buildMetricsComputeContext();\n const fullResult = await computeFullMetrics();\n\n let metricsResult = fullResult;\n if (options.segment) {\n const needle = options.segment.toLowerCase();\n const match = fullResult.segments.find(\n (s) => s.segment.name.toLowerCase() === needle\n || s.segment.name.toLowerCase().includes(needle),\n );\n if (match) {\n metricsResult = { aggregate: fullResult.aggregate, segments: [match] };\n }\n }\n\n const findings: MetricsFindingEntry[] = [];\n let modelUsed: string | undefined;\n let rawPrompt: string | undefined;\n\n if (options.findings) {\n if (!canUseReplAi(options.ctx)) {\n throw new Error(\n \"AI metrics findings require stored API keys. Run `ntrp`, set api-key and/or openai-api-key, then /metrics --findings.\",\n );\n }\n options.onProgress?.(\"findings\");\n for await (const event of streamMetricsFindings({\n metrics: metricsResult.aggregate.metrics,\n coverage: mctx.coverage,\n data_source_type: mctx.sourceType,\n }, options.ctx!)) {\n if (event.type === \"finding\") findings.push(event.finding);\n if (event.type === \"done\") {\n modelUsed = event.model_used;\n rawPrompt = event.raw_prompt;\n }\n }\n\n await insertFinding({\n findings,\n model_used: modelUsed,\n raw_prompt: rawPrompt,\n analysis_lens: \"revenue_metrics\",\n });\n }\n\n const counts = await getEntityCounts();\n const companion = getCompanionRecommendation({\n analysis: options.sessionAnalysis ?? { primary: \"revenue_metrics\", completed: [\"revenue_metrics\"] },\n coverage: mctx.coverage,\n opportunityCount: counts.opportunities ?? 0,\n activityCount: counts.activities ?? 0,\n sourceType: mctx.sourceType,\n });\n\n return {\n metrics: metricsResult,\n coverage: mctx.coverage,\n data_source_type: mctx.sourceType,\n findings,\n companion_recommendation: companion ?? undefined,\n model_used: modelUsed,\n snapshot: mctx.snapshot,\n };\n}\n\nexport function printMetricsAnalysisHeader(\n sourceType: Parameters<typeof formatCoverageHeader>[0],\n coverage: Parameters<typeof formatCoverageHeader>[1],\n): string {\n return formatCoverageHeader(sourceType, coverage);\n}\n","/**\n * Deterministic metrics insights — no API key required.\n * Surfaces cross-metric patterns and data-quality caveats before AI findings.\n */\n\nimport type { DataCoverage, DataSourceType } from \"../types.js\";\nimport type { MetricResult } from \"./types.js\";\nimport { coverageTier } from \"./coverage.js\";\n\nexport type InsightSeverity = \"critical\" | \"warning\" | \"info\";\n\nexport interface DeterministicInsight {\n severity: InsightSeverity;\n headline?: boolean;\n message: string;\n suggested_ask?: string;\n}\n\nfunction metricValue(metrics: MetricResult[], key: string): number | null {\n const m = metrics.find((x) => x.metric === key);\n return m?.value ?? null;\n}\n\nfunction metricConfidence(metrics: MetricResult[], key: string): number | null {\n const m = metrics.find((x) => x.metric === key);\n return m?.confidence ?? null;\n}\n\nexport function buildDeterministicInsights(\n metrics: MetricResult[],\n coverage: DataCoverage,\n sourceType: DataSourceType,\n): DeterministicInsight[] {\n const insights: DeterministicInsight[] = [];\n const tier = coverageTier(coverage);\n\n const arr = metricValue(metrics, \"arr\");\n const winRate = metricValue(metrics, \"win_rate\");\n const pipelineCoverage = metricValue(metrics, \"pipeline_coverage\");\n const expansionArr = metricValue(metrics, \"expansion_arr\");\n const grr = metricValue(metrics, \"grr\");\n const nrr = metricValue(metrics, \"nrr\");\n const winConf = metricConfidence(metrics, \"win_rate\");\n\n if (sourceType === \"pipeline\" && grr === 100 && nrr === 100 && coverage.closed_won_count > 0) {\n insights.push({\n severity: \"warning\",\n headline: true,\n message:\n `GRR/NRR at 100% on pipeline-only data (${coverage.closed_won_count} closed-won, ${coverage.distinct_months} months) — retention is undefined, not proven zero churn. Upload a revenue ledger for authoritative retention.`,\n suggested_ask: \"Is retention really 100% or is this a data gap?\",\n });\n }\n\n if (expansionArr === 0 && (arr ?? 0) > 0 && coverage.closed_won_count >= 3) {\n insights.push({\n severity: \"warning\",\n message:\n \"Expansion ARR is $0 — either no expand motion yet or expansion deals aren't tagged. Check deal_type metadata or bring subscription ledger data.\",\n suggested_ask: \"Why is expansion ARR zero?\",\n });\n }\n\n if (winRate != null && winRate > 35 && coverage.closed_won_count < 10) {\n insights.push({\n severity: \"warning\",\n message:\n `Win rate ${Math.round(winRate)}% is based on only ${coverage.closed_won_count} closed-won deals — treat as directional until you reach reportable tier (10+ wins).`,\n suggested_ask: \"How reliable is our win rate with this sample size?\",\n });\n }\n\n if (pipelineCoverage != null && pipelineCoverage > 8 && winRate != null && winRate > 40) {\n insights.push({\n severity: \"warning\",\n message:\n `Pipeline coverage ${pipelineCoverage.toFixed(1)}x combined with ${Math.round(winRate)}% win rate implies unrealistic bookings — likely stale or early-stage pipeline inflating coverage.`,\n suggested_ask: \"Is our pipeline coverage realistic given win rate?\",\n });\n }\n\n if (!coverage.has_deal_type_metadata && sourceType !== \"revenue_ledger\") {\n insights.push({\n severity: \"info\",\n message:\n \"No deal_type tags — new vs expansion ARR is inferred from org deal order, not CRM fields.\",\n });\n }\n\n if (coverage.distinct_months < 6) {\n insights.push({\n severity: \"info\",\n message:\n `${coverage.distinct_months} month(s) of close history (${tier} tier) — trend and YoY metrics are directional only.`,\n });\n }\n\n for (const w of coverage.warnings) {\n if (!insights.some((i) => i.message.includes(w.slice(0, 24)))) {\n insights.push({ severity: \"info\", message: w });\n }\n }\n\n if (winConf != null && winConf < 55) {\n const wr = metrics.find((m) => m.metric === \"win_rate\");\n const gate = wr?.reliability_gate?.requirements[0];\n if (gate) {\n insights.push({ severity: \"info\", message: `Win rate gate: ${gate}` });\n }\n }\n\n if (insights.length === 0 && arr != null) {\n insights.push({\n severity: \"info\",\n headline: true,\n message: `ARR ${metrics.find((m) => m.metric === \"arr\")?.formatted ?? \"\"} at ${tier} data tier — metrics are computed; deepen with segment cuts or a revenue ledger.`,\n });\n }\n\n return insights;\n}\n\nexport function pickHeadlineInsight(insights: DeterministicInsight[]): string | null {\n const headline = insights.find((i) => i.headline);\n if (headline) return headline.message;\n const warning = insights.find((i) => i.severity === \"warning\");\n if (warning) return warning.message;\n return insights[0]?.message ?? null;\n}\n","/**\n * Unified terminal report for SaaS metrics — coverage, trends, table, insights, next steps.\n */\n\nimport chalk from \"chalk\";\nimport type { AnalysisLens, DataCoverage, DataSourceType, MetricsFindingEntry } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\nimport type { DataSnapshot } from \"../types.js\";\nimport type { MetricGroup, MetricResult } from \"../metrics/types.js\";\nimport { formatCoverageHeader, coverageTier } from \"../metrics/coverage.js\";\nimport { bucketClosedWonByPeriod } from \"../metrics/periods.js\";\nimport { buildDeterministicInsights, pickHeadlineInsight } from \"../metrics/insights.js\";\nimport { printMetricsTable, printFindings } from \"./terminal.js\";\nimport { bold, paint } from \"../ui/theme.js\";\nimport { printCompanionFooter } from \"../metrics/companion.js\";\n\nconst GROUP_ORDER: MetricGroup[] = [\n \"Revenue\",\n \"Retention\",\n \"Pipeline\",\n \"Sales Efficiency\",\n \"Unit Economics\",\n];\n\nexport interface RenderMetricsReportOptions {\n title?: string;\n snapshot?: DataSnapshot;\n findings?: MetricsFindingEntry[];\n companion?: AnalysisLens | null;\n interactive?: boolean;\n}\n\nexport function renderMetricsReport(\n ctx: Context,\n metrics: MetricResult[],\n coverage: DataCoverage,\n sourceType: DataSourceType,\n options: RenderMetricsReportOptions = {},\n): void {\n const title = options.title ?? \"SaaS Metrics Analysis\";\n const tier = coverageTier(coverage);\n const deterministic = buildDeterministicInsights(metrics, coverage, sourceType);\n const headline = pickHeadlineInsight(deterministic);\n\n console.log();\n console.log(chalk.bold(` ${title}`));\n console.log(\" \" + chalk.dim(formatCoverageHeader(sourceType, coverage)));\n console.log();\n\n printDataQualityPanel(coverage, sourceType, tier);\n\n if (options.snapshot && coverage.distinct_quarters >= 2) {\n printCloseTrend(options.snapshot, coverage.recommended_cadence);\n }\n\n if (headline) {\n console.log(\" \" + paint(\"warning\", \"▸ Headline\"));\n console.log(\" \" + chalk.white(wrapInsight(headline)));\n console.log();\n }\n\n printMetricsTable(metrics, GROUP_ORDER);\n\n if (deterministic.length > 0) {\n console.log(\" \" + bold(\"Pattern checks\"));\n console.log();\n for (const insight of deterministic.slice(0, 5)) {\n const dot =\n insight.severity === \"warning\"\n ? chalk.yellow(\"●\")\n : insight.severity === \"critical\"\n ? chalk.red(\"●\")\n : chalk.dim(\"○\");\n if (insight.headline) continue;\n console.log(` ${dot} ${chalk.dim(wrapInsight(insight.message))}`);\n }\n console.log();\n }\n\n if (options.findings && options.findings.length > 0) {\n printFindings(options.findings);\n }\n\n if (options.interactive !== false) {\n const suggestedAsks = deterministic\n .map((i) => i.suggested_ask)\n .filter((q): q is string => !!q);\n printMetricsNextSteps(ctx, options.companion ?? null, suggestedAsks);\n }\n}\n\nfunction wrapInsight(text: string): string {\n return text.length > 110 ? text.slice(0, 107) + \"…\" : text;\n}\n\nfunction printDataQualityPanel(\n coverage: DataCoverage,\n sourceType: DataSourceType,\n tier: string,\n): void {\n console.log(\" \" + bold(\"Data quality\"));\n console.log();\n const rows = [\n [\"Source\", sourceType.replace(\"_\", \" \")],\n [\"Close history\", coverage.distinct_months > 0 ? `${coverage.distinct_months} months · ${coverage.closed_won_count} wins` : \"none\"],\n [\"Cadence\", coverage.recommended_cadence],\n [\"Tier\", tier],\n [\"Comparisons\", coverage.eligible_comparisons.join(\", \") || \"snapshot only\"],\n ];\n if (!coverage.has_revenue_events && sourceType === \"pipeline\") {\n rows.push([\"Ledger\", \"not loaded — retention inferred from CRM\"]);\n }\n for (const [label, value] of rows) {\n console.log(` ${chalk.dim(String(label).padEnd(14))} ${value}`);\n }\n console.log();\n}\n\nfunction printCloseTrend(snapshot: DataSnapshot, cadence: DataCoverage[\"recommended_cadence\"]): void {\n const buckets = bucketClosedWonByPeriod(snapshot, cadence);\n if (buckets.length < 2) return;\n\n const recent = buckets.slice(-4);\n console.log(\" \" + bold(`Close trend (${cadence})`));\n console.log();\n for (const b of recent) {\n const newStr = b.new_arr > 0 ? chalk.dim(` new $${formatShort(b.new_arr)}`) : \"\";\n const expStr = b.expansion_arr > 0 ? chalk.dim(` exp $${formatShort(b.expansion_arr)}`) : \"\";\n console.log(\n ` ${chalk.dim(b.period.padEnd(8))} ${chalk.bold(\"$\" + formatShort(b.closed_won_total))}${newStr}${expStr} ${chalk.dim(`(${b.closed_won_count} deals)`)}`,\n );\n }\n console.log();\n}\n\nfunction formatShort(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${Math.round(n / 1_000)}K`;\n return String(Math.round(n));\n}\n\nexport function printMetricsNextSteps(\n ctx: Context,\n companion: AnalysisLens | null,\n suggestedAsks?: string[],\n): void {\n printCompanionFooter(ctx, companion, {\n justCompleted: \"revenue_metrics\",\n suggestedAsks,\n });\n}\n","/**\n * Divergence detection — pure functions.\n * Compares segment vital-sign scores against aggregate to find outliers.\n */\n\nimport type { VitalSign, VitalSignStatus } from \"../types.js\";\n\ninterface AggregateResult {\n overall_score: number;\n overall_status: VitalSignStatus;\n vital_signs: { vital_sign: VitalSign; score: number; status: VitalSignStatus }[];\n}\n\ninterface SegmentInput {\n segmentId: string;\n segmentName: string;\n result: AggregateResult;\n}\n\nexport interface Divergence {\n segmentId: string;\n segmentName: string;\n vitalSign: VitalSign;\n segmentScore: number;\n aggregateScore: number;\n delta: number;\n segmentStatus: VitalSignStatus;\n aggregateStatus: VitalSignStatus;\n}\n\nexport interface DivergenceResult {\n divergences: Divergence[];\n}\n\n/**\n * Compare segment results against the aggregate and find significant divergences.\n * A divergence is flagged when:\n * - Score differs by more than 15 points, OR\n * - Status differs (e.g., segment is red but aggregate is green)\n */\nexport function detectDivergences(\n aggregate: AggregateResult,\n segments: SegmentInput[],\n): DivergenceResult {\n const divergences: Divergence[] = [];\n const SCORE_THRESHOLD = 15;\n\n const aggMap = new Map(aggregate.vital_signs.map((v) => [v.vital_sign, v]));\n\n for (const seg of segments) {\n for (const vs of seg.result.vital_signs) {\n const agg = aggMap.get(vs.vital_sign);\n if (!agg) continue;\n\n const delta = vs.score - agg.score;\n const statusDiffers = vs.status !== agg.status;\n const scoreDiverges = Math.abs(delta) >= SCORE_THRESHOLD;\n\n if (statusDiffers || scoreDiverges) {\n divergences.push({\n segmentId: seg.segmentId,\n segmentName: seg.segmentName,\n vitalSign: vs.vital_sign,\n segmentScore: vs.score,\n aggregateScore: agg.score,\n delta,\n segmentStatus: vs.status,\n aggregateStatus: agg.status,\n });\n }\n }\n }\n\n // Sort by absolute delta descending (most divergent first)\n divergences.sort((a, b) => Math.abs(b.delta) - Math.abs(a.delta));\n\n return { divergences };\n}\n","import type { VitalSign, VitalSignStatus, FindingEntry, LlmUsageMeta } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\nimport type { Divergence } from \"../pipeline/divergence.js\";\nimport { assertReplAi } from \"./repl-api.js\";\nimport { completeWithFailover, streamWithFailover } from \"./llm/failover.js\";\nimport { VITAL_SIGNS_BLOCK, buildPlaybookBlock, FINDINGS_SCHEMA_BLOCK, METRICS_BLOCK, buildCompanyProfileBlock, ANALYST_INSTINCT_BLOCK } from \"./prompt-parts.js\";\nimport type { MetricResult } from \"../metrics/types.js\";\nimport { parseJsonArrayFromText } from \"./json-response.js\";\n\nexport interface FindingsInput {\n aggregate: {\n overall_score: number;\n overall_status: VitalSignStatus;\n vital_signs: { vital_sign: VitalSign; score: number; status: VitalSignStatus; dollar_value?: number | null; dollar_label?: string | null }[];\n total_value_at_risk?: number | null;\n };\n segments: {\n name: string;\n result: {\n overall_score: number;\n overall_status: VitalSignStatus;\n vital_signs: { vital_sign: VitalSign; score: number; status: VitalSignStatus; dollar_value?: number | null; dollar_label?: string | null }[];\n };\n }[];\n divergences: Divergence[];\n metrics?: MetricResult[];\n}\n\nfunction companyContextSection(): string {\n const block = buildCompanyProfileBlock();\n if (!block) return \"\";\n return `COMPANY CONTEXT (use this to anchor findings to the specific business — reference the company by name, use industry-appropriate language, calibrate dollar figures to their deal size):\n${block}\n\n`;\n}\n\nfunction buildSystemPrompt(): string {\n return `You are a GTM health analyst. You analyze go-to-market pipeline health data and write clear, actionable findings.\n\n${companyContextSection()}You receive:\n1. Aggregate vital sign scores across all data (with dollar values where available)\n2. Per-segment vital sign scores\n3. Divergences where segments differ significantly from the aggregate\n\nYour job: Identify the most important findings — the \"oh shit\" moments — and rank them by severity. Always translate scores into dollar impact when dollar_value is provided.\n\nANALYST INSTINCT (apply this judgment — the best findings connect symptoms into a root cause and trace the chain to the business outcome, rather than restating one bad score):\n${ANALYST_INSTINCT_BLOCK}\n\nEach vital sign measures something specific:\n${VITAL_SIGNS_BLOCK}\n\nREVENUE METRICS — cross-reference with vital signs for deeper findings:\n${METRICS_BLOCK}\n\nPLAYBOOK — recommend these plays when appropriate:\n${buildPlaybookBlock()}\n\nRespond with JSON only — an array of finding objects:\n${FINDINGS_SCHEMA_BLOCK}\n\nRules:\n- Maximum 8 findings\n- Critical: status is red, or score below 40, or a segment is dramatically worse than aggregate\n- Warning: status is yellow, or moderate divergence\n- Info: notable patterns worth mentioning\n- Always include specific numbers AND dollar values in findings when available\n- Lead with dollar impact: \"$3.1M pipeline at risk from stale accounts\" not \"Freshness is 29\"\n- Always recommend at least one play per finding\n- Focus on what's ACTIONABLE — what should the sales leader do about this?`;\n}\n\nexport function buildFindingsInput(\n aggregate: FindingsInput[\"aggregate\"],\n segments: FindingsInput[\"segments\"],\n divergences: Divergence[],\n): FindingsInput {\n return { aggregate, segments, divergences };\n}\n\nexport async function generateFindings(input: FindingsInput, ctx: Context): Promise<{\n findings: FindingEntry[];\n model_used: string;\n provider_used?: string;\n raw_prompt: string;\n}> {\n assertReplAi(ctx);\n const userMessage = buildUserMessage(input);\n const { response, meta } = await completeWithFailover(\n {\n surface: \"findings\",\n messages: [{ role: \"user\", content: userMessage }],\n system: buildSystemPrompt(),\n max_tokens: 4096,\n },\n { ctx },\n );\n const parsed = parseJsonArrayFromText(response.text);\n if (parsed === null) throw new Error(\"AI response is not valid JSON\");\n return {\n findings: parsed as FindingEntry[],\n model_used: meta.model_used,\n provider_used: meta.provider_used,\n raw_prompt: userMessage,\n };\n}\n\nfunction buildUserMessage(input: FindingsInput): string {\n const payload: Record<string, unknown> = {\n aggregate: {\n overall_score: input.aggregate.overall_score,\n overall_status: input.aggregate.overall_status,\n total_value_at_risk: input.aggregate.total_value_at_risk ?? null,\n vital_signs: Object.fromEntries(\n input.aggregate.vital_signs.map((v) => [v.vital_sign, { score: v.score, status: v.status, dollar_value: v.dollar_value ?? null, dollar_label: v.dollar_label ?? null }]),\n ),\n },\n segments: input.segments.map((s) => ({\n name: s.name,\n overall_score: s.result.overall_score,\n overall_status: s.result.overall_status,\n vital_signs: Object.fromEntries(\n s.result.vital_signs.map((v) => [v.vital_sign, { score: v.score, status: v.status, dollar_value: v.dollar_value ?? null, dollar_label: v.dollar_label ?? null }]),\n ),\n })),\n divergences: input.divergences.map((d) => ({\n segment: d.segmentName,\n vital_sign: d.vitalSign,\n segment_score: d.segmentScore,\n aggregate_score: d.aggregateScore,\n delta: d.delta,\n })),\n };\n\n if (input.metrics && input.metrics.length > 0) {\n payload.revenue_metrics = Object.fromEntries(\n input.metrics\n .filter((m) => m.value != null || m.unavailable_reason)\n .map((m) => [m.metric, {\n label: m.label,\n group: m.group,\n value: m.value,\n formatted: m.formatted,\n status: m.status,\n ...(m.unavailable_reason ? { unavailable: m.unavailable_reason } : {}),\n }]),\n );\n }\n\n return JSON.stringify(payload, null, 2);\n}\n\n/**\n * Streaming version of generateFindings — yields findings one at a time\n * as they are parsed from the streaming JSON response.\n */\nexport async function* streamFindings(input: FindingsInput, ctx: Context): AsyncGenerator<{\n type: \"finding\";\n finding: FindingEntry;\n} | {\n type: \"done\";\n findings: FindingEntry[];\n model_used: string;\n raw_prompt: string;\n provider_used?: string;\n}> {\n assertReplAi(ctx);\n const userMessage = buildUserMessage(input);\n let meta: LlmUsageMeta = { model_used: \"unknown\", provider_used: \"anthropic\", failover: false };\n for await (const event of streamWithFailover(\n {\n surface: \"findings\",\n messages: [{ role: \"user\", content: userMessage }],\n system: buildSystemPrompt(),\n max_tokens: 4096,\n },\n { ctx },\n )) {\n if (event.type === \"done\") {\n meta = event.meta;\n const parsed = parseJsonArrayFromText(event.response.text);\n if (parsed === null) throw new Error(\"AI response is not valid JSON\");\n const findings = parsed as FindingEntry[];\n for (const finding of findings) yield { type: \"finding\", finding };\n yield {\n type: \"done\",\n findings,\n model_used: meta.model_used,\n provider_used: meta.provider_used,\n raw_prompt: userMessage,\n };\n }\n }\n}\n","/**\n * Opt-in live web retrieval.\n *\n * Lets the analyst pull current frameworks, benchmarks, and case studies on\n * demand. Off by default — enabled only when both a provider key is present\n * AND the user turns it on (config `web-retrieval` = \"on\"), because live web\n * adds latency, cost, and non-determinism.\n *\n * Providers: Tavily (TAVILY_API_KEY) or Brave Search (BRAVE_API_KEY).\n */\n\nimport { getConfigValue } from \"../config/store.js\";\n\nexport interface WebResult {\n title: string;\n url: string;\n snippet: string;\n}\n\ntype Provider = \"tavily\" | \"brave\" | \"none\";\n\nfunction resolveProvider(): { provider: Provider; apiKey: string } | null {\n const tavily = process.env.TAVILY_API_KEY ?? getConfigValue(\"tavily-api-key\");\n const brave = process.env.BRAVE_API_KEY ?? getConfigValue(\"brave-api-key\");\n if (tavily) return { provider: \"tavily\", apiKey: tavily };\n if (brave) return { provider: \"brave\", apiKey: brave };\n return null;\n}\n\n/** True only when a provider is configured AND the feature is switched on. */\nexport function isWebRetrievalEnabled(): boolean {\n const flag = (getConfigValue(\"web-retrieval\") ?? \"\").toLowerCase();\n if (flag !== \"on\" && flag !== \"true\" && flag !== \"1\") return false;\n return resolveProvider() !== null;\n}\n\nexport async function webSearch(query: string, maxResults = 5): Promise<WebResult[]> {\n const resolved = resolveProvider();\n if (!resolved) return [];\n\n try {\n if (resolved.provider === \"tavily\") {\n const res = await fetch(\"https://api.tavily.com/search\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n api_key: resolved.apiKey,\n query,\n max_results: maxResults,\n search_depth: \"basic\",\n }),\n });\n if (!res.ok) return [];\n const json = (await res.json()) as { results?: { title: string; url: string; content: string }[] };\n return (json.results ?? []).map((r) => ({ title: r.title, url: r.url, snippet: r.content }));\n }\n\n // Brave\n const url = new URL(\"https://api.search.brave.com/res/v1/web/search\");\n url.searchParams.set(\"q\", query);\n url.searchParams.set(\"count\", String(maxResults));\n const res = await fetch(url, {\n headers: { Accept: \"application/json\", \"X-Subscription-Token\": resolved.apiKey },\n });\n if (!res.ok) return [];\n const json = (await res.json()) as { web?: { results?: { title: string; url: string; description: string }[] } };\n return (json.web?.results ?? []).slice(0, maxResults).map((r) => ({\n title: r.title,\n url: r.url,\n snippet: r.description,\n }));\n } catch {\n return [];\n }\n}\n","/**\n * Tool definitions for the agentic investigation loop.\n */\n\nimport type { LlmToolSchema } from \"./llm/types.js\";\nimport { isWebRetrievalEnabled } from \"./web-search.js\";\n\n/** Optional tool — only offered when live web retrieval is enabled. */\nexport const WEB_SEARCH_TOOL: LlmToolSchema = {\n name: \"web_search\",\n description:\n \"Search the live web for current GTM frameworks, benchmarks, market trends, or external case studies. \" +\n \"Use sparingly and only when the user's question benefits from up-to-date outside knowledge that isn't in \" +\n \"their data or your ingested knowledge packs. Always attribute what you learned and cite the source.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n query: {\n type: \"string\",\n description: \"The search query.\",\n },\n },\n required: [\"query\"],\n },\n};\n\n/** Assemble the tool set for an agentic run, including optional gated tools. */\nexport const CONVERSATION_TOOLS: LlmToolSchema[] = [\n {\n name: \"propose_scope\",\n description:\n \"Propose an analysis scope (lens + intent) from the user's stated goal. \" +\n \"Use in orient/scope phases before data is loaded.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n intent: { type: \"string\", description: \"User's stated analysis goal.\" },\n },\n required: [\"intent\"],\n },\n },\n {\n name: \"confirm_scope\",\n description: \"Confirm the current proposed analysis scope so data audit can run.\",\n parameters: { type: \"object\" as const, properties: {} },\n },\n {\n name: \"audit_data_gaps\",\n description:\n \"Audit what data is present and missing for the scoped analysis. \" +\n \"Returns can_compute, satisfied, missing, and optional items.\",\n parameters: { type: \"object\" as const, properties: {} },\n },\n {\n name: \"ingest_file\",\n description: \"Ingest a CSV file path into the session dataset.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n path: { type: \"string\", description: \"Absolute or relative path to a .csv file.\" },\n },\n required: [\"path\"],\n },\n },\n {\n name: \"run_compute\",\n description:\n \"Run formula-only analysis (vital signs or SaaS metrics) for the confirmed scope. \" +\n \"Only call when audit_data_gaps reports can_compute true.\",\n parameters: { type: \"object\" as const, properties: {} },\n },\n {\n name: \"draft_handoff\",\n description: \"Draft a handoff prompt combining analysis numbers and conversation thread.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n target: {\n type: \"string\",\n enum: [\"deck\", \"asana\", \"clay\", \"plan\"],\n description: \"Deliverable type. Defaults to plan.\",\n },\n },\n },\n },\n];\n\nexport function buildAgenticTools(): LlmToolSchema[] {\n const tools = [...AGENTIC_TOOLS, ...CONVERSATION_TOOLS];\n if (isWebRetrievalEnabled()) tools.push(WEB_SEARCH_TOOL);\n return tools;\n}\n\nexport const AGENTIC_TOOLS: LlmToolSchema[] = [\n {\n name: \"get_health_summary\",\n description:\n \"Get the overall health score and per-segment scores with statuses. \" +\n \"Returns overall_score, overall_status, gating_vital_sign, and each segment's scores. \" +\n \"Use this first to orient yourself before drilling deeper.\",\n parameters: {\n type: \"object\" as const,\n properties: {},\n },\n },\n {\n name: \"get_vital_sign_detail\",\n description:\n \"Get the component breakdown for a single vital sign. \" +\n \"For example, freshness returns stale entity counts by type; flow_rate returns stuck deal counts and cycle times. \" +\n \"Use this to understand WHY a vital sign is scoring low.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n vital_sign: {\n type: \"string\",\n enum: [\"freshness\", \"flow_rate\", \"drop_rate\", \"signal_to_noise\", \"thread_depth\"],\n description: \"Which vital sign to inspect.\",\n },\n segment_name: {\n type: \"string\",\n description: \"Optional segment name. Omit for aggregate.\",\n },\n },\n required: [\"vital_sign\"],\n },\n },\n {\n name: \"get_divergences\",\n description:\n \"Get segments that diverge significantly from the aggregate. \" +\n \"Returns segment name, vital sign, delta, and both scores. \" +\n \"Optionally filter to a single vital sign.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n vital_sign: {\n type: \"string\",\n enum: [\"freshness\", \"flow_rate\", \"drop_rate\", \"signal_to_noise\", \"thread_depth\"],\n description: \"Optional: filter divergences to this vital sign only.\",\n },\n },\n },\n },\n {\n name: \"query_pipeline_risk\",\n description:\n \"Query the live database for pipeline risk indicators: stuck deals (no activity in 14+ days), \" +\n \"past-due deals (close_date in the past), single-threaded deals (only 1 contact), \" +\n \"stage distribution, and total pipeline value at risk. Returns counts and percentages only.\",\n parameters: {\n type: \"object\" as const,\n properties: {},\n },\n },\n {\n name: \"query_activity_distribution\",\n description:\n \"Query activity volume from the database, grouped by type and time period. \" +\n \"Returns counts per activity_type per week or month. Useful for spotting activity trends.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n group_by: {\n type: \"string\",\n enum: [\"week\", \"month\"],\n description: \"Time bucket for grouping. Defaults to 'week'.\",\n },\n activity_type: {\n type: \"string\",\n enum: [\"email\", \"call\", \"meeting\", \"content_view\", \"form_fill\", \"custom\"],\n description: \"Optional: filter to a single activity type.\",\n },\n },\n },\n },\n {\n name: \"query_coverage_gaps\",\n description:\n \"Find coverage gaps in the data: organizations without any contacts, \" +\n \"deals without recent activity (30 days), and orphaned records (activities with no linked deal or contact). \" +\n \"Returns counts only.\",\n parameters: {\n type: \"object\" as const,\n properties: {},\n },\n },\n {\n name: \"query_segment_comparison\",\n description:\n \"Compare two named segments side-by-side across all vital signs. \" +\n \"Returns each vital sign's score and status for both segments.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n segment_a: {\n type: \"string\",\n description: \"Name of the first segment.\",\n },\n segment_b: {\n type: \"string\",\n description: \"Name of the second segment.\",\n },\n },\n required: [\"segment_a\", \"segment_b\"],\n },\n },\n {\n name: \"query_entity_counts\",\n description:\n \"Get counts of entities (people, organizations, opportunities, activities) \" +\n \"optionally grouped by a field like current_stage, source_system, or activity_type.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n entity_type: {\n type: \"string\",\n enum: [\"people\", \"organizations\", \"opportunities\", \"activities\"],\n description: \"Which entity table to count.\",\n },\n group_by: {\n type: \"string\",\n enum: [\"current_stage\", \"source_system\", \"activity_type\"],\n description: \"Optional field to group counts by.\",\n },\n },\n required: [\"entity_type\"],\n },\n },\n {\n name: \"get_revenue_metrics\",\n description:\n \"Get computed revenue metrics: ARR, NRR, GRR, Win Rate, Pipeline Coverage, \" +\n \"Pipeline Velocity, Avg Deal Size, Avg Sales Cycle, Stage Conversion, and Unit Economics. \" +\n \"Returns all metrics with values, statuses, confidence scores, and benchmark notes.\",\n parameters: {\n type: \"object\" as const,\n properties: {},\n },\n },\n {\n name: \"get_revenue_metrics_timeseries\",\n description:\n \"Get a time series for a revenue metric (MoM/QoQ). Returns per-period values with confidence \" +\n \"and delta vs prior period. Use when the user asks for quarter-over-quarter, month-over-month, \" +\n \"or trend breakdowns.\",\n parameters: {\n type: \"object\" as const,\n properties: {\n metric: {\n type: \"string\",\n description: \"Metric key: arr, new_arr, expansion_arr, closed_won_total\",\n },\n cadence: {\n type: \"string\",\n enum: [\"monthly\", \"quarterly\", \"weekly\"],\n description: \"Time bucket cadence. Defaults to quarterly.\",\n },\n comparison: {\n type: \"string\",\n enum: [\"mom\", \"qoq\", \"yoy\", \"ttm\"],\n description: \"Comparison style. Defaults to qoq.\",\n },\n },\n required: [\"metric\"],\n },\n },\n];\n","/**\n * Privacy utilities for agentic tool use.\n * - stripPII(): recursive filter that drops known PII fields\n * - logToolCall(): appends JSONL audit trail to ~/.ntrp/audit/\n */\n\nimport { existsSync, mkdirSync, appendFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\n/** Fields that must never appear in tool results sent to the model. */\nconst PII_FIELDS = new Set([\n \"name\",\n \"canonical_name\",\n \"canonical_email\",\n \"canonical_domain\",\n \"canonical_id\",\n \"email\",\n \"domain\",\n \"id\",\n \"source_id\",\n \"person_id\",\n \"organization_id\",\n \"opportunity_id\",\n \"owner_id\",\n \"raw_data\",\n \"metadata\",\n]);\n\n/**\n * Recursively strip PII fields from an object.\n * Returns a new object — never mutates the input.\n */\nexport function stripPII(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj !== \"object\") return obj;\n\n if (Array.isArray(obj)) {\n return obj.map(stripPII);\n }\n\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (PII_FIELDS.has(key)) continue;\n out[key] = typeof value === \"object\" ? stripPII(value) : value;\n }\n return out;\n}\n\n/** Single audit log entry. */\nexport interface AuditEntry {\n timestamp: string;\n tool_name: string;\n input: unknown;\n result_preview: string;\n duration_ms: number;\n}\n\nconst AUDIT_DIR = join(homedir(), \".ntrp\", \"audit\");\n\nfunction ensureAuditDir(): void {\n if (!existsSync(AUDIT_DIR)) {\n mkdirSync(AUDIT_DIR, { recursive: true });\n }\n}\n\n/**\n * Append a tool call to the daily JSONL audit log.\n * File: ~/.ntrp/audit/agentic-YYYY-MM-DD.jsonl\n */\nexport function logToolCall(entry: AuditEntry): void {\n ensureAuditDir();\n const date = new Date().toISOString().slice(0, 10);\n const path = join(AUDIT_DIR, `agentic-${date}.jsonl`);\n appendFileSync(path, JSON.stringify(entry) + \"\\n\");\n}\n","import type { Context } from \"../cli/context.js\";\n\nlet activeAgentContext: Context | null = null;\n\nexport function setAgentContext(ctx: Context | null): void {\n activeAgentContext = ctx;\n}\n\nexport function getAgentContext(): Context | null {\n return activeAgentContext;\n}\n","import type { AnalysisLens } from \"../types.js\";\nimport type { AnalysisScope } from \"./types.js\";\n\nconst METRICS_SIGNALS =\n /\\b(arr|nrr|grr|retention|revenue|expansion|churn|saas metrics|board metrics|bookings)\\b/i;\nconst HEALTH_SIGNALS =\n /\\b(vital sign|pipeline health|stuck|freshness|flow rate|drop rate|handoff|signal.?to.?noise|thread depth|zombie)\\b/i;\nconst BOARD_SIGNALS = /\\b(board|executive|cro|ceo|investor)\\b/i;\nconst TIME_SIGNALS =\n /\\b(q[1-4]|quarter|last \\d+ months?|ytd|this year|6 months|12 months)\\b/i;\n\nexport interface ScopeProposal {\n scope: AnalysisScope;\n clarifying_question?: string;\n recommend_companion?: AnalysisLens;\n}\n\nexport function proposeScopeFromIntent(input: string): ScopeProposal {\n const text = input.trim();\n const metricsHit = METRICS_SIGNALS.test(text);\n const healthHit = HEALTH_SIGNALS.test(text);\n const boardHit = BOARD_SIGNALS.test(text);\n const timeMatch = text.match(TIME_SIGNALS);\n\n let primary: AnalysisLens = \"gtm_health\";\n let recommend_companion: AnalysisLens | undefined;\n\n if (metricsHit && !healthHit) {\n primary = \"revenue_metrics\";\n } else if (metricsHit && healthHit) {\n primary = \"gtm_health\";\n recommend_companion = \"revenue_metrics\";\n }\n\n const audience = boardHit ? \"board\" : undefined;\n const time_horizon = timeMatch?.[0];\n\n let intent_summary = text.length > 120 ? `${text.slice(0, 117)}…` : text;\n if (primary === \"revenue_metrics\") {\n intent_summary = boardHit\n ? \"Board-ready SaaS metrics and retention story\"\n : metricsHit\n ? \"SaaS revenue and retention analysis\"\n : intent_summary;\n } else if (healthHit) {\n intent_summary = \"Pipeline health and vital signs\";\n }\n\n const scope: AnalysisScope = {\n intent_summary,\n primary_lens: primary,\n ...(audience ? { audience } : {}),\n ...(time_horizon ? { time_horizon } : {}),\n };\n\n let clarifying_question: string | undefined;\n if (!audience && boardHit === false && primary === \"revenue_metrics\") {\n clarifying_question = \"Who is this for — board, leadership, or ops? (optional — say skip)\";\n } else if (!time_horizon && primary === \"revenue_metrics\") {\n clarifying_question = \"What time period matters most? (e.g. Q3, last 6 months — or say skip)\";\n }\n\n return { scope, clarifying_question, recommend_companion };\n}\n\nexport function confirmScope(ctx: import(\"../cli/context.js\").Context): void {\n if (!ctx.scope) return;\n ctx.scope = { ...ctx.scope, confirmed_at: new Date().toISOString() };\n ctx.analysis = { ...ctx.analysis, primary: ctx.scope.primary_lens };\n if (ctx.scope.primary_lens === \"revenue_metrics\" || ctx.scope.primary_lens === \"gtm_health\") {\n // keep completed as-is until compute runs\n }\n}\n\nexport function isScopeConfirmInput(input: string): boolean {\n return /^(yes|y|yeah|yep|correct|looks good|that'?s right|confirm|ok|okay|go)$/i.test(input.trim());\n}\n\nexport function isScopeAdjustInput(input: string): boolean {\n return /^(adjust|change|refine|edit|no|nope)$/i.test(input.trim());\n}\n\nexport function isSkipClarifier(input: string): boolean {\n return /^skip$/i.test(input.trim());\n}\n","import chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { isAnalysisReady } from \"../cli/context.js\";\nimport { formatActiveStackShort } from \"../ai/llm/session-state.js\";\nimport { paint } from \"../ui/theme.js\";\nimport type { ConversationPhase } from \"./types.js\";\n\nexport function sessionHasData(ctx: Context): boolean {\n const counts = ctx.dataset?.counts ?? {};\n return Object.values(counts).some((n) => (n ?? 0) > 0);\n}\n\n/** Derive conversation phase from session state — not persisted independently. */\nexport function resolveConversationPhase(ctx: Context): ConversationPhase {\n if (ctx.deliverIntent) return \"deliver\";\n if (ctx.computeInProgress) return \"compute\";\n if (isAnalysisReady(ctx)) return \"explore\";\n\n const scope = ctx.scope;\n if (scope?.confirmed_at) {\n if (!sessionHasData(ctx)) return \"awaiting_data\";\n if (ctx.stage !== \"analyzed\") return \"awaiting_data\";\n }\n\n if (scope?.intent_summary && !scope.confirmed_at) return \"scope\";\n return \"orient\";\n}\n\nconst PROMPT_LABELS: Record<ConversationPhase, string> = {\n orient: \"›\",\n scope: \"scope ›\",\n awaiting_data: \"data ›\",\n compute: \"…\",\n explore: \"ask ›\",\n deliver: \"ship ›\",\n};\n\n/** User-facing phase label for dashboards and status surfaces. */\nexport function formatPhaseLabel(phase: ConversationPhase): string {\n switch (phase) {\n case \"orient\":\n return \"setup\";\n case \"explore\":\n return \"ready to ask\";\n default:\n return phase.replace(/_/g, \" \");\n }\n}\n\n/** REPL prompt label for the current conversation phase. */\nexport function buildConversationPrompt(ctx: Context): string {\n const phase = resolveConversationPhase(ctx);\n const label = PROMPT_LABELS[phase];\n const scope = ctx.sessionName ? ` ${ctx.sessionName}` : \"\";\n if (phase === \"orient\") {\n return paint(\"accent\", `${label} `);\n }\n if (phase === \"explore\") {\n const stack = formatActiveStackShort(ctx);\n return paint(\"accent\", `${label.replace(\" ›\", \"\")}${scope} › `) + chalk.dim(` ${stack} `);\n }\n return paint(\"accent\", `${label.replace(\" ›\", \"\")}${scope} › `);\n}\n\n/** System-prompt block describing phase, scope, and session state. */\nexport function getConversationPhaseBlock(ctx: Context): string {\n const phase = resolveConversationPhase(ctx);\n const lines = [`Conversation phase: ${formatPhaseLabel(phase)}`];\n if (ctx.scope) {\n lines.push(`Intent: ${ctx.scope.intent_summary}`);\n lines.push(`Primary lens: ${ctx.scope.primary_lens}`);\n if (ctx.scope.audience) lines.push(`Audience: ${ctx.scope.audience}`);\n if (ctx.scope.time_horizon) lines.push(`Time horizon: ${ctx.scope.time_horizon}`);\n if (ctx.scope.confirmed_at) lines.push(`Scope confirmed: ${ctx.scope.confirmed_at}`);\n }\n if (ctx.dataset?.label) lines.push(`Dataset: ${ctx.dataset.label}`);\n if (ctx.gapAudit) {\n lines.push(`Can compute: ${ctx.gapAudit.can_compute}`);\n if (ctx.gapAudit.missing.length > 0) {\n lines.push(`Data gaps: ${ctx.gapAudit.missing.map((m) => m.label).join(\", \")}`);\n }\n }\n return lines.join(\"\\n\");\n}\n","import { all } from \"../db/connection.js\";\nimport { getEntityCounts } from \"../db/queries.js\";\nimport { isProfileConfigured } from \"../config/profile.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { buildMetricsComputeContext } from \"../metrics/compute.js\";\nimport { buildDeterministicInsights } from \"../metrics/insights.js\";\nimport { sessionHasData } from \"./phase.js\";\nimport type { AnalysisScope, GapAuditResult } from \"./types.js\";\nimport type { AnalysisLens } from \"../types.js\";\n\nfunction debigint<T extends Record<string, unknown>>(rows: T[]): T[] {\n return rows.map((row) => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(row)) {\n out[k] = typeof v === \"bigint\" ? Number(v) : v;\n }\n return out as T;\n });\n}\n\nexport async function fetchCrmLinkageGaps(): Promise<{\n orgs_without_contacts: number;\n deals_without_recent_activity: number;\n orphaned_activities: number;\n}> {\n const [orgsNoContacts, dealsNoActivity, orphanedActivities] = await Promise.all([\n all<{ count: bigint | number }>(`\n SELECT COUNT(*) as count FROM organizations o\n WHERE NOT EXISTS (\n SELECT 1 FROM people p WHERE p.organization_id = o.id\n )\n `).then(debigint),\n all<{ count: bigint | number }>(`\n SELECT COUNT(*) as count FROM opportunities o\n WHERE o.current_stage IS NOT NULL\n AND o.current_stage NOT IN ('Closed Won', 'Closed Lost')\n AND NOT EXISTS (\n SELECT 1 FROM activities a\n WHERE a.opportunity_id = o.id\n AND a.occurred_at > CURRENT_TIMESTAMP - INTERVAL 30 DAY\n )\n `).then(debigint),\n all<{ count: bigint | number }>(`\n SELECT COUNT(*) as count FROM activities a\n WHERE a.person_id IS NULL\n AND a.opportunity_id IS NULL\n `).then(debigint),\n ]);\n\n return {\n orgs_without_contacts: Number(orgsNoContacts[0]?.count ?? 0),\n deals_without_recent_activity: Number(dealsNoActivity[0]?.count ?? 0),\n orphaned_activities: Number(orphanedActivities[0]?.count ?? 0),\n };\n}\n\nexport async function runGapAudit(\n ctx: Context,\n scope?: AnalysisScope | null,\n): Promise<GapAuditResult> {\n const primary = scope?.primary_lens ?? ctx.scope?.primary_lens ?? ctx.analysis.primary;\n const hasData = sessionHasData(ctx);\n\n let counts: Record<string, number> = {};\n try {\n counts = await getEntityCounts();\n } catch {\n counts = ctx.dataset?.counts ?? {};\n }\n\n const opps = counts.opportunities ?? 0;\n const activities = counts.activities ?? 0;\n const people = counts.people ?? 0;\n const orgs = counts.organizations ?? 0;\n\n const satisfied: GapAuditResult[\"satisfied\"] = [];\n const missing: GapAuditResult[\"missing\"] = [];\n const optional: GapAuditResult[\"optional\"] = [];\n\n if (!hasData) {\n missing.push({\n label: \"Dataset\",\n why: \"No CRM or revenue data loaded in this session\",\n suggestion: 'Say \"use demo data\" or paste a path to your CSV export',\n });\n return { can_compute: false, primary_lens: primary, satisfied, missing, optional };\n }\n\n if (opps > 0) {\n satisfied.push({ label: \"Opportunities\", detail: `${opps.toLocaleString()} deals` });\n }\n if (activities > 0) {\n satisfied.push({ label: \"Activities\", detail: `${activities.toLocaleString()} interactions` });\n }\n if (people > 0) {\n satisfied.push({ label: \"People\", detail: `${people.toLocaleString()} contacts` });\n }\n if (orgs > 0) {\n satisfied.push({ label: \"Organizations\", detail: `${orgs.toLocaleString()} accounts` });\n }\n\n if (ctx.attachments?.length) {\n for (const att of ctx.attachments) {\n const name = att.path.split(\"/\").pop() ?? att.path;\n satisfied.push({\n label: \"Attachment\",\n detail: `${name}${att.row_count ? ` (${att.row_count} rows)` : \"\"}`,\n });\n }\n }\n\n if (primary === \"gtm_health\") {\n if (opps === 0) {\n missing.push({\n label: \"Opportunities\",\n why: \"Pipeline health needs open or closed deals\",\n suggestion: \"Load a CRM opportunity export or use demo data\",\n });\n }\n if (activities === 0) {\n missing.push({\n label: \"Activities\",\n why: \"Signal-to-noise and thread depth need interaction history\",\n suggestion: \"Load activities or a combined CRM export\",\n });\n }\n }\n\n if (primary === \"revenue_metrics\") {\n let coverage;\n let sourceType: import(\"../types.js\").DataSourceType = \"pipeline\";\n try {\n const mctx = await buildMetricsComputeContext();\n coverage = mctx.coverage;\n sourceType = mctx.sourceType;\n if (coverage.closed_won_count > 0) {\n satisfied.push({\n label: \"Closed-won history\",\n detail: `${coverage.closed_won_count} wins across ${coverage.distinct_months} months`,\n });\n } else {\n missing.push({\n label: \"Closed-won deals\",\n why: \"SaaS metrics need won deal history to estimate ARR\",\n suggestion: \"Load opportunities with close dates or use demo data\",\n });\n }\n\n if (sourceType === \"pipeline\" && coverage.closed_won_count > 0) {\n optional.push({\n label: \"Revenue ledger\",\n detail:\n \"Retention (GRR/NRR) on pipeline-only data is directional — upload subscription/revenue ledger for authoritative retention\",\n });\n }\n\n if (!coverage.has_revenue_events && sourceType !== \"revenue_ledger\") {\n optional.push({\n label: \"Revenue events\",\n detail: \"No revenue ledger — expansion and churn inferred from deal order\",\n });\n }\n\n const metrics = await import(\"../metrics/compute.js\").then((m) =>\n m.computeFullMetrics().then((r) => r.aggregate.metrics),\n );\n const insights = buildDeterministicInsights(metrics, coverage, sourceType);\n for (const insight of insights) {\n if (insight.suggested_ask && insight.message.includes(\"retention\")) {\n optional.push({ label: \"Retention caveat\", detail: insight.message });\n }\n }\n } catch {\n if (opps === 0) {\n missing.push({\n label: \"Opportunity data\",\n why: \"Cannot compute SaaS metrics without deals\",\n suggestion: \"Load a CRM export or use demo data\",\n });\n }\n }\n }\n\n if (!isProfileConfigured()) {\n optional.push({\n label: \"Company profile\",\n detail: \"Using generic benchmarks — run /onboard to calibrate for your motion\",\n });\n }\n\n try {\n const crmGaps = await fetchCrmLinkageGaps();\n if (crmGaps.deals_without_recent_activity > 5) {\n optional.push({\n label: \"Stale open deals\",\n detail: `${crmGaps.deals_without_recent_activity} open deals with no activity in 30 days`,\n });\n }\n if (crmGaps.orphaned_activities > 10) {\n optional.push({\n label: \"Orphaned activities\",\n detail: `${crmGaps.orphaned_activities} activities not linked to people or deals`,\n });\n }\n } catch {\n // DB may be empty\n }\n\n const can_compute =\n missing.length === 0 &&\n hasData &&\n (primary === \"revenue_metrics\" ? opps > 0 : opps > 0 && activities > 0);\n\n return { can_compute, primary_lens: primary, satisfied, missing, optional };\n}\n\nexport function invalidateGapAudit(ctx: Context): void {\n ctx.gapAudit = undefined;\n}\n\nexport async function refreshGapAudit(ctx: Context): Promise<GapAuditResult> {\n const result = await runGapAudit(ctx, ctx.scope);\n ctx.gapAudit = result;\n return result;\n}\n","import chalk from \"chalk\";\nimport type { GapAuditResult } from \"./types.js\";\n\nexport function printGapCard(audit: GapAuditResult): void {\n console.log();\n console.log(\" \" + chalk.bold(\"Data check\"));\n\n if (audit.satisfied.length > 0) {\n for (const item of audit.satisfied) {\n console.log(\" \" + chalk.green(\"✓\") + \" \" + chalk.dim(`${item.label}: ${item.detail}`));\n }\n }\n\n for (const item of audit.missing) {\n console.log(\" \" + chalk.red(\"✗\") + \" \" + item.label + chalk.dim(` — ${item.why}`));\n console.log(\" \" + chalk.dim(item.suggestion));\n }\n\n for (const item of audit.optional) {\n console.log(\" \" + chalk.yellow(\"~\") + \" \" + chalk.dim(`${item.label}: ${item.detail}`));\n }\n\n console.log();\n if (audit.can_compute) {\n console.log(\n \" \" + chalk.dim(\"Ready to compute — say \") + chalk.cyan('\"go ahead\"') + chalk.dim(\" or \") + chalk.cyan('\"run analysis\"'),\n );\n } else if (audit.missing.length > 0) {\n console.log(\n \" \" + chalk.dim('Load data (paste a CSV path or say ') + chalk.cyan(\"use demo data\") + chalk.dim(\")\"),\n );\n }\n console.log();\n}\n","import ora from \"ora\";\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport {\n markLensCompleted,\n saveSessionState,\n recordMessage,\n} from \"../cli/context.js\";\nimport { invalidateGapAudit } from \"./gap-audit.js\";\nimport { printCompanionFooter, resolveCompanionRecommendation } from \"../metrics/companion.js\";\n\nexport async function runConversationCompute(ctx: Context): Promise<string | void> {\n const lens = ctx.scope?.primary_lens ?? ctx.analysis.primary;\n ctx.computeInProgress = true;\n\n try {\n if (lens === \"revenue_metrics\") {\n const { runMetricsAnalysis } = await import(\"../services/metrics-analysis.js\");\n const { renderMetricsReport } = await import(\"../output/metrics-report.js\");\n\n const spinner = ora({ text: \"Computing SaaS metrics…\", indent: 2, discardStdin: false }).start();\n try {\n const result = await runMetricsAnalysis({\n findings: false,\n sessionAnalysis: ctx.analysis,\n });\n spinner.succeed(\"SaaS metrics computed\");\n\n ctx.analysis.coverage = result.coverage;\n ctx.analysis.data_source_type = result.data_source_type;\n ctx.analysis.recommended = result.companion_recommendation;\n markLensCompleted(ctx, \"revenue_metrics\");\n ctx.stage = \"analyzed\";\n ctx.snapshot.computeResult = null;\n invalidateGapAudit(ctx);\n saveSessionState(ctx);\n\n renderMetricsReport(ctx, result.metrics.aggregate.metrics, result.coverage, result.data_source_type, {\n snapshot: result.snapshot,\n findings: result.findings,\n companion: result.companion_recommendation ?? null,\n interactive: true,\n });\n return \"SaaS metrics ready\";\n } catch (err) {\n spinner.fail(\"Metrics failed\");\n throw err;\n }\n }\n\n const { handler: diagnose } = await import(\"../commands/diagnose.js\");\n const summary = await diagnose([], ctx);\n markLensCompleted(ctx, \"gtm_health\");\n ctx.stage = \"analyzed\";\n ctx.snapshot.computeResult = null;\n invalidateGapAudit(ctx);\n saveSessionState(ctx);\n\n const companion = await resolveCompanionRecommendation(ctx);\n printCompanionFooter(ctx, companion, { justCompleted: \"gtm_health\" });\n return typeof summary === \"string\" ? summary : \"Health analysis ready\";\n } catch (err) {\n console.error(\" \" + chalk.red(String((err as Error).message ?? err)));\n return;\n } finally {\n ctx.computeInProgress = false;\n ctx.deliverIntent = false;\n }\n}\n\nexport function isComputeIntent(input: string): boolean {\n return /\\b(run analysis|compute|go ahead|analyze|let'?s go|do it)\\b/i.test(input.trim());\n}\n","import { existsSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { saveSessionState, recordMessage } from \"../cli/context.js\";\nimport { getEntityCounts } from \"../db/queries.js\";\nimport { createPromptSession } from \"../cli/prompts.js\";\nimport { invalidateGapAudit, refreshGapAudit } from \"./gap-audit.js\";\nimport { printGapCard } from \"./gap-card.js\";\nimport type { ChatAttachment } from \"./types.js\";\nimport { runConversationCompute } from \"./compute.js\";\nimport { paint } from \"../ui/theme.js\";\nimport { guardDemoEnabled } from \"../config/demo.js\";\n\n/** Extract a CSV file path from chat input, if present and valid. */\nexport function extractFilePath(input: string): string | null {\n const trimmed = input.trim();\n\n const patterns = [\n /^[\"'](.+\\.csv)[\"']$/i,\n /^@(.+\\.csv)$/i,\n /(?:here'?s|file|path|upload)[:\\s]+[\"']?([^\\s\"']+\\.csv)[\"']?/i,\n /^~\\/\\S+\\.csv$/i,\n /^\\.\\.?\\/\\S+\\.csv$/i,\n /^\\/\\S+\\.csv$/i,\n /^[A-Za-z]:\\\\[^\\s]+\\.csv$/i,\n /^[^\\s]+\\.csv$/i,\n ];\n\n for (const re of patterns) {\n const m = trimmed.match(re);\n if (m?.[1]) {\n const p = expandPath(m[1]);\n if (existsSync(p)) return p;\n }\n if (!m?.[1] && re.test(trimmed) && trimmed.toLowerCase().endsWith(\".csv\")) {\n const p = expandPath(trimmed.replace(/^[\"']|[\"']$/g, \"\"));\n if (existsSync(p)) return p;\n }\n }\n\n return null;\n}\n\nfunction expandPath(p: string): string {\n if (p.startsWith(\"~/\")) return resolve(homedir(), p.slice(2));\n return resolve(p);\n}\n\nexport function looksLikeFilePath(input: string): boolean {\n return extractFilePath(input) !== null;\n}\n\nexport async function ingestFromChat(ctx: Context, filePath: string): Promise<boolean> {\n if (!ctx.rl) {\n console.log(\" \" + chalk.red(\"Ingest confirm requires interactive mode.\"));\n return false;\n }\n\n const name = basename(filePath);\n const prompts = createPromptSession(ctx.rl, ctx);\n try {\n const ok = await prompts.confirm(`Ingest ${name} as CRM export?`, true);\n if (!ok) {\n console.log(\" \" + chalk.dim(\"Ingest cancelled.\"));\n return false;\n }\n } finally {\n prompts.close();\n }\n\n const { handler: ingest } = await import(\"../commands/ingest.js\");\n const { detectEntityType } = await import(\"../pipeline/csv-detect.js\");\n const { readFileSync } = await import(\"node:fs\");\n const { parseCSV } = await import(\"../pipeline/csv-parse.js\");\n const { getStoredApiKey } = await import(\"../ai/repl-api.js\");\n\n let headerCheckFailed = false;\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const { headers } = parseCSV(raw);\n const detected = detectEntityType(headers, \"unknown\");\n if (!detected) headerCheckFailed = true;\n } catch {\n headerCheckFailed = true;\n }\n\n if (headerCheckFailed && getStoredApiKey() && ctx.rl) {\n const prompts2 = createPromptSession(ctx.rl, ctx);\n try {\n const useAi = await prompts2.confirm(\n \"Headers don't match standard CRM exports. Try AI column mapping?\",\n false,\n );\n if (useAi) {\n console.log(\" \" + chalk.dim(\"AI column mapping is not wired to ingest yet — trying standard ingest.\"));\n }\n } finally {\n prompts2.close();\n }\n }\n\n await ingest([filePath, \"--no-profile\"], ctx);\n\n let counts: Record<string, number> = {};\n try {\n counts = await getEntityCounts();\n } catch {\n // ignore\n }\n\n const attachment: ChatAttachment = {\n path: filePath,\n ingested_at: new Date().toISOString(),\n row_count: Object.values(counts).reduce((a, b) => a + b, 0) || undefined,\n };\n ctx.attachments = [...(ctx.attachments ?? []), attachment];\n ctx.dataset = {\n label: name,\n source: filePath,\n counts,\n ingested_at: attachment.ingested_at,\n };\n invalidateGapAudit(ctx);\n saveSessionState(ctx);\n\n console.log();\n console.log(\" \" + paint(\"accent\", \"✓ Data loaded\") + chalk.dim(` — ${name}`));\n recordMessage(ctx, \"user\", `[ingested ${name}]`);\n recordMessage(ctx, \"agent\", `Loaded ${name}. Checking what we can analyze…`);\n\n const audit = await refreshGapAudit(ctx);\n printGapCard(audit);\n\n if (audit.can_compute && ctx.scope?.confirmed_at) {\n const auto = await maybeAutoCompute(ctx);\n if (auto) return true;\n }\n\n return true;\n}\n\nasync function maybeAutoCompute(ctx: Context): Promise<boolean> {\n if (!ctx.rl) return false;\n const prompts = createPromptSession(ctx.rl, ctx);\n try {\n const go = await prompts.confirm(\"Run analysis now?\", true);\n if (go) {\n await runConversationCompute(ctx);\n return true;\n }\n } finally {\n prompts.close();\n }\n return false;\n}\n\nexport function isDemoIntent(input: string): boolean {\n return /\\b(use demo|demo data|sample data|try demo|load demo)\\b/i.test(input.trim());\n}\n\nexport async function loadDemoFromChat(ctx: Context, scenario?: string): Promise<boolean> {\n if (!guardDemoEnabled()) return false;\n const { handler: demo } = await import(\"../commands/generate.js\");\n const args = [\"--no-profile\"];\n if (scenario) args.push(\"--scenario\", scenario);\n\n const ok = await demo(args, ctx);\n if (!ok) return false;\n\n let counts: Record<string, number> = {};\n try {\n counts = await getEntityCounts();\n } catch {\n // ignore\n }\n\n ctx.dataset = {\n label: scenario ? `${scenario} demo` : \"demo dataset\",\n source: `demo:${scenario ?? \"random\"}`,\n counts,\n ingested_at: new Date().toISOString(),\n };\n\n if (!ctx.scope) {\n const { proposeScopeFromIntent } = await import(\"./scope.js\");\n const proposal = proposeScopeFromIntent(\"demo pipeline and metrics\");\n ctx.scope = proposal.scope;\n ctx.scope.confirmed_at = new Date().toISOString();\n ctx.analysis.primary = ctx.scope.primary_lens;\n }\n\n invalidateGapAudit(ctx);\n saveSessionState(ctx);\n\n console.log();\n console.log(\" \" + paint(\"accent\", \"✓ Demo data loaded\"));\n recordMessage(ctx, \"user\", \"use demo data\");\n recordMessage(ctx, \"agent\", \"Demo dataset ready. Here's what we can work with:\");\n\n const audit = await refreshGapAudit(ctx);\n printGapCard(audit);\n return true;\n}\n","/**\n * Dual-lane session analysis loaders — GTM health + SaaS metrics bundles.\n */\n\nimport type { Context } from \"../cli/context.js\";\nimport type { AnalysisLens, FindingEntry } from \"../types.js\";\nimport {\n loadLatestDiagnosis,\n loadLatestMetricsAnalysis,\n type LatestDiagnosis,\n} from \"../db/queries.js\";\nimport { loadProfile } from \"../config/profile.js\";\nimport { VITAL_SIGN_LABELS, formatCurrency } from \"../output/formatters.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport type LatestMetricsAnalysis = NonNullable<Awaited<ReturnType<typeof loadLatestMetricsAnalysis>>>;\n\nexport interface SessionAnalysisBundle {\n diagnosis: LatestDiagnosis | null;\n metrics: LatestMetricsAnalysis | null;\n}\n\nexport async function loadSessionAnalysisBundle(): Promise<SessionAnalysisBundle> {\n const [diagnosis, metrics] = await Promise.all([\n loadLatestDiagnosis(),\n loadLatestMetricsAnalysis(),\n ]);\n return { diagnosis, metrics };\n}\n\nexport function hasAnyAnalysis(bundle: SessionAnalysisBundle): boolean {\n return bundle.diagnosis != null || bundle.metrics != null;\n}\n\n/** Lens-aware error when no analysis exists for handoff/export. */\nexport function formatAnalysisMissingError(ctx: Context): string {\n const primary = ctx.analysis.primary;\n if (primary === \"revenue_metrics\") {\n return `No analysis found. Run ${paint(\"accent\", \"/new\")} or ${paint(\"accent\", \"/metrics\")} first.`;\n }\n return `No analysis found. Run ${paint(\"accent\", \"/new\")} or ${paint(\"accent\", \"/diagnose\")} first.`;\n}\n\nconst KEY_METRICS = [\"arr\", \"nrr\", \"grr\", \"win_rate\", \"pipeline_coverage\"] as const;\n\nfunction formatMetricLine(row: Record<string, unknown>): string {\n const label = (row.label as string) ?? (row.metric as string);\n const formatted = (row.formatted as string) ?? \"--\";\n const conf = row.confidence as number | undefined;\n const confStr = conf != null && conf < 80 ? ` (${conf}% conf)` : \"\";\n return `- ${label}: ${formatted}${confStr}`;\n}\n\n/** Shared context block for handoff prompts — health, metrics, or both. */\nexport function buildHandoffContextBlock(bundle: SessionAnalysisBundle, ctx: Context): string {\n const { diagnosis, metrics } = bundle;\n const profile = loadProfile();\n const lines: string[] = [];\n\n if (profile?.company_name) {\n lines.push(`Company: ${profile.company_name} (${profile.industry})`);\n lines.push(`Sales motion: ${profile.sales_motion}${profile.average_deal_size ? ` · avg deal ${profile.average_deal_size}` : \"\"}`);\n if (profile.user_scope) lines.push(`My scope: ${profile.user_scope}`);\n }\n if (ctx.dataset?.label) {\n const counts = ctx.dataset.counts ?? {};\n const countStr = Object.entries(counts)\n .filter(([, n]) => n > 0)\n .map(([k, n]) => `${n} ${k}`)\n .join(\", \");\n lines.push(`Dataset: ${ctx.dataset.label}${countStr ? ` (${countStr})` : \"\"}`);\n }\n\n const completed = ctx.analysis.completed;\n if (completed.length > 0) {\n lines.push(`Analysis lenses completed: ${completed.join(\", \")}`);\n }\n lines.push(\"\");\n\n if (diagnosis) {\n const { health, findings } = diagnosis;\n lines.push(\"## GTM health (vital signs)\");\n lines.push(`Overall score: ${Math.round(health.overall_score)} (${health.overall_status})`);\n if (health.total_value_at_risk != null && health.total_value_at_risk > 0) {\n lines.push(`Total value at risk: ${formatCurrency(health.total_value_at_risk)}`);\n }\n lines.push(\"\");\n lines.push(\"### Vital signs\");\n for (const vs of health.vital_signs) {\n const label = VITAL_SIGN_LABELS[vs.vital_sign] ?? vs.vital_sign;\n const dollars = vs.dollar_value != null\n ? ` — ${formatCurrency(vs.dollar_value)}${vs.dollar_label ? ` ${vs.dollar_label}` : \"\"}`\n : \"\";\n lines.push(`- ${label}: ${Math.round(vs.score)} (${vs.status})${dollars}`);\n }\n if (findings.length > 0) {\n lines.push(\"\");\n lines.push(\"### GTM findings\");\n appendFindings(lines, findings);\n }\n lines.push(\"\");\n }\n\n if (metrics && metrics.metrics.length > 0) {\n lines.push(\"## SaaS metrics\");\n const byKey = new Map(metrics.metrics.map((r) => [(r.metric as string), r]));\n for (const key of KEY_METRICS) {\n const row = byKey.get(key);\n if (row) lines.push(formatMetricLine(row));\n }\n if (metrics.findings.length > 0) {\n lines.push(\"\");\n lines.push(\"### Metrics findings\");\n appendFindings(lines, metrics.findings);\n }\n lines.push(\"\");\n }\n\n if (!diagnosis && metrics) {\n lines.unshift(\"Primary analysis: SaaS metrics (no GTM health snapshot on this session yet).\", \"\");\n } else if (diagnosis && !metrics) {\n lines.push(\"(SaaS metrics not run on this session — run /metrics for the revenue view)\");\n }\n\n return lines.join(\"\\n\").trim();\n}\n\n/** Compact session artifact for explore-phase NL — vital signs + top findings only. */\nexport function buildExploreContextBlock(bundle: SessionAnalysisBundle, ctx: Context): string {\n const full = buildHandoffContextBlock(bundle, ctx);\n if (!full) return \"\";\n const lines = full.split(\"\\n\");\n const out: string[] = [\n \"COMPLETED ANALYSIS (the user already saw the full report — cite this, do not re-dump it):\",\n \"\",\n ];\n let inFindings = false;\n let findingCount = 0;\n for (const line of lines) {\n if (line.startsWith(\"### GTM findings\") || line.startsWith(\"### Metrics findings\")) {\n inFindings = true;\n out.push(line);\n continue;\n }\n if (inFindings && line.startsWith(\"- [\")) {\n if (findingCount >= 5) continue;\n out.push(line);\n findingCount++;\n continue;\n }\n if (inFindings && line.startsWith(\"##\")) {\n inFindings = false;\n }\n if (line.startsWith(\"## \") || line.startsWith(\"### Vital\") || line.startsWith(\"- \") && !inFindings) {\n if (line.startsWith(\"(SaaS metrics not run\")) continue;\n out.push(line);\n }\n if (line.startsWith(\"Overall score:\") || line.startsWith(\"Total value at risk:\")) {\n out.push(line);\n }\n if (line.startsWith(\"- ARR:\") || line.startsWith(\"- NRR:\") || line.startsWith(\"- GRR:\")) {\n out.push(line);\n }\n }\n return out.join(\"\\n\").trim();\n}\n\nfunction appendFindings(lines: string[], findings: FindingEntry[]): void {\n for (const f of findings.slice(0, 12)) {\n const dollars = f.dollar_value != null ? ` (${formatCurrency(f.dollar_value)})` : \"\";\n const plays = f.recommended_plays?.length\n ? ` → Plays: ${f.recommended_plays.map((p) => p.play_name).join(\", \")}`\n : \"\";\n lines.push(`- [${f.severity}]${dollars} ${f.finding}${plays}`);\n }\n}\n\nexport function handoffInstructionPrefix(primary: AnalysisLens): string {\n if (primary === \"revenue_metrics\") {\n return \"the SaaS metrics and pipeline context below\";\n }\n return \"the pipeline diagnosis below\";\n}\n","import type { Context } from \"../cli/context.js\";\nimport { loadProfile } from \"../config/profile.js\";\nimport {\n loadSessionAnalysisBundle,\n buildHandoffContextBlock,\n handoffInstructionPrefix,\n} from \"../services/session-analysis.js\";\nimport type { HandoffPromptTarget } from \"./types.js\";\n\nexport interface DeliverableDraft {\n markdown: string;\n sections: {\n analysis: string;\n conversation: string;\n open_questions: string;\n };\n}\n\nfunction buildConversationSection(ctx: Context): string {\n const recent = ctx.messages.slice(-20);\n if (recent.length === 0) return \"(No conversation yet.)\";\n\n const lines: string[] = [\"## Conversation thread\", \"\"];\n for (const msg of recent) {\n const role = msg.role === \"user\" ? \"User\" : \"Analyst\";\n const body = msg.content.length > 800 ? `${msg.content.slice(0, 797)}…` : msg.content;\n lines.push(`**${role}:** ${body}`, \"\");\n }\n return lines.join(\"\\n\");\n}\n\nfunction buildOpenQuestions(ctx: Context): string {\n const lines: string[] = [];\n if (ctx.gapAudit?.missing.length) {\n for (const m of ctx.gapAudit.missing) {\n lines.push(`- Data gap: ${m.label} — ${m.why}`);\n }\n }\n if (ctx.gapAudit?.optional.length) {\n for (const o of ctx.gapAudit.optional) {\n if (o.label.toLowerCase().includes(\"retention\") || o.label.toLowerCase().includes(\"caveat\")) {\n lines.push(`- Open: ${o.detail}`);\n }\n }\n }\n const userQs = ctx.messages\n .filter((m) => m.role === \"user\" && m.content.includes(\"?\"))\n .slice(-5);\n for (const q of userQs) {\n lines.push(`- User asked: ${q.content}`);\n }\n return lines.length > 0 ? lines.join(\"\\n\") : \"(No open questions recorded.)\";\n}\n\nfunction wrapForTarget(\n target: HandoffPromptTarget,\n analysisBlock: string,\n conversationBlock: string,\n openQuestions: string,\n ctx: Context,\n): string {\n const company = loadProfile()?.company_name ?? \"the company\";\n const contextLabel = handoffInstructionPrefix(ctx.analysis.primary);\n\n const instructions: Record<HandoffPromptTarget, string> = {\n deck: `produce an executive review deck outline for ${company}. Structure: (1) Headline number; (2) Pipeline health; (3) Top 3 risks with dollar impact; (4) Recommended plays; (5) Asks / decisions.`,\n asana: `produce an Asana project plan with sections and tasks tied to findings. Prioritize by dollar impact.`,\n clay: `produce a Clay table specification to operationalize the highest-impact finding.`,\n plan: `produce a prioritized action plan with problem, play, first 3 steps, owner, and leading indicator per item.`,\n };\n\n return [\n `# NTRP handoff → ${target}`,\n \"\",\n `You are an expert GTM operator. Using ${contextLabel}, ${instructions[target]}`,\n \"\",\n \"Ground every recommendation in the specific numbers provided. Do not invent data.\",\n \"\",\n \"---\",\n \"\",\n analysisBlock,\n \"\",\n \"---\",\n \"\",\n conversationBlock,\n \"\",\n \"---\",\n \"\",\n \"## Open questions\",\n \"\",\n openQuestions,\n \"\",\n \"---\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport async function buildDeliverableDraft(\n ctx: Context,\n target: HandoffPromptTarget = \"plan\",\n): Promise<DeliverableDraft | null> {\n const bundle = await loadSessionAnalysisBundle();\n const analysis = buildHandoffContextBlock(bundle, ctx);\n const conversation = buildConversationSection(ctx);\n const open_questions = buildOpenQuestions(ctx);\n\n if (!analysis && ctx.messages.length === 0) return null;\n\n const markdown = wrapForTarget(target, analysis, conversation, open_questions, ctx);\n return {\n markdown,\n sections: { analysis, conversation, open_questions },\n };\n}\n\nexport function inferHandoffTarget(input: string): HandoffPromptTarget {\n if (/\\bdeck|slides|presentation\\b/i.test(input)) return \"deck\";\n if (/\\basana|tasks|project plan\\b/i.test(input)) return \"asana\";\n if (/\\bclay|table|enrichment\\b/i.test(input)) return \"clay\";\n return \"plan\";\n}\n\nexport function isShipIntent(input: string): boolean {\n return /\\b(handoff|ship|deliver|board memo|export|turn this into|write.?up|action plan)\\b/i.test(\n input.trim(),\n );\n}\n","/**\n * Tool handlers for the agentic investigation loop.\n * 3 handlers read from pre-computed data (zero SQL overhead).\n * 5 handlers run live DuckDB queries with parameterized SQL.\n */\n\nimport type { FullComputeResult } from \"../vitals/health-score.js\";\nimport type { Divergence } from \"../pipeline/divergence.js\";\nimport type { VitalSign } from \"../types.js\";\nimport type { MetricResult } from \"../metrics/types.js\";\nimport { all } from \"../db/connection.js\";\nimport { stripPII, logToolCall } from \"./privacy.js\";\nimport { webSearch } from \"./web-search.js\";\n\nexport interface ToolContext {\n computeResult: FullComputeResult;\n divergences: Divergence[];\n metrics?: MetricResult[];\n}\n\n/** DuckDB returns BigInt for COUNT/SUM — convert to Number for JSON safety. */\nfunction debigint<T>(rows: T[]): T[] {\n return rows.map((row) => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(row as Record<string, unknown>)) {\n out[k] = typeof v === \"bigint\" ? Number(v) : v;\n }\n return out as T;\n });\n}\n\ntype HandlerFn = (input: Record<string, unknown>, ctx: ToolContext) => Promise<unknown>;\n\n// ─── Pre-computed handlers (no SQL) ──────────────────────────────────\n\nasync function handleGetHealthSummary(_input: Record<string, unknown>, ctx: ToolContext): Promise<unknown> {\n const { aggregate, segments } = ctx.computeResult;\n return {\n aggregate: {\n overall_score: aggregate.overall_score,\n overall_status: aggregate.overall_status,\n gating_vital_sign: aggregate.gating_vital_sign,\n total_value_at_risk: aggregate.total_value_at_risk,\n vital_signs: aggregate.vital_signs.map((v) => ({\n vital_sign: v.vital_sign,\n score: v.score,\n status: v.status,\n dollar_value: v.dollar_value,\n dollar_label: v.dollar_label,\n })),\n },\n segments: segments.map((s) => ({\n name: s.segment.name,\n overall_score: s.result.overall_score,\n overall_status: s.result.overall_status,\n gating_vital_sign: s.result.gating_vital_sign,\n vital_signs: s.result.vital_signs.map((v) => ({\n vital_sign: v.vital_sign,\n score: v.score,\n status: v.status,\n dollar_value: v.dollar_value,\n dollar_label: v.dollar_label,\n })),\n })),\n };\n}\n\nasync function handleGetVitalSignDetail(input: Record<string, unknown>, ctx: ToolContext): Promise<unknown> {\n const vitalSign = input.vital_sign as VitalSign;\n const segmentName = input.segment_name as string | undefined;\n\n let source = ctx.computeResult.aggregate;\n if (segmentName) {\n const seg = ctx.computeResult.segments.find(\n (s) => s.segment.name.toLowerCase() === segmentName.toLowerCase(),\n );\n if (!seg) return { error: `Segment '${segmentName}' not found` };\n source = seg.result;\n }\n\n const vital = source.vital_signs.find((v) => v.vital_sign === vitalSign);\n if (!vital) return { error: `Vital sign '${vitalSign}' not found` };\n\n // Summarize entity_details to counts by issue type instead of raw records\n const entitySummary: Record<string, number> = {};\n for (const detail of vital.entity_details) {\n const issue = (detail as Record<string, unknown>).issue as string | undefined;\n const key = issue ?? \"unclassified\";\n entitySummary[key] = (entitySummary[key] ?? 0) + 1;\n }\n\n return {\n vital_sign: vital.vital_sign,\n score: vital.score,\n status: vital.status,\n dollar_value: vital.dollar_value,\n dollar_label: vital.dollar_label,\n components: vital.components,\n entity_issue_counts: entitySummary,\n total_flagged_entities: vital.entity_details.length,\n };\n}\n\nasync function handleGetDivergences(input: Record<string, unknown>, ctx: ToolContext): Promise<unknown> {\n let divs = ctx.divergences;\n const vitalFilter = input.vital_sign as VitalSign | undefined;\n if (vitalFilter) {\n divs = divs.filter((d) => d.vitalSign === vitalFilter);\n }\n return {\n count: divs.length,\n divergences: divs.map((d) => ({\n segment: d.segmentName,\n vital_sign: d.vitalSign,\n segment_score: d.segmentScore,\n aggregate_score: d.aggregateScore,\n delta: d.delta,\n segment_status: d.segmentStatus,\n aggregate_status: d.aggregateStatus,\n })),\n };\n}\n\n// ─── Live SQL handlers ───────────────────────────────────────────────\n\nasync function handleQueryPipelineRisk(): Promise<unknown> {\n const [stuckDeals, pastDueDeals, singleThreaded, stages, totalPipeline] = await Promise.all([\n all<{ count: number }>(`\n SELECT COUNT(*) as count FROM opportunities o\n WHERE o.current_stage IS NOT NULL\n AND o.current_stage NOT IN ('Closed Won', 'Closed Lost')\n AND NOT EXISTS (\n SELECT 1 FROM activities a\n WHERE a.opportunity_id = o.id\n AND a.occurred_at > CURRENT_TIMESTAMP - INTERVAL 14 DAY\n )\n `).then(debigint),\n all<{ count: number; total_amount: number }>(`\n SELECT COUNT(*) as count,\n COALESCE(SUM(amount), 0) as total_amount\n FROM opportunities\n WHERE close_date IS NOT NULL\n AND TRY_CAST(close_date AS DATE) < CURRENT_DATE\n AND current_stage NOT IN ('Closed Won', 'Closed Lost')\n `).then(debigint),\n all<{ count: number }>(`\n SELECT COUNT(*) as count FROM opportunities o\n WHERE o.current_stage IS NOT NULL\n AND o.current_stage NOT IN ('Closed Won', 'Closed Lost')\n AND (\n SELECT COUNT(DISTINCT a.person_id)\n FROM activities a\n WHERE a.opportunity_id = o.id AND a.person_id IS NOT NULL\n ) <= 1\n `).then(debigint),\n all<{ current_stage: string; count: number; total_amount: number }>(`\n SELECT current_stage,\n COUNT(*) as count,\n COALESCE(SUM(amount), 0) as total_amount\n FROM opportunities\n WHERE current_stage IS NOT NULL\n GROUP BY current_stage\n ORDER BY count DESC\n `).then(debigint),\n all<{ total_open: number; total_value: number }>(`\n SELECT COUNT(*) as total_open,\n COALESCE(SUM(amount), 0) as total_value\n FROM opportunities\n WHERE current_stage IS NOT NULL\n AND current_stage NOT IN ('Closed Won', 'Closed Lost')\n `).then(debigint),\n ]);\n\n const totalOpen = totalPipeline[0]?.total_open ?? 0;\n return {\n stuck_deals: stuckDeals[0]?.count ?? 0,\n past_due_deals: {\n count: pastDueDeals[0]?.count ?? 0,\n total_amount_at_risk: pastDueDeals[0]?.total_amount ?? 0,\n },\n single_threaded_deals: singleThreaded[0]?.count ?? 0,\n total_open_deals: totalOpen,\n total_pipeline_value: totalPipeline[0]?.total_value ?? 0,\n stuck_pct: totalOpen > 0 ? Math.round(((stuckDeals[0]?.count ?? 0) / totalOpen) * 100) : 0,\n single_threaded_pct: totalOpen > 0 ? Math.round(((singleThreaded[0]?.count ?? 0) / totalOpen) * 100) : 0,\n stage_distribution: stages,\n };\n}\n\nasync function handleQueryActivityDistribution(input: Record<string, unknown>): Promise<unknown> {\n const groupBy = (input.group_by as string) ?? \"week\";\n const activityType = input.activity_type as string | undefined;\n\n const truncFn = groupBy === \"month\" ? \"DATE_TRUNC('month', occurred_at)\" : \"DATE_TRUNC('week', occurred_at)\";\n const typeFilter = activityType ? \"AND activity_type = ?\" : \"\";\n const params = activityType ? [activityType] : [];\n\n const rows = debigint(await all<{ period: string; activity_type: string; count: number }>(\n `SELECT ${truncFn}::VARCHAR as period,\n activity_type,\n COUNT(*) as count\n FROM activities\n WHERE occurred_at > CURRENT_TIMESTAMP - INTERVAL 90 DAY\n ${typeFilter}\n GROUP BY period, activity_type\n ORDER BY period DESC, count DESC`,\n params,\n ));\n\n return {\n group_by: groupBy,\n periods: rows.length,\n distribution: rows,\n };\n}\n\nasync function handleQueryCoverageGaps(): Promise<unknown> {\n const [orgsNoContacts, dealsNoActivity, orphanedActivities] = await Promise.all([\n all<{ count: number }>(`\n SELECT COUNT(*) as count FROM organizations o\n WHERE NOT EXISTS (\n SELECT 1 FROM people p WHERE p.organization_id = o.id\n )\n `).then(debigint),\n all<{ count: number }>(`\n SELECT COUNT(*) as count FROM opportunities o\n WHERE o.current_stage IS NOT NULL\n AND o.current_stage NOT IN ('Closed Won', 'Closed Lost')\n AND NOT EXISTS (\n SELECT 1 FROM activities a\n WHERE a.opportunity_id = o.id\n AND a.occurred_at > CURRENT_TIMESTAMP - INTERVAL 30 DAY\n )\n `).then(debigint),\n all<{ count: number }>(`\n SELECT COUNT(*) as count FROM activities a\n WHERE a.person_id IS NULL\n AND a.opportunity_id IS NULL\n `).then(debigint),\n ]);\n\n return {\n orgs_without_contacts: orgsNoContacts[0]?.count ?? 0,\n deals_without_recent_activity: dealsNoActivity[0]?.count ?? 0,\n orphaned_activities: orphanedActivities[0]?.count ?? 0,\n };\n}\n\nasync function handleQuerySegmentComparison(input: Record<string, unknown>, ctx: ToolContext): Promise<unknown> {\n const nameA = (input.segment_a as string).toLowerCase();\n const nameB = (input.segment_b as string).toLowerCase();\n\n const segA = ctx.computeResult.segments.find((s) => s.segment.name.toLowerCase() === nameA);\n const segB = ctx.computeResult.segments.find((s) => s.segment.name.toLowerCase() === nameB);\n\n if (!segA) return { error: `Segment '${input.segment_a}' not found` };\n if (!segB) return { error: `Segment '${input.segment_b}' not found` };\n\n const comparison: Record<string, unknown>[] = [];\n for (const vs of segA.result.vital_signs) {\n const bVital = segB.result.vital_signs.find((v) => v.vital_sign === vs.vital_sign);\n comparison.push({\n vital_sign: vs.vital_sign,\n [`${segA.segment.name}_score`]: vs.score,\n [`${segA.segment.name}_status`]: vs.status,\n [`${segB.segment.name}_score`]: bVital?.score ?? null,\n [`${segB.segment.name}_status`]: bVital?.status ?? null,\n delta: bVital ? vs.score - bVital.score : null,\n });\n }\n\n return {\n segment_a: { name: segA.segment.name, overall_score: segA.result.overall_score, overall_status: segA.result.overall_status },\n segment_b: { name: segB.segment.name, overall_score: segB.result.overall_score, overall_status: segB.result.overall_status },\n vital_sign_comparison: comparison,\n };\n}\n\nasync function handleQueryEntityCounts(input: Record<string, unknown>): Promise<unknown> {\n const entityType = input.entity_type as string;\n const groupByField = input.group_by as string | undefined;\n\n // Whitelist allowed tables and group-by columns\n const allowedTables: Record<string, string[]> = {\n people: [\"source_system\"],\n organizations: [\"source_system\"],\n opportunities: [\"current_stage\", \"source_system\"],\n activities: [\"activity_type\", \"source_system\"],\n };\n\n const allowedColumns = allowedTables[entityType];\n if (!allowedColumns) return { error: `Invalid entity_type '${entityType}'` };\n\n if (groupByField) {\n if (!allowedColumns.includes(groupByField)) {\n return { error: `Cannot group '${entityType}' by '${groupByField}'. Allowed: ${allowedColumns.join(\", \")}` };\n }\n const rows = debigint(await all<{ group_value: string; count: number }>(\n `SELECT ${groupByField} as group_value, COUNT(*) as count\n FROM ${entityType}\n GROUP BY ${groupByField}\n ORDER BY count DESC`,\n ));\n return { entity_type: entityType, group_by: groupByField, groups: rows, total: rows.reduce((s, r) => s + r.count, 0) };\n }\n\n const row = debigint(await all<{ count: number }>(`SELECT COUNT(*) as count FROM ${entityType}`));\n return { entity_type: entityType, count: row[0]?.count ?? 0 };\n}\n\n// ─── Revenue Metrics handler ─────────────────────────────────────────\n\nasync function handleGetRevenueMetrics(_input: Record<string, unknown>, ctx: ToolContext): Promise<unknown> {\n if (!ctx.metrics || ctx.metrics.length === 0) {\n const { computeFullMetrics } = await import(\"../metrics/compute.js\");\n const full = await computeFullMetrics();\n ctx.metrics = full.aggregate.metrics;\n }\n if (!ctx.metrics || ctx.metrics.length === 0) {\n return { error: \"Revenue metrics unavailable — load data and run /metrics, or ask after /new --lens metrics.\" };\n }\n\n const groups: Record<string, unknown[]> = {};\n for (const m of ctx.metrics) {\n if (!groups[m.group]) groups[m.group] = [];\n groups[m.group]!.push({\n metric: m.metric,\n label: m.label,\n value: m.value,\n formatted: m.formatted,\n status: m.status,\n confidence: m.confidence ?? null,\n confidence_label: m.confidence_label ?? null,\n reliability_gate: m.reliability_gate ?? null,\n benchmark_note: m.benchmark_note ?? null,\n unavailable_reason: m.unavailable_reason ?? null,\n });\n }\n\n return { metric_groups: groups };\n}\n\nasync function handleGetRevenueMetricsTimeseries(input: Record<string, unknown>): Promise<unknown> {\n const metric = typeof input.metric === \"string\" ? input.metric : \"arr\";\n const cadence = (input.cadence as \"monthly\" | \"quarterly\" | \"weekly\") ?? \"quarterly\";\n const comparison = (input.comparison as \"mom\" | \"qoq\" | \"yoy\" | \"ttm\") ?? \"qoq\";\n\n const { prefetchSnapshot } = await import(\"../vitals/health-score.js\");\n const { computeMetricTimeseries } = await import(\"../metrics/periods.js\");\n const snapshot = await prefetchSnapshot();\n const series = computeMetricTimeseries(metric, snapshot, cadence, comparison);\n\n return {\n metric,\n cadence,\n comparison,\n points: series,\n note: series.length < 2 ? \"Insufficient history for trend — see reliability_gate on point-in-time metrics\" : undefined,\n };\n}\n\n// ─── Live web retrieval handler ──────────────────────────────────────\n\nasync function handleWebSearch(input: Record<string, unknown>): Promise<unknown> {\n const query = typeof input.query === \"string\" ? input.query.trim() : \"\";\n if (!query) return { error: \"web_search requires a 'query'.\" };\n const results = await webSearch(query);\n if (results.length === 0) {\n return { query, results: [], note: \"No results (web retrieval may be disabled or returned nothing).\" };\n }\n return { query, results };\n}\n\n// ─── Conversation orchestration handlers ─────────────────────────────\n\nasync function handleProposeScope(input: Record<string, unknown>): Promise<unknown> {\n const { getAgentContext } = await import(\"../conversation/agent-context.js\");\n const { proposeScopeFromIntent } = await import(\"../conversation/scope.js\");\n const { saveSessionState } = await import(\"../cli/context.js\");\n const ctx = getAgentContext();\n if (!ctx) return { error: \"No active session context.\" };\n const intent = typeof input.intent === \"string\" ? input.intent : \"\";\n if (!intent) return { error: \"intent is required.\" };\n const proposal = proposeScopeFromIntent(intent);\n ctx.scope = proposal.scope;\n saveSessionState(ctx);\n return { scope: proposal.scope, clarifying_question: proposal.clarifying_question };\n}\n\nasync function handleConfirmScope(): Promise<unknown> {\n const { getAgentContext } = await import(\"../conversation/agent-context.js\");\n const { confirmScope } = await import(\"../conversation/scope.js\");\n const { refreshGapAudit } = await import(\"../conversation/gap-audit.js\");\n const { saveSessionState } = await import(\"../cli/context.js\");\n const ctx = getAgentContext();\n if (!ctx) return { error: \"No active session context.\" };\n if (!ctx.scope) return { error: \"No scope proposed yet.\" };\n confirmScope(ctx);\n saveSessionState(ctx);\n const audit = await refreshGapAudit(ctx);\n return audit;\n}\n\nasync function handleAuditDataGaps(): Promise<unknown> {\n const { getAgentContext } = await import(\"../conversation/agent-context.js\");\n const { refreshGapAudit } = await import(\"../conversation/gap-audit.js\");\n const ctx = getAgentContext();\n if (!ctx) return { error: \"No active session context.\" };\n return refreshGapAudit(ctx);\n}\n\nasync function handleIngestFile(input: Record<string, unknown>): Promise<unknown> {\n const { getAgentContext } = await import(\"../conversation/agent-context.js\");\n const { ingestFromChat } = await import(\"../conversation/ingest-chat.js\");\n const ctx = getAgentContext();\n if (!ctx) return { error: \"No active session context.\" };\n const path = typeof input.path === \"string\" ? input.path : \"\";\n if (!path) return { error: \"path is required.\" };\n const ok = await ingestFromChat(ctx, path);\n return { ingested: ok, dataset: ctx.dataset?.label };\n}\n\nasync function handleRunCompute(): Promise<unknown> {\n const { getAgentContext } = await import(\"../conversation/agent-context.js\");\n const { runConversationCompute } = await import(\"../conversation/compute.js\");\n const { refreshGapAudit } = await import(\"../conversation/gap-audit.js\");\n const ctx = getAgentContext();\n if (!ctx) return { error: \"No active session context.\" };\n const audit = ctx.gapAudit ?? (await refreshGapAudit(ctx));\n if (!audit.can_compute) return { error: \"Cannot compute yet.\", audit };\n await runConversationCompute(ctx);\n return { computed: true, stage: ctx.stage, completed: ctx.analysis.completed };\n}\n\nasync function handleDraftHandoff(input: Record<string, unknown>): Promise<unknown> {\n const { getAgentContext } = await import(\"../conversation/agent-context.js\");\n const { buildDeliverableDraft } = await import(\"../conversation/handoff-draft.js\");\n const ctx = getAgentContext();\n if (!ctx) return { error: \"No active session context.\" };\n const target = (typeof input.target === \"string\" ? input.target : \"plan\") as\n | \"deck\"\n | \"asana\"\n | \"clay\"\n | \"plan\";\n const draft = await buildDeliverableDraft(ctx, target);\n if (!draft) return { error: \"No analysis or conversation to draft from.\" };\n return {\n target,\n preview: draft.markdown.slice(0, 4000),\n sections: Object.keys(draft.sections),\n };\n}\n\n// ─── Dispatcher ──────────────────────────────────────────────────────\n\nconst HANDLERS: Record<string, HandlerFn> = {\n get_health_summary: handleGetHealthSummary,\n get_vital_sign_detail: handleGetVitalSignDetail,\n get_divergences: handleGetDivergences,\n query_pipeline_risk: (_, __) => handleQueryPipelineRisk(),\n query_activity_distribution: (input, _) => handleQueryActivityDistribution(input),\n query_coverage_gaps: (_, __) => handleQueryCoverageGaps(),\n query_segment_comparison: handleQuerySegmentComparison,\n query_entity_counts: (input, _) => handleQueryEntityCounts(input),\n get_revenue_metrics: handleGetRevenueMetrics,\n get_revenue_metrics_timeseries: (input, _) => handleGetRevenueMetricsTimeseries(input),\n web_search: (input, _) => handleWebSearch(input),\n propose_scope: (input, _) => handleProposeScope(input),\n confirm_scope: (_, __) => handleConfirmScope(),\n audit_data_gaps: (_, __) => handleAuditDataGaps(),\n ingest_file: (input, _) => handleIngestFile(input),\n run_compute: (_, __) => handleRunCompute(),\n draft_handoff: (input, _) => handleDraftHandoff(input),\n};\n\n/**\n * Execute a tool call: dispatch to handler, strip PII, log to audit trail.\n * Returns the JSON string result to send back to the model.\n */\nexport async function executeToolCall(\n name: string,\n input: Record<string, unknown>,\n ctx: ToolContext,\n): Promise<string> {\n const handler = HANDLERS[name];\n if (!handler) {\n return JSON.stringify({ error: `Unknown tool '${name}'` });\n }\n\n const start = Date.now();\n const rawResult = await handler(input, ctx);\n const safeResult = stripPII(rawResult);\n const resultJson = JSON.stringify(safeResult);\n const duration = Date.now() - start;\n\n logToolCall({\n timestamp: new Date().toISOString(),\n tool_name: name,\n input: stripPII(input),\n result_preview: resultJson.slice(0, 500),\n duration_ms: duration,\n });\n\n return resultJson;\n}\n","import type { FindingEntry, LlmUsageMeta } from \"../types.js\";\nimport { completeWithFailover } from \"./llm/failover.js\";\nimport { normalizeThread } from \"./llm/thread-compat.js\";\nimport type { LlmMessage } from \"./llm/types.js\";\nimport { tierForSurface } from \"./llm/surfaces.js\";\nimport { loadLlmConfig } from \"../config/llm-config.js\";\nimport { parseJsonArrayFromText } from \"./json-response.js\";\nimport type { FullComputeResult } from \"../vitals/health-score.js\";\nimport type { Divergence } from \"../pipeline/divergence.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { assertReplAi } from \"./repl-api.js\";\n// assertReplAi validates keys before spend\nimport { buildAgenticTools } from \"./tool-schemas.js\";\nimport { executeToolCall, type ToolContext } from \"./tool-handlers.js\";\nimport { VITAL_SIGNS_BLOCK, buildPlaybookBlock, FINDINGS_SCHEMA_BLOCK, buildCompanyProfileBlock, ANALYST_INSTINCT_BLOCK } from \"./prompt-parts.js\";\nimport type { ExploreResponseMode, PromptExperiment } from \"./explore-mode.js\";\n\nconst MAX_ITERATIONS = 10;\nconst BRIEF_MAX_TOKENS = 768;\nconst DEEP_MAX_TOKENS = 4096;\n\nfunction companyContextSection(): string {\n const block = buildCompanyProfileBlock();\n if (!block) return \"\";\n return `COMPANY CONTEXT (use this to make every answer specific to the business — reference the company by name, use industry-appropriate language, anchor dollar figures to their deal size):\n${block}\n\n`;\n}\n\nexport function buildSystemPrompt(): string {\n return `You are an expert GTM health investigator. You have tools to query a local database of CRM and pipeline data. Your job is to investigate the health scores you've been given and discover the specific root causes behind any problems.\n\n${companyContextSection()}INVESTIGATION APPROACH:\n1. Start by examining the health summary to understand the overall picture\n2. Drill into the lowest-scoring vital signs using get_vital_sign_detail\n3. Check divergences to find segments that are significantly worse than average\n4. Use the query_* tools to investigate specific hypotheses with live data\n5. Cross-reference findings — if freshness is low AND pipeline has stuck deals, they may be related\n6. Always translate scores into dollar values when available — lead with financial impact\n\nANALYST INSTINCT (let this shape WHICH findings you surface and how you connect them — a great finding names a root cause and its chain, not just a symptom):\n${ANALYST_INSTINCT_BLOCK}\n\nVITAL SIGNS EXPLAINED (with dollar translations):\n${VITAL_SIGNS_BLOCK}\n\nPLAYBOOK — recommend these plays when appropriate:\n${buildPlaybookBlock()}\n\nRULES:\n- Build evidence BEFORE claiming a finding. Call at least 2 tools before emitting a finding.\n- Include specific numbers AND dollar values in every finding.\n- Lead with dollar impact: \"$3.1M pipeline at risk\" not \"Freshness is 29\".\n- Always recommend at least one play per finding.\n- Maximum 8 findings. Quality over quantity.\n- When you're done investigating, respond with your findings as a JSON array.\n\nFORMATTING (the \\`finding\\` field on each finding is rendered in a terminal via a small markdown renderer):\n- Use **bold** for dollar figures, scores, play names, and person/account names.\n- Use *italics* sparingly for conversational asides.\n- Use \\`inline code\\` for CRM field names, SQL snippets, or literal values.\n- Prefer short sentences over tables inside a finding; if you must use a table, keep it ≤3 columns, ≤5 rows, cells ≤30 chars.\n- Never place emoji inside a table cell or heading — they break column alignment.\n\nOUTPUT FORMAT — when you're ready to present findings, respond with ONLY a JSON array:\n${FINDINGS_SCHEMA_BLOCK}\n\nKeep investigating until you have a clear picture. Don't guess — use the tools.`;\n}\n\nexport interface FreshNlPromptOptions {\n responseMode?: ExploreResponseMode;\n sessionArtifact?: string;\n experiment?: PromptExperiment;\n}\n\nexport function buildFreshNlSystemPrompt(\n sessionContext?: string,\n memoryBlock?: string,\n analysisBlock?: string,\n conversationBlock?: string,\n promptOptions: FreshNlPromptOptions = {},\n): string {\n const experiment = promptOptions.experiment ?? \"production\";\n const responseMode: ExploreResponseMode =\n experiment === \"baseline\" || experiment === \"a\" || experiment === \"b\"\n ? \"deep\"\n : promptOptions.responseMode ?? \"brief\";\n\n const sessionBlock = sessionContext\n ? `\\nPREVIOUS SESSION CONTEXT:\\nThe user resumed an earlier session. Here is what they were investigating before:\\n${sessionContext}\\nTreat this as already-established background. Pick up where it left off — do not re-introduce it as if it were new.\\n\\n`\n : \"\";\n\n const memorySection = memoryBlock\n ? `\\nWHAT YOU ALREADY KNOW ABOUT THIS BUSINESS (durable memory — learned facts, prior decisions, active strategies, and logged wins):\\n${memoryBlock}\\nReference this naturally, the way a consultant who has worked with this client for months would. Do not re-derive things you already know; build on them.\\n\\n`\n : \"\";\n\n const analysisSection = analysisBlock\n ? `\\nSESSION ANALYSIS CONTEXT:\\n${analysisBlock}\\nUse get_revenue_metrics and get_revenue_metrics_timeseries when the user asks about SaaS metrics, retention, or period trends.\\n\\n`\n : \"\";\n\n const artifactSection =\n promptOptions.sessionArtifact &&\n (experiment === \"production\" || experiment === \"b\" || experiment === \"c\")\n ? `\\nCOMPLETED SESSION ANALYSIS:\\n${promptOptions.sessionArtifact}\\nThe user already received the full report in the terminal. Answer follow-ups by citing specific numbers from here — do not re-run the full analysis or restate every finding.\\n\\n`\n : \"\";\n\n const conversationSection = conversationBlock\n ? `\\nCONVERSATION STATE:\\n${conversationBlock}\\nDo not run compute until audit_data_gaps reports can_compute. Prefer ingest_file over telling the user to run /ingest.\\n\\n`\n : \"\";\n\n const conversationRules = `HOW A GREAT ANALYST CARRIES A CONVERSATION (read carefully — this is what separates you from a search box):\n- You have continuity. The conversation so far is provided to you as prior messages. Read it before answering. You remember every angle you have already explored, every number you have already surfaced, and every recommendation you have already made.\n- Never repeat or re-recommend an analysis you have already presented in this conversation unless the user explicitly asks you to revisit, recall, or connect it. Repetition reads as forgetfulness and destroys trust.\n- Each answer should ADVANCE the discussion: go deeper, introduce a genuinely new angle, challenge an assumption, or synthesize across what you have already found. Move the thinking forward.\n- When the user's new question relates to something you discussed earlier, explicitly build on it (\"Earlier we saw X — that's exactly why Y…\") rather than starting over.\n- Connecting the dots and recalling prior findings IS valuable when the user asks for it. In that case, synthesize across the thread; do not treat it as redundant.\n- If you genuinely have nothing new to add on a topic, say so briefly and offer a different, higher-value direction — never pad with a recycled recommendation.`;\n\n const briefJob = `YOUR JOB (BRIEF MODE — default after analysis is complete):\n- Stay concise — roughly 40–90 words total, not a mini-report.\n- Do NOT call tools unless the user explicitly asks for a new data cut (by rep, stage, list of deals, etc.). The completed analysis above is your source of truth.\n- Name a playbook play only when the user asks what to do or which action to take.\n- If the question is ambiguous, ask one sharp clarifying question — still scannable (one line).`;\n\n const deepJob = `YOUR JOB (DEEP MODE — user asked for detail or a new data cut):\n- Decide whether you need tools to answer, whether a direct answer is enough, or both. Don't re-call a tool whose result you already have from earlier in the conversation.\n- Stay focused — lead with the answer, then bullets if needed. Avoid walls of text.\n- When you use numbers, include dollar values where available and lead with financial impact.\n- Reference specific segments, vital signs, or plays by name when it helps the user act.\n- Reference the company by name and use language appropriate to their industry and ICP.\n- If the question is genuinely ambiguous given everything you already know, ask one sharp clarifying question instead of guessing.`;\n\n const analystSection =\n responseMode === \"brief\" && experiment === \"production\"\n ? `ANALYST INSTINCT (apply lightly in brief mode — one causal link max, no full triage):\n- Lead with the single most expensive or urgent point relevant to this question.\n- Name one pattern or root cause only if it directly answers what they asked.\n- Do not enumerate every vital sign or play — the full analysis is already on record.`\n : `ANALYST INSTINCT (this is the judgment a CEO pays a top consultant for — apply it by default):\n${ANALYST_INSTINCT_BLOCK}`;\n\n const jobSection = responseMode === \"brief\" ? briefJob : deepJob;\n\n const includeFormatting =\n experiment !== \"a\" && responseMode !== \"brief\";\n\n const formattingSection = includeFormatting\n ? `\nFORMATTING (your answer is rendered in a terminal via a small markdown renderer):\n- Use **bold** for every dollar figure, score, play name, and person name.\n- Use *italics* for conversational asides and your closing follow-up question.\n- Use ### for section headings — never # or ##. The renderer flattens depth.\n- For multi-point answers, prefer a one-line lead + bullet list over long paragraph blocks.\n- Keep paragraphs to 3-4 sentences. Break walls of text with ### headings or bullets.\n- Prefer short tables (≤3 columns, ≤5 rows, cells ≤30 chars). Anything wider will wrap awkwardly — use a bulleted list instead.\n- Place emojis at the START of a bullet or sentence only. Never inside a heading, never inside a table cell — they break column alignment.\n- Use \\`inline code\\` for CRM field names, SQL snippets, or literal values.\n- End with a dim horizontal rule (---) followed by one italicized follow-up question.\n`\n : `\nFORMATTING (brief mode — scannable, not chunky):\n- Open with ONE direct sentence that answers the question. Then a blank line before any list.\n- When the answer has 2+ distinct points (causes, links, numbers, steps), use a short bullet list — not a paragraph block.\n Example shape:\n Drop rate is your handoff leak — **$11.4M** estimated lost at the gap (score **33**).\n\n - **Handoff:** leads never reach sales, so reps can't work them\n - **Freshness:** unworked leads sit in CRM and read as stale pipeline\n- Max 4 bullets; each bullet is one line. Bold **dollar figures**, **scores**, and **play names** only.\n- Use blank lines between the lead sentence and bullets, and between bullet groups if you have two topics.\n- No ### headings, no tables, no --- footer, no closing \"want me to dig deeper?\" question.\n- Single-point answers can stay one sentence — don't force bullets when one line is enough.\n`;\n\n const outputRules =\n responseMode === \"brief\"\n ? `OUTPUT RULES:\n- Respond in plain text markdown (not JSON). Lead sentence + bullets when helpful — never a dense paragraph wall.\n- Pull numbers from the completed session analysis or conversation history — never guess.\n- Do not call tools in brief mode.`\n : `OUTPUT RULES:\n- Respond in plain text (not JSON). You do NOT need to emit the findings schema — only emit structured findings if the user explicitly asks for them.\n- Include specific numbers from tool results, never guess.\n- When you have enough information, answer directly. Don't call tools you don't need.`;\n\n return `You are a world-class GTM operating partner — the kind of analyst a CEO keeps on speed dial. You are exceptionally well-read, rigorous, and commercially sharp, and you have tools to query a local database of this company's CRM and pipeline data. The user is having an ongoing, free-form conversation with you about their go-to-market health and SaaS metrics.\n\n${companyContextSection()}${sessionBlock}${memorySection}${analysisSection}${artifactSection}${conversationSection}${conversationRules}\n\n${analystSection}\n\n${jobSection}\n\nCONTEXT:\nThe user's health scores and top divergences were included as JSON at the start of this conversation. Use them and the conversation history as background and as hints for which tools to call.\n\nVITAL SIGNS EXPLAINED (with dollar translations):\n${VITAL_SIGNS_BLOCK}\n\nPLAYBOOK — recommend these plays when appropriate:\n${buildPlaybookBlock()}\n${formattingSection}\n${outputRules}`;\n}\n\nexport type AgenticMode = \"investigation\" | \"fresh\";\n\nexport interface AgenticOptions {\n /** \"investigation\" (default) or \"fresh\" for NL questions. */\n mode?: AgenticMode;\n /** Required when mode === \"fresh\" — the user's question text. */\n userQuestion?: string;\n /** Summary from a resumed session — injected into the system prompt for continuity. */\n sessionContext?: string;\n /** Include revenue metrics in tool context so get_revenue_metrics can answer. */\n includeMetrics?: boolean;\n /** Serialized session analysis lens / coverage for NL context. */\n analysisBlock?: string;\n /**\n * Compacted conversation thread from earlier turns in this session. Seeds\n * the message list so the agent has full continuity and never re-answers\n * from a blank slate. Used in \"fresh\" mode.\n */\n priorMessages?: LlmMessage[];\n /**\n * Durable analyst memory (learned facts, prior decisions, strategies, wins,\n * retrieved knowledge) rendered as a markdown block for the system prompt.\n */\n memoryBlock?: string;\n /** Conversation phase, scope, and gap audit for orchestrated NL. */\n conversationBlock?: string;\n /** Completed session analysis artifact (findings + vital signs) for explore chat. */\n sessionArtifact?: string;\n /** Brief vs deep response shape for explore-phase NL. */\n responseMode?: ExploreResponseMode;\n /** Prompt experiment override for verbosity investigation harness. */\n experiment?: PromptExperiment;\n /** Required — AI runs only from the interactive REPL. */\n ctx: Context;\n}\n\nexport type AgenticEvent =\n | { type: \"tool_call\"; name: string }\n | { type: \"finding\"; finding: FindingEntry }\n | { type: \"thinking\"; text: string }\n | { type: \"answer\"; text: string }\n | {\n type: \"done\";\n findings: FindingEntry[];\n model_used: string;\n provider_used?: string;\n failover?: boolean;\n raw_prompt: string;\n conversation_history: LlmMessage[];\n usage?: LlmUsageMeta;\n };\n\n/**\n * Run the agentic investigation loop. Yields events as they occur.\n *\n * In \"investigation\" mode (the default), the model calls tools to drill into\n * health data and emits a JSON array of findings at the end.\n *\n * In \"fresh\" mode, the model gets a user question and responds\n * conversationally — it may call tools, but it's allowed to emit a plain\n * text answer without the findings schema.\n */\nfunction doneEvent(\n findings: FindingEntry[],\n meta: LlmUsageMeta,\n initialContext: string,\n messages: LlmMessage[],\n): AgenticEvent {\n return {\n type: \"done\",\n findings,\n model_used: meta.model_used,\n provider_used: meta.provider_used,\n failover: meta.failover,\n raw_prompt: initialContext,\n conversation_history: messages,\n usage: meta,\n };\n}\n\nexport async function* agenticFindings(\n computeResult: FullComputeResult,\n divergences: Divergence[],\n options: AgenticOptions,\n): AsyncGenerator<AgenticEvent> {\n assertReplAi(options.ctx);\n\n const mode: AgenticMode = options.mode ?? \"investigation\";\n const experiment = options.experiment ?? \"production\";\n const responseMode: ExploreResponseMode =\n experiment === \"baseline\" || experiment === \"a\" || experiment === \"b\"\n ? \"deep\"\n : options.responseMode ?? (options.sessionArtifact ? \"brief\" : \"deep\");\n\n const useTools =\n mode !== \"fresh\" ||\n responseMode === \"deep\" ||\n !options.sessionArtifact;\n\n const maxTokens = mode === \"fresh\" && responseMode === \"brief\" ? BRIEF_MAX_TOKENS : DEEP_MAX_TOKENS;\n const surface = mode === \"fresh\"\n ? responseMode === \"brief\"\n ? \"agentic_fresh_brief\"\n : \"agentic_investigation\"\n : \"agentic_investigation\";\n const llmCfg = loadLlmConfig();\n const tier = tierForSurface(surface, llmCfg.tier);\n\n const systemPrompt = mode === \"fresh\"\n ? buildFreshNlSystemPrompt(\n options.sessionContext,\n options.memoryBlock,\n options.analysisBlock,\n options.conversationBlock,\n { responseMode, sessionArtifact: options.sessionArtifact, experiment },\n )\n : buildSystemPrompt();\n\n const tools = useTools ? buildAgenticTools() : [];\n\n const toolCtx: ToolContext = { computeResult, divergences };\n if (options.includeMetrics) {\n try {\n const { computeFullMetrics } = await import(\"../metrics/compute.js\");\n toolCtx.metrics = (await computeFullMetrics()).aggregate.metrics;\n } catch {\n // metrics tool returns unavailable response\n }\n }\n\n const initialContext = buildInitialContext(computeResult, divergences, options.userQuestion);\n const priorRaw = options.priorMessages ?? [];\n const priorMessages = priorRaw.length > 0 && typeof priorRaw[0] === \"object\" && priorRaw[0] !== null && \"content\" in priorRaw[0]\n ? normalizeThread(priorRaw as unknown[])\n : priorRaw;\n\n const messages: LlmMessage[] =\n mode === \"fresh\" && priorMessages.length > 0 && options.userQuestion\n ? [...priorMessages, { role: \"user\", content: options.userQuestion }]\n : [{ role: \"user\", content: initialContext }];\n\n let lastMeta: LlmUsageMeta = { provider_used: \"anthropic\", model_used: \"unknown\" };\n\n async function callLlm(msgs: LlmMessage[], tokens: number, withTools: boolean) {\n const result = await completeWithFailover(\n {\n surface,\n messages: msgs,\n system: systemPrompt,\n tools: withTools && tools.length > 0 ? tools : undefined,\n max_tokens: tokens,\n },\n { tier, ctx: options.ctx },\n );\n lastMeta = result.meta;\n return result.response;\n }\n\n for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {\n const response = await callLlm(messages, maxTokens, true);\n\n if (response.tool_calls.length === 0) {\n const fullText = response.text;\n\n if (mode === \"fresh\") {\n const findings = parseFindings(fullText);\n if (findings.length > 0) {\n for (const finding of findings) yield { type: \"finding\", finding };\n } else if (fullText.trim()) {\n yield { type: \"answer\", text: fullText.trim() };\n }\n messages.push(response.assistant_message);\n yield doneEvent(findings, lastMeta, initialContext, messages);\n return;\n }\n\n let findings = parseFindings(fullText);\n if (findings.length === 0 && fullText.trim().length > 0) {\n messages.push(response.assistant_message);\n messages.push({\n role: \"user\",\n content: \"Please format your findings as the JSON array specified in your instructions. Respond with ONLY the JSON array, no other text.\",\n });\n const retry = await callLlm(messages, maxTokens, tools.length > 0);\n findings = parseFindings(retry.text);\n messages.push(retry.assistant_message);\n } else {\n messages.push(response.assistant_message);\n }\n\n for (const finding of findings) yield { type: \"finding\", finding };\n yield doneEvent(findings, lastMeta, initialContext, messages);\n return;\n }\n\n messages.push(response.assistant_message);\n if (response.text.trim()) {\n yield { type: \"thinking\", text: response.text.trim().slice(0, 200) };\n }\n\n for (const tc of response.tool_calls) {\n yield { type: \"tool_call\", name: tc.name };\n const result = await executeToolCall(tc.name, tc.arguments ?? {}, toolCtx);\n messages.push({ role: \"tool\", tool_call_id: tc.id, content: result });\n }\n }\n\n if (mode === \"fresh\") {\n messages.push({\n role: \"user\",\n content: \"You've reached the tool budget. Please answer the user's question now with what you've learned.\",\n });\n const final = await callLlm(messages, responseMode === \"brief\" ? BRIEF_MAX_TOKENS : 2048, tools.length > 0);\n if (final.text.trim()) yield { type: \"answer\", text: final.text.trim() };\n messages.push(final.assistant_message);\n yield doneEvent([], lastMeta, initialContext, messages);\n return;\n }\n\n messages.push({\n role: \"user\",\n content: \"You've reached the investigation limit. Please provide your findings now as a JSON array.\",\n });\n const final = await callLlm(messages, 4096, false);\n const findings = parseFindings(final.text);\n for (const finding of findings) yield { type: \"finding\", finding };\n messages.push(final.assistant_message);\n yield doneEvent(findings, lastMeta, initialContext, messages);\n}\n\nfunction buildInitialContext(computeResult: FullComputeResult, divergences: Divergence[], userQuestion?: string): string {\n const { aggregate, segments } = computeResult;\n\n const summary = {\n aggregate: {\n overall_score: aggregate.overall_score,\n overall_status: aggregate.overall_status,\n gating_vital_sign: aggregate.gating_vital_sign,\n total_value_at_risk: aggregate.total_value_at_risk,\n vital_signs: Object.fromEntries(\n aggregate.vital_signs.map((v) => [v.vital_sign, { score: v.score, status: v.status, dollar_value: v.dollar_value, dollar_label: v.dollar_label }]),\n ),\n },\n segment_names: segments.map((s) => s.segment.name),\n top_divergences: divergences.slice(0, 5).map((d) => ({\n segment: d.segmentName,\n vital_sign: d.vitalSign,\n segment_score: d.segmentScore,\n aggregate_score: d.aggregateScore,\n delta: d.delta,\n })),\n };\n\n const header = userQuestion\n ? `The user asked: ${userQuestion}\\n\\nHere is the current GTM health snapshot as background. Use it plus any tools you need to answer their question.\\n\\n`\n : \"Here is the GTM health assessment. Investigate the data to find root causes and generate findings.\\n\\n\";\n\n return header + JSON.stringify(summary, null, 2);\n}\n\nfunction parseFindings(text: string): FindingEntry[] {\n return (parseJsonArrayFromText(text) ?? []) as FindingEntry[];\n}\n","import { initSchema } from \"../db/schema.js\";\nimport { insertFinding } from \"../db/queries.js\";\nimport { autoGenerateSegments } from \"../pipeline/segments.js\";\nimport { detectDivergences, type Divergence } from \"../pipeline/divergence.js\";\nimport { computeFullHealth, type FullComputeResult } from \"../vitals/health-score.js\";\nimport { buildFindingsInput, streamFindings } from \"../ai/findings.js\";\nimport { agenticFindings } from \"../ai/agentic-loop.js\";\nimport { canUseReplAi } from \"../ai/repl-api.js\";\nimport type { Context } from \"../cli/context.js\";\nimport type { FindingEntry } from \"../types.js\";\n\nexport interface DiagnosisOptions {\n findings?: boolean;\n deep?: boolean;\n segments?: boolean;\n segment?: string;\n ctx?: Context;\n}\n\nexport interface DiagnosisResult {\n health: FullComputeResult[\"aggregate\"];\n segments: FullComputeResult[\"segments\"];\n divergences: Divergence[];\n findings: FindingEntry[];\n model_used?: string;\n provider_used?: string;\n failover?: boolean;\n raw_prompt?: string;\n}\n\nexport async function runDiagnosis(options: DiagnosisOptions = {}): Promise<DiagnosisResult> {\n await initSchema();\n if (options.segments !== false) {\n await autoGenerateSegments();\n }\n\n const fullResult = await computeFullHealth();\n const divInput = fullResult.segments.map((s) => ({\n segmentId: s.segment.id,\n segmentName: s.segment.name,\n result: s.result,\n }));\n const { divergences } = detectDivergences(fullResult.aggregate, divInput);\n const findings: FindingEntry[] = [];\n let modelUsed: string | undefined;\n let providerUsed: string | undefined;\n let failover: boolean | undefined;\n let rawPrompt: string | undefined;\n\n if (options.findings) {\n if (!canUseReplAi(options.ctx)) {\n throw new Error(\n \"AI findings require stored API keys. Run `ntrp`, then /config set api-key and/or /config set openai-api-key, and use /diagnose --findings.\",\n );\n }\n if (options.deep) {\n for await (const event of agenticFindings(fullResult, divergences, { includeMetrics: true, ctx: options.ctx! })) {\n if (event.type === \"finding\") findings.push(event.finding);\n if (event.type === \"done\") {\n modelUsed = event.model_used;\n providerUsed = event.provider_used;\n failover = event.failover;\n rawPrompt = event.raw_prompt;\n if (event.findings.length > findings.length) {\n findings.splice(0, findings.length, ...event.findings);\n }\n }\n }\n } else {\n const findingsInput = buildFindingsInput(\n fullResult.aggregate,\n fullResult.segments.map((s) => ({ name: s.segment.name, result: s.result })),\n divergences,\n );\n for await (const event of streamFindings(findingsInput, options.ctx!)) {\n if (event.type === \"finding\") findings.push(event.finding);\n if (event.type === \"done\") {\n modelUsed = event.model_used;\n providerUsed = event.provider_used;\n rawPrompt = event.raw_prompt;\n }\n }\n }\n\n await insertFinding({\n findings,\n model_used: modelUsed,\n provider_used: providerUsed,\n failover,\n raw_prompt: rawPrompt,\n });\n }\n\n return {\n health: fullResult.aggregate,\n segments: fullResult.segments,\n divergences,\n findings,\n model_used: modelUsed,\n provider_used: providerUsed,\n failover,\n raw_prompt: rawPrompt,\n };\n}\n","import type { HealthComputeResult } from \"../vitals/health-score.js\";\nimport type { VitalSignResult, SegmentResult } from \"../types.js\";\n\nexport function summarizeEntityDetails(details: Record<string, unknown>[] = []): Record<string, number> {\n const summary: Record<string, number> = {};\n for (const detail of details) {\n const issue = typeof detail.issue === \"string\" ? detail.issue : \"unclassified\";\n summary[issue] = (summary[issue] ?? 0) + 1;\n }\n return summary;\n}\n\nexport function serializeVitalSign(vs: VitalSignResult): Record<string, unknown> {\n return {\n vital_sign: vs.vital_sign,\n score: vs.score,\n status: vs.status,\n components: vs.components,\n dollar_value: vs.dollar_value ?? null,\n dollar_label: vs.dollar_label ?? null,\n entity_issue_counts: summarizeEntityDetails(vs.entity_details),\n total_flagged_entities: vs.entity_details.length,\n };\n}\n\nexport function serializeHealth(result: HealthComputeResult | SegmentResult[\"result\"]): Record<string, unknown> {\n return {\n overall_score: result.overall_score,\n overall_status: result.overall_status,\n gating_vital_sign: result.gating_vital_sign,\n total_value_at_risk: \"total_value_at_risk\" in result ? result.total_value_at_risk ?? null : null,\n vital_signs: Object.fromEntries(result.vital_signs.map((vs) => [vs.vital_sign, serializeVitalSign(vs)])),\n };\n}\n\nexport function serializeSegment(seg: SegmentResult | { segment: SegmentResult[\"segment\"]; result: HealthComputeResult }): Record<string, unknown> {\n return {\n id: seg.segment.id,\n name: seg.segment.name,\n result: serializeHealth(seg.result),\n };\n}\n","/**\n * ntrp diagnose — compute vital signs, segments, and optionally AI findings.\n *\n * All output is plain ANSI via `renderDiagnoseStream` in output/terminal.ts.\n * TTY and piped modes share the same renderer — `ora` auto-detects non-TTY\n * and downgrades gracefully.\n *\n * --findings: single-shot AI findings\n * --deep: agentic investigation — model calls tools to drill into data\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { initSchema } from \"../db/schema.js\";\nimport { autoGenerateSegments } from \"../pipeline/segments.js\";\nimport { detectDivergences } from \"../pipeline/divergence.js\";\nimport { computeFullHealth, computeFullHealthStream } from \"../vitals/health-score.js\";\nimport type { FullComputeResult } from \"../vitals/health-score.js\";\nimport { buildFindingsInput, streamFindings } from \"../ai/findings.js\";\nimport { agenticFindings } from \"../ai/agentic-loop.js\";\nimport { canUseReplAi } from \"../ai/repl-api.js\";\nimport { insertFinding } from \"../db/queries.js\";\nimport {\n printHealthSummary,\n printVitalSigns,\n printSegmentSummary,\n printSegmentDetail,\n renderDiagnoseStream,\n type FindingsStreamEvent,\n} from \"../output/terminal.js\";\nimport { extractPipelineMetrics, formatCurrency } from \"../output/formatters.js\";\nimport { getStrategiesDir, getWinsDir } from \"../config/store.js\";\nimport { parseArgs, getBool, getString, getFalse } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { hydrateAnalysisFromPersistedState, markLensCompleted, saveSessionState } from \"../cli/context.js\";\nimport type { FindingEntry } from \"../types.js\";\nimport type { HealthComputeResult } from \"../vitals/health-score.js\";\nimport { isStructuredOutput, emitResult, emitError } from \"../io/emit.js\";\nimport { runDiagnosis } from \"../services/diagnosis.js\";\nimport { serializeHealth, serializeSegment } from \"../services/serialize.js\";\nimport { paint } from \"../ui/theme.js\";\nimport { printCompanionBanner, printCompanionFooter, resolveCompanionRecommendation } from \"../metrics/companion.js\";\n\ninterface DiagnoseOptions {\n findings: boolean;\n deep: boolean;\n segments: boolean;\n segment?: string;\n}\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n await hydrateAnalysisFromPersistedState(ctx);\n const { flags } = parseArgs(args, [\"findings\", \"deep\"]);\n\n const options: DiagnoseOptions = {\n findings: getBool(flags, \"findings\") || getBool(flags, \"deep\"),\n deep: getBool(flags, \"deep\"),\n segments: !getFalse(flags, \"segments\"),\n segment: getString(flags, \"segment\"),\n };\n\n if (isStructuredOutput(ctx.execution)) {\n try {\n const result = await runDiagnosis({ ...options, ctx });\n const segments = options.segment\n ? result.segments.filter((s) => s.segment.name.toLowerCase().includes(options.segment!.toLowerCase()))\n : result.segments;\n emitResult(\"diagnose\", {\n health: serializeHealth(result.health),\n segments: segments.map(serializeSegment),\n divergences: result.divergences,\n findings: result.findings,\n model_used: result.model_used,\n });\n return buildDiagnoseSummary(result.health, result.findings);\n } catch (err) {\n emitError(\"diagnose\", err);\n }\n }\n\n if (options.findings && !canUseReplAi(ctx)) {\n console.log();\n console.log(\" \" + chalk.red(\"AI findings run only in the interactive REPL.\"));\n console.log(\" \" + chalk.dim(\"Vital signs compute without a key — omit --findings for numbers only.\"));\n console.log(\" \" + chalk.dim(\"Start with \") + paint(\"accent\", \"ntrp\") + chalk.dim(\", set \") + paint(\"accent\", \"/config set api-key\") + chalk.dim(\" or openai-api-key, then /diagnose --findings.\"));\n console.log();\n return;\n }\n\n if (!isStructuredOutput(ctx.execution)) {\n printCompanionBanner(\"diagnose\", ctx.analysis.primary);\n }\n\n // Common init\n await initSchema();\n getStrategiesDir();\n getWinsDir();\n if (options.segments) {\n await autoGenerateSegments();\n }\n\n // --segment forces a focused single-segment static render\n let summary: string | undefined;\n if (options.segment) {\n summary = await runSegmentDiagnose(options);\n } else {\n summary = await runDiagnose(options, ctx);\n }\n\n markLensCompleted(ctx, \"gtm_health\");\n if (ctx.stage === \"new\") ctx.stage = \"analyzed\";\n saveSessionState(ctx);\n\n if (!ctx.oneShot && !isStructuredOutput(ctx.execution)) {\n const companion = await resolveCompanionRecommendation(ctx);\n printCompanionFooter(ctx, companion, { justCompleted: \"gtm_health\" });\n }\n\n // In one-shot mode, nudge the user toward the REPL for follow-ups.\n if (ctx.oneShot && options.findings) {\n console.log(chalk.dim(\" For follow-up questions, run `ntrp` and ask in plain English.\"));\n console.log();\n }\n\n return summary;\n}\n\n/** Progressive ANSI diagnose renderer. */\nasync function runDiagnose(options: DiagnoseOptions, ctx: Context): Promise<string | undefined> {\n const diagnoseGenerator = () => computeFullHealthStream();\n\n const runFindings = options.findings\n ? (result: FullComputeResult): AsyncGenerator<FindingsStreamEvent> => {\n const divInput = result.segments.map((s) => ({\n segmentId: s.segment.id,\n segmentName: s.segment.name,\n result: s.result,\n }));\n const { divergences } = detectDivergences(result.aggregate, divInput);\n\n if (options.deep) {\n return (async function* () {\n for await (const event of agenticFindings(result, divergences, { includeMetrics: true, ctx })) {\n if (event.type === \"finding\") {\n yield { type: \"finding\", finding: event.finding };\n } else if (event.type === \"tool_call\") {\n yield { type: \"tool_call\", name: event.name };\n } else if (event.type === \"done\") {\n yield {\n type: \"done\",\n findings: event.findings,\n model_used: event.model_used,\n raw_prompt: event.raw_prompt,\n };\n }\n }\n })();\n }\n\n const findingsInput = buildFindingsInput(\n result.aggregate,\n result.segments.map((s) => ({ name: s.segment.name, result: s.result })),\n divergences,\n );\n return streamFindings(findingsInput, ctx);\n }\n : null;\n\n const storeFindingsFn = options.findings\n ? async (data: {\n findings: FindingEntry[];\n model_used: string;\n raw_prompt: string;\n provider_used?: string;\n failover?: boolean;\n }) => {\n await insertFinding({\n findings: data.findings,\n model_used: data.model_used,\n provider_used: data.provider_used,\n failover: data.failover,\n raw_prompt: data.raw_prompt,\n });\n }\n : null;\n\n try {\n const { fullResult, findings } = await renderDiagnoseStream({\n diagnoseGenerator,\n runFindings,\n storeFindings: storeFindingsFn,\n deep: options.deep,\n });\n return buildDiagnoseSummary(fullResult.aggregate, findings);\n } catch (err) {\n console.error(chalk.red(String(err)));\n process.exit(1);\n }\n}\n\n/** Focused render for `--segment <name>`. */\nasync function runSegmentDiagnose(options: DiagnoseOptions): Promise<string | undefined> {\n const spinner = ora({ text: \"Computing vital signs...\", discardStdin: false }).start();\n let result;\n try {\n result = await computeFullHealth();\n spinner.succeed(\"Diagnosis complete\");\n } catch (err) {\n spinner.fail(\"Diagnosis failed\");\n console.error(chalk.red(String(err)));\n process.exit(1);\n }\n\n const needle = options.segment!.toLowerCase();\n let match = result.segments.find((s) => s.segment.name.toLowerCase() === needle);\n if (!match) {\n const subs = result.segments.filter((s) => s.segment.name.toLowerCase().includes(needle));\n if (subs.length === 1) match = subs[0];\n else if (subs.length > 1) {\n console.error(chalk.yellow(`\\n \"${options.segment}\" matches multiple segments:`));\n for (const s of subs) console.log(chalk.dim(` - ${s.segment.name}`));\n console.log();\n return;\n }\n }\n if (!match) {\n console.error(chalk.red(`\\n No segment matching \"${options.segment}\".`));\n if (result.segments.length > 0) {\n console.log(chalk.dim(\" Available segments:\"));\n for (const s of result.segments) console.log(chalk.dim(` - ${s.segment.name}`));\n }\n console.log();\n return;\n }\n\n // Show the focused segment detail, plus a brief aggregate context line.\n const pipelineMetrics = extractPipelineMetrics(result.aggregate.vital_signs);\n printHealthSummary(result.aggregate, pipelineMetrics ?? undefined);\n printVitalSigns(result.aggregate.vital_signs);\n if (result.segments.length > 0) {\n printSegmentSummary(result.segments);\n }\n printSegmentDetail(\n { segment: match.segment, result: match.result },\n result.aggregate,\n );\n\n return buildDiagnoseSummary(result.aggregate, []);\n}\n\n/** Build a compact summary line for compressed history. */\nfunction buildDiagnoseSummary(aggregate: HealthComputeResult, findings: FindingEntry[]): string {\n const parts: string[] = [];\n parts.push(`Score: ${Math.round(aggregate.overall_score)} (${aggregate.overall_status})`);\n if (findings.length > 0) {\n parts.push(`${findings.length} finding${findings.length === 1 ? \"\" : \"s\"}`);\n }\n if (aggregate.total_value_at_risk != null && aggregate.total_value_at_risk > 0) {\n parts.push(`${formatCurrency(aggregate.total_value_at_risk)} at risk`);\n }\n return parts.join(\" · \");\n}\n","/**\n * ntrp new — start a fresh point-in-time analysis.\n *\n * This is the front door of the session-centric workflow. It:\n * 1. Rotates to a brand-new session bound to its own dataset file, so the\n * prior analysis stays intact in its own DuckDB.\n * 2. Loads the data you're analyzing (a CSV file, a demo scenario, or empty).\n * 3. Runs an initial GTM health snapshot or SaaS metrics analysis.\n *\n * Usage:\n * /new interactive — one menu picks data + analysis\n * /new <file.csv> ingest a CRM export and analyze\n * /new --demo [--scenario] generate demo data and analyze\n * /new --empty start an empty session (load data later)\n * /new --lens health|metrics choose analysis type (headless)\n */\n\nimport chalk from \"chalk\";\nimport { existsSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport type { Context } from \"../cli/context.js\";\nimport type { AnalysisLens } from \"../types.js\";\nimport {\n saveSessionState,\n closeSession,\n rotateToFreshSession,\n setPrimaryLens,\n markLensCompleted,\n} from \"../cli/context.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport { getEntityCounts } from \"../db/queries.js\";\nimport { parseArgs, getBool, getString } from \"../cli/argparse.js\";\nimport { createPromptSession } from \"../cli/prompts.js\";\nimport { paint, bold } from \"../ui/theme.js\";\nimport { isProfileConfigured } from \"../config/profile.js\";\nimport { isStructuredOutput, emitResult } from \"../io/emit.js\";\nimport { guardDemoEnabled, isDemoEnabled } from \"../config/demo.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n const { positional, flags } = parseArgs(args, [\"demo\", \"empty\", \"list-scenarios\", \"regen-taxonomy\"]);\n\n let source: DataSource | null = null;\n let lens: AnalysisLens | null = parseLensFlag(getString(flags, \"lens\"));\n\n if (getBool(flags, \"demo\") || getBool(flags, \"list-scenarios\")) {\n if (getBool(flags, \"demo\") && !guardDemoEnabled()) return;\n source = { kind: \"demo\", scenario: getString(flags, \"scenario\") };\n } else if (positional[0]) {\n source = { kind: \"file\", path: positional[0]! };\n } else if (getBool(flags, \"empty\")) {\n source = { kind: \"empty\" };\n } else if (!ctx.oneShot && ctx.rl) {\n const picked = await promptForNewPath(ctx);\n if (!picked) return;\n source = picked.source;\n lens = picked.lens;\n } else {\n console.error(chalk.red(\" Usage: /new <file.csv> | --demo [--scenario <name>] | --empty [--lens health|metrics]\"));\n return;\n }\n\n if (source.kind === \"file\" && !existsSync(source.path)) {\n console.error(chalk.red(` File not found: ${source.path}`));\n return;\n }\n\n if (!lens) lens = \"gtm_health\";\n\n if (lens === \"revenue_metrics\" && !isProfileConfigured() && source.kind === \"demo\" && !ctx.execution.quiet) {\n console.log(\" \" + chalk.dim(\"No company profile — using mid-market benchmarks. Run \") + paint(\"accent\", \"/onboard\") + chalk.dim(\" to calibrate.\"));\n console.log();\n }\n\n if (!ctx.oneShot) {\n await rotateToNewSession(ctx);\n }\n\n setPrimaryLens(ctx, lens);\n ctx.analysis.data_source_type = undefined;\n ctx.analysis.coverage = undefined;\n\n await initSchema();\n let datasetLabel = \"empty session\";\n let datasetSource = \"empty\";\n\n if (source.kind === \"file\") {\n const { handler: ingest } = await import(\"./ingest.js\");\n const passthrough = [source.path];\n const sourceFlag = getString(flags, \"source\", \"s\");\n if (sourceFlag) passthrough.push(\"--source\", sourceFlag);\n await ingest(passthrough, ctx);\n datasetLabel = basename(source.path);\n datasetSource = source.path;\n } else if (source.kind === \"demo\") {\n const { handler: demo } = await import(\"./generate.js\");\n const passthrough: string[] = [];\n if (source.scenario) passthrough.push(\"--scenario\", source.scenario);\n if (getBool(flags, \"regen-taxonomy\")) passthrough.push(\"--regen-taxonomy\");\n if (!isProfileConfigured()) passthrough.push(\"--no-profile\");\n const ok = await demo(passthrough, ctx);\n if (!ok) {\n ctx.stage = \"new\";\n saveSessionState(ctx);\n console.log();\n console.error(\" \" + chalk.red(\"Demo generation failed — session not loaded.\"));\n console.log(\" \" + chalk.dim(\"Try \") + paint(\"accent\", \"/new\") + chalk.dim(\" again or pick another data source.\"));\n console.log();\n return \"Demo failed\";\n }\n datasetLabel = source.scenario ? `${source.scenario} demo` : \"demo dataset\";\n datasetSource = `demo:${source.scenario ?? \"random\"}`;\n }\n\n let counts: Record<string, number> = {};\n try {\n counts = await getEntityCounts();\n } catch {\n // no DB yet\n }\n const hasData = Object.values(counts).some((n) => n > 0);\n ctx.dataset = {\n label: datasetLabel,\n source: datasetSource,\n counts,\n ingested_at: new Date().toISOString(),\n };\n\n if (source.kind === \"empty\" || !hasData) {\n ctx.stage = \"new\";\n saveSessionState(ctx);\n console.log();\n console.log(\" \" + paint(\"accent\", \"New session started\") + chalk.dim(\" — no data loaded yet.\"));\n console.log(\" \" + chalk.dim(\"Load a CSV with \") + paint(\"accent\", \"/new <file.csv>\") + chalk.dim(\" or ask a question to begin.\"));\n console.log();\n return \"New empty session\";\n }\n\n if (lens === \"revenue_metrics\") {\n const ora = (await import(\"ora\")).default;\n const { runMetricsAnalysis } = await import(\"../services/metrics-analysis.js\");\n const { renderMetricsReport } = await import(\"../output/metrics-report.js\");\n\n const structured = isStructuredOutput(ctx.execution);\n const spinner = structured\n ? null\n : ora({ text: \"Computing SaaS metrics…\", indent: 2, discardStdin: false }).start();\n let result;\n try {\n result = await runMetricsAnalysis({\n findings: false,\n sessionAnalysis: ctx.analysis,\n });\n if (spinner) spinner.succeed(\"SaaS metrics computed\");\n } catch (err) {\n if (spinner) spinner.fail(\"SaaS metrics failed\");\n console.error(chalk.red(String(err)));\n ctx.stage = \"new\";\n saveSessionState(ctx);\n return \"Metrics failed\";\n }\n\n ctx.analysis.coverage = result.coverage;\n ctx.analysis.data_source_type = result.data_source_type;\n ctx.analysis.recommended = result.companion_recommendation;\n markLensCompleted(ctx, \"revenue_metrics\");\n ctx.stage = \"analyzed\";\n saveSessionState(ctx);\n\n if (isStructuredOutput(ctx.execution)) {\n emitResult(\"new\", {\n lens: \"revenue_metrics\",\n stage: ctx.stage,\n metrics: result.metrics.aggregate.metrics,\n findings: result.findings,\n coverage: result.coverage,\n data_source_type: result.data_source_type,\n });\n return \"Metrics ready — ask a question\";\n }\n\n renderMetricsReport(ctx, result.metrics.aggregate.metrics, result.coverage, result.data_source_type, {\n snapshot: result.snapshot,\n findings: result.findings,\n companion: result.companion_recommendation ?? null,\n interactive: !ctx.oneShot,\n });\n\n return \"Metrics ready — ask a question\";\n }\n\n const { handler: diagnose } = await import(\"./diagnose.js\");\n const summary = await diagnose([], ctx);\n\n markLensCompleted(ctx, \"gtm_health\");\n ctx.stage = \"analyzed\";\n saveSessionState(ctx);\n\n return typeof summary === \"string\" ? summary.replace(\"New analysis ready\", \"Health ready — ask a question\") : \"Health ready — ask a question\";\n}\n\ntype DataSource =\n | { kind: \"file\"; path: string }\n | { kind: \"demo\"; scenario?: string }\n | { kind: \"empty\" };\n\nfunction parseLensFlag(raw?: string): AnalysisLens | null {\n if (!raw) return null;\n const v = raw.toLowerCase();\n if (v === \"health\" || v === \"gtm_health\" || v === \"gtm\") return \"gtm_health\";\n if (v === \"metrics\" || v === \"revenue_metrics\" || v === \"revenue\") return \"revenue_metrics\";\n return null;\n}\n\n/** One menu for the common case — data source + first analysis together. */\nasync function promptForNewPath(\n ctx: Context,\n): Promise<{ source: DataSource; lens: AnalysisLens } | null> {\n const prompts = createPromptSession(ctx.rl, ctx);\n try {\n console.log();\n console.log(\" \" + bold(\"Start a new analysis\"));\n console.log(\" \" + chalk.dim(\"Pick once — we load the data and run the first report.\"));\n console.log();\n\n const startChoices = [\n ...(isDemoEnabled()\n ? [\n {\n value: \"demo\" as const,\n label: \"Demo\",\n description: \"Sample CRM data · fastest way to explore\",\n },\n ]\n : []),\n {\n value: \"file\" as const,\n label: \"My CSV export\",\n description: \"Your CRM pipeline data\",\n },\n {\n value: \"empty\" as const,\n label: \"Empty session\",\n description: \"Set up now, load data later\",\n },\n ];\n\n const pick = await prompts.choose(\n \"Where should we start?\",\n startChoices,\n { default: isDemoEnabled() ? \"demo\" : \"file\" },\n );\n\n if (pick === \"demo\") {\n const lens = await prompts.choose(\"What kind of analysis?\", [\n { value: \"gtm_health\", label: \"Pipeline health\", description: \"Vital signs — motion, handoffs, stuck deals\" },\n { value: \"revenue_metrics\", label: \"SaaS metrics\", description: \"ARR, retention, pipeline efficiency\" },\n ], { default: \"gtm_health\" }) as AnalysisLens;\n return { source: { kind: \"demo\" }, lens };\n }\n if (pick === \"empty\") {\n return { source: { kind: \"empty\" }, lens: \"gtm_health\" };\n }\n\n const path = (await prompts.ask(\"Path to the CSV file\")).trim();\n if (!path) return null;\n let lens = await prompts.choose(\"First report on this data?\", [\n { value: \"gtm_health\", label: \"Pipeline health\", description: \"Vital signs — motion, handoffs, stuck deals\" },\n { value: \"revenue_metrics\", label: \"SaaS metrics\", description: \"ARR, retention, pipeline efficiency\" },\n ], { default: \"gtm_health\" }) as AnalysisLens;\n\n if (lens === \"revenue_metrics\" && !isProfileConfigured()) {\n const fixChoices = [\n { value: \"onboard\" as const, label: \"Set up profile now\", description: \"Quick /onboard wizard\" },\n ...(isDemoEnabled()\n ? [{ value: \"demo_metrics\" as const, label: \"Try demo metrics instead\", description: \"Sample data, no profile\" }]\n : []),\n { value: \"cancel\" as const, label: \"Cancel\", description: \"Go back\" },\n ];\n const fix = await prompts.choose(\"SaaS metrics on your CSV needs a company profile.\", fixChoices);\n if (fix === \"onboard\") {\n const { handler: onboard } = await import(\"./onboard.js\");\n await onboard([], ctx);\n if (!isProfileConfigured()) return null;\n } else if (fix === \"demo_metrics\") {\n return { source: { kind: \"demo\" }, lens: \"revenue_metrics\" };\n } else {\n return null;\n }\n }\n\n return { source: { kind: \"file\", path }, lens };\n } finally {\n prompts.close();\n }\n}\n\nasync function rotateToNewSession(ctx: Context): Promise<void> {\n const exchangeCount = Math.floor(ctx.messages.length / 2);\n if (exchangeCount > 0) {\n await closeSession(ctx);\n } else if (ctx.stage !== \"new\" || ctx.dataset) {\n saveSessionState(ctx);\n }\n\n await rotateToFreshSession(ctx);\n}\n","/**\n * ntrp end — close the current analysis without producing a handoff.\n *\n * Marks the session \"ended\" so it no longer appears as in-progress, then\n * rotates to a fresh empty session. Use when you're done exploring but\n * don't need a report, CSV, or other deliverable.\n */\n\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { endSession, rotateToFreshSession } from \"../cli/context.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n if (args.length > 0) {\n console.error(chalk.red(\" Usage: /end\"));\n return;\n }\n\n if (ctx.oneShot) {\n console.error(chalk.red(\" /end is for the interactive REPL only.\"));\n return;\n }\n\n const alreadyClosed = ctx.stage === \"delivered\" || ctx.stage === \"ended\";\n const hasWork =\n ctx.stage === \"analyzed\" ||\n !!ctx.dataset ||\n ctx.messages.length > 0 ||\n ctx.deliverables.length > 0;\n\n if (alreadyClosed) {\n console.log();\n console.log(\" \" + chalk.dim(\"This session is already closed — starting fresh.\"));\n await rotateToFreshSession(ctx);\n await initSchema();\n console.log();\n return \"Fresh session\";\n }\n\n if (!hasWork) {\n console.log();\n console.log(\" \" + chalk.dim(\"Nothing to end — starting a fresh session.\"));\n await rotateToFreshSession(ctx);\n await initSchema();\n console.log();\n return \"Fresh session\";\n }\n\n const summary = await endSession(ctx);\n await rotateToFreshSession(ctx);\n await initSchema();\n\n console.log();\n console.log(\" \" + paint(\"accent\", \"Session ended\") + chalk.dim(\" — no longer in progress.\"));\n if (summary) {\n console.log(\" \" + chalk.dim(summary));\n }\n console.log();\n\n return \"Session ended\";\n}\n","/**\n * ntrp session — the data-centric picker.\n *\n * A session is a point-in-time analysis: a dataset + the questions you asked of\n * it + whatever you delivered. This command is how you move between them.\n *\n * /session list sessions (unfinished work first)\n * /session <id|name> pick one up: rebinds its dataset + conversation\n * <id> same as /session <id> when the id is unambiguous\n * /session new start a fresh analysis (alias for /new)\n *\n * Picking a session up continues it *in place* — same id, same dataset file,\n * appended transcript — because the data is the thing you're returning to.\n */\n\nimport chalk from \"chalk\";\nimport { join } from \"node:path\";\nimport ora from \"ora\";\nimport type { Context } from \"../cli/context.js\";\nimport {\n listSessions,\n loadSessionFile,\n getUnfinishedSessions,\n getSessionsDir,\n datasetPathForSession,\n resetContextForSwitch,\n closeSession,\n saveSessionState,\n resolveSessionByToken,\n type SessionListEntry,\n} from \"../cli/context.js\";\nimport { setActiveDbPath } from \"../db/connection.js\";\nimport { paint, bold } from \"../ui/theme.js\";\nimport { padRight } from \"../ui/layout.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n const sub = args[0];\n\n if (!sub) return listSessionsView(ctx);\n\n if (sub === \"new\") {\n const { handler: newAnalysis } = await import(\"./new.js\");\n return newAnalysis(args.slice(1), ctx);\n }\n\n if (sub === \"list\") return listSessionsView(ctx);\n\n // Otherwise treat the token as a session id / suffix / name to pick up.\n return pickUp(args.join(\" \").trim(), ctx);\n}\n\n// ============================================================\n// List\n// ============================================================\n\nfunction stageBadge(s: SessionListEntry): string {\n const delivered = (s.deliverables?.length ?? 0) > 0;\n if (delivered || s.stage === \"delivered\") return paint(\"accent\", \"delivered\");\n if (s.stage === \"analyzed\") return chalk.yellow(\"in progress\");\n if (s.stage === \"ended\") return chalk.dim(\"ended\");\n if (s.stage === \"new\") return chalk.dim(\"new\");\n return chalk.dim(\"\\u2014\");\n}\n\nfunction datasetLabel(s: SessionListEntry): string {\n if (s.dataset?.label) return s.dataset.label;\n return s.summary ?? chalk.dim(\"(no data)\");\n}\n\nfunction listSessionsView(ctx: Context): string | undefined {\n const all = listSessions({ limit: 12 }).filter((s) => s.id !== ctx.sessionId);\n const unfinished = getUnfinishedSessions(ctx.sessionId);\n const unfinishedIds = new Set(unfinished.map((s) => s.id));\n\n if (all.length === 0) {\n console.log();\n console.log(\" \" + chalk.dim(\"No prior sessions. Start one with \") + paint(\"accent\", \"/new\") + chalk.dim(\".\"));\n console.log();\n return;\n }\n\n const renderRow = (s: SessionListEntry) => {\n const shortId = s.id.slice(-4);\n const date = s.created_at?.slice(0, 10) ?? s.id.slice(0, 10);\n const nameTag = s.name ? paint(\"accent\", `[${s.name}] `) : \"\";\n return ` ${chalk.dim(date)} ${paint(\"accent\", shortId)} ${padRight(stageBadge(s), 22)} ${nameTag}${chalk.dim(datasetLabel(s))}`;\n };\n\n console.log();\n console.log(\" \" + paint(\"accent\", bold(\"Sessions\")));\n console.log(\" \" + chalk.dim(\"\\u2500\".repeat(60)));\n\n if (unfinished.length > 0) {\n console.log(\" \" + chalk.yellow(bold(\"In progress\")) + chalk.dim(\" \\u2014 reached insight, not yet delivered. Run \") + paint(\"accent\", \"/handoff\") + chalk.dim(\" to ship or \") + paint(\"accent\", \"/end\") + chalk.dim(\" to close.\"));\n for (const s of unfinished) console.log(renderRow(s));\n const rest = all.filter((s) => !unfinishedIds.has(s.id));\n if (rest.length > 0) {\n console.log();\n console.log(\" \" + chalk.dim(bold(\"Earlier\")));\n for (const s of rest) console.log(renderRow(s));\n }\n } else {\n for (const s of all) console.log(renderRow(s));\n }\n\n console.log(\" \" + chalk.dim(\"\\u2500\".repeat(60)));\n console.log(\n \" \" +\n paint(\"accent\", \"<id>\") +\n chalk.dim(\" to pick up \\u00b7 \") +\n paint(\"accent\", \"/new\") +\n chalk.dim(\" to start fresh\"),\n );\n console.log();\n return `${all.length} session${all.length === 1 ? \"\" : \"s\"}`;\n}\n\n// ============================================================\n// Pick up (continue in place)\n// ============================================================\n\nasync function pickUp(idArg: string, ctx: Context): Promise<string | void> {\n const target = resolveSessionByToken(idArg);\n if (!target) {\n if (typeof target === \"undefined\") {\n console.log(\" \" + chalk.red(`No session matching \"${idArg}\".`) + chalk.dim(\" Use /session to list.\"));\n }\n return;\n }\n\n if (target.id === ctx.sessionId) {\n console.log(\" \" + chalk.dim(\"Already in this session.\"));\n return;\n }\n\n const session = loadSessionFile(target.id);\n if (!session) {\n console.log(\" \" + chalk.red(`Could not read session ${target.id}.`));\n return;\n }\n\n // Save the current session before leaving it.\n const exchangeCount = Math.floor(ctx.messages.length / 2);\n if (exchangeCount > 0) {\n const spinner = ora({ text: \"Saving current session\\u2026\", color: \"cyan\", discardStdin: false }).start();\n await closeSession(ctx);\n spinner.succeed(\"Saved current session\");\n } else if (ctx.stage !== \"new\" || ctx.dataset) {\n saveSessionState(ctx);\n }\n\n // Continue the target in place: same id, same dataset, appended transcript.\n resetContextForSwitch(ctx, {\n sessionId: target.id,\n sessionFile: join(getSessionsDir(), `${target.id}.json`),\n sessionName: session.name,\n messages: [...session.messages],\n conversation: session.thread ? [...session.thread] : [],\n resumedSessionSummary: session.summary,\n stage: session.stage ?? (session.messages.length > 0 ? \"analyzed\" : \"new\"),\n dataset: session.dataset,\n deliverables: session.deliverables ?? [],\n analysis: session.analysis,\n scope: session.scope,\n attachments: session.attachments,\n llm: session.llm ? { ...session.llm } : undefined,\n });\n\n // Rebind the active database to this session's dataset.\n ctx.datasetPath = datasetPathForSession(target.id);\n await setActiveDbPath(ctx.datasetPath);\n\n const shortId = target.id.slice(-4);\n console.log();\n console.log(\" \" + paint(\"accent\", `Picked up session ${shortId}`));\n if (session.dataset?.label) {\n console.log(\" \" + chalk.dim(\"Data: \") + session.dataset.label);\n }\n if (session.summary) {\n console.log(\" \" + chalk.dim(\"Context: \") + session.summary);\n }\n const exch = session.exchange_count ?? Math.floor(session.messages.length / 2);\n if (exch > 0) console.log(\" \" + chalk.dim(`${exch} prior exchange${exch === 1 ? \"\" : \"s\"} loaded`));\n console.log();\n\n return `Picked up ${shortId}`;\n}\n","import type { FindingEntry, ReportData } from \"../types.js\";\nimport { VITAL_SIGN_LABELS, formatScore, severityLabel, statusEmoji, formatDollarImpact } from \"./formatters.js\";\n\nexport function generateMarkdownReport(data: ReportData): string {\n const lines: string[] = [];\n\n lines.push(\"# GTM Health Report\");\n lines.push(\"\");\n lines.push(`*Generated: ${data.generatedAt}*`);\n lines.push(\"\");\n\n // Health Summary\n lines.push(\"## Overall Health\");\n lines.push(\"\");\n lines.push(`${statusEmoji(data.health.overall_status)} **Score: ${formatScore(data.health.overall_score)} / 100** (${data.health.overall_status})`);\n lines.push(\"\");\n lines.push(`Gating vital sign: **${VITAL_SIGN_LABELS[data.health.gating_vital_sign]}**`);\n lines.push(\"\");\n\n // Entity Counts\n lines.push(\"## Data Summary\");\n lines.push(\"\");\n lines.push(\"| Entity | Count |\");\n lines.push(\"|--------|-------|\");\n for (const [entity, count] of Object.entries(data.entityCounts)) {\n lines.push(`| ${entity} | ${count.toLocaleString()} |`);\n }\n lines.push(\"\");\n\n // Vital Signs\n lines.push(\"## Vital Signs\");\n lines.push(\"\");\n lines.push(\"| Vital Sign | Score | Status | $ Impact |\");\n lines.push(\"|------------|-------|--------|----------|\");\n for (const vs of data.health.vital_signs) {\n lines.push(`| ${VITAL_SIGN_LABELS[vs.vital_sign]} | ${formatScore(vs.score)} | ${statusEmoji(vs.status)} ${vs.status} | ${formatDollarImpact(vs.dollar_value, vs.dollar_label)} |`);\n }\n lines.push(\"\");\n\n // Vital Sign Details\n for (const vs of data.health.vital_signs) {\n lines.push(`### ${VITAL_SIGN_LABELS[vs.vital_sign]}`);\n lines.push(\"\");\n lines.push(`Score: **${formatScore(vs.score)}** ${statusEmoji(vs.status)}`);\n lines.push(\"\");\n\n // Components\n if (Object.keys(vs.components).length > 0) {\n lines.push(\"**Components:**\");\n lines.push(\"\");\n for (const [key, value] of Object.entries(vs.components)) {\n if (typeof value === \"object\" && value !== null) {\n lines.push(`- ${key}:`);\n for (const [subKey, subVal] of Object.entries(value as Record<string, unknown>)) {\n lines.push(` - ${subKey}: ${subVal}`);\n }\n } else {\n lines.push(`- ${key}: ${value}`);\n }\n }\n lines.push(\"\");\n }\n\n // Entity details (top 5)\n if (vs.entity_details.length > 0) {\n lines.push(\"**Top issues:**\");\n lines.push(\"\");\n for (const entity of vs.entity_details.slice(0, 5)) {\n const name = entity.name ?? entity.id ?? \"Unknown\";\n const issue = entity.issue ?? \"\";\n lines.push(`- **${name}**: ${issue}`);\n }\n if (vs.entity_details.length > 5) {\n lines.push(`- *...and ${vs.entity_details.length - 5} more*`);\n }\n lines.push(\"\");\n }\n }\n\n // Segments\n if (data.segments.length > 0) {\n lines.push(\"## Segments\");\n lines.push(\"\");\n lines.push(\"| Segment | Score | Status | Gating Sign |\");\n lines.push(\"|---------|-------|--------|-------------|\");\n for (const seg of data.segments) {\n lines.push(`| ${seg.segment.name} | ${formatScore(seg.result.overall_score)} | ${statusEmoji(seg.result.overall_status)} ${seg.result.overall_status} | ${VITAL_SIGN_LABELS[seg.result.gating_vital_sign]} |`);\n }\n lines.push(\"\");\n }\n\n // AI Findings\n if (data.findings.length > 0) {\n lines.push(\"## AI Findings\");\n lines.push(\"\");\n for (const finding of data.findings) {\n const icon = finding.severity === \"critical\" ? \"🚨\" : finding.severity === \"warning\" ? \"⚠️\" : \"ℹ️\";\n lines.push(`### ${icon} ${severityLabel(finding.severity)} — ${finding.segment}`);\n lines.push(\"\");\n lines.push(finding.finding);\n lines.push(\"\");\n if (finding.recommended_focus) {\n lines.push(`*Recommended focus: ${VITAL_SIGN_LABELS[finding.recommended_focus]}*`);\n lines.push(\"\");\n }\n }\n }\n\n lines.push(\"---\");\n lines.push(\"*Generated by ntrp-cli*\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","import type { ReportData } from \"../types.js\";\nimport { serializeVitalSign } from \"../services/serialize.js\";\n\nexport function generateJSONReport(data: ReportData): string {\n const report = {\n generated_at: data.generatedAt,\n health: {\n overall_score: data.health.overall_score,\n overall_status: data.health.overall_status,\n gating_vital_sign: data.health.gating_vital_sign,\n total_value_at_risk: data.health.total_value_at_risk ?? null,\n vital_signs: Object.fromEntries(\n data.health.vital_signs.map((vs) => [\n vs.vital_sign,\n serializeVitalSign(vs),\n ]),\n ),\n },\n entity_counts: data.entityCounts,\n segments: data.segments.map((seg) => ({\n name: seg.segment.name,\n overall_score: seg.result.overall_score,\n overall_status: seg.result.overall_status,\n gating_vital_sign: seg.result.gating_vital_sign,\n vital_signs: Object.fromEntries(\n seg.result.vital_signs.map((vs) => [\n vs.vital_sign,\n serializeVitalSign(vs),\n ]),\n ),\n })),\n findings: data.findings,\n };\n\n return JSON.stringify(report, null, 2);\n}\n","import { homedir } from \"node:os\";\nimport { resolve, sep } from \"node:path\";\n\nexport const NTRP_HOME = resolve(homedir(), \".ntrp\");\n\nexport function resolveUserPath(path: string): string {\n return resolve(path);\n}\n\nexport function isInsideNtrp(path: string): boolean {\n const resolved = resolve(path);\n return resolved === NTRP_HOME || resolved.startsWith(NTRP_HOME + sep);\n}\n\n","import { initSchema } from \"../db/schema.js\";\nimport { loadLatestDiagnosis } from \"../db/queries.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\n\nexport async function loadReportData(segmentName?: string) {\n await initSchema();\n const diagnosis = await loadLatestDiagnosis();\n if (!diagnosis) {\n throw new NtrpError(\"no_diagnosis\", \"No diagnosis data found. Run diagnose first.\", ExitCode.NoData);\n }\n\n let { health, segments, findings, entityCounts } = diagnosis;\n let scopedSegment = null as typeof segments[number] | null;\n if (segmentName) {\n const lower = segmentName.toLowerCase();\n let match = segments.find((s) => s.segment.name.toLowerCase() === lower);\n if (!match) {\n const subs = segments.filter((s) => s.segment.name.toLowerCase().includes(lower));\n if (subs.length === 1) match = subs[0];\n else if (subs.length > 1) {\n throw new NtrpError(\"ambiguous_segment\", `\"${segmentName}\" matches multiple segments.`, ExitCode.Usage, {\n matches: subs.map((s) => s.segment.name),\n });\n }\n }\n if (!match) {\n throw new NtrpError(\"segment_not_found\", `No segment matching \"${segmentName}\".`, ExitCode.Usage, {\n available_segments: segments.map((s) => s.segment.name),\n });\n }\n scopedSegment = match;\n health = match.result;\n segments = [match];\n findings = findings.filter((f) => f.segment.toLowerCase().includes(lower));\n }\n\n return {\n diagnosis,\n scopedSegment,\n reportData: {\n health,\n segments,\n findings,\n entityCounts,\n generatedAt: new Date().toISOString(),\n },\n };\n}\n","import type { MetricsReportData } from \"../metrics/types.js\";\nimport type { MetricResult } from \"../metrics/types.js\";\nimport { formatCoverageHeader } from \"../metrics/coverage.js\";\nimport { severityLabel } from \"./formatters.js\";\n\nexport function generateMetricsMarkdownReport(data: MetricsReportData): string {\n const lines: string[] = [];\n\n lines.push(\"# SaaS Metrics Report\");\n lines.push(\"\");\n lines.push(`*Generated: ${data.generatedAt}*`);\n lines.push(\"\");\n lines.push(formatCoverageHeader(data.data_source_type, data.coverage));\n lines.push(\"\");\n\n lines.push(\"## Metrics\");\n lines.push(\"\");\n lines.push(\"| Metric | Value | Status | Confidence |\");\n lines.push(\"|--------|-------|--------|------------|\");\n for (const m of data.metrics) {\n const conf = m.confidence != null ? `${m.confidence_label ?? \"\"} (${m.confidence})` : \"—\";\n lines.push(`| ${m.label} | ${m.formatted} | ${m.status} | ${conf} |`);\n if (m.reliability_gate?.requirements?.[0]) {\n lines.push(`| | *Gate: ${m.reliability_gate.requirements[0]}* | | |`);\n }\n }\n lines.push(\"\");\n\n if (data.findings.length > 0) {\n lines.push(\"## Findings\");\n lines.push(\"\");\n for (const f of data.findings) {\n lines.push(`### ${severityLabel(f.severity)} — ${f.segment}`);\n lines.push(\"\");\n lines.push(f.finding);\n lines.push(\"\");\n }\n }\n\n lines.push(\"---\");\n lines.push(\"*Generated by ntrp-cli*\");\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport function appendMetricsSection(lines: string[], metrics: MetricResult[]): string[] {\n lines.push(\"## SaaS Metrics\");\n lines.push(\"\");\n lines.push(\"| Metric | Value | Confidence |\");\n lines.push(\"|--------|-------|------------|\");\n for (const m of metrics) {\n const conf = m.confidence != null ? `${m.confidence}` : \"—\";\n lines.push(`| ${m.label} | ${m.formatted} | ${conf} |`);\n }\n lines.push(\"\");\n return lines;\n}\n","/**\n * ntrp report — generate a formatted report from the latest diagnosis.\n */\n\nimport chalk from \"chalk\";\nimport { writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { initSchema } from \"../db/schema.js\";\nimport { loadLatestDiagnosis } from \"../db/queries.js\";\nimport { generateMarkdownReport } from \"../output/markdown.js\";\nimport { generateJSONReport } from \"../output/json.js\";\nimport { printHealthSummary, printVitalSigns, printFindings, printSegmentDetail } from \"../output/terminal.js\";\nimport { extractPipelineMetrics } from \"../output/formatters.js\";\nimport { isInsideNtrp, resolveUserPath } from \"../output/path-safety.js\";\nimport { getConfigValue } from \"../config/store.js\";\nimport { parseArgs, getString } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { isStructuredOutput, emitResult, emitError } from \"../io/emit.js\";\nimport { loadReportData } from \"../services/report.js\";\nimport { loadLatestMetricsAnalysis } from \"../db/queries.js\";\nimport { generateMetricsMarkdownReport, appendMetricsSection } from \"../output/metrics-markdown.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { flags } = parseArgs(args);\n const format = getString(flags, \"format\", \"f\") ?? getConfigValue(\"default-format\") ?? \"terminal\";\n const output = getString(flags, \"output\", \"o\");\n const segmentName = getString(flags, \"segment\");\n\n try {\n const metricsAnalysis = await loadLatestMetricsAnalysis();\n let diagnosis: Awaited<ReturnType<typeof loadReportData>> | null = null;\n try {\n diagnosis = await loadReportData(segmentName);\n } catch {\n if (!metricsAnalysis) throw new Error(\"No diagnosis or metrics data found. Run /new or /metrics first.\");\n }\n\n if (isStructuredOutput(ctx.execution) && !output && diagnosis) {\n emitResult(\"report\", { ...diagnosis.reportData, metrics: metricsAnalysis?.metrics });\n return;\n }\n\n let rendered = \"\";\n\n switch (format) {\n case \"md\":\n case \"markdown\":\n if (diagnosis) {\n const base = generateMarkdownReport(diagnosis.reportData);\n if (metricsAnalysis && metricsAnalysis.metrics.length > 0) {\n const metricRows = metricsAnalysis.metrics.map((r) => ({\n metric: r.metric as string,\n label: r.label as string,\n group: r.group_name as import(\"../metrics/types.js\").MetricGroup,\n value: r.value as number | null,\n formatted: r.formatted as string,\n status: r.status as import(\"../metrics/types.js\").MetricStatus,\n components: typeof r.components === \"string\" ? JSON.parse(r.components as string) : (r.components as Record<string, unknown>) ?? {},\n confidence: r.confidence as number | undefined,\n confidence_label: r.confidence_label as import(\"../types.js\").ConfidenceLabel | undefined,\n reliability_gate: typeof r.reliability_gate === \"string\"\n ? JSON.parse(r.reliability_gate as string)\n : r.reliability_gate as import(\"../types.js\").ReliabilityGate | undefined,\n }));\n const parts = base.split(\"---\");\n const body = parts[0] ?? base;\n const footer = parts.length > 1 ? parts.slice(1).join(\"---\") : \"\";\n const combined = [...appendMetricsSection(body.split(\"\\n\"), metricRows), \"---\", footer].join(\"\\n\");\n rendered = combined;\n } else {\n rendered = base;\n }\n } else if (metricsAnalysis) {\n rendered = generateMetricsMarkdownReport({\n metrics: metricsAnalysis.metrics as unknown as import(\"../metrics/types.js\").MetricResult[],\n segments: [],\n findings: metricsAnalysis.findings,\n coverage: ctx.analysis?.coverage ?? {\n earliest_close_date: null,\n latest_close_date: null,\n distinct_months: 0,\n distinct_quarters: 0,\n closed_won_count: 0,\n orgs_with_multiple_wins: 0,\n has_deal_type_metadata: false,\n has_revenue_events: false,\n recommended_cadence: \"quarterly\",\n eligible_comparisons: [\"snapshot\"],\n warnings: [],\n },\n data_source_type: ctx.analysis?.data_source_type ?? \"pipeline\",\n analysis: ctx.analysis,\n entityCounts: {},\n generatedAt: new Date().toISOString(),\n });\n }\n break;\n case \"json\":\n if (diagnosis) {\n rendered = generateJSONReport(diagnosis.reportData);\n }\n break;\n case \"terminal\":\n default:\n if (diagnosis) {\n const { scopedSegment, reportData } = diagnosis;\n if (scopedSegment) {\n printSegmentDetail(scopedSegment, diagnosis.diagnosis.health);\n } else {\n const pipelineMetrics = extractPipelineMetrics(reportData.health.vital_signs);\n printHealthSummary(reportData.health, pipelineMetrics ?? undefined);\n printVitalSigns(reportData.health.vital_signs);\n }\n if (reportData.findings.length > 0) printFindings(reportData.findings);\n }\n break;\n }\n\n if (output) {\n const resolvedOutput = resolveUserPath(output);\n if (!isInsideNtrp(resolvedOutput)) {\n console.warn(chalk.yellow(` Warning: writing report outside ~/.ntrp (${dirname(resolvedOutput)})`));\n }\n writeFileSync(resolvedOutput, rendered);\n console.log(chalk.green(` Report written to ${resolvedOutput}`));\n } else if (rendered) {\n console.log(rendered);\n }\n } catch (err) {\n if (isStructuredOutput(ctx.execution)) {\n emitError(\"report\", err);\n }\n console.error(chalk.red(String(err)));\n process.exit(1);\n }\n}\n","import { writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { FindingEntry, VitalSign } from \"../types.js\";\nimport type { FullComputeResult } from \"../vitals/health-score.js\";\nimport type { Divergence } from \"../pipeline/divergence.js\";\nimport { getExportsDir } from \"../config/store.js\";\n\n/** A single question/answer pair from an interactive review session. */\nexport interface ReviewExchange {\n question: string;\n answer: string;\n}\nimport { VITAL_SIGN_LABELS, extractPipelineMetrics, formatCurrency, formatDollarValue, formatPipelineLine, statusEmoji, formatDollarImpact } from \"./formatters.js\";\n\nexport interface NotesExportData {\n computeResult: FullComputeResult;\n divergences: Divergence[];\n findings: FindingEntry[];\n exchanges?: ReviewExchange[];\n}\n\nexport function exportToNotes(data: NotesExportData): string {\n const { computeResult, divergences, findings, exchanges } = data;\n const { aggregate, segments } = computeResult;\n\n const now = new Date();\n const dateStr = formatDate(now);\n const timeStr = formatTime(now);\n const filename = `${dateStr}-${timeStr}-gtm-health.md`;\n\n const dir = getExportsDir();\n const filepath = join(dir, filename);\n\n // Build severity tags\n const severityTags = new Set<string>();\n for (const f of findings) severityTags.add(f.severity);\n\n const tags = [\"ntrp\", \"gtm-health\", ...severityTags];\n if (aggregate.gating_vital_sign) {\n tags.push(aggregate.gating_vital_sign.replace(/_/g, \"-\"));\n }\n\n // YAML frontmatter\n const frontmatter = [\n \"---\",\n `date: ${now.toISOString().split(\"T\")[0]}`,\n `overall_score: ${aggregate.overall_score}`,\n `overall_status: ${aggregate.overall_status}`,\n `gating_vital_sign: ${aggregate.gating_vital_sign}`,\n ];\n\n for (const vs of aggregate.vital_signs) {\n frontmatter.push(`${vs.vital_sign}_score: ${vs.score}`);\n if (vs.dollar_value != null && vs.dollar_value > 0) {\n frontmatter.push(`${vs.vital_sign}_dollar_value: ${vs.dollar_value}`);\n }\n }\n\n if (aggregate.total_value_at_risk != null && aggregate.total_value_at_risk > 0) {\n frontmatter.push(`total_value_at_risk: ${aggregate.total_value_at_risk}`);\n }\n\n const pipelineMetrics = extractPipelineMetrics(aggregate.vital_signs);\n if (pipelineMetrics) {\n frontmatter.push(`pipeline_value: ${pipelineMetrics.total_pipeline_value}`);\n frontmatter.push(`pipeline_at_risk: ${pipelineMetrics.at_risk_value}`);\n }\n frontmatter.push(`findings_count: ${findings.length}`);\n frontmatter.push(`tags: [${tags.join(\", \")}]`);\n frontmatter.push(\"---\");\n\n // Body\n const body: string[] = [];\n\n // Health summary\n body.push(\"# GTM Health Diagnosis\");\n body.push(\"\");\n body.push(`**Overall Score:** ${aggregate.overall_score}/100 (${aggregate.overall_status})`);\n body.push(`**Gating Vital Sign:** ${VITAL_SIGN_LABELS[aggregate.gating_vital_sign]}`);\n body.push(`**Date:** ${now.toISOString().split(\"T\")[0]} ${timeStr.replace(/(\\d{2})(\\d{2})/, \"$1:$2\")}`);\n if (pipelineMetrics) {\n body.push(`**${formatPipelineLine(pipelineMetrics)}**`);\n }\n body.push(\"\");\n\n // Vital signs table\n body.push(\"## Vital Signs\");\n body.push(\"\");\n body.push(\"| Vital Sign | Score | Status | Value at Risk |\");\n body.push(\"|---|---|---|---|\");\n for (const vs of aggregate.vital_signs) {\n body.push(`| ${VITAL_SIGN_LABELS[vs.vital_sign]} | ${vs.score} | ${statusEmoji(vs.status)} ${vs.status} | ${formatDollarImpact(vs.dollar_value, vs.dollar_label)} |`);\n }\n body.push(\"\");\n\n // Segments table\n if (segments.length > 0) {\n body.push(\"## Segments\");\n body.push(\"\");\n body.push(\"| Segment | Score | Status | Gating Sign |\");\n body.push(\"|---|---|---|---|\");\n for (const seg of segments) {\n body.push(`| ${seg.segment.name} | ${seg.result.overall_score} | ${statusEmoji(seg.result.overall_status)} ${seg.result.overall_status} | ${VITAL_SIGN_LABELS[seg.result.gating_vital_sign]} |`);\n }\n body.push(\"\");\n }\n\n // Findings\n if (findings.length > 0) {\n body.push(\"## Findings\");\n body.push(\"\");\n for (const finding of findings) {\n const icon = finding.severity === \"critical\" ? \"🚨\" : finding.severity === \"warning\" ? \"⚠️\" : \"ℹ️\";\n body.push(`### ${icon} ${finding.severity.toUpperCase()} — ${finding.segment}`);\n body.push(\"\");\n if (finding.dollar_value != null && finding.dollar_value > 0) {\n body.push(`**${formatDollarValue(finding.dollar_value)}** — ${finding.finding}`);\n } else {\n body.push(finding.finding);\n }\n if (finding.recommended_plays && finding.recommended_plays.length > 0) {\n body.push(\"\");\n body.push(`*Plays: ${finding.recommended_plays.map((p) => p.play_name).join(\", \")}*`);\n }\n body.push(\"\");\n }\n }\n\n // Review transcript\n if (exchanges && exchanges.length > 0) {\n body.push(\"## Review Notes\");\n body.push(\"\");\n for (const ex of exchanges) {\n body.push(`**Q:** ${ex.question}`);\n body.push(\"\");\n body.push(`**A:** ${ex.answer}`);\n body.push(\"\");\n }\n }\n\n const content = frontmatter.join(\"\\n\") + \"\\n\\n\" + body.join(\"\\n\") + \"\\n\";\n writeFileSync(filepath, content);\n\n return filepath;\n}\n\nfunction formatDate(d: Date): string {\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\nfunction formatTime(d: Date): string {\n return `${pad(d.getHours())}${pad(d.getMinutes())}`;\n}\n\nfunction pad(n: number): string {\n return n.toString().padStart(2, \"0\");\n}\n","/**\n * ntrp export — save your latest diagnosis to Obsidian-compatible notes.\n */\n\nimport chalk from \"chalk\";\nimport { initSchema } from \"../db/schema.js\";\nimport { loadSessionAnalysisBundle, formatAnalysisMissingError } from \"../services/session-analysis.js\";\nimport { exportToNotes } from \"../output/notes-export.js\";\nimport { isInsideNtrp, resolveUserPath } from \"../output/path-safety.js\";\nimport { setConfigValue, getConfigValue, deleteConfigValue } from \"../config/store.js\";\nimport { parseArgs, getString } from \"../cli/argparse.js\";\nimport type { FullComputeResult } from \"../vitals/health-score.js\";\nimport type { Context } from \"../cli/context.js\";\n\nexport async function handler(args: string[], _ctx: Context): Promise<void> {\n const { flags } = parseArgs(args);\n const dir = getString(flags, \"dir\");\n const segmentName = getString(flags, \"segment\");\n\n try {\n await initSchema();\n\n const bundle = await loadSessionAnalysisBundle();\n const diagnosis = bundle.diagnosis;\n if (!diagnosis) {\n if (bundle.metrics) {\n console.error(chalk.red(\"\\n Notes export requires a GTM health snapshot.\"));\n console.error(chalk.dim(\" Run \") + chalk.cyan(\"/diagnose\") + chalk.dim(\" for companion vital signs, or \") + chalk.cyan(\"/handoff report\") + chalk.dim(\" for a metrics write-up.\\n\"));\n } else {\n console.error(chalk.red(`\\n ${formatAnalysisMissingError(_ctx)}\\n`));\n }\n process.exit(1);\n }\n\n const prevDir = getConfigValue(\"export-dir\");\n const resolvedDir = dir ? resolveUserPath(dir) : undefined;\n if (resolvedDir && !isInsideNtrp(resolvedDir)) {\n console.warn(chalk.yellow(` Warning: writing export outside ~/.ntrp (${resolvedDir})`));\n }\n if (resolvedDir) setConfigValue(\"export-dir\", resolvedDir);\n\n try {\n let exportSegments = diagnosis.segments;\n let exportFindings = diagnosis.findings;\n let exportHealth = diagnosis.health;\n\n if (segmentName) {\n const lower = segmentName.toLowerCase();\n let match = diagnosis.segments.find((s) => s.segment.name.toLowerCase() === lower);\n if (!match) {\n const subs = diagnosis.segments.filter((s) => s.segment.name.toLowerCase().includes(lower));\n if (subs.length === 1) match = subs[0];\n else if (subs.length > 1) {\n console.error(chalk.yellow(`\\n \"${segmentName}\" matches multiple segments:`));\n for (const s of subs) console.log(chalk.dim(` - ${s.segment.name}`));\n console.log();\n process.exit(1);\n }\n }\n if (!match) {\n console.error(chalk.red(`\\n No segment matching \"${segmentName}\".`));\n if (diagnosis.segments.length > 0) {\n console.log(chalk.dim(\" Available segments:\"));\n for (const s of diagnosis.segments) console.log(chalk.dim(` - ${s.segment.name}`));\n }\n console.log();\n process.exit(1);\n }\n exportHealth = match.result;\n exportSegments = [match];\n exportFindings = diagnosis.findings.filter((f) => f.segment.toLowerCase().includes(lower));\n }\n\n const computeResult: FullComputeResult = {\n aggregate: {\n overall_score: exportHealth.overall_score,\n overall_status: exportHealth.overall_status,\n gating_vital_sign: exportHealth.gating_vital_sign,\n vital_signs: exportHealth.vital_signs,\n total_value_at_risk: exportHealth.total_value_at_risk ?? null,\n },\n segments: exportSegments.map((s) => ({\n segment: { ...s.segment, entity_type: \"opportunities\" as const, filters: [], is_auto_generated: true, created_at: \"\", updated_at: \"\" },\n result: {\n overall_score: s.result.overall_score,\n overall_status: s.result.overall_status,\n gating_vital_sign: s.result.gating_vital_sign,\n vital_signs: s.result.vital_signs,\n total_value_at_risk: null,\n },\n })),\n };\n\n const filepath = exportToNotes({\n computeResult,\n divergences: [],\n findings: exportFindings,\n });\n\n console.log(chalk.green(`\\n Exported to ${filepath}\\n`));\n } finally {\n if (resolvedDir) {\n if (prevDir) setConfigValue(\"export-dir\", prevDir);\n else deleteConfigValue(\"export-dir\");\n }\n }\n } catch (err) {\n console.error(chalk.red(String(err)));\n process.exit(1);\n }\n}\n","/**\n * ntrp backmeup — export diagnosis receipts as a folder of CSVs.\n *\n * Produces a timestamped folder with:\n * cover-sheet.csv — overall health + per-vital-sign scores & dollars\n * findings.csv — AI findings (if any)\n * freshness.csv — entity evidence backing the freshness score\n * flow-rate.csv — entity evidence backing the flow-rate score\n * drop-rate.csv — entity evidence backing the drop-rate score\n * signal-noise.csv — entity evidence backing the signal-to-noise score\n * thread-depth.csv — entity evidence backing the thread-depth score\n */\n\nimport chalk from \"chalk\";\nimport Papa from \"papaparse\";\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { initSchema } from \"../db/schema.js\";\nimport { loadSessionAnalysisBundle, formatAnalysisMissingError } from \"../services/session-analysis.js\";\nimport { getExportsDir } from \"../config/store.js\";\nimport { parseArgs, getString } from \"../cli/argparse.js\";\nimport { VITAL_SIGN_LABELS, formatCurrency } from \"../output/formatters.js\";\nimport { isInsideNtrp, resolveUserPath } from \"../output/path-safety.js\";\nimport type { VitalSign } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\n\n/** Map vital_sign key → evidence CSV filename. */\nconst EVIDENCE_FILENAMES: Record<VitalSign, string> = {\n freshness: \"freshness.csv\",\n flow_rate: \"flow-rate.csv\",\n drop_rate: \"drop-rate.csv\",\n signal_to_noise: \"signal-noise.csv\",\n thread_depth: \"thread-depth.csv\",\n};\n\nconst CSV_FORMULA_RE = /^[=+\\-@\\t\\r]/;\n\nfunction sanitizeCsvValue(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n return CSV_FORMULA_RE.test(value) ? `'${value}` : value;\n}\n\nfunction sanitizeCsvRows(rows: Array<Record<string, unknown>>): Array<Record<string, unknown>> {\n return rows.map((row) => Object.fromEntries(\n Object.entries(row).map(([key, value]) => [key, sanitizeCsvValue(value)]),\n ));\n}\n\nexport async function handler(args: string[], _ctx: Context): Promise<void> {\n const { flags } = parseArgs(args);\n const outputDir = getString(flags, \"output\", \"o\");\n\n try {\n await initSchema();\n\n const bundle = await loadSessionAnalysisBundle();\n const diagnosis = bundle.diagnosis;\n if (!diagnosis) {\n if (bundle.metrics) {\n console.error(chalk.red(\"\\n CSV receipts require a GTM health snapshot (vital sign evidence).\"));\n console.error(chalk.dim(\" Run \") + chalk.cyan(\"/diagnose\") + chalk.dim(\" for companion vital signs, or \") + chalk.cyan(\"/handoff report\") + chalk.dim(\" for metrics.\\n\"));\n } else {\n console.error(chalk.red(`\\n ${formatAnalysisMissingError(_ctx)}\\n`));\n }\n process.exit(1);\n }\n\n const { health, findings } = diagnosis;\n const now = new Date();\n const stamp = now.toISOString().replace(/T/, \"-\").replace(/:/g, \"\").slice(0, 15);\n const folderName = `backmeup-${stamp}`;\n const baseDir = outputDir ? resolveUserPath(outputDir) : getExportsDir();\n if (!isInsideNtrp(baseDir)) {\n console.warn(chalk.yellow(` Warning: writing backup outside ~/.ntrp (${baseDir})`));\n }\n const folder = join(baseDir, folderName);\n mkdirSync(folder, { recursive: true });\n\n const generatedAt = now.toISOString();\n let fileCount = 0;\n\n // ── Cover sheet ───────────────────────────────────────────\n const coverRows = health.vital_signs.map((vs) => ({\n \"Vital Sign\": VITAL_SIGN_LABELS[vs.vital_sign] ?? vs.vital_sign,\n Score: vs.score,\n Status: vs.status,\n \"Dollar Value\": vs.dollar_value != null ? formatCurrency(vs.dollar_value) : \"N/A\",\n \"Dollar Label\": vs.dollar_label ?? \"\",\n \"Overall Score\": health.overall_score,\n \"Overall Status\": health.overall_status,\n \"Total At Risk\": health.total_value_at_risk != null ? formatCurrency(health.total_value_at_risk) : \"N/A\",\n \"Generated At\": generatedAt,\n }));\n writeFileSync(join(folder, \"cover-sheet.csv\"), Papa.unparse(sanitizeCsvRows(coverRows)), \"utf-8\");\n fileCount++;\n\n // ── Findings ──────────────────────────────────────────────\n if (findings.length > 0) {\n const findingsRows = findings.map((f) => ({\n Severity: f.severity,\n Segment: f.segment,\n \"Dollar Value\": f.dollar_value != null ? formatCurrency(f.dollar_value) : \"N/A\",\n Finding: f.finding,\n \"Recommended Plays\": f.recommended_plays\n ? f.recommended_plays.map((p) => p.play_name).join(\"; \")\n : \"\",\n }));\n writeFileSync(join(folder, \"findings.csv\"), Papa.unparse(sanitizeCsvRows(findingsRows)), \"utf-8\");\n fileCount++;\n }\n\n // ── Per-vital evidence CSVs ───────────────────────────────\n for (const vs of health.vital_signs) {\n if (!vs.entity_details || vs.entity_details.length === 0) continue;\n\n const rows = vs.entity_details.map((detail) => ({\n vital_sign: VITAL_SIGN_LABELS[vs.vital_sign] ?? vs.vital_sign,\n ...detail,\n }));\n\n const filename = EVIDENCE_FILENAMES[vs.vital_sign] ?? `${vs.vital_sign}.csv`;\n writeFileSync(join(folder, filename), Papa.unparse(sanitizeCsvRows(rows)), \"utf-8\");\n fileCount++;\n }\n\n // ── Summary ───────────────────────────────────────────────\n console.log(chalk.green(`\\n Exported ${fileCount} file${fileCount === 1 ? \"\" : \"s\"} to:`));\n console.log(chalk.white(` ${folder}\\n`));\n } catch (err) {\n console.error(chalk.red(String(err)));\n process.exit(1);\n }\n}\n","import {\n listActionExecutions,\n listActionProposals,\n listStrategies,\n listStrategySources,\n uuid,\n type LatestDiagnosis,\n} from \"../db/queries.js\";\nimport { loadSessionAnalysisBundle, hasAnyAnalysis } from \"../services/session-analysis.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport { VITAL_SIGN_LABELS, formatCurrency, formatDollarImpact } from \"../output/formatters.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport type { RepositoryExportPackage, RepositoryExportTarget, ExportSection } from \"./types.js\";\n\nexport interface BuildRepositoryExportOptions {\n target: RepositoryExportTarget;\n command?: string;\n source?: string;\n modelOrFixture?: string;\n}\n\nexport async function buildRepositoryExportPackage(options: BuildRepositoryExportOptions): Promise<RepositoryExportPackage> {\n await initSchema();\n const bundle = await loadSessionAnalysisBundle();\n const diagnosis = bundle.diagnosis;\n if (!diagnosis) {\n if (bundle.metrics) {\n throw new NtrpError(\n \"diagnosis_required\",\n \"Publish packages require a GTM health snapshot. Run /diagnose (companion) or /handoff report for metrics-only export.\",\n ExitCode.NoData,\n );\n }\n if (!hasAnyAnalysis(bundle)) {\n throw new NtrpError(\"diagnosis_required\", \"No analysis data found. Run /new, /diagnose, or /metrics first.\", ExitCode.NoData);\n }\n throw new NtrpError(\"diagnosis_required\", \"No diagnosis data found. Run /diagnose first.\", ExitCode.NoData);\n }\n\n const strategies = await listStrategies(\"all\");\n const strategiesWithSources = await Promise.all(\n strategies.map(async (strategy) => ({\n strategy,\n sources: await listStrategySources(strategy.id),\n })),\n );\n\n const proposals = await listActionProposals(100);\n const actions = await Promise.all(\n proposals.map(async (proposal) => ({\n proposal,\n executions: await listActionExecutions(proposal.id),\n })),\n );\n\n const sections = buildSections({\n diagnosis,\n strategiesCount: strategiesWithSources.length,\n actionsCount: actions.length,\n });\n\n return {\n schema_version: \"ntrp.repository_export.v1\",\n export_id: uuid(),\n generated_at: new Date().toISOString(),\n target: options.target,\n summary: {\n overall_score: diagnosis.health.overall_score,\n overall_status: diagnosis.health.overall_status,\n gating_vital_sign: diagnosis.health.gating_vital_sign,\n total_value_at_risk: diagnosis.health.total_value_at_risk ?? null,\n findings_count: diagnosis.findings.length,\n strategies_count: strategiesWithSources.length,\n action_proposals_count: actions.length,\n },\n diagnosis: {\n health: diagnosis.health,\n segments: diagnosis.segments.map((segment) => ({\n segment: segment.segment,\n result: segment.result,\n })),\n findings: diagnosis.findings,\n entity_counts: diagnosis.entityCounts,\n upload_batch_id: diagnosis.uploadBatchId,\n },\n strategies: strategiesWithSources,\n actions,\n sections,\n provenance: {\n command: options.command ?? \"publish\",\n model_or_fixture: options.modelOrFixture,\n source: options.source ?? \"local_duckdb\",\n notes: [\n \"Generated from the latest persisted diagnosis.\",\n \"Repository writes are approval-gated through local action proposals.\",\n ],\n },\n };\n}\n\nfunction buildSections(input: {\n diagnosis: LatestDiagnosis;\n strategiesCount: number;\n actionsCount: number;\n}): ExportSection[] {\n const { diagnosis } = input;\n const health = diagnosis.health;\n\n return [\n {\n id: \"cover\",\n title: \"Cover Summary\",\n summary: `${health.overall_score}/100 ${health.overall_status}, gated by ${health.gating_vital_sign}`,\n markdown: [\n `Overall score: **${health.overall_score}/100** (${health.overall_status})`,\n `Gating vital sign: **${VITAL_SIGN_LABELS[health.gating_vital_sign]}**`,\n `Total value at risk: **${health.total_value_at_risk ? formatCurrency(health.total_value_at_risk) : \"N/A\"}**`,\n `Findings: **${diagnosis.findings.length}**`,\n `Strategies: **${input.strategiesCount}**`,\n `Action proposals: **${input.actionsCount}**`,\n ].join(\"\\n\\n\"),\n },\n {\n id: \"vital-signs\",\n title: \"Vital Signs\",\n summary: `${health.vital_signs.length} vital signs`,\n markdown: health.vital_signs.map((vs) => (\n `- **${VITAL_SIGN_LABELS[vs.vital_sign]}:** ${Math.round(vs.score)}/100 (${vs.status}) — ${formatDollarImpact(vs.dollar_value, vs.dollar_label)}`\n )).join(\"\\n\"),\n children: health.vital_signs.map((vs) => ({\n id: `vital-${vs.vital_sign}`,\n title: `${VITAL_SIGN_LABELS[vs.vital_sign]}: ${Math.round(vs.score)}/100`,\n summary: formatDollarImpact(vs.dollar_value, vs.dollar_label),\n markdown: [\n `Status: **${vs.status}**`,\n `Value: **${formatDollarImpact(vs.dollar_value, vs.dollar_label)}**`,\n `Flagged entities: **${vs.entity_details.length}**`,\n \"\",\n \"Components:\",\n \"```json\",\n JSON.stringify(vs.components, null, 2),\n \"```\",\n \"\",\n \"Top entity details:\",\n \"```json\",\n JSON.stringify(vs.entity_details.slice(0, 25), null, 2),\n \"```\",\n ].join(\"\\n\"),\n metadata: { vital_sign: vs.vital_sign },\n })),\n },\n {\n id: \"findings\",\n title: \"Findings and Deep Analysis\",\n summary: `${diagnosis.findings.length} findings`,\n markdown: diagnosis.findings.length > 0\n ? diagnosis.findings.map((finding) => (\n `- **${finding.severity.toUpperCase()}** ${finding.segment}: ${finding.finding}`\n )).join(\"\\n\")\n : \"_No findings recorded._\",\n children: diagnosis.findings.map((finding, index) => ({\n id: `finding-${index + 1}`,\n title: `${finding.severity.toUpperCase()} — ${finding.segment}`,\n summary: finding.dollar_value ? formatCurrency(finding.dollar_value) : undefined,\n markdown: [\n finding.finding,\n \"\",\n finding.recommended_plays && finding.recommended_plays.length > 0\n ? `Recommended plays: ${finding.recommended_plays.map((play) => `**${play.play_name}**`).join(\", \")}`\n : \"Recommended plays: _None recorded._\",\n \"\",\n \"Scores:\",\n \"```json\",\n JSON.stringify(finding.vital_signs, null, 2),\n \"```\",\n ].join(\"\\n\"),\n })),\n },\n {\n id: \"segments\",\n title: \"Segments\",\n summary: `${diagnosis.segments.length} segments`,\n markdown: diagnosis.segments.length > 0\n ? diagnosis.segments.map((segment) => (\n `- **${segment.segment.name}:** ${Math.round(segment.result.overall_score)}/100 (${segment.result.overall_status}), gated by ${segment.result.gating_vital_sign}`\n )).join(\"\\n\")\n : \"_No segments recorded._\",\n },\n ];\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { VITAL_SIGN_LABELS, formatCurrency, formatDollarImpact } from \"../output/formatters.js\";\nimport type {\n ExportSection,\n RepositoryAdapter,\n RepositoryExportPackage,\n RepositoryExportTarget,\n RepositoryWritePlan,\n RepositoryWriteReceipt,\n StrategyWithSources,\n} from \"./types.js\";\n\nexport const markdownRepositoryAdapter: RepositoryAdapter = {\n kind: \"markdown\",\n describeTarget(target) {\n return target.directory ? `local markdown folder ${resolve(target.directory)}` : \"local markdown folder\";\n },\n planWrite(pkg) {\n const files = renderMarkdownFiles(pkg);\n return {\n target: pkg.target,\n root_path: getRootPath(pkg.target),\n files: files.map((file) => ({\n path: file.relativePath,\n bytes: Buffer.byteLength(file.contents, \"utf-8\"),\n description: file.description,\n })),\n };\n },\n write(pkg) {\n const root = getRootPath(pkg.target);\n const files = renderMarkdownFiles(pkg);\n mkdirSync(root, { recursive: true });\n\n const written: string[] = [];\n for (const file of files) {\n const absolutePath = join(root, file.relativePath);\n mkdirSync(dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, file.contents, \"utf-8\");\n written.push(absolutePath);\n }\n\n return {\n mode: \"repository_export\",\n target: pkg.target,\n root_path: root,\n files_written: written,\n bundle_id: pkg.export_id,\n message: `Wrote ${written.length} repository export files to ${root}.`,\n external_side_effects: false,\n };\n },\n};\n\ninterface RenderedFile {\n relativePath: string;\n contents: string;\n description: string;\n}\n\nexport function renderMarkdownFiles(pkg: RepositoryExportPackage): RenderedFile[] {\n const bundleJson = JSON.stringify(pkg, null, 2) + \"\\n\";\n const vitalDetails = renderVitalEvidence(pkg);\n const findings = renderFindings(pkg);\n const receipts = JSON.stringify({\n export_id: pkg.export_id,\n generated_at: pkg.generated_at,\n actions: pkg.actions,\n }, null, 2) + \"\\n\";\n\n const strategyFiles = pkg.strategies.map((entry) => ({\n relativePath: `strategies/${safeFilename(entry.strategy.slug || entry.strategy.title)}`,\n contents: renderStrategy(entry),\n description: `Strategy: ${entry.strategy.title}`,\n }));\n\n return [\n {\n relativePath: \"index.md\",\n contents: renderIndex(pkg),\n description: \"Repository export index\",\n },\n {\n relativePath: \"evidence/vital-signs.md\",\n contents: vitalDetails,\n description: \"Detailed vital-sign evidence\",\n },\n {\n relativePath: \"evidence/findings.md\",\n contents: findings,\n description: \"Findings and recommended plays\",\n },\n ...strategyFiles,\n {\n relativePath: \"receipts/actions.json\",\n contents: receipts,\n description: \"Action proposal and execution receipts\",\n },\n {\n relativePath: \"bundle.json\",\n contents: bundleJson,\n description: \"Canonical repository export package\",\n },\n ];\n}\n\nfunction renderIndex(pkg: RepositoryExportPackage): string {\n const frontmatter = stringifyYaml({\n export_id: pkg.export_id,\n generated_at: pkg.generated_at,\n target: pkg.target.kind,\n overall_score: pkg.summary.overall_score,\n overall_status: pkg.summary.overall_status,\n gating_vital_sign: pkg.summary.gating_vital_sign,\n total_value_at_risk: pkg.summary.total_value_at_risk,\n tags: [\"ntrp\", \"repository-export\", pkg.summary.gating_vital_sign.replace(/_/g, \"-\")],\n }).trim();\n\n return [\n \"---\",\n frontmatter,\n \"---\",\n \"\",\n \"# NTRP Repository Export\",\n \"\",\n `Generated: ${pkg.generated_at}`,\n \"\",\n `Overall score: **${pkg.summary.overall_score}/100** (${pkg.summary.overall_status})`,\n `Gating vital sign: **${VITAL_SIGN_LABELS[pkg.summary.gating_vital_sign]}**`,\n `Total value at risk: **${pkg.summary.total_value_at_risk ? formatCurrency(pkg.summary.total_value_at_risk) : \"N/A\"}**`,\n \"\",\n \"## Sections\",\n \"\",\n ...pkg.sections.map(renderSection),\n \"## Files\",\n \"\",\n \"- [[evidence/vital-signs|Vital-sign evidence]]\",\n \"- [[evidence/findings|Findings]]\",\n \"- `bundle.json`\",\n \"- `receipts/actions.json`\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction renderSection(section: ExportSection): string {\n const childMarkdown = section.children && section.children.length > 0\n ? [\"\", ...section.children.map(renderNestedSection)].join(\"\\n\")\n : \"\";\n\n return [\n \"<details>\",\n `<summary>${escapeSummary(section.title)}${section.summary ? ` — ${escapeSummary(section.summary)}` : \"\"}</summary>`,\n \"\",\n section.markdown,\n childMarkdown,\n \"\",\n \"</details>\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction renderNestedSection(section: ExportSection): string {\n return [\n \"<details>\",\n `<summary>${escapeSummary(section.title)}${section.summary ? ` — ${escapeSummary(section.summary)}` : \"\"}</summary>`,\n \"\",\n section.markdown,\n \"\",\n \"</details>\",\n ].join(\"\\n\");\n}\n\nfunction renderVitalEvidence(pkg: RepositoryExportPackage): string {\n const lines = [\"# Vital-Sign Evidence\", \"\"];\n for (const vs of pkg.diagnosis.health.vital_signs) {\n lines.push(`## ${VITAL_SIGN_LABELS[vs.vital_sign]}`);\n lines.push(\"\");\n lines.push(`Score: **${Math.round(vs.score)}/100** (${vs.status})`);\n lines.push(`Value: **${formatDollarImpact(vs.dollar_value, vs.dollar_label)}**`);\n lines.push(`Flagged entities: **${vs.entity_details.length}**`);\n lines.push(\"\");\n lines.push(\"<details>\");\n lines.push(\"<summary>Components</summary>\");\n lines.push(\"\");\n lines.push(\"```json\");\n lines.push(JSON.stringify(vs.components, null, 2));\n lines.push(\"```\");\n lines.push(\"\");\n lines.push(\"</details>\");\n lines.push(\"\");\n lines.push(\"<details>\");\n lines.push(\"<summary>Entity details</summary>\");\n lines.push(\"\");\n lines.push(\"```json\");\n lines.push(JSON.stringify(vs.entity_details, null, 2));\n lines.push(\"```\");\n lines.push(\"\");\n lines.push(\"</details>\");\n lines.push(\"\");\n }\n return lines.join(\"\\n\");\n}\n\nfunction renderFindings(pkg: RepositoryExportPackage): string {\n if (pkg.diagnosis.findings.length === 0) return \"# Findings\\n\\n_No findings recorded._\\n\";\n const lines = [\"# Findings\", \"\"];\n for (const finding of pkg.diagnosis.findings) {\n lines.push(`## ${finding.severity.toUpperCase()} — ${finding.segment}`);\n lines.push(\"\");\n lines.push(finding.finding);\n lines.push(\"\");\n if (finding.dollar_value) lines.push(`Dollar value: **${formatCurrency(finding.dollar_value)}**`);\n if (finding.recommended_plays && finding.recommended_plays.length > 0) {\n lines.push(`Recommended plays: ${finding.recommended_plays.map((play) => `**${play.play_name}**`).join(\", \")}`);\n }\n lines.push(\"\");\n }\n return lines.join(\"\\n\");\n}\n\nfunction renderStrategy(entry: StrategyWithSources): string {\n const { strategy, sources } = entry;\n const frontmatter = stringifyYaml({\n id: strategy.id,\n slug: strategy.slug,\n status: strategy.status,\n priority: strategy.priority,\n linked_play_ids: strategy.linked_play_ids,\n source_count: sources.length,\n updated_at: strategy.updated_at,\n }).trim();\n\n return [\n \"---\",\n frontmatter,\n \"---\",\n \"\",\n `# ${strategy.title}`,\n \"\",\n `Goal: ${strategy.goal}`,\n \"\",\n `Hypothesis: ${strategy.hypothesis}`,\n \"\",\n `Target segment: ${strategy.target_segment}`,\n \"\",\n \"## Recommended Actions\",\n \"\",\n strategy.recommended_actions.length > 0 ? strategy.recommended_actions.map((action) => `- ${action}`).join(\"\\n\") : \"_None specified._\",\n \"\",\n \"## Source Metadata\",\n \"\",\n \"```json\",\n JSON.stringify(sources, null, 2),\n \"```\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction getRootPath(target: RepositoryExportTarget): string {\n return resolve(target.directory ?? `ntrp-repository-${new Date().toISOString().slice(0, 10)}`);\n}\n\nfunction safeFilename(value: string): string {\n return (basename(value).toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"strategy\") + \".md\";\n}\n\nfunction escapeSummary(value: string): string {\n return value.replace(/[<>]/g, \"\");\n}\n","import { markdownRepositoryAdapter } from \"./markdown.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport type { RepositoryAdapter, RepositoryAdapterNote, RepositoryTargetKind } from \"./types.js\";\n\nexport function getRepositoryAdapter(kind: RepositoryTargetKind): RepositoryAdapter {\n switch (kind) {\n case \"markdown\":\n return markdownRepositoryAdapter;\n case \"notion\":\n case \"airtable\":\n case \"github\":\n throw new NtrpError(\"repository_target_planned\", `${kind} repository exports are planned but not implemented yet. Use --target markdown for now.`, ExitCode.Usage);\n }\n}\n\nexport function listRepositoryAdapterNotes(): RepositoryAdapterNote[] {\n return [\n {\n kind: \"markdown\",\n status: \"available\",\n best_for: \"Obsidian vaults, local folders, Git-tracked evidence repositories, and smoke tests.\",\n mapping: [\n \"One export folder per run\",\n \"index.md for summary and collapsible sections\",\n \"bundle.json for machine-readable evidence\",\n \"receipts/actions.json for approval lifecycle receipts\",\n ],\n constraints: [\n \"Local filesystem only\",\n \"No remote sync unless the folder is managed by another tool\",\n ],\n },\n {\n kind: \"notion\",\n status: \"planned\",\n best_for: \"Narrative operator workspaces with rich pages, toggle blocks, and database properties.\",\n mapping: [\n \"Export run becomes a Notion page or database row\",\n \"Vital signs and findings become toggle blocks\",\n \"Strategies can become child pages\",\n \"Receipts become page properties or a linked receipts database\",\n ],\n constraints: [\n \"Requires API token and database/page schema\",\n \"Large evidence arrays need pagination or child pages\",\n ],\n },\n {\n kind: \"airtable\",\n status: \"planned\",\n best_for: \"Structured operations tracking across export runs, findings, strategies, and action receipts.\",\n mapping: [\n \"Export Runs table for summary fields\",\n \"Vital Signs table linked by export_id\",\n \"Findings table linked to recommended plays\",\n \"Strategies and Action Receipts tables linked by source IDs\",\n ],\n constraints: [\n \"Not ideal for long narrative reports\",\n \"Nested toggles map to linked records or long text fields\",\n ],\n },\n {\n kind: \"github\",\n status: \"planned\",\n best_for: \"Auditable evidence repositories, pull-request review, and immutable history.\",\n mapping: [\n \"Markdown adapter output committed as a folder\",\n \"bundle.json tracked for machine review\",\n \"Receipts tracked as JSON artifacts\",\n ],\n constraints: [\n \"Requires git remote and auth workflow\",\n \"Write path should use explicit branch/PR approval\",\n ],\n },\n ];\n}\n","import { getActionProposal, insertActionProposal } from \"../db/queries.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport { buildRepositoryExportPackage } from \"../repositories/bundle.js\";\nimport { getRepositoryAdapter, listRepositoryAdapterNotes } from \"../repositories/adapters.js\";\nimport type { ActionProposal } from \"../actions/types.js\";\nimport type {\n RepositoryAdapterNote,\n RepositoryExportPackage,\n RepositoryExportTarget,\n RepositoryTargetKind,\n RepositoryWritePlan,\n RepositoryWriteReceipt,\n} from \"../repositories/types.js\";\n\nexport interface PublishOptions {\n target: RepositoryTargetKind;\n directory?: string;\n source?: string;\n modelOrFixture?: string;\n}\n\nexport interface PublishPreviewResult {\n action: \"preview\";\n package: RepositoryExportPackage;\n plan: RepositoryWritePlan;\n}\n\nexport interface PublishProposalResult {\n action: \"propose\";\n proposal: ActionProposal;\n plan: RepositoryWritePlan;\n}\n\nexport async function previewRepositoryExport(options: PublishOptions): Promise<PublishPreviewResult> {\n const pkg = await buildPackage(options, \"publish preview\");\n const adapter = getRepositoryAdapter(pkg.target.kind);\n return { action: \"preview\", package: pkg, plan: adapter.planWrite(pkg) };\n}\n\nexport async function proposeRepositoryExport(options: PublishOptions): Promise<PublishProposalResult> {\n await initSchema();\n const pkg = await buildPackage(options, \"publish propose\");\n const adapter = getRepositoryAdapter(pkg.target.kind);\n const plan = adapter.planWrite(pkg);\n\n const id = await insertActionProposal({\n handle_title: options.source === \"smoke_protocol\" ? \"Monkey Pelican Export\" : \"NTRP Repository Export\",\n kind: \"repository_export\",\n title: options.source === \"smoke_protocol\" ? \"Monkey Pelican Export\" : `Publish NTRP evidence bundle to ${pkg.target.kind}`,\n summary: `Export diagnosis, findings, strategies, evidence, and action receipts to ${adapter.describeTarget(pkg.target)}.`,\n permission_class: \"execute\",\n status: \"pending_approval\",\n target: {\n connector_id: `${pkg.target.kind}-repository`,\n connector_type: pkg.target.kind,\n operation: \"write_repository_export\",\n },\n payload: {\n repository_export: pkg,\n write_plan: plan,\n },\n dry_run: {\n mode: \"dry_run\",\n summary: `Would write ${plan.files.length} file${plan.files.length === 1 ? \"\" : \"s\"} to ${plan.root_path}.`,\n would_execute: false,\n expected_mutations: plan.files.map((file) => `${file.path} (${file.description})`),\n risk_notes: [\n \"Requires explicit local approval before writing files.\",\n \"Markdown target writes only to the local filesystem.\",\n \"Notion and Airtable targets are planned adapter mappings only in this slice.\",\n ],\n },\n source: options.source ?? \"publish\",\n });\n\n const proposal = await getActionProposal(id);\n if (!proposal) {\n throw new NtrpError(\"publish_proposal_missing\", `Publish proposal was not found after insert: ${id}`, ExitCode.RuntimeError);\n }\n return { action: \"propose\", proposal, plan };\n}\n\nexport function listPublishTargets(): RepositoryAdapterNote[] {\n return listRepositoryAdapterNotes();\n}\n\nexport function executeRepositoryExportProposal(proposal: ActionProposal): RepositoryWriteReceipt | null {\n if (proposal.kind !== \"repository_export\") return null;\n const payload = proposal.payload as Record<string, unknown>;\n const pkg = payload.repository_export as RepositoryExportPackage | undefined;\n if (!pkg || pkg.schema_version !== \"ntrp.repository_export.v1\") {\n throw new NtrpError(\"repository_export_payload_invalid\", `Action ${proposal.id} is missing a repository export package.`, ExitCode.RuntimeError);\n }\n const adapter = getRepositoryAdapter(pkg.target.kind);\n return adapter.write(pkg);\n}\n\nasync function buildPackage(options: PublishOptions, command: string): Promise<RepositoryExportPackage> {\n const target: RepositoryExportTarget = {\n kind: options.target,\n directory: options.directory,\n };\n return buildRepositoryExportPackage({\n target,\n command,\n source: options.source ?? \"publish\",\n modelOrFixture: options.modelOrFixture,\n });\n}\n","/**\n * ntrp publish — preview and propose repository exports.\n */\n\nimport chalk from \"chalk\";\nimport { parseArgs, getString } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { emitError, emitResult, isStructuredOutput } from \"../io/emit.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport {\n listPublishTargets,\n previewRepositoryExport,\n proposeRepositoryExport,\n type PublishPreviewResult,\n type PublishProposalResult,\n} from \"../services/publish.js\";\nimport type { RepositoryAdapterNote, RepositoryTargetKind, RepositoryWritePlan } from \"../repositories/types.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { positional, flags } = parseArgs(args);\n stripProcessArgvFlag(\"dir\");\n const sub = positional[0] ?? \"preview\";\n\n try {\n const result = await runPublish(sub, flags);\n if (isStructuredOutput(ctx.execution)) {\n emitResult(\"publish\", result);\n return;\n }\n renderPublishResult(result);\n } catch (err) {\n if (isStructuredOutput(ctx.execution)) emitError(\"publish\", err);\n console.error(chalk.red(` ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nasync function runPublish(sub: string, flags: Map<string, string | boolean>): Promise<PublishResult> {\n switch (sub) {\n case \"preview\":\n return previewRepositoryExport({\n target: parseTarget(getString(flags, \"target\") ?? \"markdown\"),\n directory: getString(flags, \"dir\", \"output\", \"o\"),\n });\n case \"propose\":\n return proposeRepositoryExport({\n target: parseTarget(getString(flags, \"target\") ?? \"markdown\"),\n directory: getString(flags, \"dir\", \"output\", \"o\"),\n });\n case \"targets\":\n return { action: \"targets\", targets: listPublishTargets() };\n default:\n throw new NtrpError(\"unknown_publish_subcommand\", `Unknown publish subcommand: ${sub}`, ExitCode.Usage);\n }\n}\n\ntype PublishResult =\n | PublishPreviewResult\n | PublishProposalResult\n | { action: \"targets\"; targets: RepositoryAdapterNote[] };\n\nfunction renderPublishResult(result: PublishResult): void {\n switch (result.action) {\n case \"preview\":\n console.log(chalk.bold(\"\\n Repository Export Preview\\n\"));\n printPlan(result.plan);\n printSummary(result.package.summary);\n console.log();\n return;\n case \"propose\":\n console.log(chalk.bold(\"\\n Repository Export Proposal Created\\n\"));\n printPlan(result.plan);\n console.log(\" Repository export prepared.\");\n console.log(chalk.dim(` Reference: ${result.proposal.handle}`));\n console.log(chalk.dim(\" Next: /actions continue\"));\n console.log();\n return;\n case \"targets\":\n console.log(chalk.bold(\"\\n Publish Targets\\n\"));\n for (const target of result.targets) {\n const status = target.status === \"available\" ? chalk.green(target.status) : chalk.dim(target.status);\n console.log(` ${status} ${chalk.bold(target.kind)}`);\n console.log(chalk.dim(` Best for: ${target.best_for}`));\n console.log(chalk.dim(` Mapping: ${target.mapping.join(\"; \")}`));\n console.log(chalk.dim(` Constraints: ${target.constraints.join(\"; \")}`));\n }\n console.log();\n return;\n }\n}\n\nfunction printPlan(plan: RepositoryWritePlan): void {\n console.log(` Target: ${chalk.bold(plan.target.kind)} ${chalk.dim(plan.root_path)}`);\n console.log(` Files: ${plan.files.length}`);\n for (const file of plan.files) {\n console.log(chalk.dim(` - ${file.path} (${file.bytes} bytes) — ${file.description}`));\n }\n console.log();\n}\n\nfunction printSummary(summary: PublishPreviewResult[\"package\"][\"summary\"]): void {\n console.log(` Score: ${summary.overall_score}/100 (${summary.overall_status})`);\n console.log(` Gating: ${summary.gating_vital_sign}`);\n console.log(` Findings: ${summary.findings_count}`);\n console.log(` Strategies: ${summary.strategies_count}`);\n console.log(` Actions: ${summary.action_proposals_count}`);\n}\n\nfunction parseTarget(value: string): RepositoryTargetKind {\n if (value === \"markdown\" || value === \"notion\" || value === \"airtable\" || value === \"github\") return value;\n throw new NtrpError(\"publish_target_invalid\", `Unsupported publish target: ${value}`, ExitCode.Usage);\n}\n\nfunction stripProcessArgvFlag(flagName: string): void {\n const next: string[] = [];\n for (let i = 0; i < process.argv.length; i++) {\n const arg = process.argv[i]!;\n if (arg === `--${flagName}`) {\n i++;\n continue;\n }\n if (arg.startsWith(`--${flagName}=`)) {\n continue;\n }\n next.push(arg);\n }\n process.argv = next;\n}\n","/**\n * ntrp handoff — turn the current analysis into an output that gets you to\n * action. This is the closing beat of the point-in-time loop.\n *\n * /handoff interactive menu of outputs\n * /handoff report write a markdown report\n * /handoff notes export to your Obsidian/notes directory\n * /handoff csv export diagnosis receipts as CSVs\n * /handoff publish build a repository export package\n * /handoff prompt [target] generate a prompt for another agent\n * targets: deck | asana | clay | plan\n *\n * Producing any output records a deliverable and marks the session \"delivered\",\n * so the welcome flow stops nudging you to finish it.\n */\n\nimport chalk from \"chalk\";\nimport { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Context } from \"../cli/context.js\";\nimport { hydrateAnalysisFromPersistedState, saveSessionState, type Deliverable } from \"../cli/context.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport {\n loadSessionAnalysisBundle,\n hasAnyAnalysis,\n formatAnalysisMissingError,\n} from \"../services/session-analysis.js\";\nimport { getExportsDir } from \"../config/store.js\";\nimport { createPromptSession } from \"../cli/prompts.js\";\nimport { paint, bold } from \"../ui/theme.js\";\n\nconst PROMPT_TARGETS = [\"deck\", \"asana\", \"clay\", \"plan\"] as const;\ntype PromptTarget = (typeof PROMPT_TARGETS)[number];\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n const sub = args[0];\n\n if (!sub) {\n if (ctx.oneShot || !ctx.rl) {\n console.error(chalk.red(\" Usage: /handoff <report|notes|csv|publish|prompt> [target]\"));\n return;\n }\n return interactiveMenu(ctx);\n }\n\n switch (sub) {\n case \"report\":\n return runReport(args.slice(1), ctx);\n case \"notes\":\n return runNotes(args.slice(1), ctx);\n case \"csv\":\n case \"backmeup\":\n return runCsv(args.slice(1), ctx);\n case \"publish\":\n return runPublish(args.slice(1), ctx);\n case \"prompt\":\n return runPrompt((args[1] as PromptTarget) ?? \"plan\", ctx);\n default:\n console.error(chalk.red(` Unknown handoff: ${sub}`));\n console.error(chalk.dim(\" Try: report, notes, csv, publish, prompt\"));\n return;\n }\n}\n\n// ============================================================\n// Interactive menu\n// ============================================================\n\nasync function interactiveMenu(ctx: Context): Promise<string | void> {\n const prompts = createPromptSession(ctx.rl, ctx);\n try {\n console.log();\n console.log(\" \" + bold(\"Hand off this analysis\"));\n const choice = await prompts.choose(\"What do you want to produce?\", [\n { value: \"prompt\", label: \"A prompt for another agent\", description: \"Build a deck, Asana project, Clay table, or action plan elsewhere\" },\n { value: \"report\", label: \"A markdown report\", description: ctx.analysis.completed.length > 1 ? \"Combined health + metrics write-up\" : \"Shareable write-up of the analysis\" },\n { value: \"notes\", label: \"Notes export\", description: \"Drop into Obsidian / your notes vault\" },\n { value: \"csv\", label: \"CSV receipts\", description: \"Evidence files for a deck or email\" },\n { value: \"publish\", label: \"Repository export\", description: \"Full package for a connected repo\" },\n ]);\n\n if (choice === \"prompt\") {\n const target = await prompts.choose<PromptTarget>(\"What should the other agent build?\", [\n { value: \"plan\", label: \"Action plan\", description: \"Prioritized plan of plays to run\" },\n { value: \"deck\", label: \"Review deck\", description: \"Executive slide outline\" },\n { value: \"asana\", label: \"Asana project\", description: \"Tasks + sections to create\" },\n { value: \"clay\", label: \"Clay table\", description: \"Enrichment / outreach table spec\" },\n ]);\n return runPrompt(target, ctx);\n }\n if (choice === \"report\") return runReport([], ctx);\n if (choice === \"notes\") return runNotes([], ctx);\n if (choice === \"csv\") return runCsv([], ctx);\n return runPublish([], ctx);\n } finally {\n prompts.close();\n }\n}\n\n// ============================================================\n// Delegating outputs\n// ============================================================\n\nasync function runReport(args: string[], ctx: Context): Promise<string | void> {\n const out = join(getExportsDir(), `report-${stamp()}.md`);\n const { handler: report } = await import(\"./report.js\");\n await report([\"--format\", \"md\", \"--output\", out, ...args], ctx);\n recordDeliverable(ctx, { kind: \"report\", at: new Date().toISOString(), path: out });\n return \"Report delivered\";\n}\n\nasync function runNotes(args: string[], ctx: Context): Promise<string | void> {\n const { handler: exportNotes } = await import(\"./export.js\");\n await exportNotes(args, ctx);\n recordDeliverable(ctx, { kind: \"notes\", at: new Date().toISOString() });\n return \"Notes exported\";\n}\n\nasync function runCsv(args: string[], ctx: Context): Promise<string | void> {\n const { handler: backmeup } = await import(\"./backmeup.js\");\n await backmeup(args, ctx);\n recordDeliverable(ctx, { kind: \"csv\", at: new Date().toISOString() });\n return \"CSV receipts exported\";\n}\n\nasync function runPublish(args: string[], ctx: Context): Promise<string | void> {\n const { handler: publish } = await import(\"./publish.js\");\n const result = await publish(args.length > 0 ? args : [\"preview\"], ctx);\n recordDeliverable(ctx, { kind: \"publish\", at: new Date().toISOString() });\n return typeof result === \"string\" ? result : \"Publish package built\";\n}\n\n// ============================================================\n// Agent-prompt generator (the novel piece)\n// ============================================================\n\nasync function runPrompt(target: PromptTarget, ctx: Context): Promise<string | void> {\n if (!PROMPT_TARGETS.includes(target)) {\n console.error(chalk.red(` Unknown prompt target: ${target}`));\n console.error(chalk.dim(` Targets: ${PROMPT_TARGETS.join(\", \")}`));\n return;\n }\n\n await initSchema();\n await hydrateAnalysisFromPersistedState(ctx);\n const bundle = await loadSessionAnalysisBundle();\n if (!hasAnyAnalysis(bundle)) {\n console.error(chalk.red(`\\n ${formatAnalysisMissingError(ctx)}\\n`));\n return;\n }\n\n const { buildDeliverableDraft } = await import(\"../conversation/handoff-draft.js\");\n const draft = await buildDeliverableDraft(ctx, target);\n if (!draft) {\n console.error(chalk.red(`\\n ${formatAnalysisMissingError(ctx)}\\n`));\n return;\n }\n const prompt = draft.markdown;\n\n const out = join(getExportsDir(), `handoff-${target}-${stamp()}.md`);\n writeFileSync(out, prompt, \"utf-8\");\n\n recordDeliverable(ctx, { kind: `prompt:${target}`, at: new Date().toISOString(), path: out });\n\n console.log();\n console.log(\" \" + paint(\"accent\", `Agent prompt ready (${target})`));\n console.log(\" \" + chalk.dim(out));\n console.log(\" \" + chalk.dim(\"\\u2500\".repeat(60)));\n console.log(prompt.split(\"\\n\").map((l) => \" \" + chalk.dim(l)).join(\"\\n\"));\n console.log(\" \" + chalk.dim(\"\\u2500\".repeat(60)));\n console.log(\" \" + chalk.dim(\"Paste this into another agent (Cursor, Claude, etc.) to build the deliverable.\"));\n console.log();\n\n return `${target} prompt delivered`;\n}\n\n// ============================================================\n// Helpers\n// ============================================================\n\nfunction recordDeliverable(ctx: Context, d: Deliverable): void {\n ctx.deliverables.push(d);\n ctx.stage = \"delivered\";\n saveSessionState(ctx);\n}\n\nfunction stamp(): string {\n return new Date().toISOString().replace(/T/, \"-\").replace(/:/g, \"\").slice(0, 15);\n}\n","import {\n getActionProposal,\n insertActionExecution,\n insertActionProposal,\n listActionExecutions,\n listActionProposals,\n updateActionProposalStatus,\n} from \"../db/queries.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport type { ActionExecution, ActionProposal } from \"../actions/types.js\";\nimport { executeRepositoryExportProposal } from \"./publish.js\";\n\nexport interface CreateManualTestProposalInput {\n title?: string;\n summary?: string;\n connectorType?: string;\n operation?: string;\n}\n\nexport async function createManualTestProposal(input: CreateManualTestProposalInput = {}): Promise<ActionProposal> {\n await initSchema();\n\n const title = input.title ?? \"Manual test action\";\n const summary = input.summary ?? \"Validate the approval and execution flow without mutating an external tool.\";\n const connectorType = input.connectorType ?? \"local\";\n const operation = input.operation ?? \"noop\";\n\n const id = await insertActionProposal({\n kind: \"manual_test\",\n title,\n summary,\n permission_class: \"execute\",\n status: \"pending_approval\",\n target: {\n connector_id: \"local-test\",\n connector_type: connectorType,\n operation,\n },\n payload: {\n intent: \"exercise_action_lifecycle\",\n external_side_effects: false,\n },\n dry_run: {\n mode: \"dry_run\",\n summary: \"Would record a local no-op execution receipt. No external system would be changed.\",\n would_execute: false,\n expected_mutations: [\"Insert one local action_executions receipt\"],\n risk_notes: [\"No connector credentials are used.\", \"No GTM records are created, updated, or deleted.\"],\n },\n source: \"manual\",\n });\n\n return requireActionProposal(id);\n}\n\nexport async function getActionProposals(limit?: number): Promise<ActionProposal[]> {\n await initSchema();\n return listActionProposals(limit);\n}\n\nexport async function getActionProposalDetail(id: string): Promise<{ proposal: ActionProposal; executions: ActionExecution[] }> {\n await initSchema();\n const proposal = await requireActionProposal(id);\n const executions = await listActionExecutions(proposal.id);\n return { proposal, executions };\n}\n\nexport async function continueLatestActionProposal(): Promise<ContinueActionResult> {\n await initSchema();\n const proposals = await listActionProposals(50);\n const pending = proposals.find((proposal) => proposal.status === \"pending_approval\");\n if (pending) {\n const proposal = await approveActionProposal(pending.id, \"continue\");\n return { action: \"continue_approved\", proposal };\n }\n\n const approved = proposals.find((proposal) => proposal.status === \"approved\");\n if (approved) {\n return { action: \"continue_executed\", ...(await executeApprovedAction(approved.id)) };\n }\n\n return { action: \"continue_idle\", proposals };\n}\n\nexport async function approveActionProposal(id: string, approvedBy = \"local\"): Promise<ActionProposal> {\n await initSchema();\n const proposal = await requireActionProposal(id);\n if (proposal.status === \"executed\") {\n throw new NtrpError(\"action_already_executed\", `Action proposal ${id} has already been executed.`, ExitCode.Usage);\n }\n if (proposal.status === \"rejected\") {\n throw new NtrpError(\"action_rejected\", `Action proposal ${id} was rejected and cannot be approved.`, ExitCode.Usage);\n }\n await updateActionProposalStatus(proposal.id, \"approved\", approvedBy);\n return requireActionProposal(proposal.id);\n}\n\nexport async function rejectActionProposal(id: string): Promise<ActionProposal> {\n await initSchema();\n const proposal = await requireActionProposal(id);\n if (proposal.status === \"executed\") {\n throw new NtrpError(\"action_already_executed\", `Action proposal ${id} has already been executed.`, ExitCode.Usage);\n }\n await updateActionProposalStatus(proposal.id, \"rejected\");\n return requireActionProposal(proposal.id);\n}\n\nexport async function executeApprovedAction(id: string): Promise<{ proposal: ActionProposal; execution: ActionExecution }> {\n await initSchema();\n const proposal = await requireActionProposal(id);\n if (proposal.permission_class === \"execute\" && proposal.status !== \"approved\") {\n throw new NtrpError(\n \"action_approval_required\",\n `Action proposal ${id} requires local approval before execution. Run /actions approve ${id}.`,\n ExitCode.Usage,\n );\n }\n if (proposal.status === \"executed\") {\n throw new NtrpError(\"action_already_executed\", `Action proposal ${id} has already been executed.`, ExitCode.Usage);\n }\n if (proposal.status === \"rejected\") {\n throw new NtrpError(\"action_rejected\", `Action proposal ${id} was rejected and cannot be executed.`, ExitCode.Usage);\n }\n\n const repositoryReceipt = executeRepositoryExportProposal(proposal);\n const receipt: Record<string, unknown> = repositoryReceipt ? { ...repositoryReceipt } : {\n mode: \"local_noop\",\n connector_type: proposal.target.connector_type,\n operation: proposal.target.operation,\n message: \"Recorded local execution receipt for manual test action.\",\n external_side_effects: false,\n };\n\n const executionId = await insertActionExecution({\n proposal_id: proposal.id,\n status: \"succeeded\",\n receipt,\n });\n await updateActionProposalStatus(proposal.id, \"executed\");\n\n const [executedProposal, executions] = await Promise.all([\n requireActionProposal(proposal.id),\n listActionExecutions(proposal.id),\n ]);\n const execution = executions.find((row) => row.id === executionId);\n if (!execution) {\n throw new NtrpError(\"execution_receipt_missing\", `Execution receipt ${executionId} was not found.`, ExitCode.RuntimeError);\n }\n return { proposal: executedProposal, execution };\n}\n\nasync function requireActionProposal(id: string): Promise<ActionProposal> {\n const proposal = await getActionProposal(id);\n if (!proposal) {\n throw new NtrpError(\"action_not_found\", `Action proposal not found: ${id}`, ExitCode.Usage);\n }\n return proposal;\n}\n\nexport type ContinueActionResult =\n | { action: \"continue_approved\"; proposal: ActionProposal }\n | { action: \"continue_executed\"; proposal: ActionProposal; execution: ActionExecution }\n | { action: \"continue_idle\"; proposals: ActionProposal[] };\n","/**\n * ntrp actions — manage local action proposals and approvals.\n */\n\nimport chalk from \"chalk\";\nimport { parseArgs, getNumber, getString } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { emitError, emitResult, isStructuredOutput } from \"../io/emit.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport {\n approveActionProposal,\n continueLatestActionProposal,\n createManualTestProposal,\n executeApprovedAction,\n getActionProposalDetail,\n getActionProposals,\n rejectActionProposal,\n} from \"../services/actions.js\";\nimport type { ActionProposal } from \"../actions/types.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { positional, flags } = parseArgs(args);\n const sub = positional[0] ?? \"list\";\n\n try {\n const result = await runActions(sub, positional, flags);\n if (isStructuredOutput(ctx.execution)) {\n emitResult(\"actions\", result);\n return;\n }\n renderActionsResult(result);\n } catch (err) {\n if (isStructuredOutput(ctx.execution)) {\n emitError(\"actions\", err);\n }\n console.error(chalk.red(` ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nasync function runActions(sub: string, positional: string[], flags: Map<string, string | boolean>): Promise<ActionsResult> {\n switch (sub) {\n case \"test\": {\n const proposal = await createManualTestProposal({\n title: getString(flags, \"title\"),\n summary: getString(flags, \"summary\"),\n connectorType: getString(flags, \"connector\", \"connector-type\"),\n operation: getString(flags, \"operation\"),\n });\n return { action: \"test\", proposal };\n }\n case \"list\": {\n const limit = getNumber(flags, \"limit\") ?? 20;\n const proposals = await getActionProposals(limit);\n return { action: \"list\", proposals };\n }\n case \"show\": {\n const id = requireId(positional);\n return { action: \"show\", ...(await getActionProposalDetail(id)) };\n }\n case \"approve\": {\n const id = requireId(positional);\n const proposal = await approveActionProposal(id, getString(flags, \"by\") ?? \"local\");\n return { action: \"approve\", proposal };\n }\n case \"reject\": {\n const id = requireId(positional);\n const proposal = await rejectActionProposal(id);\n return { action: \"reject\", proposal };\n }\n case \"execute\": {\n const id = requireId(positional);\n return { action: \"execute\", ...(await executeApprovedAction(id)) };\n }\n case \"continue\":\n return continueLatestActionProposal();\n default:\n throw new NtrpError(\"unknown_actions_subcommand\", `Unknown actions subcommand: ${sub}`, ExitCode.Usage);\n }\n}\n\nfunction requireId(positional: string[]): string {\n const id = positional[1];\n if (!id) {\n throw new NtrpError(\"action_id_required\", \"An action proposal id is required.\", ExitCode.Usage);\n }\n return id;\n}\n\ntype ActionsResult =\n | { action: \"test\"; proposal: ActionProposal }\n | { action: \"list\"; proposals: ActionProposal[] }\n | Awaited<ReturnType<typeof getActionProposalDetail>> & { action: \"show\" }\n | { action: \"approve\"; proposal: ActionProposal }\n | { action: \"reject\"; proposal: ActionProposal }\n | Awaited<ReturnType<typeof executeApprovedAction>> & { action: \"execute\" }\n | Awaited<ReturnType<typeof continueLatestActionProposal>>;\n\nfunction renderActionsResult(result: ActionsResult): void {\n switch (result.action) {\n case \"test\":\n console.log(chalk.bold(\"\\n Action Proposal Created\\n\"));\n printProposal(result.proposal);\n console.log(chalk.dim(` Next: /actions approve ${result.proposal.handle}`));\n console.log();\n return;\n case \"list\":\n printProposalList(result.proposals);\n return;\n case \"show\":\n console.log(chalk.bold(\"\\n Action Proposal\\n\"));\n printProposal(result.proposal);\n if (result.executions.length > 0) {\n console.log(chalk.hex(\"#14b8a6\")(\" Executions\"));\n for (const execution of result.executions) {\n console.log(` ${execution.status} ${chalk.dim(execution.executed_at)} ${execution.id}`);\n }\n console.log();\n }\n return;\n case \"approve\":\n console.log(chalk.green(\"\\n Approved\\n\"));\n printProposal(result.proposal);\n console.log(chalk.dim(` Next: /actions execute ${result.proposal.handle}`));\n console.log();\n return;\n case \"reject\":\n console.log(chalk.yellow(\"\\n Rejected\\n\"));\n printProposal(result.proposal);\n return;\n case \"execute\":\n console.log(chalk.green(\"\\n Executed\\n\"));\n printProposal(result.proposal);\n printExecutionReceipt(result.execution.receipt);\n console.log(chalk.dim(` id: ${result.execution.id}`));\n console.log();\n return;\n case \"continue_approved\":\n console.log(chalk.green(\"\\n Approved\\n\"));\n console.log(` ${chalk.bold(result.proposal.title)}`);\n console.log(chalk.dim(` ${result.proposal.handle}`));\n console.log();\n console.log(chalk.dim(\" Next: /actions continue\"));\n console.log();\n return;\n case \"continue_executed\":\n console.log(chalk.green(\"\\n Export Complete\\n\"));\n console.log(` ${chalk.bold(result.proposal.title)}`);\n console.log();\n printExecutionReceipt(result.execution.receipt);\n console.log();\n return;\n case \"continue_idle\":\n console.log(chalk.bold(\"\\n Nothing To Continue\\n\"));\n console.log(chalk.dim(\" No pending or approved action proposals are waiting.\"));\n if (result.proposals.length > 0) {\n console.log(chalk.dim(\" Recent actions:\"));\n for (const proposal of result.proposals.slice(0, 5)) {\n console.log(chalk.dim(` - ${proposal.status} ${proposal.handle}`));\n }\n }\n console.log(chalk.dim(\" Try /publish propose --target markdown --dir <path> or /actions list.\"));\n console.log();\n return;\n }\n}\n\nfunction printProposalList(proposals: ActionProposal[]): void {\n console.log(chalk.bold(\"\\n Action Proposals\\n\"));\n if (proposals.length === 0) {\n console.log(chalk.dim(\" No action proposals yet. Run /actions test to create a local dry-run proposal.\\n\"));\n return;\n }\n for (const proposal of proposals) {\n console.log(` ${statusBadge(proposal.status)} ${chalk.bold(proposal.handle)} ${chalk.dim(proposal.title)}`);\n console.log(chalk.dim(` ${proposal.kind} · ${proposal.permission_class} · ${proposal.target.connector_type}/${proposal.target.operation}`));\n }\n console.log();\n}\n\nfunction printProposal(proposal: ActionProposal): void {\n console.log(` ${statusBadge(proposal.status)} ${chalk.bold(proposal.handle)}`);\n console.log(chalk.dim(` title: ${proposal.title}`));\n console.log(chalk.dim(` id: ${proposal.id}`));\n console.log(chalk.dim(` kind: ${proposal.kind} · permission: ${proposal.permission_class}`));\n console.log();\n console.log(` ${proposal.summary}`);\n console.log();\n console.log(chalk.hex(\"#14b8a6\")(\" Dry Run\"));\n console.log(` ${proposal.dry_run.summary}`);\n for (const mutation of proposal.dry_run.expected_mutations) {\n console.log(chalk.dim(` - ${mutation}`));\n }\n if (proposal.dry_run.risk_notes.length > 0) {\n console.log(chalk.hex(\"#14b8a6\")(\" Risk Notes\"));\n for (const note of proposal.dry_run.risk_notes) {\n console.log(chalk.dim(` - ${note}`));\n }\n }\n console.log();\n}\n\nfunction printExecutionReceipt(receipt: Record<string, unknown>): void {\n console.log(chalk.hex(\"#14b8a6\")(\" Receipt\"));\n console.log(` ${receipt.message ?? \"Execution receipt recorded.\"}`);\n const files = Array.isArray(receipt.files_written) ? receipt.files_written.filter((file): file is string => typeof file === \"string\") : [];\n const indexFile = files.find((file) => file.endsWith(\"/index.md\")) ?? files[0];\n if (indexFile) {\n console.log();\n console.log(chalk.hex(\"#14b8a6\")(\" Exported Repository Bundle\"));\n console.log(` ${indexFile}`);\n }\n}\n\nfunction statusBadge(status: ActionProposal[\"status\"]): string {\n switch (status) {\n case \"pending_approval\": return chalk.yellow(\"pending\");\n case \"approved\": return chalk.green(\"approved\");\n case \"executed\": return chalk.blue(\"executed\");\n case \"rejected\": return chalk.red(\"rejected\");\n }\n}\n","/**\n * ntrp segment — browse, inspect, and manage data segments.\n */\n\nimport chalk from \"chalk\";\nimport { initSchema } from \"../db/schema.js\";\nimport { loadLatestDiagnosis, insertSegment, findSegmentsByName, deleteSegment } from \"../db/queries.js\";\nimport { printSegmentList, printSegmentDetail, printSegmentComparison } from \"../output/terminal.js\";\nimport { parseArgs, getString } from \"../cli/argparse.js\";\nimport type { SegmentResult, SegmentFilter } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { isStructuredOutput, emitResult, emitError } from \"../io/emit.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport { serializeSegment } from \"../services/serialize.js\";\n\n// ============================================================\n// Name resolution\n// ============================================================\n\ntype ResolveResult =\n | { type: \"exact\"; segment: SegmentResult }\n | { type: \"ambiguous\"; matches: SegmentResult[] }\n | { type: \"none\" };\n\nfunction resolveSegmentByName(query: string, segments: SegmentResult[]): ResolveResult {\n const lower = query.toLowerCase();\n const exact = segments.find((s) => s.segment.name.toLowerCase() === lower);\n if (exact) return { type: \"exact\", segment: exact };\n\n const matches = segments.filter((s) => s.segment.name.toLowerCase().includes(lower));\n if (matches.length === 1) return { type: \"exact\", segment: matches[0]! };\n if (matches.length > 1) return { type: \"ambiguous\", matches };\n return { type: \"none\" };\n}\n\nfunction handleNoMatch(query: string, segments: SegmentResult[]): void {\n console.error(chalk.red(` No segment matching \"${query}\".`));\n console.log();\n console.log(chalk.dim(\" Available segments:\"));\n for (const seg of segments) console.log(chalk.dim(` - ${seg.segment.name}`));\n console.log();\n}\n\nfunction handleAmbiguous(query: string, matches: SegmentResult[]): void {\n console.error(chalk.yellow(` \"${query}\" matches multiple segments:`));\n console.log();\n for (const m of matches) console.log(chalk.dim(` - ${m.segment.name}`));\n console.log();\n}\n\n// ============================================================\n// Filter parsing\n// ============================================================\n\nconst OPERATOR_ALIASES: Record<string, SegmentFilter[\"operator\"]> = {\n eq: \"equals\",\n equals: \"equals\",\n neq: \"not_equals\",\n not_equals: \"not_equals\",\n gt: \"greater_than\",\n greater_than: \"greater_than\",\n lt: \"less_than\",\n less_than: \"less_than\",\n contains: \"contains\",\n in: \"in\",\n};\n\nfunction parseFilter(expr: string): SegmentFilter {\n const parts = expr.split(\":\");\n if (parts.length < 3) {\n throw new Error(`Invalid filter \"${expr}\". Use field:operator:value (e.g., amount:gt:100000)`);\n }\n const field = parts[0]!;\n const opRaw = parts[1]!;\n const valueRaw = parts.slice(2).join(\":\");\n\n const operator = OPERATOR_ALIASES[opRaw];\n if (!operator) {\n throw new Error(`Unknown operator \"${opRaw}\". Valid: eq, neq, gt, lt, contains, in`);\n }\n\n let value: string | number | string[];\n if (operator === \"in\") {\n value = valueRaw.split(\",\").map((v) => v.trim());\n } else if (operator === \"greater_than\" || operator === \"less_than\") {\n const num = Number(valueRaw);\n if (isNaN(num)) {\n throw new Error(`Operator \"${opRaw}\" requires a numeric value, got \"${valueRaw}\"`);\n }\n value = num;\n } else {\n value = valueRaw;\n }\n\n return { field, operator, value };\n}\n\n// ============================================================\n// Main handler\n// ============================================================\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { positional, flags } = parseArgs(args);\n const sub = positional[0] ?? \"list\";\n\n if (isStructuredOutput(ctx.execution)) {\n try {\n emitResult(\"segment\", await runSegmentStructured(sub, positional, flags));\n return;\n } catch (err) {\n emitError(\"segment\", err);\n }\n }\n\n switch (sub) {\n case \"list\":\n await listSegments();\n return;\n case \"show\": {\n const name = positional[1];\n if (!name) {\n console.error(chalk.red(\" /segment show requires a name\"));\n process.exit(1);\n }\n await showSegment(name);\n return;\n }\n case \"compare\": {\n const a = positional[1];\n const b = positional[2];\n if (!a || !b) {\n console.error(chalk.red(\" /segment compare requires two names\"));\n process.exit(1);\n }\n await compareSegments(a, b);\n return;\n }\n case \"create\": {\n const name = positional[1];\n if (!name) {\n console.error(chalk.red(\" /segment create requires a name\"));\n process.exit(1);\n }\n const entity = getString(flags, \"entity\");\n if (!entity) {\n console.error(chalk.red(\" /segment create requires --entity\"));\n process.exit(1);\n }\n const filterExprs: string[] = [];\n const raw = flags.get(\"filter\");\n if (typeof raw === \"string\") filterExprs.push(raw);\n await createSegment(name, entity, filterExprs);\n return;\n }\n case \"delete\": {\n const name = positional[1];\n if (!name) {\n console.error(chalk.red(\" /segment delete requires a name\"));\n process.exit(1);\n }\n await deleteSegmentByName(name);\n return;\n }\n default:\n // Treat unrecognized first positional as a bare \"show <name>\" shortcut\n await showSegment(sub);\n return;\n }\n}\n\nasync function runSegmentStructured(sub: string, positional: string[], flags: Map<string, string | boolean>): Promise<unknown> {\n switch (sub) {\n case \"list\": {\n await initSchema();\n const diagnosis = await loadLatestDiagnosis();\n if (!diagnosis) throw new NtrpError(\"no_diagnosis\", \"No diagnosis data found. Run diagnose first.\", ExitCode.NoData);\n return { action: \"list\", segments: diagnosis.segments.map(serializeSegment), aggregate: diagnosis.health };\n }\n case \"show\": {\n const name = positional[1];\n if (!name) throw new NtrpError(\"segment_name_required\", \"segment show requires a name.\", ExitCode.Usage);\n return structuredShowSegment(name);\n }\n case \"compare\": {\n const a = positional[1];\n const b = positional[2];\n if (!a || !b) throw new NtrpError(\"segments_required\", \"segment compare requires two names.\", ExitCode.Usage);\n return structuredCompareSegments(a, b);\n }\n case \"create\": {\n const name = positional[1];\n if (!name) throw new NtrpError(\"segment_name_required\", \"segment create requires a name.\", ExitCode.Usage);\n const entity = getString(flags, \"entity\");\n if (!entity) throw new NtrpError(\"segment_entity_required\", \"segment create requires --entity.\", ExitCode.Usage);\n const raw = flags.get(\"filter\");\n const filterExprs = typeof raw === \"string\" ? [raw] : [];\n const id = await createSegmentStructured(name, entity, filterExprs);\n return { action: \"create\", id, name, entity_type: entity };\n }\n case \"delete\": {\n const name = positional[1];\n if (!name) throw new NtrpError(\"segment_name_required\", \"segment delete requires a name.\", ExitCode.Usage);\n const deleted = await deleteSegmentStructured(name);\n return { action: \"delete\", segment: deleted };\n }\n default:\n return structuredShowSegment(sub);\n }\n}\n\nasync function structuredShowSegment(name: string): Promise<unknown> {\n await initSchema();\n const diagnosis = await loadLatestDiagnosis();\n if (!diagnosis) throw new NtrpError(\"no_diagnosis\", \"No diagnosis data found. Run diagnose first.\", ExitCode.NoData);\n const result = resolveSegmentByName(name, diagnosis.segments);\n if (result.type === \"ambiguous\") {\n throw new NtrpError(\"ambiguous_segment\", `\"${name}\" matches multiple segments.`, ExitCode.Usage, {\n matches: result.matches.map((s) => s.segment.name),\n });\n }\n if (result.type === \"none\") {\n throw new NtrpError(\"segment_not_found\", `No segment matching \"${name}\".`, ExitCode.Usage, {\n available_segments: diagnosis.segments.map((s) => s.segment.name),\n });\n }\n return { action: \"show\", segment: serializeSegment(result.segment), aggregate: diagnosis.health };\n}\n\nasync function structuredCompareSegments(a: string, b: string): Promise<unknown> {\n await initSchema();\n const diagnosis = await loadLatestDiagnosis();\n if (!diagnosis) throw new NtrpError(\"no_diagnosis\", \"No diagnosis data found. Run diagnose first.\", ExitCode.NoData);\n const resA = resolveSegmentByName(a, diagnosis.segments);\n const resB = resolveSegmentByName(b, diagnosis.segments);\n if (resA.type !== \"exact\") throw new NtrpError(\"segment_not_found\", `No exact segment matching \"${a}\".`, ExitCode.Usage);\n if (resB.type !== \"exact\") throw new NtrpError(\"segment_not_found\", `No exact segment matching \"${b}\".`, ExitCode.Usage);\n return {\n action: \"compare\",\n a: serializeSegment(resA.segment),\n b: serializeSegment(resB.segment),\n };\n}\n\nasync function createSegmentStructured(name: string, entity: string, filterExprs: string[]): Promise<string> {\n const validEntities = [\"organizations\", \"opportunities\", \"people\"];\n if (!validEntities.includes(entity)) {\n throw new NtrpError(\"invalid_entity_type\", `Invalid entity type \"${entity}\".`, ExitCode.Usage, { valid: validEntities });\n }\n if (filterExprs.length === 0) {\n throw new NtrpError(\"filter_required\", \"At least one --filter is required.\", ExitCode.Usage);\n }\n const filters = filterExprs.map(parseFilter);\n await initSchema();\n return insertSegment({ name, entity_type: entity, filters, is_auto_generated: false });\n}\n\nasync function deleteSegmentStructured(name: string): Promise<unknown> {\n await initSchema();\n const matches = await findSegmentsByName(name);\n if (matches.length === 0) throw new NtrpError(\"segment_not_found\", `No segment matching \"${name}\".`, ExitCode.Usage);\n if (matches.length > 1) {\n throw new NtrpError(\"ambiguous_segment\", `\"${name}\" matches multiple segments.`, ExitCode.Usage, {\n matches: matches.map((m) => m.name),\n });\n }\n const segment = matches[0]!;\n if (segment.is_auto_generated) {\n throw new NtrpError(\"auto_segment\", `\"${segment.name}\" is auto-generated and rebuilds on each diagnose.`, ExitCode.Usage);\n }\n await deleteSegment(segment.id);\n return segment;\n}\n\n// ============================================================\n// Subcommand implementations\n// ============================================================\n\nasync function listSegments(): Promise<void> {\n await initSchema();\n const diagnosis = await loadLatestDiagnosis();\n if (!diagnosis) {\n console.error(chalk.red(\" No diagnosis data found. Run /diagnose first.\"));\n process.exit(1);\n }\n\n if (diagnosis.segments.length === 0) {\n console.log(chalk.dim(\"\\n No segments found. Import more data or run /diagnose with more records.\\n\"));\n return;\n }\n\n printSegmentList(diagnosis.segments, diagnosis.health);\n}\n\nasync function showSegment(name: string): Promise<void> {\n await initSchema();\n const diagnosis = await loadLatestDiagnosis();\n if (!diagnosis) {\n console.error(chalk.red(\" No diagnosis data found. Run /diagnose first.\"));\n process.exit(1);\n }\n\n const result = resolveSegmentByName(name, diagnosis.segments);\n switch (result.type) {\n case \"exact\":\n printSegmentDetail(result.segment, diagnosis.health);\n break;\n case \"ambiguous\":\n handleAmbiguous(name, result.matches);\n break;\n case \"none\":\n handleNoMatch(name, diagnosis.segments);\n break;\n }\n}\n\nasync function compareSegments(a: string, b: string): Promise<void> {\n await initSchema();\n const diagnosis = await loadLatestDiagnosis();\n if (!diagnosis) {\n console.error(chalk.red(\" No diagnosis data found. Run /diagnose first.\"));\n process.exit(1);\n }\n\n const resA = resolveSegmentByName(a, diagnosis.segments);\n const resB = resolveSegmentByName(b, diagnosis.segments);\n\n if (resA.type !== \"exact\") {\n if (resA.type === \"ambiguous\") handleAmbiguous(a, resA.matches);\n else handleNoMatch(a, diagnosis.segments);\n return;\n }\n if (resB.type !== \"exact\") {\n if (resB.type === \"ambiguous\") handleAmbiguous(b, resB.matches);\n else handleNoMatch(b, diagnosis.segments);\n return;\n }\n\n printSegmentComparison(resA.segment, resB.segment);\n}\n\nasync function createSegment(name: string, entity: string, filterExprs: string[]): Promise<void> {\n const validEntities = [\"organizations\", \"opportunities\", \"people\"];\n if (!validEntities.includes(entity)) {\n console.error(chalk.red(` Invalid entity type \"${entity}\". Must be one of: ${validEntities.join(\", \")}`));\n process.exit(1);\n }\n\n const filters: SegmentFilter[] = [];\n for (const expr of filterExprs) {\n try {\n filters.push(parseFilter(expr));\n } catch (err) {\n console.error(chalk.red(` ${(err as Error).message}`));\n process.exit(1);\n }\n }\n\n if (filters.length === 0) {\n console.error(chalk.red(\" At least one --filter is required.\"));\n process.exit(1);\n }\n\n await initSchema();\n const id = await insertSegment({\n name,\n entity_type: entity,\n filters,\n is_auto_generated: false,\n });\n\n console.log(chalk.green(`\\n Created segment \"${name}\" (${id})`));\n console.log(chalk.dim(\" Run /diagnose to compute health scores for this segment.\\n\"));\n}\n\nasync function deleteSegmentByName(name: string): Promise<void> {\n await initSchema();\n const matches = await findSegmentsByName(name);\n\n if (matches.length === 0) {\n console.error(chalk.red(` No segment matching \"${name}\".`));\n process.exit(1);\n }\n\n if (matches.length > 1) {\n console.error(chalk.yellow(` \"${name}\" matches multiple segments:`));\n for (const m of matches) {\n console.log(chalk.dim(` - ${m.name}${m.is_auto_generated ? \" (auto)\" : \"\"}`));\n }\n process.exit(1);\n }\n\n const segment = matches[0]!;\n if (segment.is_auto_generated) {\n console.error(chalk.yellow(` \"${segment.name}\" is auto-generated and rebuilds on each diagnose. No need to delete.`));\n process.exit(1);\n }\n\n await deleteSegment(segment.id);\n console.log(chalk.green(`\\n Deleted segment \"${segment.name}\"\\n`));\n}\n","import type { Context } from \"../cli/context.js\";\nimport { assertReplAi } from \"./repl-api.js\";\nimport { llmCompleteText } from \"./llm/complete.js\";\nimport { getPlaybook } from \"../data/playbook.js\";\nimport type { Strategy, StrategyMetric, StrategyPriority, StrategySourceType, StrategyStatus } from \"../types.js\";\n\nexport interface NormalizedStrategyInput {\n source_type: StrategySourceType;\n source_path: string | null;\n raw_text: string;\n structured_hint?: Record<string, unknown>;\n}\n\nexport type NormalizedStrategyDraft = Omit<Strategy, \"id\" | \"slug\" | \"library_path\" | \"created_at\" | \"updated_at\">;\n\nconst SYSTEM_PROMPT = `You are a strategy-ingestion engine for NTRP, a GTM pipeline-health and orchestration tool.\n\nYOUR JOB:\nTurn a user-supplied GTM strategy document into a structured strategy spec. The source may be organized or messy. Extract what is explicit, infer conservative scaffolding where useful, and mark confidence accordingly.\n\nNTRP VITAL SIGNS:\n- freshness: stale contacts, accounts, and zombie deals\n- flow_rate: stuck pipeline and slow deal progression\n- drop_rate: marketing-to-sales handoff leakage\n- signal_to_noise: activity aimed at low-value or dead-end targets\n- thread_depth: single-threaded or fragile deals\n\nOUTPUT RULES:\n- Return STRICT JSON only. No markdown fences, no preamble.\n- Do not invent customer facts. If the source is vague, use short generic scaffolding and lower confidence.\n- Link only to play IDs that are relevant to the strategy.\n- success_metrics and leading_indicators must be arrays of objects with name, target, baseline, and timeframe strings when known.\n- status must be one of: draft, active, paused, completed, archived.\n- priority must be one of: low, medium, high.\n\nJSON SHAPE:\n{\n \"title\": \"Strategy title\",\n \"status\": \"draft\",\n \"goal\": \"What this strategy is trying to accomplish\",\n \"hypothesis\": \"Why this should work\",\n \"target_segment\": \"Who or what this applies to\",\n \"priority\": \"medium\",\n \"linked_play_ids\": [\"play-id\"],\n \"success_metrics\": [{\"name\":\"Metric\", \"target\":\"Target\", \"baseline\":\"Baseline\", \"timeframe\":\"Timeframe\"}],\n \"leading_indicators\": [{\"name\":\"Indicator\", \"target\":\"Target\", \"baseline\":\"Baseline\", \"timeframe\":\"Timeframe\"}],\n \"risks\": [\"Risk\"],\n \"recommended_actions\": [\"Action\"],\n \"experiment_design\": \"How to run or evaluate this strategy\",\n \"review_cadence\": \"Weekly\",\n \"confidence\": 0.75,\n \"raw_excerpt\": \"Short source excerpt that best summarizes the strategy\"\n}`;\n\nfunction stripFences(text: string): string {\n const trimmed = text.trim();\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n if (fenced) return fenced[1]!.trim();\n return trimmed;\n}\n\nexport async function normalizeStrategy(input: NormalizedStrategyInput, ctx: Context): Promise<NormalizedStrategyDraft> {\n assertReplAi(ctx);\n const playbookBlock = getPlaybook()\n .map((play) => `- ${play.id}: ${play.name} (${play.trigger_vital_sign}) — ${play.why}`)\n .join(\"\\n\");\n\n const { text } = await llmCompleteText(\n \"strategy\",\n SYSTEM_PROMPT,\n `AVAILABLE PLAYBOOK IDS:\\n${playbookBlock}\\n\\nSOURCE TYPE: ${input.source_type}\\nSOURCE PATH: ${input.source_path ?? \"none\"}\\nSTRUCTURED HINT:\\n${JSON.stringify(input.structured_hint ?? {}, null, 2)}\\n\\nRAW STRATEGY DOCUMENT:\\n${input.raw_text.slice(0, 16000)}\\n\\nNormalize this strategy now as strict JSON.`,\n 1800,\n ctx,\n );\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(stripFences(text)) as Record<string, unknown>;\n } catch {\n throw new Error(\"AI response is not valid strategy JSON\");\n }\n\n return validateStrategyDraft(parsed, input);\n}\n\nexport function validateStrategyDraft(\n raw: Record<string, unknown>,\n input: Pick<NormalizedStrategyInput, \"source_type\" | \"source_path\">,\n): NormalizedStrategyDraft {\n const title = stringValue(raw.title) ?? \"Untitled Strategy\";\n const goal = stringValue(raw.goal) ?? \"Clarify the GTM strategy and define measurable outcomes.\";\n const hypothesis = stringValue(raw.hypothesis) ?? \"If the team executes this strategy consistently, the targeted GTM health metrics should improve.\";\n const targetSegment = stringValue(raw.target_segment) ?? \"Unspecified segment\";\n\n return {\n title,\n status: enumValue<StrategyStatus>(raw.status, [\"draft\", \"active\", \"paused\", \"completed\", \"archived\"], \"draft\"),\n source_type: input.source_type,\n source_path: input.source_path,\n goal,\n hypothesis,\n target_segment: targetSegment,\n priority: enumValue<StrategyPriority>(raw.priority, [\"low\", \"medium\", \"high\"], \"medium\"),\n linked_play_ids: validPlayIds(raw.linked_play_ids),\n success_metrics: metricArray(raw.success_metrics),\n leading_indicators: metricArray(raw.leading_indicators),\n risks: stringArray(raw.risks),\n recommended_actions: stringArray(raw.recommended_actions),\n experiment_design: stringValue(raw.experiment_design) ?? \"Define a pilot cohort, execute the strategy, and compare before/after pipeline-health readings.\",\n review_cadence: stringValue(raw.review_cadence) ?? \"Weekly\",\n confidence: confidenceValue(raw.confidence),\n raw_excerpt: stringValue(raw.raw_excerpt) ?? \"\",\n };\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.map(stringValue).filter((item): item is string => Boolean(item))\n : [];\n}\n\nfunction metricArray(value: unknown): StrategyMetric[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((item) => {\n if (!item || typeof item !== \"object\") return [];\n const raw = item as Record<string, unknown>;\n const name = stringValue(raw.name);\n if (!name) return [];\n return [{\n name,\n target: stringValue(raw.target),\n baseline: stringValue(raw.baseline),\n timeframe: stringValue(raw.timeframe),\n }];\n });\n}\n\nfunction validPlayIds(value: unknown): string[] {\n const allowed = new Set(getPlaybook().map((play) => play.id));\n return stringArray(value).filter((id) => allowed.has(id));\n}\n\nfunction enumValue<T extends string>(value: unknown, allowed: T[], fallback: T): T {\n return typeof value === \"string\" && allowed.includes(value as T) ? value as T : fallback;\n}\n\nfunction confidenceValue(value: unknown): number {\n const numeric = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(numeric)) return 0.5;\n return Math.min(1, Math.max(0, numeric));\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { extname, resolve } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { PDFParse } from \"pdf-parse\";\nimport type { StrategySourceType } from \"../types.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\n\nexport interface StrategyDocument {\n source_type: StrategySourceType;\n source_path: string | null;\n raw_text: string;\n structured_hint: Record<string, unknown>;\n content_hash: string;\n metadata: Record<string, unknown>;\n}\n\nexport async function readStrategyFile(pathOrDash: string): Promise<StrategyDocument> {\n if (pathOrDash === \"-\") {\n const text = readFileSync(0, \"utf-8\");\n return createDocument(\"stdin\", null, text, {});\n }\n\n const sourcePath = resolve(pathOrDash);\n if (!existsSync(sourcePath)) {\n throw new NtrpError(\"strategy_file_not_found\", `Strategy file not found: ${pathOrDash}`, ExitCode.Usage);\n }\n\n const ext = extname(sourcePath).toLowerCase();\n if (ext === \".pdf\") {\n return readPdf(sourcePath);\n }\n\n const text = readFileSync(sourcePath, \"utf-8\");\n if (ext === \".yaml\" || ext === \".yml\") {\n const structured = parseStructuredYaml(text);\n return createDocument(\"yaml\", sourcePath, text, structured);\n }\n\n if (ext === \".md\" || ext === \".markdown\") {\n const { frontmatter, body } = splitFrontmatter(text);\n return createDocument(\"markdown\", sourcePath, body, frontmatter);\n }\n\n return createDocument(\"text\", sourcePath, text, {});\n}\n\nexport function readStrategyText(text: string): StrategyDocument {\n return createDocument(\"text\", null, text, {});\n}\n\nasync function readPdf(sourcePath: string): Promise<StrategyDocument> {\n const data = readFileSync(sourcePath);\n const parser = new PDFParse({ data });\n try {\n const result = await parser.getText();\n return createDocument(\"pdf\", sourcePath, result.text, {}, { pages: result.total });\n } finally {\n await parser.destroy().catch(() => undefined);\n }\n}\n\nfunction createDocument(\n sourceType: StrategySourceType,\n sourcePath: string | null,\n rawText: string,\n structuredHint: Record<string, unknown>,\n metadata: Record<string, unknown> = {},\n): StrategyDocument {\n const normalizedText = rawText.trim();\n if (!normalizedText) {\n throw new NtrpError(\"strategy_input_empty\", \"Strategy input did not contain readable text.\", ExitCode.Usage);\n }\n return {\n source_type: sourceType,\n source_path: sourcePath,\n raw_text: normalizedText,\n structured_hint: structuredHint,\n content_hash: createHash(\"sha256\").update(normalizedText).digest(\"hex\"),\n metadata,\n };\n}\n\nfunction splitFrontmatter(text: string): { frontmatter: Record<string, unknown>; body: string } {\n if (!text.startsWith(\"---\")) return { frontmatter: {}, body: text };\n const end = text.indexOf(\"\\n---\", 3);\n if (end === -1) return { frontmatter: {}, body: text };\n const rawFrontmatter = text.slice(3, end).trim();\n const body = text.slice(end + 4).replace(/^\\r?\\n/, \"\");\n return {\n frontmatter: parseStructuredYaml(rawFrontmatter),\n body,\n };\n}\n\nfunction parseStructuredYaml(text: string): Record<string, unknown> {\n const parsed = parseYaml(text);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : {};\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { getStrategiesDir } from \"../config/store.js\";\nimport type { Strategy } from \"../types.js\";\n\nexport function strategyLibraryPath(slug: string): string {\n return join(getStrategiesDir(), `${slug}.md`);\n}\n\nexport function writeStrategyMarkdown(strategy: Strategy): string {\n const path = strategyLibraryPath(strategy.slug);\n writeFileSync(path, renderStrategyMarkdown(strategy), \"utf-8\");\n return path;\n}\n\nexport function renderStrategyMarkdown(strategy: Strategy): string {\n const frontmatter = stringifyYaml({\n id: strategy.id,\n slug: strategy.slug,\n status: strategy.status,\n source_type: strategy.source_type,\n source_path: strategy.source_path,\n priority: strategy.priority,\n linked_play_ids: strategy.linked_play_ids,\n review_cadence: strategy.review_cadence,\n confidence: strategy.confidence,\n updated_at: strategy.updated_at,\n }).trim();\n\n return `---\\n${frontmatter}\\n---\\n\\n# ${strategy.title}\\n\\n## Goal\\n${strategy.goal}\\n\\n## Hypothesis\\n${strategy.hypothesis}\\n\\n## Target Segment\\n${strategy.target_segment}\\n\\n## Success Metrics\\n${formatMetrics(strategy.success_metrics)}\\n\\n## Leading Indicators\\n${formatMetrics(strategy.leading_indicators)}\\n\\n## Recommended Actions\\n${formatList(strategy.recommended_actions)}\\n\\n## Risks\\n${formatList(strategy.risks)}\\n\\n## Experiment Design\\n${strategy.experiment_design}\\n\\n## Source Excerpt\\n${strategy.raw_excerpt || \"_No excerpt captured._\"}\\n`;\n}\n\nfunction formatMetrics(metrics: Strategy[\"success_metrics\"]): string {\n if (metrics.length === 0) return \"_None specified._\";\n return metrics.map((metric) => {\n const parts = [\n metric.target ? `target: ${metric.target}` : null,\n metric.baseline ? `baseline: ${metric.baseline}` : null,\n metric.timeframe ? `timeframe: ${metric.timeframe}` : null,\n ].filter(Boolean);\n return `- ${metric.name}${parts.length > 0 ? ` (${parts.join(\", \")})` : \"\"}`;\n }).join(\"\\n\");\n}\n\nfunction formatList(items: string[]): string {\n return items.length > 0 ? items.map((item) => `- ${item}`).join(\"\\n\") : \"_None specified._\";\n}\n","import { readdirSync, statSync } from \"node:fs\";\nimport type { Stats } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, extname, join, relative, resolve, sep } from \"node:path\";\nimport { readStrategyFile, type StrategyDocument } from \"./readers.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\n\nexport type StrategyLibraryConnectorKind = \"local_folder\" | \"notion\";\n\nexport interface StrategyLibraryDocumentRef {\n id: string;\n title: string;\n source_path: string;\n relative_path?: string;\n size_bytes?: number;\n modified_at?: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface StrategyLibraryConnector {\n id: string;\n name: string;\n kind: StrategyLibraryConnectorKind;\n readonly: boolean;\n listDocuments(): Promise<StrategyLibraryDocumentRef[]>;\n readDocument(ref: StrategyLibraryDocumentRef): Promise<StrategyDocument>;\n writeDocument?(ref: StrategyLibraryDocumentRef, contents: string): Promise<void>;\n}\n\nexport interface LocalFolderConnectorOptions {\n rootPath: string;\n name?: string;\n includePatterns?: string[];\n excludePatterns?: string[];\n maxFiles?: number;\n maxBytes?: number;\n}\n\nconst DEFAULT_MAX_FILES = 50;\nconst DEFAULT_MAX_BYTES = 512 * 1024;\nconst SUPPORTED_EXTENSIONS = new Set([\".md\", \".markdown\", \".yaml\", \".yml\", \".txt\", \".pdf\"]);\nconst DEFAULT_EXCLUDED_DIRS = new Set([\".git\", \".hg\", \".svn\", \".obsidian\", \"node_modules\", \"dist\", \"build\"]);\n\nexport function createLocalFolderConnector(options: LocalFolderConnectorOptions): StrategyLibraryConnector {\n const rootPath = resolveUserPath(options.rootPath);\n const name = options.name ?? (basename(rootPath) || \"local\");\n const includePatterns = normalizePatterns(options.includePatterns);\n const excludePatterns = normalizePatterns(options.excludePatterns);\n const maxFiles = options.maxFiles ?? DEFAULT_MAX_FILES;\n const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;\n\n return {\n id: `local:${rootPath}`,\n name,\n kind: \"local_folder\",\n readonly: true,\n async listDocuments() {\n const rootStat = safeStat(rootPath);\n if (!rootStat?.isDirectory()) {\n throw new NtrpError(\"strategy_library_not_found\", `Strategy library folder not found: ${rootPath}`, ExitCode.Usage);\n }\n\n const refs: StrategyLibraryDocumentRef[] = [];\n walkLocalFolder(rootPath, rootPath, refs, { includePatterns, excludePatterns, maxBytes });\n refs.sort((a, b) => (a.relative_path ?? a.source_path).localeCompare(b.relative_path ?? b.source_path));\n return refs.slice(0, maxFiles);\n },\n async readDocument(ref) {\n const document = await readStrategyFile(ref.source_path);\n return {\n ...document,\n metadata: {\n ...document.metadata,\n connector_id: `local:${rootPath}`,\n connector_kind: \"local_folder\",\n connector_name: name,\n library_root: rootPath,\n relative_path: ref.relative_path,\n size_bytes: ref.size_bytes,\n modified_at: ref.modified_at,\n },\n };\n },\n };\n}\n\nfunction walkLocalFolder(\n rootPath: string,\n currentPath: string,\n refs: StrategyLibraryDocumentRef[],\n opts: {\n includePatterns: string[];\n excludePatterns: string[];\n maxBytes: number;\n },\n): void {\n for (const entry of readdirSync(currentPath, { withFileTypes: true })) {\n const absolutePath = join(currentPath, entry.name);\n const relativePath = normalizePath(relative(rootPath, absolutePath));\n\n if (entry.isDirectory()) {\n if (shouldSkipDirectory(entry.name) || matchesAny(relativePath, opts.excludePatterns)) continue;\n walkLocalFolder(rootPath, absolutePath, refs, opts);\n continue;\n }\n\n if (!entry.isFile()) continue;\n const ext = extname(entry.name).toLowerCase();\n if (!SUPPORTED_EXTENSIONS.has(ext)) continue;\n if (opts.includePatterns.length > 0 && !matchesAny(relativePath, opts.includePatterns)) continue;\n if (matchesAny(relativePath, opts.excludePatterns)) continue;\n\n const stat = safeStat(absolutePath);\n if (!stat || stat.size > opts.maxBytes) continue;\n\n refs.push({\n id: `local:${absolutePath}`,\n title: entry.name.replace(/\\.[^.]+$/, \"\"),\n source_path: absolutePath,\n relative_path: relativePath,\n size_bytes: stat.size,\n modified_at: stat.mtime.toISOString(),\n metadata: {\n connector_kind: \"local_folder\",\n library_root: rootPath,\n relative_path: relativePath,\n },\n });\n }\n}\n\nfunction shouldSkipDirectory(name: string): boolean {\n return DEFAULT_EXCLUDED_DIRS.has(name) || name.startsWith(\".\");\n}\n\nfunction safeStat(path: string): Stats | null {\n try {\n return statSync(path);\n } catch {\n return null;\n }\n}\n\nfunction normalizePatterns(patterns: string[] | undefined): string[] {\n return (patterns ?? [])\n .map((pattern) => pattern.trim())\n .filter(Boolean)\n .map(normalizePath);\n}\n\nfunction matchesAny(relativePath: string, patterns: string[]): boolean {\n return patterns.some((pattern) => matchesPattern(relativePath, pattern));\n}\n\nfunction matchesPattern(relativePath: string, pattern: string): boolean {\n const normalizedPath = normalizePath(relativePath);\n const normalizedPattern = normalizePath(pattern);\n const base = basename(normalizedPath);\n\n if (!normalizedPattern.includes(\"*\")) {\n return normalizedPath === normalizedPattern\n || normalizedPath.endsWith(`/${normalizedPattern}`)\n || normalizedPath.includes(normalizedPattern);\n }\n\n const regex = wildcardToRegExp(normalizedPattern);\n return regex.test(normalizedPath) || regex.test(base);\n}\n\nfunction wildcardToRegExp(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \"__DOUBLE_STAR__\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/__DOUBLE_STAR__/g, \".*\");\n return new RegExp(`^${escaped}$`, \"i\");\n}\n\nfunction normalizePath(path: string): string {\n return path.split(sep).join(\"/\");\n}\n\nfunction resolveUserPath(path: string): string {\n if (path === \"~\") return homedir();\n if (path.startsWith(\"~/\")) return join(homedir(), path.slice(2));\n return resolve(path);\n}\n","import { initSchema } from \"../db/schema.js\";\nimport {\n getStrategyBySlugOrId,\n insertStrategySource,\n listStrategies,\n listStrategySources,\n upsertStrategy,\n} from \"../db/queries.js\";\nimport { normalizeStrategy, validateStrategyDraft } from \"../ai/strategy-normalize.js\";\nimport { readStrategyFile, readStrategyText, type StrategyDocument } from \"../strategies/readers.js\";\nimport { strategyLibraryPath, writeStrategyMarkdown } from \"../strategies/library.js\";\nimport {\n createLocalFolderConnector,\n type LocalFolderConnectorOptions,\n type StrategyLibraryConnector,\n} from \"../strategies/connectors.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport type { Strategy, StrategyStatus } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\n\nexport interface StrategyIngestOptions {\n useAi?: boolean;\n sourceMetadata?: Record<string, unknown>;\n ctx?: Context;\n}\n\nexport async function ingestStrategyFile(pathOrDash: string, opts: StrategyIngestOptions = {}): Promise<StrategyIngestResult> {\n const document = await readStrategyFile(pathOrDash);\n return persistStrategyDocument(document, opts);\n}\n\nexport async function addStrategyText(text: string, opts: StrategyIngestOptions = {}): Promise<StrategyIngestResult> {\n const document = readStrategyText(text);\n return persistStrategyDocument(document, opts);\n}\n\nexport async function getStrategies(status?: StrategyStatus | \"all\"): Promise<Strategy[]> {\n await initSchema();\n return listStrategies(status);\n}\n\nexport async function getStrategyDetail(slugOrId: string): Promise<StrategyDetail> {\n await initSchema();\n const strategy = await getStrategyBySlugOrId(slugOrId);\n if (!strategy) {\n throw new NtrpError(\"strategy_not_found\", `Strategy not found: ${slugOrId}`, ExitCode.Usage);\n }\n const sources = await listStrategySources(strategy.id);\n return { strategy, sources };\n}\n\nexport async function syncStrategyLibrary(options: StrategyLibrarySyncOptions): Promise<StrategyLibrarySyncResult> {\n const connector = createStrategyLibraryConnector(options);\n const refs = await connector.listDocuments();\n const imported: StrategyIngestResult[] = [];\n const errors: StrategyLibrarySyncError[] = [];\n\n for (const ref of refs) {\n try {\n const document = await connector.readDocument(ref);\n imported.push(await persistStrategyDocument(document, {\n useAi: options.useAi,\n ctx: options.ctx,\n sourceMetadata: {\n connector_id: connector.id,\n connector_name: connector.name,\n connector_kind: connector.kind,\n document_id: ref.id,\n relative_path: ref.relative_path,\n source_title: ref.title,\n sync_mode: \"read_only\",\n write_back: \"approval_required_future\",\n },\n }));\n } catch (err) {\n errors.push({\n source_path: ref.source_path,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return {\n connector: {\n id: connector.id,\n name: connector.name,\n kind: connector.kind,\n readonly: connector.readonly,\n },\n discovered: refs.length,\n imported: imported.length,\n errors,\n strategies: imported.map((result) => result.strategy),\n };\n}\n\nexport function listStrategyLibraryConnectors(): StrategyLibraryConnectorInfo[] {\n return [\n {\n kind: \"local_folder\",\n name: \"Local folder\",\n status: \"available\",\n description: \"Read markdown, YAML, text, and PDF strategy documents from an Obsidian-style folder.\",\n write_back: \"planned_approval_required\",\n },\n {\n kind: \"notion\",\n name: \"Notion\",\n status: \"planned\",\n description: \"Read strategy pages from Notion once API configuration is added.\",\n write_back: \"planned_approval_required\",\n },\n ];\n}\n\nasync function persistStrategyDocument(document: StrategyDocument, opts: StrategyIngestOptions): Promise<StrategyIngestResult> {\n await initSchema();\n const useAi = opts.useAi !== false;\n const draft = useAi\n ? await normalizeStrategy(document, opts.ctx!)\n : validateStrategyDraft({\n ...inferStrategyFields(document.raw_text),\n ...document.structured_hint,\n raw_excerpt: excerpt(document.raw_text),\n }, document);\n\n const slug = slugify(draft.title);\n const libraryPath = strategyLibraryPath(slug);\n const id = await upsertStrategy({\n ...draft,\n slug,\n raw_excerpt: draft.raw_excerpt || excerpt(document.raw_text),\n library_path: libraryPath,\n });\n\n const strategy = await getStrategyBySlugOrId(id);\n if (!strategy) {\n throw new NtrpError(\"strategy_persist_failed\", \"Strategy was not found after saving.\", ExitCode.RuntimeError);\n }\n\n const writtenPath = writeStrategyMarkdown(strategy);\n await insertStrategySource({\n strategy_id: strategy.id,\n source_type: document.source_type,\n source_path: document.source_path,\n content_hash: document.content_hash,\n extracted_text_excerpt: excerpt(document.raw_text),\n metadata: {\n ...document.metadata,\n ...opts.sourceMetadata,\n structured_hint_keys: Object.keys(document.structured_hint),\n normalization: useAi ? \"ai\" : \"local\",\n },\n });\n\n return {\n strategy: { ...strategy, library_path: writtenPath },\n library_path: writtenPath,\n normalization: useAi ? \"ai\" : \"local\",\n };\n}\n\nfunction slugify(value: string): string {\n const slug = value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64);\n return slug || `strategy-${Date.now()}`;\n}\n\nfunction excerpt(text: string): string {\n return text.trim().replace(/\\s+/g, \" \").slice(0, 800);\n}\n\nfunction inferStrategyFields(text: string): Record<string, unknown> {\n const trimmed = text.trim();\n const lines = trimmed.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean);\n const heading = lines.find((line) => line.startsWith(\"# \"))?.replace(/^#\\s+/, \"\");\n const firstLine = lines[0] ?? \"\";\n const inlineGoalMatch = firstLine.match(/^(.+?)\\s+(?:goal|objective)\\s*:\\s*(.+)$/i);\n const title = heading ?? inlineGoalMatch?.[1]?.trim() ?? firstLine.replace(/[:.]\\s*$/, \"\");\n const goalMatch = trimmed.match(/(?:^|\\n)\\s*(?:goal|objective)\\s*:\\s*(.+)/i) ?? inlineGoalMatch;\n const segmentMatch = trimmed.match(/(?:^|\\n)\\s*(?:target segment|segment)\\s*:\\s*(.+)/i);\n return {\n ...(title ? { title } : {}),\n ...(goalMatch?.[2] || goalMatch?.[1] ? { goal: String(goalMatch[2] ?? goalMatch[1]).trim() } : {}),\n ...(segmentMatch?.[1] ? { target_segment: segmentMatch[1].trim() } : {}),\n };\n}\n\nexport interface StrategyIngestResult {\n strategy: Strategy;\n library_path: string;\n normalization: \"ai\" | \"local\";\n}\n\nexport interface StrategyDetail {\n strategy: Strategy;\n sources: Awaited<ReturnType<typeof listStrategySources>>;\n}\n\nexport type StrategyLibrarySource = \"local_folder\";\n\nexport interface StrategyLibrarySyncOptions extends Omit<LocalFolderConnectorOptions, \"rootPath\"> {\n source?: StrategyLibrarySource;\n path: string;\n useAi?: boolean;\n ctx?: Context;\n}\n\nexport interface StrategyLibrarySyncError {\n source_path: string;\n message: string;\n}\n\nexport interface StrategyLibrarySyncResult {\n connector: {\n id: string;\n name: string;\n kind: StrategyLibraryConnector[\"kind\"];\n readonly: boolean;\n };\n discovered: number;\n imported: number;\n errors: StrategyLibrarySyncError[];\n strategies: Strategy[];\n}\n\nexport interface StrategyLibraryConnectorInfo {\n kind: StrategyLibraryConnector[\"kind\"];\n name: string;\n status: \"available\" | \"planned\";\n description: string;\n write_back: \"unsupported\" | \"planned_approval_required\";\n}\n\nfunction createStrategyLibraryConnector(options: StrategyLibrarySyncOptions): StrategyLibraryConnector {\n const source = options.source ?? \"local_folder\";\n switch (source) {\n case \"local_folder\":\n return createLocalFolderConnector({\n rootPath: options.path,\n name: options.name,\n includePatterns: options.includePatterns,\n excludePatterns: options.excludePatterns,\n maxFiles: options.maxFiles,\n maxBytes: options.maxBytes,\n });\n }\n}\n","/**\n * ntrp strategy — ingest and inspect GTM strategy specs.\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { parseArgs, getFalse, getNumber, getString } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { emitError, emitResult, isStructuredOutput } from \"../io/emit.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport {\n addStrategyText,\n getStrategies,\n getStrategyDetail,\n ingestStrategyFile,\n listStrategyLibraryConnectors,\n syncStrategyLibrary,\n type StrategyLibraryConnectorInfo,\n type StrategyLibrarySyncResult,\n} from \"../services/strategy.js\";\nimport { canUseReplAi } from \"../ai/repl-api.js\";\nimport type { Strategy, StrategyStatus } from \"../types.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { positional, flags } = parseArgs(args, [\"no-ai\"]);\n const sub = positional[0] ?? \"list\";\n\n try {\n const result = await runStrategy(sub, positional, flags, ctx);\n if (isStructuredOutput(ctx.execution)) {\n emitResult(\"strategy\", result);\n return;\n }\n renderStrategyResult(result);\n } catch (err) {\n if (isStructuredOutput(ctx.execution)) emitError(\"strategy\", err);\n console.error(chalk.red(` ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nasync function runStrategy(\n sub: string,\n positional: string[],\n flags: Map<string, string | boolean>,\n ctx: Context,\n): Promise<StrategyResult> {\n const useAi = !getFalse(flags, \"ai\") && canUseReplAi(ctx);\n switch (sub) {\n case \"ingest\": {\n const path = positional[1];\n if (!path) throw new NtrpError(\"strategy_path_required\", \"strategy ingest requires a file path or - for stdin.\", ExitCode.Usage);\n const spinner = shouldSpin(ctx) ? ora({ text: \"Ingesting strategy...\", discardStdin: false }).start() : null;\n try {\n const result = await ingestStrategyFile(path, { useAi, ctx });\n spinner?.succeed(\"Strategy ingested\");\n return { action: \"ingest\", ...result };\n } catch (err) {\n spinner?.fail(\"Strategy ingest failed\");\n throw err;\n }\n }\n case \"add\": {\n const text = positional.slice(1).join(\" \").trim();\n if (!text) throw new NtrpError(\"strategy_text_required\", \"strategy add requires text.\", ExitCode.Usage);\n const spinner = shouldSpin(ctx) ? ora({ text: \"Normalizing strategy...\", discardStdin: false }).start() : null;\n try {\n const result = await addStrategyText(text, { useAi, ctx });\n spinner?.succeed(\"Strategy added\");\n return { action: \"add\", ...result };\n } catch (err) {\n spinner?.fail(\"Strategy add failed\");\n throw err;\n }\n }\n case \"list\": {\n const status = getString(flags, \"status\") as StrategyStatus | \"all\" | undefined;\n const strategies = await getStrategies(status);\n return { action: \"list\", strategies };\n }\n case \"show\": {\n const id = positional[1];\n if (!id) throw new NtrpError(\"strategy_id_required\", \"strategy show requires a slug or id.\", ExitCode.Usage);\n return { action: \"show\", ...(await getStrategyDetail(id)) };\n }\n case \"sync\": {\n const path = getString(flags, \"path\", \"dir\") ?? positional[1];\n if (!path) throw new NtrpError(\"strategy_sync_path_required\", \"strategy sync requires --path <folder> or a folder path.\", ExitCode.Usage);\n const source = normalizeSyncSource(getString(flags, \"source\"));\n const spinner = shouldSpin(ctx) ? ora({ text: \"Syncing strategy library...\", discardStdin: false }).start() : null;\n try {\n const result = await syncStrategyLibrary({\n source,\n path,\n useAi,\n ctx,\n includePatterns: splitPatterns(getString(flags, \"include\")),\n excludePatterns: splitPatterns(getString(flags, \"exclude\")),\n maxFiles: getNumber(flags, \"max-files\"),\n maxBytes: getNumber(flags, \"max-bytes\"),\n });\n if (result.errors.length > 0) {\n spinner?.warn(`Strategy library synced with ${result.errors.length} error(s)`);\n } else {\n spinner?.succeed(\"Strategy library synced\");\n }\n return { action: \"sync\", ...result };\n } catch (err) {\n spinner?.fail(\"Strategy library sync failed\");\n throw err;\n }\n }\n case \"sources\":\n return { action: \"sources\", sources: listStrategyLibraryConnectors() };\n default:\n throw new NtrpError(\"unknown_strategy_subcommand\", `Unknown strategy subcommand: ${sub}`, ExitCode.Usage);\n }\n}\n\nfunction shouldSpin(ctx: Context): boolean {\n return !isStructuredOutput(ctx.execution) && ctx.execution.progress;\n}\n\ntype StrategyResult =\n | { action: \"ingest\" | \"add\"; strategy: Strategy; library_path: string; normalization: \"ai\" | \"local\" }\n | { action: \"list\"; strategies: Strategy[] }\n | Awaited<ReturnType<typeof getStrategyDetail>> & { action: \"show\" }\n | StrategyLibrarySyncResult & { action: \"sync\" }\n | { action: \"sources\"; sources: StrategyLibraryConnectorInfo[] };\n\nfunction renderStrategyResult(result: StrategyResult): void {\n switch (result.action) {\n case \"ingest\":\n case \"add\":\n console.log(chalk.bold(\"\\n Strategy Saved\\n\"));\n printStrategySummary(result.strategy);\n console.log(chalk.dim(` Library file: ${result.library_path}`));\n console.log(chalk.dim(` Normalization: ${result.normalization}`));\n console.log();\n return;\n case \"list\":\n printStrategyList(result.strategies);\n return;\n case \"show\":\n console.log(chalk.bold(\"\\n Strategy\\n\"));\n printStrategyDetail(result.strategy);\n if (result.sources.length > 0) {\n console.log(chalk.hex(\"#14b8a6\")(\" Sources\"));\n for (const source of result.sources) {\n console.log(` ${source.source_type} ${chalk.dim(source.source_path ?? \"inline\")} ${chalk.dim(source.created_at)}`);\n }\n console.log();\n }\n return;\n case \"sync\":\n printStrategySync(result);\n return;\n case \"sources\":\n printStrategySources(result.sources);\n return;\n }\n}\n\nfunction printStrategyList(strategies: Strategy[]): void {\n console.log(chalk.bold(\"\\n Strategies\\n\"));\n if (strategies.length === 0) {\n console.log(chalk.dim(\" No strategies yet. Run /strategy ingest <file> or /strategy add \\\"...\\\".\\n\"));\n return;\n }\n for (const strategy of strategies) {\n console.log(` ${statusBadge(strategy.status)} ${chalk.bold(strategy.title)} ${chalk.dim(strategy.slug)}`);\n console.log(chalk.dim(` ${strategy.priority} priority · ${strategy.target_segment}`));\n }\n console.log();\n}\n\nfunction printStrategySummary(strategy: Strategy): void {\n console.log(` ${statusBadge(strategy.status)} ${chalk.bold(strategy.title)}`);\n console.log(chalk.dim(` slug: ${strategy.slug}`));\n console.log();\n console.log(` ${strategy.goal}`);\n console.log();\n}\n\nfunction printStrategyDetail(strategy: Strategy): void {\n printStrategySummary(strategy);\n console.log(chalk.hex(\"#14b8a6\")(\" Hypothesis\"));\n console.log(` ${strategy.hypothesis}`);\n console.log();\n console.log(chalk.hex(\"#14b8a6\")(\" Target Segment\"));\n console.log(` ${strategy.target_segment}`);\n console.log();\n if (strategy.linked_play_ids.length > 0) {\n console.log(chalk.hex(\"#14b8a6\")(\" Linked Plays\"));\n console.log(` ${strategy.linked_play_ids.join(\", \")}`);\n console.log();\n }\n if (strategy.success_metrics.length > 0) {\n console.log(chalk.hex(\"#14b8a6\")(\" Success Metrics\"));\n for (const metric of strategy.success_metrics) {\n console.log(` - ${metric.name}${metric.target ? `: ${metric.target}` : \"\"}`);\n }\n console.log();\n }\n console.log(chalk.hex(\"#14b8a6\")(\" Experiment Design\"));\n console.log(` ${strategy.experiment_design}`);\n console.log();\n}\n\nfunction statusBadge(status: Strategy[\"status\"]): string {\n switch (status) {\n case \"draft\": return chalk.gray(\"draft\");\n case \"active\": return chalk.green(\"active\");\n case \"paused\": return chalk.yellow(\"paused\");\n case \"completed\": return chalk.blue(\"completed\");\n case \"archived\": return chalk.dim(\"archived\");\n }\n}\n\nfunction printStrategySync(result: StrategyLibrarySyncResult): void {\n console.log(chalk.bold(\"\\n Strategy Library Sync\\n\"));\n console.log(` Source: ${chalk.bold(result.connector.name)} ${chalk.dim(result.connector.kind)}`);\n console.log(chalk.dim(` Mode: ${result.connector.readonly ? \"read-only\" : \"read/write\"}`));\n console.log();\n console.log(` Discovered: ${result.discovered}`);\n console.log(` Imported: ${result.imported}`);\n if (result.strategies.length > 0) {\n console.log();\n for (const strategy of result.strategies) {\n console.log(` ${statusBadge(strategy.status)} ${chalk.bold(strategy.title)} ${chalk.dim(strategy.slug)}`);\n }\n }\n if (result.errors.length > 0) {\n console.log();\n console.log(chalk.yellow(\" Errors\"));\n for (const error of result.errors.slice(0, 5)) {\n console.log(chalk.dim(` - ${error.source_path}: ${error.message}`));\n }\n if (result.errors.length > 5) {\n console.log(chalk.dim(` ... ${result.errors.length - 5} more`));\n }\n }\n console.log();\n}\n\nfunction printStrategySources(sources: StrategyLibraryConnectorInfo[]): void {\n console.log(chalk.bold(\"\\n Strategy Library Sources\\n\"));\n for (const source of sources) {\n const status = source.status === \"available\" ? chalk.green(source.status) : chalk.dim(source.status);\n console.log(` ${status} ${chalk.bold(source.name)} ${chalk.dim(source.kind)}`);\n console.log(chalk.dim(` ${source.description}`));\n console.log(chalk.dim(` Write-back: ${source.write_back}`));\n }\n console.log();\n}\n\nfunction splitPatterns(value: string | undefined): string[] | undefined {\n return value?.split(\",\").map((item) => item.trim()).filter(Boolean);\n}\n\nfunction normalizeSyncSource(value: string | undefined): \"local_folder\" {\n if (!value || value === \"local\" || value === \"local_folder\") return \"local_folder\";\n throw new NtrpError(\"strategy_source_unsupported\", `Unsupported strategy source: ${value}`, ExitCode.Usage);\n}\n","import { initSchema } from \"../db/schema.js\";\nimport { getEntityCounts, getLatestHealthReading, getSegments } from \"../db/queries.js\";\nimport { getStoredApiKey, hasEnvApiKeyHint } from \"../ai/repl-api.js\";\nimport { profileExists } from \"../config/profile.js\";\n\nexport async function getStatus() {\n await initSchema();\n const [entityCounts, segments, health] = await Promise.all([\n getEntityCounts(),\n getSegments(),\n getLatestHealthReading(),\n ]);\n const totalEntities = Object.values(entityCounts).reduce((sum, count) => sum + count, 0);\n return {\n entity_counts: entityCounts,\n total_entities: totalEntities,\n segments: {\n count: segments.length,\n items: segments,\n },\n latest_diagnosis: health\n ? {\n overall_score: Number(health.overall_score),\n overall_status: health.overall_status,\n gating_vital_sign: health.gating_vital_sign,\n total_value_at_risk: health.total_value_at_risk ?? null,\n computed_at: health.computed_at instanceof Date ? health.computed_at.toISOString() : String(health.computed_at),\n }\n : null,\n readiness: {\n profile: profileExists(),\n api_key: Boolean(getStoredApiKey()),\n api_key_env_hint: hasEnvApiKeyHint(),\n },\n };\n}\n","/**\n * ntrp status — show current database status and entity counts.\n */\n\nimport chalk from \"chalk\";\nimport { initSchema } from \"../db/schema.js\";\nimport { getEntityCounts, getLatestHealthReading, getSegments, loadLatestMetricsAnalysis } from \"../db/queries.js\";\nimport { printEntityCounts } from \"../output/terminal.js\";\nimport type { VitalSignStatus } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { isStructuredOutput, emitResult, emitError } from \"../io/emit.js\";\nimport { getStatus } from \"../services/status.js\";\n\nfunction statusDot(status: VitalSignStatus): string {\n switch (status) {\n case \"green\": return chalk.green(\"●\");\n case \"yellow\": return chalk.yellow(\"●\");\n case \"red\": return chalk.red(\"●\");\n }\n}\n\nexport async function handler(_args: string[], ctx: Context): Promise<string | void> {\n try {\n if (isStructuredOutput(ctx.execution)) {\n emitResult(\"status\", await getStatus());\n return;\n }\n\n await initSchema();\n\n const counts = await getEntityCounts();\n const totalEntities = Object.values(counts).reduce((sum, c) => sum + c, 0);\n\n if (totalEntities === 0) {\n console.log(chalk.dim(\"\\n No data loaded. Use /ingest <file> or /ingest --demo to add data.\\n\"));\n return;\n }\n\n console.log(chalk.bold(\"\\n Data Status\\n\"));\n printEntityCounts(counts);\n\n const segments = await getSegments();\n if (segments.length > 0) {\n console.log(chalk.dim(` ${segments.length} segments defined`));\n }\n\n const health = await getLatestHealthReading();\n const metrics = await loadLatestMetricsAnalysis();\n if (health) {\n const status = health.overall_status as VitalSignStatus;\n console.log(\n ` GTM health: ${statusDot(status)} ${chalk.bold(String(health.overall_score))} / 100 (${health.overall_status})`,\n );\n const computedAt = health.computed_at instanceof Date\n ? health.computed_at.toISOString()\n : String(health.computed_at);\n console.log(chalk.dim(` computed ${computedAt}`));\n } else {\n console.log(chalk.dim(\" GTM health: not run — /diagnose\"));\n }\n if (metrics && metrics.metrics.length > 0) {\n const arr = metrics.metrics.find((m) => m.metric === \"arr\");\n const arrLabel = arr ? String(arr.formatted) : `${metrics.metrics.length} metrics`;\n console.log(` SaaS metrics: ${chalk.bold(arrLabel)} (${metrics.metrics.length} stored)`);\n } else {\n console.log(chalk.dim(\" SaaS metrics: not run — /metrics\"));\n }\n console.log();\n\n // Build summary for compressed history\n const parts: string[] = [];\n parts.push(`${totalEntities} entities`);\n if (health) {\n parts.push(`health ${Math.round(Number(health.overall_score))}`);\n }\n if (metrics?.metrics.length) {\n parts.push(`${metrics.metrics.length} metrics`);\n }\n return parts.join(\" · \");\n } catch (err) {\n if (isStructuredOutput(ctx.execution)) {\n emitError(\"status\", err);\n }\n console.error(chalk.red(String(err)));\n process.exit(1);\n }\n}\n","/**\n * ntrp reset — clear all data from the local database.\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { isClosedConnectionError, recreateDatabaseFile, run } from \"../db/connection.js\";\nimport { initSchema } from \"../db/schema.js\";\nimport { parseArgs, getBool } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\n\nconst TABLES = [\n \"findings\",\n \"health_readings\",\n \"vital_sign_readings\",\n \"metric_readings\",\n \"revenue_events\",\n \"segments\",\n \"csv_uploads\",\n \"activities\",\n \"campaigns\",\n \"opportunities\",\n \"people\",\n \"organizations\",\n];\n\nexport async function handler(args: string[], _ctx: Context): Promise<void> {\n const { flags } = parseArgs(args, [\"force\"]);\n const force = getBool(flags, \"force\");\n\n if (!force) {\n console.log(chalk.yellow(\"\\n This will delete ALL data from the local database.\"));\n console.log(chalk.dim(\" Re-run with --force to confirm.\\n\"));\n process.exit(1);\n }\n\n const spinner = ora({ text: \"Resetting database...\", discardStdin: false }).start();\n try {\n await initSchema();\n for (const table of TABLES) {\n await run(`DELETE FROM ${table}`);\n }\n spinner.succeed(\"All data cleared\");\n console.log(chalk.dim(\"\\n Run \") + chalk.cyan(\"/new\") + chalk.dim(\" → pick Demo, then choose your analysis type.\\n\"));\n } catch (err) {\n if (force && isClosedConnectionError(err)) {\n try {\n spinner.text = \"Recreating database...\";\n await recreateDatabaseFile();\n await initSchema();\n spinner.succeed(\"Database recreated\");\n console.log(chalk.dim(\"\\n Run \") + chalk.cyan(\"/new\") + chalk.dim(\" → pick Demo, then choose your analysis type.\\n\"));\n return;\n } catch (recreateErr) {\n spinner.fail(\"Reset failed\");\n console.error(chalk.red(String(recreateErr)));\n process.exit(1);\n }\n }\n spinner.fail(\"Reset failed\");\n console.error(chalk.red(String(err)));\n process.exit(1);\n }\n}\n","/**\n * ntrp playbook — view recommended plays for improving health scores.\n */\n\nimport chalk from \"chalk\";\nimport { getPlaybook, getPlayById, getPlaysForVitalSign, addCustomPlay } from \"../data/playbook.js\";\nimport { VITAL_SIGN_LABELS } from \"../output/formatters.js\";\nimport { parseArgs, getString } from \"../cli/argparse.js\";\nimport { createPromptSession, type Choice } from \"../cli/prompts.js\";\nimport { paint } from \"../ui/theme.js\";\nimport type { VitalSign } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { isStructuredOutput, emitResult, emitError } from \"../io/emit.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\n\nconst VALID_VITALS = new Set<VitalSign>([\"freshness\", \"flow_rate\", \"drop_rate\", \"signal_to_noise\", \"thread_depth\"]);\n\nconst VITAL_CHOICES: Choice<VitalSign>[] = [\n { value: \"freshness\", label: \"Freshness\", description: \"Stale contacts and zombie deals\" },\n { value: \"flow_rate\", label: \"Flow Rate\", description: \"Stuck or slow-moving deals\" },\n { value: \"drop_rate\", label: \"Drop Rate\", description: \"Leads lost between marketing and sales\" },\n { value: \"signal_to_noise\", label: \"Signal-to-Noise\", description: \"Effort aimed at dead ends\" },\n { value: \"thread_depth\", label: \"Thread Depth\", description: \"Single-threaded, fragile deals\" },\n];\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { positional, flags } = parseArgs(args);\n\n // Add a learned play: /playbook add \"<name>\" --vital <sign> --why \"...\" --steps \"a | b\"\n if (positional[0] === \"add\") {\n return addLearnedPlay(positional, flags, ctx);\n }\n\n const playId = positional[0];\n const vitalSign = getString(flags, \"vital-sign\", \"vital\");\n\n // Single play detail\n if (playId) {\n const play = getPlayById(playId);\n if (!play) {\n if (isStructuredOutput(ctx.execution)) {\n emitError(\"playbook\", new NtrpError(\"play_not_found\", `Play not found: ${playId}`, ExitCode.Usage));\n }\n console.error(chalk.red(`\\n Play not found: ${playId}`));\n console.error(chalk.dim(\" Run /playbook to see all available plays.\\n\"));\n process.exit(1);\n }\n\n if (isStructuredOutput(ctx.execution)) {\n emitResult(\"playbook\", { play });\n return;\n }\n\n console.log();\n console.log(chalk.bold(` ${play.name}`));\n const triggerLabel = play.trigger_vital_sign\n ? VITAL_SIGN_LABELS[play.trigger_vital_sign]\n : play.trigger_metric ?? \"metrics\";\n console.log(chalk.dim(` Trigger: ${triggerLabel} — ${play.trigger_condition}`));\n console.log();\n console.log(chalk.hex(\"#14b8a6\")(\" Why\"));\n console.log(` ${play.why}`);\n console.log();\n console.log(chalk.hex(\"#14b8a6\")(\" Steps\"));\n play.steps.forEach((step, i) => {\n console.log(` ${i + 1}. ${step}`);\n });\n console.log();\n console.log(chalk.hex(\"#14b8a6\")(\" Tools That Help\"));\n console.log(` ${play.tools_that_help.join(\", \")}`);\n console.log();\n console.log(chalk.hex(\"#14b8a6\")(\" Expected Outcome\"));\n console.log(` ${play.expected_outcome}`);\n console.log();\n return;\n }\n\n // Filter by vital sign\n let plays = getPlaybook();\n if (vitalSign) {\n plays = getPlaysForVitalSign(vitalSign as VitalSign);\n if (plays.length === 0) {\n if (isStructuredOutput(ctx.execution)) {\n emitError(\"playbook\", new NtrpError(\"no_plays\", `No plays found for vital sign: ${vitalSign}`, ExitCode.Usage));\n }\n console.error(chalk.red(`\\n No plays found for vital sign: ${vitalSign}\\n`));\n process.exit(1);\n }\n }\n\n if (isStructuredOutput(ctx.execution)) {\n emitResult(\"playbook\", { vital_sign: vitalSign ?? null, plays });\n return;\n }\n\n console.log();\n console.log(chalk.bold(\" Recommended Plays\"));\n console.log();\n\n const gtmPlays = vitalSign ? plays : plays.filter((p) => p.trigger_vital_sign);\n const metricsPlays = vitalSign ? [] : plays.filter((p) => p.trigger_lens === \"revenue_metrics\" || p.trigger_metric);\n\n if (gtmPlays.length > 0) {\n console.log(chalk.hex(\"#14b8a6\")(\" GTM health\"));\n printPlayRows(gtmPlays);\n }\n if (metricsPlays.length > 0) {\n console.log(chalk.hex(\"#14b8a6\")(\" SaaS metrics\"));\n printPlayRows(metricsPlays);\n }\n\n console.log();\n console.log(chalk.dim(\" Run /playbook <play-id> for full details.\"));\n console.log(chalk.dim(\" Add your own: \") + paint(\"accent\", \"/playbook add\") + chalk.dim(\" — I'll walk you through it.\"));\n console.log();\n}\n\nfunction printPlayRows(plays: ReturnType<typeof getPlaybook>): void {\n const maxName = Math.max(...plays.map((p) => p.name.length));\n for (const play of plays) {\n const label = play.trigger_vital_sign\n ? VITAL_SIGN_LABELS[play.trigger_vital_sign]\n : play.trigger_metric ?? \"metrics\";\n const tag = play.source === \"learned\" ? chalk.hex(\"#14b8a6\")(\" learned\") : \"\";\n console.log(\n ` ${chalk.bold(play.name.padEnd(maxName + 2))} ${chalk.dim(label + \" — \" + play.trigger_condition)}${tag}`,\n );\n console.log(chalk.dim(` ${\"\".padEnd(maxName + 2)} id: ${play.id}`));\n }\n console.log();\n}\n\nasync function addLearnedPlay(\n positional: string[],\n flags: Map<string, string | boolean>,\n ctx: Context,\n): Promise<void> {\n const name = positional[1] ?? getString(flags, \"name\");\n const vital = getString(flags, \"vital\", \"vital-sign\");\n const why = getString(flags, \"why\");\n const stepsRaw = getString(flags, \"steps\");\n const condition = getString(flags, \"condition\");\n const outcome = getString(flags, \"outcome\");\n const tools = getString(flags, \"tools\");\n const steps = (stepsRaw ?? \"\").split(\"|\").map((s) => s.trim()).filter(Boolean);\n\n // Power path: everything supplied via flags → save directly (works in\n // scripts, headless, and structured-output modes).\n const haveAllFlags = Boolean(name) && Boolean(vital) && VALID_VITALS.has(vital as VitalSign) && Boolean(why) && steps.length > 0;\n if (haveAllFlags) {\n return savePlay(ctx, {\n name: name!,\n trigger_vital_sign: vital as VitalSign,\n trigger_condition: condition,\n why: why!,\n steps,\n tools_that_help: tools ? tools.split(\",\").map((t) => t.trim()).filter(Boolean) : undefined,\n expected_outcome: outcome,\n });\n }\n\n // No interactive terminal available (headless / piped / structured output):\n // we can't run the wizard, so report what's required.\n const interactive = !isStructuredOutput(ctx.execution) && (ctx.rl !== undefined || process.stdin.isTTY);\n if (!interactive) {\n const msg = \"playbook add needs a name, --vital, --why, and --steps (or run it interactively).\";\n if (isStructuredOutput(ctx.execution)) {\n emitError(\"playbook\", new NtrpError(\"play_add_invalid\", msg, ExitCode.Usage));\n }\n console.error(chalk.red(`\\n ${msg}`));\n console.error(chalk.dim(' Example: /playbook add \"Exec Sponsor Map\" --vital thread_depth --why \"...\" --steps \"Identify EB | Secure intro\"\\n'));\n process.exit(1);\n }\n\n // Guided path: walk a non-technical user through it, no flags or quotes.\n await guidedAddPlay(ctx, { name, vital, why, steps });\n}\n\ninterface GuidedSeed {\n name?: string;\n vital?: string;\n why?: string;\n steps: string[];\n}\n\nasync function guidedAddPlay(ctx: Context, seed: GuidedSeed): Promise<void> {\n const session = createPromptSession(ctx.rl, ctx);\n try {\n console.log();\n console.log(\" \" + chalk.bold(\"Let's add a play to your playbook.\"));\n console.log(\" \" + chalk.dim(\"A play is a repeatable move the analyst can recommend. I'll ask a few questions.\"));\n\n const name = seed.name ?? (await session.askRequired(\"What should we call this play?\"));\n\n const vital = seed.vital && VALID_VITALS.has(seed.vital as VitalSign)\n ? (seed.vital as VitalSign)\n : await session.choose<VitalSign>(\"Which problem does this play address?\", VITAL_CHOICES);\n\n const why = seed.why ?? (await session.askRequired(\"Why does this play work? (one or two sentences)\"));\n\n console.log();\n console.log(\" \" + chalk.bold(\"What are the steps?\") + \" \" + chalk.dim(\"Enter one per line. Press enter on a blank line when done.\"));\n const steps: string[] = [...seed.steps];\n for (;;) {\n const step = await session.ask(`Step ${steps.length + 1}`, { default: \"\" });\n if (!step.trim()) {\n if (steps.length === 0) {\n console.log(\" \" + chalk.red(\"Add at least one step.\"));\n continue;\n }\n break;\n }\n steps.push(step.trim());\n }\n\n const toolsRaw = await session.ask(\"Any tools that help? (comma-separated, or enter to skip)\", { default: \"\" });\n const tools = toolsRaw.split(\",\").map((t) => t.trim()).filter(Boolean);\n\n const outcome = await session.ask(\"What's the expected outcome? (enter to skip)\", { default: \"\" });\n\n console.log();\n console.log(\" \" + chalk.bold(\"Here's your play:\"));\n console.log(\" \" + chalk.dim(\"Name: \") + name);\n console.log(\" \" + chalk.dim(\"Trigger: \") + VITAL_SIGN_LABELS[vital]);\n console.log(\" \" + chalk.dim(\"Why: \") + why);\n steps.forEach((s, i) => console.log(\" \" + chalk.dim(`Step ${i + 1}: `) + s));\n if (tools.length > 0) console.log(\" \" + chalk.dim(\"Tools: \") + tools.join(\", \"));\n if (outcome.trim()) console.log(\" \" + chalk.dim(\"Outcome: \") + outcome.trim());\n console.log();\n\n const ok = await session.confirm(\"Save this play?\", true);\n if (!ok) {\n console.log(\" \" + chalk.dim(\"No problem — nothing saved.\"));\n console.log();\n return;\n }\n\n await savePlay(ctx, {\n name,\n trigger_vital_sign: vital,\n why,\n steps,\n tools_that_help: tools.length > 0 ? tools : undefined,\n expected_outcome: outcome.trim() || undefined,\n });\n } finally {\n session.close();\n }\n}\n\ninterface SavePlayInput {\n name: string;\n trigger_vital_sign: VitalSign;\n trigger_condition?: string;\n why: string;\n steps: string[];\n tools_that_help?: string[];\n expected_outcome?: string;\n}\n\nasync function savePlay(ctx: Context, input: SavePlayInput): Promise<void> {\n const play = addCustomPlay(input);\n\n if (isStructuredOutput(ctx.execution)) {\n emitResult(\"playbook\", { added: play });\n return;\n }\n\n console.log();\n console.log(\" \" + paint(\"accent\", `Learned play saved: ${play.name}`));\n const triggerLabel = play.trigger_vital_sign\n ? VITAL_SIGN_LABELS[play.trigger_vital_sign]\n : play.trigger_metric ?? \"metrics\";\n console.log(\" \" + chalk.dim(`id: ${play.id} · triggers on ${triggerLabel}`));\n console.log(\" \" + chalk.dim(\"The analyst can now recommend this play during analysis.\"));\n console.log();\n}\n","/**\n * ntrp config set/get/list/delete — manage CLI configuration.\n */\n\nimport chalk from \"chalk\";\nimport { getConfigValue, setConfigValue, deleteConfigValue, loadConfig } from \"../config/store.js\";\nimport { parseArgs } from \"../cli/argparse.js\";\nimport { createPromptSession } from \"../cli/prompts.js\";\nimport { paint } from \"../ui/theme.js\";\nimport type { Context } from \"../cli/context.js\";\n\nconst SECRET_KEYS = new Set([\"api-key\", \"openai-api-key\", \"license-key\"]);\n\nfunction display(key: string, value: unknown): string {\n return SECRET_KEYS.has(key) ? String(value).slice(0, 10) + \"...\" : String(value);\n}\n\nfunction secretPromptLabel(key: string): string {\n if (key === \"api-key\") return \"Anthropic API key\";\n if (key === \"openai-api-key\") return \"OpenAI API key\";\n if (key === \"license-key\") return \"License key\";\n return key;\n}\n\nfunction usage(): void {\n console.log(chalk.dim(\" Usage: /config <get|set|list|delete> [key] [value]\"));\n console.log(chalk.dim(\" Tip: \") + paint(\"accent\", \"/config set api-key\") + chalk.dim(\" opens a hidden prompt (no inline paste).\"));\n}\n\nfunction fail(message: string, ctx: Context): void {\n console.error(chalk.red(` ${message}`));\n if (ctx.oneShot) process.exit(1);\n}\n\nasync function promptSecretValue(key: string, ctx: Context): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new Error(`Run \\`/config set ${key} <value>\\` in non-interactive mode.`);\n }\n\n const prompts = createPromptSession(ctx.rl, ctx);\n try {\n console.log();\n console.log(\" \" + chalk.dim(\"Paste once, press Enter, then confirm. Stored in \") + paint(\"accent\", \"~/.ntrp/config.json\") + chalk.dim(\" only.\"));\n return await prompts.askSecret(secretPromptLabel(key), { confirm: true });\n } finally {\n prompts.close();\n }\n}\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { positional } = parseArgs(args);\n const sub = positional[0] ?? \"list\";\n\n switch (sub) {\n case \"set\": {\n const key = positional[1];\n const inlineValue = positional.slice(2).join(\" \").trim();\n if (!key) {\n fail(\"/config set requires <key> [value]\", ctx);\n usage();\n return;\n }\n\n let value = inlineValue;\n if (!value && SECRET_KEYS.has(key)) {\n try {\n value = await promptSecretValue(key, ctx);\n } catch (err) {\n console.log(\" \" + chalk.dim(String((err as Error).message ?? err)));\n return;\n }\n } else if (!value) {\n fail(\"/config set requires <key> <value>\", ctx);\n usage();\n return;\n }\n\n setConfigValue(key, value);\n const saved = getConfigValue(key);\n if (saved !== value) {\n fail(`Failed to save ${key} — check permissions on ~/.ntrp/config.json`, ctx);\n return;\n }\n console.log();\n console.log(chalk.green(` ✓ ${key} saved`) + chalk.dim(` (${display(key, value)})`));\n if (key === \"api-key\" || key === \"openai-api-key\") {\n console.log(\" \" + chalk.dim(\"Keys enable AI after analysis. Add both to switch engines with /provider.\"));\n }\n console.log();\n return;\n }\n case \"get\": {\n const key = positional[1];\n if (!key) {\n fail(\"/config get requires <key>\", ctx);\n return;\n }\n const value = getConfigValue(key);\n if (value === undefined) console.log(chalk.dim(` ${key} is not set`));\n else console.log(` ${key} = ${display(key, value)}`);\n return;\n }\n case \"list\": {\n const config = loadConfig();\n const entries = Object.entries(config);\n if (entries.length === 0) {\n console.log(chalk.dim(\" No configuration set.\"));\n return;\n }\n for (const [k, v] of entries) console.log(` ${k} = ${display(k, v)}`);\n return;\n }\n case \"delete\": {\n const key = positional[1];\n if (!key) {\n fail(\"/config delete requires <key>\", ctx);\n return;\n }\n deleteConfigValue(key);\n console.log(chalk.green(` Deleted ${key}`));\n return;\n }\n default: {\n fail(`Unknown subcommand: ${sub}`, ctx);\n usage();\n return;\n }\n }\n}\n","/**\n * License key verification.\n *\n * Key format: NTRP-XXXXXXXX-XXXXXXXX-XXXXXXXX\n * Part 1: random payload (hex)\n * Part 2: edition flag + expiry (hex-encoded)\n * Part 3: HMAC-SHA256 signature truncated to 8 hex chars\n *\n * Keys are generated offline with a shared secret.\n * The CLI validates the signature locally — no server needed.\n */\n\nimport { createHmac } from \"crypto\";\nimport { getConfigValue } from \"../config/store.js\";\n\n// Embedded in the built binary. Not true security — just a speed bump\n// to prevent casual key forging. Real protection comes from the value\n// of the product + support, not DRM.\nconst SIGNING_SECRET = \"ntrp-gtm-health-2026\";\n\nexport interface LicenseInfo {\n valid: boolean;\n edition: \"pro\" | \"team\" | \"trial\";\n expiresAt: Date | null;\n message: string;\n}\n\n/**\n * Validate a license key string.\n */\nexport function validateLicenseKey(key: string): LicenseInfo {\n const invalid = (msg: string): LicenseInfo => ({\n valid: false,\n edition: \"trial\",\n expiresAt: null,\n message: msg,\n });\n\n if (!key || !key.startsWith(\"NTRP-\")) {\n return invalid(\"Invalid key format\");\n }\n\n const parts = key.replace(\"NTRP-\", \"\").split(\"-\");\n if (parts.length !== 3) {\n return invalid(\"Invalid key format\");\n }\n\n const [payload, meta, signature] = parts as [string, string, string];\n\n // Verify HMAC signature\n const dataToSign = `${payload}-${meta}`;\n const expectedSig = createHmac(\"sha256\", SIGNING_SECRET)\n .update(dataToSign)\n .digest(\"hex\")\n .slice(0, 8);\n\n if (signature !== expectedSig) {\n return invalid(\"Invalid license key\");\n }\n\n // Decode meta: first 2 chars = edition, rest = expiry (unix timestamp hex or \"00000000\" for perpetual)\n const editionCode = meta.slice(0, 2);\n const expiryHex = meta.slice(2);\n\n const edition = editionCode === \"01\" ? \"pro\"\n : editionCode === \"02\" ? \"team\"\n : \"trial\";\n\n const expiryTs = parseInt(expiryHex, 16);\n const expiresAt = expiryTs > 0 ? new Date(expiryTs * 1000) : null;\n\n if (expiresAt && expiresAt < new Date()) {\n return invalid(`License expired on ${expiresAt.toISOString().slice(0, 10)}`);\n }\n\n return {\n valid: true,\n edition,\n expiresAt,\n message: `${edition} license${expiresAt ? ` (expires ${expiresAt.toISOString().slice(0, 10)})` : \" (perpetual)\"}`,\n };\n}\n\n/**\n * Check the stored license key. Returns LicenseInfo.\n */\nexport function checkLicense(): LicenseInfo {\n const key = getConfigValue(\"license-key\");\n if (!key) {\n return {\n valid: false,\n edition: \"trial\",\n expiresAt: null,\n message: \"No license key found. Run: ntrp activate <key>\",\n };\n }\n return validateLicenseKey(key);\n}\n","/**\n * ntrp activate <key> — activate a license key.\n */\n\nimport chalk from \"chalk\";\nimport { setConfigValue } from \"../config/store.js\";\nimport { validateLicenseKey } from \"../license/verify.js\";\nimport { parseArgs } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\n\nexport async function handler(args: string[], _ctx: Context): Promise<void> {\n const { positional } = parseArgs(args);\n const key = positional[0];\n\n if (!key) {\n console.error(chalk.red(\"\\n Usage: /activate <key>\"));\n console.error(chalk.dim(\" License key format: NTRP-XXXX-XXXX-XXXX\\n\"));\n process.exit(1);\n }\n\n const result = validateLicenseKey(key);\n if (!result.valid) {\n console.error(chalk.red(`\\n Invalid license key: ${result.message}\\n`));\n process.exit(1);\n }\n\n setConfigValue(\"license-key\", key);\n console.log(chalk.green(`\\n License activated: ${result.message}\\n`));\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { describeLlmReadiness, getStoredApiKey, hasEnvApiKeyHint, hasAnyLlmProvider } from \"../ai/repl-api.js\";\nimport { loadLlmConfig } from \"../config/llm-config.js\";\nimport { ntrpHome, getConfigValue, setConfigValue } from \"../config/store.js\";\nimport type { LlmProvider } from \"../types.js\";\nimport { profileExists, profilePath, saveProfile } from \"../config/profile.js\";\nimport { checkLicense } from \"../license/verify.js\";\nimport type { CompanyProfile, SalesMotion } from \"../types.js\";\n\nexport interface SetupCheckResult {\n ntrp_home: string;\n writable: boolean;\n profile: { exists: boolean; path: string };\n config: {\n api_key: boolean;\n api_key_env_hint?: boolean;\n default_format?: string;\n export_dir?: string;\n llm?: {\n configured: boolean;\n primary: LlmProvider;\n failover_order: LlmProvider[];\n tier: string;\n auto_failover: boolean;\n anthropic: boolean;\n openai: boolean;\n };\n };\n license: {\n valid: boolean;\n message: string;\n };\n}\n\nexport function setupCheck(): SetupCheckResult {\n const home = ntrpHome();\n let writable = false;\n try {\n mkdirSync(home, { recursive: true });\n const probe = join(home, \".write-check\");\n writeFileSync(probe, \"ok\\n\");\n writable = true;\n } catch {\n writable = false;\n }\n const license = checkLicense();\n const apiKey = getStoredApiKey();\n const llmCfg = loadLlmConfig();\n const llmReady = describeLlmReadiness();\n return {\n ntrp_home: home,\n writable,\n profile: { exists: profileExists(), path: profilePath() },\n config: {\n api_key: Boolean(apiKey) || hasAnyLlmProvider(),\n api_key_env_hint: hasEnvApiKeyHint(),\n default_format: getConfigValue(\"default-format\"),\n export_dir: getConfigValue(\"export-dir\"),\n llm: {\n configured: hasAnyLlmProvider(),\n primary: llmCfg.primary,\n failover_order: llmCfg.failoverOrder,\n tier: llmCfg.tier,\n auto_failover: llmCfg.autoFailover,\n anthropic: llmReady.anthropic,\n openai: llmReady.openai,\n },\n },\n license: {\n valid: license.valid,\n message: license.message,\n },\n };\n}\n\nexport function readProfileInput(pathOrDash: string): Partial<CompanyProfile> {\n const raw = pathOrDash === \"-\" ? readFileSync(0, \"utf-8\") : readFileSync(pathOrDash, \"utf-8\");\n return JSON.parse(raw) as Partial<CompanyProfile>;\n}\n\nexport function writeAgentProfile(input: Partial<CompanyProfile>): CompanyProfile {\n const now = new Date().toISOString();\n const profile: CompanyProfile = {\n schema_version: 1,\n company_name: input.company_name ?? \"\",\n company_url: input.company_url,\n industry: input.industry ?? \"\",\n product_description: input.product_description ?? \"\",\n target_customer: input.target_customer ?? \"\",\n sales_motion: (input.sales_motion ?? \"mid_market\") as SalesMotion,\n average_deal_size: input.average_deal_size,\n sales_cycle_days: input.sales_cycle_days,\n primary_crm: input.primary_crm,\n engagement_tool: input.engagement_tool,\n user_scope: input.user_scope,\n custom_context: input.custom_context,\n created_at: input.created_at ?? now,\n updated_at: input.updated_at ?? now,\n };\n saveProfile(profile);\n return profile;\n}\n\nexport function applyAgentConfig(opts: {\n defaultFormat?: string;\n apiKey?: string;\n openaiApiKey?: string;\n llmPrimary?: string;\n licenseKey?: string;\n exportDir?: string;\n}): void {\n if (opts.defaultFormat) setConfigValue(\"default-format\", opts.defaultFormat);\n if (opts.apiKey) setConfigValue(\"api-key\", opts.apiKey);\n if (opts.openaiApiKey) setConfigValue(\"openai-api-key\", opts.openaiApiKey);\n if (opts.llmPrimary === \"anthropic\" || opts.llmPrimary === \"openai\") {\n setConfigValue(\"llm-primary\", opts.llmPrimary);\n }\n if (opts.licenseKey) setConfigValue(\"license-key\", opts.licenseKey);\n if (opts.exportDir) setConfigValue(\"export-dir\", opts.exportDir);\n}\n\nexport function fileExists(path: string): boolean {\n return existsSync(path);\n}\n","import chalk from \"chalk\";\nimport { parseArgs, getString } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { emitError, emitResult, isStructuredOutput } from \"../io/emit.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport { applyAgentConfig, readProfileInput, setupCheck, writeAgentProfile } from \"../services/setup.js\";\nimport type { CompanyProfile } from \"../types.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { positional, flags } = parseArgs(args);\n const sub = positional[0] ?? \"check\";\n\n try {\n switch (sub) {\n case \"check\": {\n const result = setupCheck();\n if (isStructuredOutput(ctx.execution)) {\n emitResult(\"setup\", { action: \"check\", ...result });\n return;\n }\n console.log();\n console.log(chalk.bold(\" Setup Check\"));\n console.log(` NTRP home: ${result.ntrp_home}`);\n console.log(` Writable: ${result.writable ? \"yes\" : \"no\"}`);\n console.log(` Profile: ${result.profile.exists ? \"ready\" : \"missing\"} (${result.profile.path})`);\n const llm = result.config.llm;\n if (llm) {\n const engines = (llm.anthropic ? 1 : 0) + (llm.openai ? 1 : 0);\n console.log(` Engines: ${engines} · default ${llm.primary} · tier ${llm.tier}`);\n console.log(` Anthropic: ${llm.anthropic ? \"set\" : \"missing\"} · OpenAI: ${llm.openai ? \"set\" : \"missing\"}`);\n console.log(` Auto-failover: ${llm.auto_failover ? \"on\" : \"off\"}`);\n } else {\n console.log(\" Engines: missing\");\n }\n console.log(` License: ${result.license.valid ? \"valid\" : \"missing/invalid\"} - ${result.license.message}`);\n console.log();\n return;\n }\n case \"agent\": {\n const profilePath = getString(flags, \"profile\");\n let profilePatch: Partial<CompanyProfile> = {};\n if (profilePath) {\n profilePatch = readProfileInput(profilePath);\n } else {\n profilePatch = {\n company_name: getString(flags, \"company-name\") ?? \"\",\n company_url: getString(flags, \"company-url\"),\n industry: getString(flags, \"industry\") ?? \"\",\n product_description: getString(flags, \"product-description\") ?? \"\",\n target_customer: getString(flags, \"target-customer\") ?? \"\",\n sales_motion: getString(flags, \"sales-motion\") as CompanyProfile[\"sales_motion\"] | undefined,\n };\n }\n\n applyAgentConfig({\n defaultFormat: getString(flags, \"default-format\"),\n apiKey: getString(flags, \"api-key\"),\n openaiApiKey: getString(flags, \"openai-api-key\"),\n llmPrimary: getString(flags, \"llm-primary\"),\n licenseKey: getString(flags, \"license-key\"),\n exportDir: getString(flags, \"export-dir\"),\n });\n const profile = writeAgentProfile(profilePatch);\n const result = { action: \"agent\", profile, check: setupCheck() };\n if (isStructuredOutput(ctx.execution)) {\n emitResult(\"setup\", result);\n return;\n }\n console.log(chalk.green(`\\n Agent setup written for ${profile.company_name || \"NTRP\"}.\\n`));\n return;\n }\n default:\n throw new NtrpError(\"unknown_setup_command\", `Unknown setup command: ${sub}`, ExitCode.Usage);\n }\n } catch (err) {\n if (isStructuredOutput(ctx.execution)) {\n emitError(\"setup\", err);\n }\n console.error(chalk.red(String(err)));\n process.exit(err instanceof NtrpError ? err.exitCode : 1);\n }\n}\n","import chalk from \"chalk\";\nimport { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Context } from \"../cli/context.js\";\nimport { recordMessage, saveSessionState, type Deliverable } from \"../cli/context.js\";\nimport { getExportsDir } from \"../config/store.js\";\nimport { paint } from \"../ui/theme.js\";\nimport { resolveConversationPhase } from \"./phase.js\";\nimport { proposeScopeFromIntent, confirmScope, isScopeConfirmInput, isScopeAdjustInput, isSkipClarifier } from \"./scope.js\";\nimport { refreshGapAudit } from \"./gap-audit.js\";\nimport { printGapCard } from \"./gap-card.js\";\nimport { runConversationCompute, isComputeIntent } from \"./compute.js\";\nimport { buildDeliverableDraft, inferHandoffTarget, isShipIntent } from \"./handoff-draft.js\";\nimport { createPromptSession } from \"../cli/prompts.js\";\n\nconst ORIENT_HINT_PRINTED = Symbol.for(\"ntrp.orientHint\");\nconst TIME_CLARIFIER = /\\b(q[1-4]|quarter|last \\d+ months?|ytd|6 months|12 months)\\b/i;\n\nfunction printScopeProposal(ctx: Context): void {\n if (!ctx.scope) return;\n const lens =\n ctx.scope.primary_lens === \"revenue_metrics\" ? \"SaaS metrics\" : \"pipeline health\";\n console.log();\n console.log(\" \" + chalk.bold(\"Proposed focus\"));\n console.log(\" \" + chalk.dim(`Lens: `) + paint(\"accent\", lens));\n console.log(\" \" + chalk.dim(`Intent: ${ctx.scope.intent_summary}`));\n if (ctx.scope.audience) {\n console.log(\" \" + chalk.dim(`Audience: ${ctx.scope.audience}`));\n }\n if (ctx.scope.time_horizon) {\n console.log(\" \" + chalk.dim(`Period: ${ctx.scope.time_horizon}`));\n }\n console.log();\n console.log(\n \" \" + chalk.dim(\"Confirm? \") + chalk.cyan(\"yes\") + chalk.dim(\" · \") + chalk.cyan(\"adjust\"),\n );\n console.log();\n}\n\n/** Keyless handler for orient, scope, and awaiting_data phases. */\nexport async function handleDeterministic(\n input: string,\n ctx: Context,\n): Promise<string | void> {\n const phase = resolveConversationPhase(ctx);\n const line = input.trim();\n\n if (phase === \"orient\") {\n if (!(ctx as Context & { [ORIENT_HINT_PRINTED]?: boolean })[ORIENT_HINT_PRINTED]) {\n console.log();\n console.log(\n \" \" +\n chalk.dim(\"What do you want to look at? \") +\n chalk.dim('(e.g. \"pipeline health\", \"is NRR real?\", \"board deck on Q3\")'),\n );\n console.log();\n (ctx as Context & { [ORIENT_HINT_PRINTED]: boolean })[ORIENT_HINT_PRINTED] = true;\n }\n\n const proposal = proposeScopeFromIntent(line);\n ctx.scope = proposal.scope;\n if (proposal.recommend_companion) {\n ctx.analysis.recommended = proposal.recommend_companion;\n }\n saveSessionState(ctx);\n recordMessage(ctx, \"user\", line);\n\n if (proposal.clarifying_question) {\n console.log(\" \" + chalk.dim(proposal.clarifying_question));\n recordMessage(ctx, \"agent\", proposal.clarifying_question);\n return \"Scope proposed\";\n }\n\n printScopeProposal(ctx);\n recordMessage(ctx, \"agent\", `Proposed ${proposal.scope.primary_lens} analysis: ${proposal.scope.intent_summary}`);\n return \"Scope proposed\";\n }\n\n if (phase === \"scope\") {\n recordMessage(ctx, \"user\", line);\n\n if (isScopeAdjustInput(line)) {\n console.log();\n console.log(\" \" + chalk.dim(\"What should we focus on instead?\"));\n ctx.scope = undefined;\n saveSessionState(ctx);\n return \"Scope cleared\";\n }\n\n if (isSkipClarifier(line) && ctx.scope && !ctx.scope.confirmed_at) {\n printScopeProposal(ctx);\n return \"Awaiting confirm\";\n }\n\n if (isScopeConfirmInput(line)) {\n if (!ctx.scope) return;\n confirmScope(ctx);\n saveSessionState(ctx);\n const audit = await refreshGapAudit(ctx);\n printGapCard(audit);\n recordMessage(ctx, \"agent\", \"Scope confirmed. Data check complete.\");\n return \"Scope confirmed\";\n }\n\n if (!ctx.scope?.confirmed_at) {\n if (/\\b(board|leadership|exec|cro|ceo|investor)\\b/i.test(line) && ctx.scope) {\n ctx.scope.audience = \"board\";\n saveSessionState(ctx);\n printScopeProposal(ctx);\n recordMessage(ctx, \"agent\", \"Noted — board audience. Confirm when ready.\");\n return \"Audience set\";\n }\n if (/\\b(ops|operations|revops)\\b/i.test(line) && ctx.scope) {\n ctx.scope.audience = \"ops\";\n saveSessionState(ctx);\n printScopeProposal(ctx);\n return \"Audience set\";\n }\n if (TIME_CLARIFIER.test(line) && ctx.scope) {\n ctx.scope.time_horizon = line.trim();\n saveSessionState(ctx);\n printScopeProposal(ctx);\n return \"Horizon set\";\n }\n const proposal = proposeScopeFromIntent(line);\n ctx.scope = proposal.scope;\n saveSessionState(ctx);\n printScopeProposal(ctx);\n recordMessage(ctx, \"agent\", `Proposed focus: ${proposal.scope.intent_summary}`);\n return \"Scope updated\";\n }\n\n return;\n }\n\n if (phase === \"awaiting_data\") {\n recordMessage(ctx, \"user\", line);\n\n if (isComputeIntent(line)) {\n const audit = ctx.gapAudit ?? (await refreshGapAudit(ctx));\n if (!audit.can_compute) {\n printGapCard(audit);\n return \"Cannot compute yet\";\n }\n return runConversationCompute(ctx);\n }\n\n const audit = await refreshGapAudit(ctx);\n printGapCard(audit);\n recordMessage(\n ctx,\n \"agent\",\n \"Still waiting on data — paste a CSV path or say \\\"use demo data\\\".\",\n );\n return \"Awaiting data\";\n }\n\n return;\n}\n\nexport async function handleDeliverFlow(input: string, ctx: Context): Promise<string | void> {\n const target = inferHandoffTarget(input);\n const draft = await buildDeliverableDraft(ctx, target);\n if (!draft) {\n console.log();\n console.log(\" \" + chalk.red(\"Nothing to ship yet — load data and run analysis first.\"));\n console.log();\n ctx.deliverIntent = false;\n return;\n }\n\n console.log();\n console.log(\" \" + chalk.bold(\"Deliverable preview\"));\n console.log(\" \" + chalk.dim(\"─\".repeat(56)));\n const preview = draft.markdown.split(\"\\n\").slice(0, 24);\n for (const l of preview) {\n console.log(\" \" + chalk.dim(l));\n }\n if (draft.markdown.split(\"\\n\").length > 24) {\n console.log(\" \" + chalk.dim(\"…\"));\n }\n console.log(\" \" + chalk.dim(\"─\".repeat(56)));\n console.log();\n\n if (!ctx.rl) {\n console.log(\" \" + chalk.dim(\"Run interactively to confirm write.\"));\n return;\n }\n\n const prompts = createPromptSession(ctx.rl, ctx);\n try {\n const ok = await prompts.confirm(\"Write handoff prompt to exports and mark delivered?\", true);\n if (!ok) {\n ctx.deliverIntent = false;\n console.log(\" \" + chalk.dim(\"Kept as preview only — session not marked delivered.\"));\n return \"Preview only\";\n }\n } finally {\n prompts.close();\n }\n\n const stamp = new Date().toISOString().replace(/T/, \"-\").replace(/:/g, \"\").slice(0, 15);\n const out = join(getExportsDir(), `handoff-${target}-${stamp}.md`);\n writeFileSync(out, draft.markdown, \"utf-8\");\n\n const d: Deliverable = {\n kind: `prompt:${target}`,\n at: new Date().toISOString(),\n path: out,\n };\n ctx.deliverables.push(d);\n ctx.stage = \"delivered\";\n ctx.deliverIntent = false;\n saveSessionState(ctx);\n\n console.log();\n console.log(\" \" + paint(\"accent\", `Handoff prompt ready (${target})`));\n console.log(\" \" + chalk.dim(out));\n console.log(\" \" + chalk.dim(\"Paste into another agent to build the deliverable.\"));\n console.log();\n\n recordMessage(ctx, \"user\", input);\n recordMessage(ctx, \"agent\", `Wrote ${target} handoff prompt to ${out}`);\n return `${target} prompt delivered`;\n}\n\nexport async function handleExploreWithoutKey(ctx: Context): Promise<void> {\n console.log();\n console.log(\" \" + chalk.red(\"AI interpretation needs an LLM API key saved in config.\"));\n console.log(\n \" \" + chalk.dim(\"Set with: \")\n + paint(\"accent\", \"/config set api-key\")\n + chalk.dim(\" (Anthropic) or \")\n + paint(\"accent\", \"/config set openai-api-key\"),\n );\n console.log(\" \" + chalk.dim(\"Number crunching works without a key — only Q&A in the REPL needs one.\"));\n if (ctx.gapAudit) {\n printGapCard(ctx.gapAudit);\n }\n console.log();\n}\n","/**\n * Explore-phase response mode — brief follow-ups vs deep investigation.\n */\n\nimport type { Context } from \"../cli/context.js\";\nimport { isAnalysisReady } from \"../cli/context.js\";\n\nexport type ExploreResponseMode = \"brief\" | \"deep\";\n\n/** Prompt experiment flags for verbosity investigation (Phase 3). */\nexport type PromptExperiment = \"production\" | \"baseline\" | \"a\" | \"b\" | \"c\";\n\nconst DEEP_DIVE_PATTERNS = [\n /\\b(break down|breakdown|drill|dig deeper|show me|list all|by rep|by stage|by segment|query|sql|detail|expand|elaborate|full analysis|walk me through|pull up|give me the data)\\b/i,\n /\\b(how many|which deals|which accounts|who owns|top \\d+|every deal|all stuck)\\b/i,\n];\n\nexport function isDeepDiveQuestion(question: string): boolean {\n return DEEP_DIVE_PATTERNS.some((p) => p.test(question.trim()));\n}\n\n/**\n * Resolve how the NL agent should respond.\n * Default brief after analysis; deep when the user asks for new cuts or data.\n */\nexport function resolveExploreResponseMode(\n question: string,\n ctx: Context,\n priorTurnCount: number,\n): ExploreResponseMode {\n if (isDeepDiveQuestion(question)) return \"deep\";\n if (isAnalysisReady(ctx)) return \"brief\";\n if (ctx.stage === \"analyzed\" || ctx.analysis.completed.length > 0) return \"brief\";\n // Pre-analysis first question may need tools to ground an answer.\n if (priorTurnCount === 0) return \"deep\";\n return \"brief\";\n}\n\nexport function parsePromptExperiment(raw: string | undefined): PromptExperiment {\n if (!raw || raw === \"production\") return \"production\";\n if (raw === \"baseline\" || raw === \"a\" || raw === \"b\" || raw === \"c\") return raw;\n return \"production\";\n}\n","/**\n * Conversation threading utilities — provider-neutral LlmMessage compaction.\n */\n\nimport type { LlmMessage } from \"./llm/types.js\";\n\nconst APPROX_CHARS_PER_TOKEN = 4;\nexport const DEFAULT_THREAD_CHAR_BUDGET = 24_000;\nconst MIN_RECENT_MESSAGES = 6;\n\nfunction summarizeAssistantTurn(text: string, max = 360): string {\n const plain = text\n .replace(/#{1,6}\\s+/g, \"\")\n .replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n .replace(/\\*([^*]+)\\*/g, \"$1\")\n .replace(/`([^`]+)`/g, \"$1\")\n .replace(/^---\\s*$/gm, \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n if (plain.length <= max) return plain;\n const sentences = plain.match(/[^.!?]+[.!?]+/g) ?? [plain];\n let out = \"\";\n for (const sentence of sentences) {\n if ((out + sentence).length > max) break;\n out += sentence;\n if (out.length >= Math.min(max * 0.55, 200)) break;\n }\n const trimmed = out.trim();\n return trimmed.length > 0 ? trimmed : plain.slice(0, max).replace(/\\s+\\S*$/, \"\") + \"…\";\n}\n\nconst ASSISTANT_SUMMARIZE_THRESHOLD = 420;\n\nfunction mergeConsecutive(messages: LlmMessage[]): LlmMessage[] {\n const out: LlmMessage[] = [];\n for (const message of messages) {\n if (message.role !== \"user\" && message.role !== \"assistant\") continue;\n let text = message.content.trim();\n if (!text) continue;\n if (message.role === \"assistant\" && text.length > ASSISTANT_SUMMARIZE_THRESHOLD) {\n text = summarizeAssistantTurn(text);\n }\n const last = out[out.length - 1];\n if (last && last.role === message.role) {\n last.content = `${last.content}\\n\\n${text}`;\n } else {\n out.push({ role: message.role, content: text });\n }\n }\n return out;\n}\n\nexport function compactConversation(messages: LlmMessage[]): LlmMessage[] {\n const collapsed = mergeConsecutive(messages);\n while (collapsed.length > 0 && collapsed[0]!.role !== \"user\") collapsed.shift();\n while (collapsed.length > 0 && collapsed[collapsed.length - 1]!.role !== \"assistant\") collapsed.pop();\n return collapsed;\n}\n\nfunction estimateChars(messages: LlmMessage[]): number {\n return messages.reduce((sum, m) => sum + (m.content?.length ?? 0), 0);\n}\n\nexport function estimateTokens(messages: LlmMessage[]): number {\n return Math.ceil(estimateChars(messages) / APPROX_CHARS_PER_TOKEN);\n}\n\nfunction firstSentence(text: string, max = 120): string {\n const plain = text.replace(/\\s+/g, \" \").trim();\n const match = plain.match(/^(.+?[.!?])(\\s|$)/);\n const sentence = match ? match[1]! : plain;\n return sentence.length > max ? sentence.slice(0, max).replace(/\\s+\\S*$/, \"\") + \"…\" : sentence;\n}\n\nexport function boundConversation(\n messages: LlmMessage[],\n charBudget: number = DEFAULT_THREAD_CHAR_BUDGET,\n): LlmMessage[] {\n if (messages.length <= MIN_RECENT_MESSAGES) return messages;\n if (estimateChars(messages) <= charBudget) return messages;\n\n let cut = 0;\n while (cut < messages.length - MIN_RECENT_MESSAGES && estimateChars(messages.slice(cut)) > charBudget) {\n cut++;\n }\n if (cut === 0) return messages;\n\n const dropped = messages.slice(0, cut);\n let recent = messages.slice(cut);\n while (recent.length > 0 && recent[0]!.role !== \"user\") recent = recent.slice(1);\n\n const topics = dropped\n .filter((m) => m.role === \"user\")\n .map((m) => firstSentence(m.content))\n .filter(Boolean);\n\n const recap = topics.length > 0\n ? `[Earlier this session you already worked through: ${topics.join(\"; \")}. Build on these conclusions — do not re-run or re-recommend them unless the user asks you to revisit or connect them.]`\n : \"[Earlier this session you covered additional analysis. Build on it rather than repeating it.]\";\n\n return mergeConsecutive([{ role: \"user\", content: recap }, ...recent]);\n}\n\nexport function distillThread(\n rawMessages: LlmMessage[],\n charBudget: number = DEFAULT_THREAD_CHAR_BUDGET,\n): LlmMessage[] {\n return boundConversation(compactConversation(rawMessages), charBudget);\n}\n","/**\n * Embeddings provider wrapper for semantic memory recall.\n *\n * Supports Voyage AI (Anthropic's recommended partner) and OpenAI. Disabled by\n * default — semantic recall only kicks in when a provider key is present, and\n * everything degrades gracefully to keyword ranking when it isn't.\n *\n * Configuration (any of):\n * - env VOYAGE_API_KEY → Voyage\n * - env OPENAI_API_KEY → OpenAI\n * - config embeddings-provider → \"voyage\" | \"openai\" | \"none\"\n * - config voyage-api-key / openai-api-key\n */\n\nimport { getConfigValue } from \"../config/store.js\";\nimport { getOpenAiApiKey } from \"../config/llm-config.js\";\nimport type { RetrievableItem } from \"../memory/types.js\";\n\ntype Provider = \"voyage\" | \"openai\" | \"none\";\n\ninterface ProviderConfig {\n provider: Provider;\n apiKey: string;\n model: string;\n url: string;\n}\n\nconst VOYAGE_MODEL = \"voyage-3\";\nconst OPENAI_MODEL = \"text-embedding-3-small\";\n\n/** In-process cache so repeated text isn't re-embedded within a session. */\nconst cache = new Map<string, number[]>();\n\nfunction resolveConfig(): ProviderConfig | null {\n const explicit = getConfigValue(\"embeddings-provider\") as Provider | undefined;\n if (explicit === \"none\") return null;\n\n const voyageKey = process.env.VOYAGE_API_KEY ?? getConfigValue(\"voyage-api-key\");\n const openaiKey = getOpenAiApiKey();\n\n const provider: Provider = explicit ?? (voyageKey ? \"voyage\" : openaiKey ? \"openai\" : \"none\");\n\n if (provider === \"voyage\" && voyageKey) {\n return { provider, apiKey: voyageKey, model: VOYAGE_MODEL, url: \"https://api.voyageai.com/v1/embeddings\" };\n }\n if (provider === \"openai\" && openaiKey) {\n return { provider, apiKey: openaiKey, model: OPENAI_MODEL, url: \"https://api.openai.com/v1/embeddings\" };\n }\n return null;\n}\n\nexport function isEmbeddingsEnabled(): boolean {\n return resolveConfig() !== null;\n}\n\nasync function callProvider(texts: string[]): Promise<number[][] | null> {\n const cfg = resolveConfig();\n if (!cfg || texts.length === 0) return null;\n\n try {\n const res = await fetch(cfg.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${cfg.apiKey}`,\n },\n body: JSON.stringify({ input: texts, model: cfg.model }),\n });\n if (!res.ok) return null;\n const json = (await res.json()) as { data?: { embedding: number[] }[] };\n if (!json.data) return null;\n return json.data.map((d) => d.embedding);\n } catch {\n return null;\n }\n}\n\n/** Embed a single string. Returns null if embeddings are unavailable. */\nexport async function embedText(text: string): Promise<number[] | null> {\n const key = text.trim();\n if (!key) return null;\n const cached = cache.get(key);\n if (cached) return cached;\n const result = await callProvider([key]);\n const vec = result?.[0] ?? null;\n if (vec) cache.set(key, vec);\n return vec;\n}\n\n/**\n * Ensure every item has an embedding, batching the ones that don't. Items that\n * already carry a cached embedding (e.g. persisted in jsonl) are left as-is.\n */\nexport async function embedItems(items: RetrievableItem[]): Promise<RetrievableItem[]> {\n const needing: { index: number; text: string }[] = [];\n const out = items.map((it, index) => {\n if (it.embedding && it.embedding.length > 0) return { ...it };\n const cached = cache.get(it.text.trim());\n if (cached) return { ...it, embedding: cached };\n needing.push({ index, text: it.text });\n return { ...it };\n });\n\n if (needing.length === 0) return out;\n\n const vectors = await callProvider(needing.map((n) => n.text));\n if (!vectors) return out;\n\n needing.forEach((n, i) => {\n const vec = vectors[i];\n if (vec) {\n out[n.index]!.embedding = vec;\n cache.set(n.text.trim(), vec);\n }\n });\n return out;\n}\n","/**\n * Relevance ranking for memory retrieval.\n *\n * Uses semantic (embedding) similarity when an embeddings provider is\n * configured, and falls back to lexical keyword overlap otherwise. Either way\n * the corpus is small (one user's facts/strategies/knowledge), so brute-force\n * scoring in JS is more than fast enough — no vector database required.\n */\n\nimport type { RetrievableItem } from \"./types.js\";\n\nexport interface RankedItem {\n id: string;\n score: number;\n}\n\nconst STOPWORDS = new Set([\n \"the\", \"and\", \"for\", \"are\", \"was\", \"were\", \"with\", \"that\", \"this\", \"from\",\n \"have\", \"has\", \"had\", \"our\", \"your\", \"you\", \"what\", \"which\", \"how\", \"why\",\n \"who\", \"when\", \"where\", \"into\", \"about\", \"over\", \"than\", \"then\", \"they\",\n \"them\", \"their\", \"there\", \"here\", \"been\", \"being\", \"does\", \"did\", \"doing\",\n \"can\", \"could\", \"would\", \"should\", \"will\", \"shall\", \"may\", \"might\", \"must\",\n \"not\", \"but\", \"all\", \"any\", \"some\", \"more\", \"most\", \"much\", \"many\", \"very\",\n \"just\", \"like\", \"out\", \"off\", \"per\", \"via\", \"use\", \"get\", \"got\",\n]);\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length >= 3 && !STOPWORDS.has(t));\n}\n\nfunction keywordRank(query: string, items: RetrievableItem[], topK: number): RankedItem[] {\n const queryTokens = new Set(tokenize(query));\n if (queryTokens.size === 0) {\n // No usable query terms — fall back to the most recent items.\n return items.slice(-topK).reverse().map((it) => ({ id: it.id, score: 0 }));\n }\n\n const scored = items.map((it) => {\n const tokens = tokenize(it.text);\n if (tokens.length === 0) return { id: it.id, score: 0 };\n let overlap = 0;\n const seen = new Set<string>();\n for (const t of tokens) {\n if (queryTokens.has(t) && !seen.has(t)) {\n overlap++;\n seen.add(t);\n }\n }\n // Normalize so a long item isn't unfairly favored.\n return { id: it.id, score: overlap / Math.sqrt(tokens.length) };\n });\n\n const positive = scored.filter((s) => s.score > 0).sort((a, b) => b.score - a.score);\n if (positive.length > 0) return positive.slice(0, topK);\n\n // Nothing matched — still surface the most recent items so memory persists.\n return items.slice(-topK).reverse().map((it) => ({ id: it.id, score: 0 }));\n}\n\nfunction cosine(a: number[], b: number[]): number {\n let dot = 0;\n let na = 0;\n let nb = 0;\n const len = Math.min(a.length, b.length);\n for (let i = 0; i < len; i++) {\n dot += a[i]! * b[i]!;\n na += a[i]! * a[i]!;\n nb += b[i]! * b[i]!;\n }\n if (na === 0 || nb === 0) return 0;\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\n}\n\n/**\n * Rank items by relevance to a query. Returns up to topK ids, best first.\n * Attempts semantic ranking; silently falls back to keyword overlap.\n */\nexport async function rankByRelevance(\n query: string,\n items: RetrievableItem[],\n topK: number,\n): Promise<RankedItem[]> {\n if (items.length === 0) return [];\n\n try {\n const { isEmbeddingsEnabled, embedText, embedItems } = await import(\"../ai/embeddings.js\");\n if (isEmbeddingsEnabled()) {\n const queryVec = await embedText(query);\n if (queryVec) {\n const withVecs = await embedItems(items);\n const scored = withVecs\n .filter((it) => it.embedding && it.embedding.length > 0)\n .map((it) => ({ id: it.id, score: cosine(queryVec, it.embedding!) }))\n .sort((a, b) => b.score - a.score);\n if (scored.length > 0) return scored.slice(0, topK);\n }\n }\n } catch {\n // embeddings unavailable — fall through to keyword ranking\n }\n\n return keywordRank(query, items, topK);\n}\n","/**\n * Curated knowledge packs.\n *\n * External case studies, frameworks, and benchmark reports the user drops into\n * `~/.ntrp/knowledge/` (or adds via `/knowledge add <file>`). Ingested files\n * are chunked and indexed to `~/.ntrp/memory/knowledge.jsonl`, then retrieved\n * into analysis prompts so the agent can learn from work done outside the\n * platform.\n */\n\nimport { existsSync, readFileSync, appendFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { getMemoryDir } from \"../config/store.js\";\nimport { readStrategyFile } from \"../strategies/readers.js\";\nimport type { KnowledgeChunk } from \"./types.js\";\n\nconst KNOWLEDGE_FILE = \"knowledge.jsonl\";\nconst MAX_CHUNK_CHARS = 1200;\n\nfunction knowledgePath(): string {\n return join(getMemoryDir(), KNOWLEDGE_FILE);\n}\n\nexport function loadKnowledgeChunks(): KnowledgeChunk[] {\n const path = knowledgePath();\n if (!existsSync(path)) return [];\n const out: KnowledgeChunk[] = [];\n for (const line of readFileSync(path, \"utf-8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n out.push(JSON.parse(trimmed) as KnowledgeChunk);\n } catch {\n // skip malformed lines\n }\n }\n return out;\n}\n\n/** Split a long document into overlapping-free paragraph-ish chunks. */\nfunction chunkText(text: string): string[] {\n const paragraphs = text\n .split(/\\n\\s*\\n/)\n .map((p) => p.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n\n const chunks: string[] = [];\n let current = \"\";\n for (const para of paragraphs) {\n if (current.length + para.length + 1 > MAX_CHUNK_CHARS && current) {\n chunks.push(current.trim());\n current = \"\";\n }\n if (para.length > MAX_CHUNK_CHARS) {\n // Hard-split an oversized paragraph.\n for (let i = 0; i < para.length; i += MAX_CHUNK_CHARS) {\n chunks.push(para.slice(i, i + MAX_CHUNK_CHARS).trim());\n }\n } else {\n current += (current ? \" \" : \"\") + para;\n }\n }\n if (current.trim()) chunks.push(current.trim());\n return chunks;\n}\n\nexport interface KnowledgeAddResult {\n doc_id: string;\n title: string;\n source_path: string | null;\n chunks: number;\n}\n\n/** Ingest a file (md/text/pdf/yaml) into the knowledge index. */\nexport async function addKnowledgeFile(pathOrDash: string, titleOverride?: string): Promise<KnowledgeAddResult> {\n const doc = await readStrategyFile(pathOrDash);\n const title =\n titleOverride ??\n (doc.metadata.title as string | undefined) ??\n doc.raw_text.match(/^#\\s+(.+)$/m)?.[1]?.trim() ??\n (doc.source_path ? doc.source_path.split(\"/\").pop()! : \"Untitled knowledge\");\n\n const docId = randomUUID();\n const createdAt = new Date().toISOString();\n const pieces = chunkText(doc.raw_text);\n\n const rows: KnowledgeChunk[] = pieces.map((text, i) => ({\n id: randomUUID(),\n doc_id: docId,\n title,\n source_path: doc.source_path,\n text,\n chunk_index: i,\n created_at: createdAt,\n }));\n\n try {\n appendFileSync(knowledgePath(), rows.map((r) => JSON.stringify(r)).join(\"\\n\") + (rows.length ? \"\\n\" : \"\"));\n } catch {\n // best-effort\n }\n\n return { doc_id: docId, title, source_path: doc.source_path, chunks: rows.length };\n}\n\nexport interface KnowledgeDocSummary {\n doc_id: string;\n title: string;\n source_path: string | null;\n chunks: number;\n created_at: string;\n}\n\n/** Summarize indexed knowledge docs (one row per document). */\nexport function listKnowledgeDocs(): KnowledgeDocSummary[] {\n const chunks = loadKnowledgeChunks();\n const byDoc = new Map<string, KnowledgeDocSummary>();\n for (const c of chunks) {\n const existing = byDoc.get(c.doc_id);\n if (existing) {\n existing.chunks++;\n } else {\n byDoc.set(c.doc_id, {\n doc_id: c.doc_id,\n title: c.title,\n source_path: c.source_path,\n chunks: 1,\n created_at: c.created_at,\n });\n }\n }\n return Array.from(byDoc.values()).sort((a, b) => b.created_at.localeCompare(a.created_at));\n}\n\n/** Discover unindexed files sitting in the knowledge dir (for hints). */\nexport function listKnowledgeDirFiles(dir: string): string[] {\n try {\n return readdirSync(dir).filter((n) => !n.toLowerCase().endsWith(\"readme.md\") && /\\.(md|markdown|txt|pdf|yaml|yml)$/i.test(n));\n } catch {\n return [];\n }\n}\n","/**\n * Durable analyst memory store.\n *\n * Persists to `~/.ntrp/memory/`:\n * - facts.jsonl — learned facts, decisions, and preferences\n * - ledger.jsonl — analyses already run (so the agent builds forward)\n *\n * Also assembles the cross-surface \"memory block\" injected into the analysis\n * prompt, pulling together facts, the analysis ledger, active strategies,\n * logged wins, and (Phase 3) ingested knowledge — ranked by relevance.\n */\n\nimport { existsSync, readFileSync, appendFileSync, readdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { getMemoryDir, getWinsDir } from \"../config/store.js\";\nimport { rankByRelevance } from \"./retrieval.js\";\nimport { loadKnowledgeChunks } from \"./knowledge.js\";\nimport type { MemoryFact, FactKind, MemorySource, LedgerEntry } from \"./types.js\";\n\nconst FACTS_FILE = \"facts.jsonl\";\nconst LEDGER_FILE = \"ledger.jsonl\";\n\n// ─── Low-level JSONL helpers ─────────────────────────────────────────\n\nfunction memPath(file: string): string {\n return join(getMemoryDir(), file);\n}\n\nfunction readJsonl<T>(file: string): T[] {\n const path = memPath(file);\n if (!existsSync(path)) return [];\n const out: T[] = [];\n for (const line of readFileSync(path, \"utf-8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n out.push(JSON.parse(trimmed) as T);\n } catch {\n // skip malformed lines\n }\n }\n return out;\n}\n\nfunction appendJsonl(file: string, obj: unknown): void {\n try {\n appendFileSync(memPath(file), JSON.stringify(obj) + \"\\n\");\n } catch {\n // best-effort; never crash the REPL over memory writes\n }\n}\n\n/** Rewrite an entire jsonl file (used to backfill cached embeddings). */\nexport function rewriteJsonl(file: string, rows: unknown[]): void {\n try {\n writeFileSync(memPath(file), rows.map((r) => JSON.stringify(r)).join(\"\\n\") + (rows.length ? \"\\n\" : \"\"));\n } catch {\n // best-effort\n }\n}\n\nexport const FACTS_JSONL = FACTS_FILE;\nexport const LEDGER_JSONL = LEDGER_FILE;\n\n// ─── Light PII guard for free text ───────────────────────────────────\n\n/**\n * Redact obvious PII (email addresses) from free text before persisting it to\n * the durable store. Names/company references are intentionally preserved —\n * they are usually the *substance* of a business fact — but raw contact\n * details should never be written to memory.\n */\nexport function scrubText(text: string): string {\n return text.replace(/[\\w.+-]+@[\\w-]+\\.[\\w.-]+/g, \"[email]\").trim();\n}\n\n// ─── Facts ───────────────────────────────────────────────────────────\n\nexport interface AddFactInput {\n text: string;\n kind?: FactKind;\n source?: MemorySource;\n session_id?: string;\n}\n\nexport function addFact(input: AddFactInput): MemoryFact {\n const fact: MemoryFact = {\n id: randomUUID(),\n text: scrubText(input.text),\n kind: input.kind ?? \"fact\",\n source: input.source ?? \"user\",\n session_id: input.session_id,\n created_at: new Date().toISOString(),\n };\n appendJsonl(FACTS_FILE, fact);\n return fact;\n}\n\nexport function listFacts(): MemoryFact[] {\n return readJsonl<MemoryFact>(FACTS_FILE);\n}\n\n// ─── Analysis ledger ─────────────────────────────────────────────────\n\nexport interface RecordAnalysisInput {\n question: string;\n answer: string;\n tools: string[];\n session_id?: string;\n}\n\n/** Distill an answer to a one-line summary for the ledger. */\nfunction summarizeAnswer(answer: string): string {\n const plain = answer\n .replace(/[#*`>_]/g, \"\")\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n .replace(/\\s+/g, \" \")\n .trim();\n const match = plain.match(/^(.+?[.!?])(\\s|$)/);\n const sentence = match ? match[1]! : plain;\n return sentence.length > 200 ? sentence.slice(0, 200).replace(/\\s+\\S*$/, \"\") + \"…\" : sentence;\n}\n\nexport function recordAnalysis(input: RecordAnalysisInput): LedgerEntry {\n const entry: LedgerEntry = {\n id: randomUUID(),\n question: scrubText(input.question).slice(0, 300),\n summary: scrubText(summarizeAnswer(input.answer)),\n tools: input.tools,\n session_id: input.session_id,\n created_at: new Date().toISOString(),\n };\n appendJsonl(LEDGER_FILE, entry);\n return entry;\n}\n\nexport function listLedger(): LedgerEntry[] {\n return readJsonl<LedgerEntry>(LEDGER_FILE);\n}\n\n// ─── Strategies + wins readers (for the memory block) ────────────────\n\ninterface NamedSnippet {\n id: string;\n title: string;\n text: string;\n}\n\nasync function loadStrategySnippets(): Promise<NamedSnippet[]> {\n try {\n const { getStrategies } = await import(\"../services/strategy.js\");\n const strategies = await getStrategies(\"all\");\n return strategies\n .filter((s) => s.status === \"active\" || s.status === \"draft\")\n .map((s) => ({\n id: `strategy:${s.slug}`,\n title: s.title,\n text: `${s.title}. Goal: ${s.goal} Hypothesis: ${s.hypothesis} Target: ${s.target_segment}`,\n }));\n } catch {\n return [];\n }\n}\n\nfunction loadWinSnippets(): NamedSnippet[] {\n try {\n const dir = getWinsDir();\n const out: NamedSnippet[] = [];\n for (const name of readdirSync(dir)) {\n if (!name.endsWith(\".md\") || name.toLowerCase() === \"readme.md\") continue;\n const raw = readFileSync(join(dir, name), \"utf-8\");\n const title = raw.match(/^#\\s+(.+)$/m)?.[1]?.trim() ?? name.replace(/\\.md$/, \"\");\n const body = raw.replace(/^#.*$/m, \"\").replace(/\\s+/g, \" \").trim().slice(0, 300);\n out.push({ id: `win:${name}`, title, text: `${title}. ${body}` });\n }\n return out;\n } catch {\n return [];\n }\n}\n\n// ─── The memory block ────────────────────────────────────────────────\n\ninterface BuildMemoryOptions {\n maxFacts?: number;\n maxLedger?: number;\n maxStrategies?: number;\n maxWins?: number;\n maxKnowledge?: number;\n}\n\n/**\n * Assemble the durable-memory markdown block injected into the analysis\n * prompt, ranked by relevance to the user's current question.\n */\nexport async function buildMemoryBlock(query: string, opts: BuildMemoryOptions = {}): Promise<string> {\n const maxFacts = opts.maxFacts ?? 8;\n const maxLedger = opts.maxLedger ?? 6;\n const maxStrategies = opts.maxStrategies ?? 4;\n const maxWins = opts.maxWins ?? 3;\n const maxKnowledge = opts.maxKnowledge ?? 4;\n\n const facts = listFacts();\n const ledger = listLedger();\n const strategies = await loadStrategySnippets();\n const wins = loadWinSnippets();\n let knowledge: import(\"./types.js\").KnowledgeChunk[] = [];\n try {\n knowledge = loadKnowledgeChunks();\n } catch {\n knowledge = [];\n }\n\n const sections: string[] = [];\n\n if (facts.length > 0) {\n const ranked = await rankByRelevance(query, facts.map((f) => ({ id: f.id, text: f.text, embedding: f.embedding })), maxFacts);\n const chosen = ranked.map((r) => facts.find((f) => f.id === r.id)!).filter(Boolean);\n if (chosen.length > 0) {\n sections.push(\n \"Known facts & decisions:\\n\" +\n chosen.map((f) => `- ${f.text}${f.kind === \"decision\" ? \" (decision)\" : f.kind === \"preference\" ? \" (preference)\" : \"\"}`).join(\"\\n\"),\n );\n }\n }\n\n if (strategies.length > 0) {\n const ranked = await rankByRelevance(query, strategies, maxStrategies);\n const chosen = ranked.map((r) => strategies.find((s) => s.id === r.id)!).filter(Boolean);\n if (chosen.length > 0) {\n sections.push(\"Active strategies:\\n\" + chosen.map((s) => `- ${s.title}`).join(\"\\n\"));\n }\n }\n\n if (wins.length > 0) {\n const ranked = await rankByRelevance(query, wins, maxWins);\n const chosen = ranked.map((r) => wins.find((w) => w.id === r.id)!).filter(Boolean);\n if (chosen.length > 0) {\n sections.push(\"Logged wins (what has worked before):\\n\" + chosen.map((w) => `- ${w.title}`).join(\"\\n\"));\n }\n }\n\n if (knowledge.length > 0) {\n const ranked = await rankByRelevance(query, knowledge.map((k) => ({ id: k.id, text: k.text, embedding: k.embedding })), maxKnowledge);\n const chosen = ranked.map((r) => knowledge.find((k) => k.id === r.id)!).filter(Boolean);\n if (chosen.length > 0) {\n sections.push(\n \"Relevant external knowledge (case studies / frameworks you've ingested):\\n\" +\n chosen.map((k) => `- [${k.title}] ${k.text.replace(/\\s+/g, \" \").slice(0, 280)}`).join(\"\\n\"),\n );\n }\n }\n\n if (ledger.length > 0) {\n const ranked = await rankByRelevance(\n query,\n ledger.map((l) => ({ id: l.id, text: `${l.question} ${l.summary}`, embedding: l.embedding })),\n maxLedger,\n );\n const chosen = ranked.map((r) => ledger.find((l) => l.id === r.id)!).filter(Boolean);\n if (chosen.length > 0) {\n sections.push(\n \"Analyses already run for this business (do NOT repeat these unless asked to revisit or connect them):\\n\" +\n chosen.map((l) => `- \"${l.question}\" → ${l.summary}`).join(\"\\n\"),\n );\n }\n }\n\n return sections.join(\"\\n\\n\");\n}\n","import { join } from \"node:path\";\nimport { insertFinding } from \"../db/queries.js\";\nimport { runDiagnosis } from \"./diagnosis.js\";\nimport { addStrategyText, type StrategyIngestResult } from \"./strategy.js\";\nimport { proposeRepositoryExport } from \"./publish.js\";\nimport { getPlaysForVitalSign } from \"../data/playbook.js\";\nimport { getExportsDir } from \"../config/store.js\";\nimport { formatCurrency } from \"../output/formatters.js\";\nimport type { Context } from \"../cli/context.js\";\nimport type { ActionProposal } from \"../actions/types.js\";\nimport type { FindingEntry, VitalSign, VitalSignResult } from \"../types.js\";\n\nexport const SMOKE_TRIGGER_PHRASE = \"the monkey is green and riding a pelican\";\n\nexport interface SmokeProtocolResult {\n answer: string;\n finding: FindingEntry;\n strategy: StrategyIngestResult[\"strategy\"];\n action_proposal: ActionProposal;\n health: {\n overall_score: number;\n overall_status: string;\n gating_vital_sign: VitalSign;\n total_value_at_risk: number | null;\n };\n}\n\nexport function isSmokeProtocolTrigger(input: string): boolean {\n return normalize(input).includes(SMOKE_TRIGGER_PHRASE);\n}\n\nexport async function runSmokeProtocol(_input: string, ctx: Context): Promise<SmokeProtocolResult> {\n const diagnosis = await runDiagnosis({ findings: false, segments: true });\n ctx.snapshot.computeResult = {\n aggregate: diagnosis.health,\n segments: diagnosis.segments,\n };\n ctx.snapshot.divergences = diagnosis.divergences;\n\n const gatingVital = diagnosis.health.vital_signs.find((vs) => vs.vital_sign === diagnosis.health.gating_vital_sign)\n ?? diagnosis.health.vital_signs[0];\n const play = getPlaysForVitalSign(diagnosis.health.gating_vital_sign)[0];\n const finding = buildSmokeFinding(\n diagnosis.health.vital_signs,\n gatingVital,\n play?.id ?? \"review-playbook\",\n play?.name ?? \"Review the playbook\",\n );\n\n await insertFinding({\n findings: [finding],\n model_used: \"smoke-protocol-v1\",\n raw_prompt: `Smoke trigger: ${SMOKE_TRIGGER_PHRASE}`,\n });\n\n const strategyResult = await addStrategyText(renderSmokeStrategy(finding, play?.name ?? \"Review the playbook\"), {\n useAi: false,\n sourceMetadata: {\n connector_kind: \"smoke_protocol\",\n connector_name: \"Monkey Pelican Trigger\",\n sync_mode: \"local_fixture\",\n write_back: \"approval_required_future\",\n trigger_phrase: SMOKE_TRIGGER_PHRASE,\n },\n });\n\n const proposalResult = await proposeRepositoryExport({\n target: \"markdown\",\n directory: join(getExportsDir(), \"repository-smoke\"),\n source: \"smoke_protocol\",\n modelOrFixture: \"smoke-protocol-v1\",\n });\n\n const answer = renderSmokeAnswer({\n overallScore: diagnosis.health.overall_score,\n overallStatus: diagnosis.health.overall_status,\n gatingVital: diagnosis.health.gating_vital_sign,\n totalValueAtRisk: diagnosis.health.total_value_at_risk,\n finding,\n strategyTitle: strategyResult.strategy.title,\n strategyPath: strategyResult.library_path,\n });\n\n return {\n answer,\n finding,\n strategy: strategyResult.strategy,\n action_proposal: proposalResult.proposal,\n health: {\n overall_score: diagnosis.health.overall_score,\n overall_status: diagnosis.health.overall_status,\n gating_vital_sign: diagnosis.health.gating_vital_sign,\n total_value_at_risk: diagnosis.health.total_value_at_risk ?? null,\n },\n };\n}\n\nfunction buildSmokeFinding(\n vitals: VitalSignResult[],\n gatingVital: VitalSignResult | undefined,\n playId: string,\n playName: string,\n): FindingEntry {\n const vitalSigns = Object.fromEntries(vitals.map((vs) => [vs.vital_sign, Math.round(vs.score)])) as Record<VitalSign, number>;\n const value = gatingVital?.dollar_value ?? null;\n const valueLabel = gatingVital?.dollar_label ?? \"value at risk\";\n const score = Math.round(gatingVital?.score ?? 0);\n const vital = gatingVital?.vital_sign ?? \"freshness\";\n const formattedValue = value === null ? \"N/A\" : formatCurrency(value);\n\n return {\n severity: gatingVital?.status === \"red\" ? \"critical\" : gatingVital?.status === \"yellow\" ? \"warning\" : \"info\",\n segment: \"All Pipeline\",\n finding: `**${formattedValue} ${valueLabel}** is the smoke-test headline. The current gating vital sign is **${vital}** at **${score}/100**, so the placeholder deep analysis would recommend **${playName}** as the next play.`,\n vital_signs: vitalSigns,\n entity_count: gatingVital?.entity_details.length ?? 0,\n recommended_focus: vital,\n dollar_value: value,\n recommended_plays: [{\n play_id: playId,\n play_name: playName,\n rationale: \"Selected from the current gating vital sign to exercise the diagnosis-to-play smoke workflow.\",\n }],\n };\n}\n\nfunction renderSmokeStrategy(finding: FindingEntry, playName: string): string {\n return `# Smoke Test: ${playName}\n\nGoal: Validate the flow from natural-language trigger to diagnosis, deep-analysis-style response, saved strategy, and approval-gated library write-back.\n\nTarget Segment: ${finding.segment}\n\nRecommended play: ${playName}\n\nSmoke finding: ${finding.finding.replace(/\\*\\*/g, \"\")}\n`;\n}\n\nfunction renderSmokeAnswer(input: {\n overallScore: number;\n overallStatus: string;\n gatingVital: VitalSign;\n totalValueAtRisk: number | null;\n finding: FindingEntry;\n strategyTitle: string;\n strategyPath: string;\n}): string {\n const totalValue = input.totalValueAtRisk === null ? \"N/A\" : formatCurrency(input.totalValueAtRisk);\n return `### Smoke Protocol Complete\n\nI treated the monkey/pelican phrase as a local smoke trigger and ran the placeholder protocol without calling an AI model.\n\n- Diagnosis: overall score **${Math.round(input.overallScore)}/100** (${input.overallStatus}), gated by **${input.gatingVital}**, with **${totalValue}** total value at risk.\n- Deep analysis fixture: ${input.finding.finding}\n- Saved play/strategy: **${input.strategyTitle}** at \\`${input.strategyPath}\\`.\n- Repository export prepared for an approval-gated Obsidian-compatible markdown bundle.\n\n---\n*Next: run \\`/actions continue\\` to approve the export, then \\`/actions continue\\` again to write it to the repository.*`;\n}\n\nfunction normalize(input: string): string {\n return input.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n","/**\n * Natural-language entry point. Routes free-form questions through\n * `agenticFindings()` in \"fresh\" mode, streaming thinking/tool_call/answer\n * events to the terminal.\n *\n * Lazily computes (and caches) the current health snapshot on the context\n * so the agent always has background context available.\n */\n\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport type { Context } from \"./context.js\";\nimport type { LlmMessage } from \"../ai/llm/types.js\";\nimport { recordMessage, buildAnalysisBlock, prefersMetricsFirstContext, saveSessionState } from \"./context.js\";\nimport { getConversationPhaseBlock, resolveConversationPhase } from \"../conversation/phase.js\";\nimport { setAgentContext } from \"../conversation/agent-context.js\";\nimport { handleExploreWithoutKey } from \"../conversation/orchestrator.js\";\nimport { agenticFindings } from \"../ai/agentic-loop.js\";\nimport { resolveExploreResponseMode } from \"../ai/explore-mode.js\";\nimport { distillThread } from \"../ai/thread.js\";\nimport { buildMemoryBlock, recordAnalysis } from \"../memory/store.js\";\nimport { computeFullHealth } from \"../vitals/health-score.js\";\nimport { detectDivergences } from \"../pipeline/divergence.js\";\nimport { canUseReplAi } from \"../ai/repl-api.js\";\nimport { paint } from \"../ui/theme.js\";\nimport { printMarkdown } from \"../ui/markdown.js\";\nimport { isSmokeProtocolTrigger, runSmokeProtocol } from \"../services/smoke-protocol.js\";\nimport { loadSessionAnalysisBundle, buildExploreContextBlock, hasAnyAnalysis } from \"../services/session-analysis.js\";\nimport type { FindingEntry } from \"../types.js\";\n\nexport async function runNaturalLanguage(input: string, ctx: Context): Promise<string | void> {\n if (isSmokeProtocolTrigger(input)) {\n recordMessage(ctx, \"user\", input);\n console.log();\n const spinner = ora({ text: \"Running smoke protocol…\", color: \"cyan\", discardStdin: false }).start();\n try {\n const result = await runSmokeProtocol(input, ctx);\n spinner.succeed(\"Smoke protocol complete\");\n printAnswer(result.answer);\n recordMessage(ctx, \"agent\", result.answer);\n console.log();\n return extractSummary(result.answer);\n } catch (err) {\n spinner.fail(\"Smoke protocol failed\");\n console.error(\" \" + chalk.red(String((err as Error).message ?? err)));\n console.log();\n return;\n }\n }\n\n const phase = resolveConversationPhase(ctx);\n if (!canUseReplAi(ctx) && (phase === \"explore\" || phase === \"deliver\")) {\n await handleExploreWithoutKey(ctx);\n return;\n }\n if (!canUseReplAi(ctx)) {\n return;\n }\n\n recordMessage(ctx, \"user\", input);\n\n // Lazily compute and cache the snapshot — the first NL question in a\n // session runs the vital-sign pipeline; subsequent calls reuse.\n let snapshot = ctx.snapshot.computeResult;\n if (!snapshot) {\n const metricsFirst = prefersMetricsFirstContext(ctx);\n const spinner = ora({\n text: metricsFirst ? \"Loading session context…\" : \"Computing vital signs…\",\n color: \"cyan\",\n discardStdin: false,\n }).start();\n try {\n snapshot = await computeFullHealth();\n ctx.snapshot.computeResult = snapshot;\n\n const divInput = snapshot.segments.map((s) => ({\n segmentId: s.segment.id,\n segmentName: s.segment.name,\n result: s.result,\n }));\n ctx.snapshot.divergences = detectDivergences(snapshot.aggregate, divInput).divergences;\n spinner.succeed(metricsFirst ? \"Session context ready\" : \"Health snapshot ready\");\n } catch (err) {\n spinner.fail(\"Could not compute health snapshot\");\n console.error(\" \" + chalk.red(String((err as Error).message ?? err)));\n console.log(\" \" + chalk.dim(\"Run \") + paint(\"accent\", \"/new\") + chalk.dim(\" → pick Demo to load sample data.\"));\n console.log();\n return;\n }\n }\n\n console.log();\n\n // Retrieve durable analyst memory (learned facts, decisions, strategies,\n // wins, knowledge) relevant to this question — closes the learning loop.\n const memoryBlock = await buildMemoryBlock(input).catch(() => \"\");\n\n // Stream events from the agent. Show a spinner during model calls; when a\n // tool is invoked, replace the spinner text so the user can see progress.\n const spinner = ora({ text: \"Thinking…\", color: \"cyan\", discardStdin: false }).start();\n let lastAnswer = \"\";\n let rawHistory: LlmMessage[] = [];\n const toolsUsed: string[] = [];\n\n setAgentContext(ctx);\n try {\n const analysisBlock = buildAnalysisBlock(ctx);\n const conversationBlock = getConversationPhaseBlock(ctx);\n const bundle = await loadSessionAnalysisBundle();\n const sessionArtifact = hasAnyAnalysis(bundle) ? buildExploreContextBlock(bundle, ctx) : \"\";\n const responseMode = resolveExploreResponseMode(input, ctx, ctx.conversation.length);\n\n for await (const event of agenticFindings(snapshot, ctx.snapshot.divergences, {\n mode: \"fresh\",\n userQuestion: input,\n sessionContext: ctx.resumedSessionSummary,\n includeMetrics: true,\n analysisBlock,\n conversationBlock,\n sessionArtifact,\n responseMode,\n priorMessages: ctx.conversation,\n memoryBlock,\n ctx,\n })) {\n switch (event.type) {\n case \"tool_call\":\n toolsUsed.push(event.name);\n spinner.text = `Querying ${event.name}…`;\n break;\n case \"thinking\":\n // Brief peek at model reasoning — render dim italic\n spinner.stop();\n console.log(\" \" + chalk.dim.italic(event.text));\n spinner.start(\"Thinking…\");\n break;\n case \"answer\":\n spinner.stop();\n lastAnswer = event.text;\n printAnswer(event.text);\n break;\n case \"finding\":\n // Fresh mode usually skips findings, but if the model emits one,\n // render it concisely.\n spinner.stop();\n printFindingInline(event.finding);\n break;\n case \"done\":\n spinner.stop();\n rawHistory = event.conversation_history;\n break;\n }\n }\n } catch (err) {\n spinner.fail(\"Error while investigating\");\n console.error(\" \" + chalk.red(String((err as Error).message ?? err)));\n console.log();\n return;\n } finally {\n setAgentContext(null);\n }\n\n // Persist the compacted, bounded thread so the next turn has continuity.\n if (rawHistory.length > 0) {\n ctx.conversation = distillThread(rawHistory);\n }\n\n if (!lastAnswer) {\n console.log(\" \" + chalk.dim(\"(no answer returned)\"));\n } else {\n recordMessage(ctx, \"agent\", lastAnswer);\n saveSessionState(ctx);\n // Log to the analysis ledger so the agent knows what it has already run.\n recordAnalysis({ question: input, answer: lastAnswer, tools: toolsUsed, session_id: ctx.sessionId });\n // Remember the exchange so /rate can attach feedback to it.\n ctx.lastExchange = { question: input, answer: lastAnswer };\n }\n console.log();\n\n return lastAnswer ? extractSummary(lastAnswer) : undefined;\n}\n\nfunction printAnswer(text: string): void {\n printMarkdown(text, { indent: 2 });\n}\n\n/** Extract a short summary from the agent's markdown answer (~60 chars). */\nfunction extractSummary(text: string): string {\n // Strip markdown formatting\n const plain = text\n .replace(/#{1,6}\\s+/g, \"\") // headings\n .replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\") // bold\n .replace(/\\*([^*]+)\\*/g, \"$1\") // italic\n .replace(/`([^`]+)`/g, \"$1\") // code\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\") // links\n .replace(/^[-*]\\s+/gm, \"\") // list bullets\n .trim();\n\n // Take first sentence\n const sentenceMatch = plain.match(/^(.+?[.!?])(?:\\s|$)/);\n const sentence = sentenceMatch ? sentenceMatch[1]! : plain.split(\"\\n\")[0]!;\n\n // Truncate to ~60 chars at a word boundary\n if (sentence.length <= 60) return sentence;\n const truncated = sentence.slice(0, 60).replace(/\\s+\\S*$/, \"\");\n return truncated + \"…\";\n}\n\nfunction printFindingInline(finding: FindingEntry): void {\n const sev = finding.severity;\n const color = sev === \"critical\" ? chalk.red : sev === \"warning\" ? chalk.yellow : chalk.blue;\n console.log();\n console.log(\" \" + color(`[${sev}]`) + \" \" + chalk.bold(finding.segment));\n printMarkdown(finding.finding, { indent: 2 });\n const play = finding.recommended_plays?.[0];\n if (play) console.log(\" \" + chalk.dim(\"→ \" + play.play_name + \" — \" + play.rationale));\n}\n","import { agenticFindings, type AgenticEvent } from \"../ai/agentic-loop.js\";\nimport { resolveExploreResponseMode } from \"../ai/explore-mode.js\";\nimport { computeFullHealth } from \"../vitals/health-score.js\";\nimport { detectDivergences } from \"../pipeline/divergence.js\";\nimport { assertReplAi } from \"../ai/repl-api.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { buildAnalysisBlock, hydrateAnalysisFromPersistedState } from \"../cli/context.js\";\nimport { getConversationPhaseBlock } from \"../conversation/phase.js\";\nimport { loadSessionAnalysisBundle, buildExploreContextBlock, hasAnyAnalysis } from \"./session-analysis.js\";\nimport { isSmokeProtocolTrigger, runSmokeProtocol } from \"./smoke-protocol.js\";\n\nexport interface AskResult {\n answer: string;\n tool_calls: string[];\n findings: unknown[];\n model_used?: string;\n provider_used?: string;\n failover?: boolean;\n}\n\nexport async function ensureAskSnapshot(ctx: Context) {\n let snapshot = ctx.snapshot.computeResult;\n if (!snapshot) {\n snapshot = await computeFullHealth();\n ctx.snapshot.computeResult = snapshot;\n const divInput = snapshot.segments.map((s) => ({\n segmentId: s.segment.id,\n segmentName: s.segment.name,\n result: s.result,\n }));\n ctx.snapshot.divergences = detectDivergences(snapshot.aggregate, divInput).divergences;\n }\n return snapshot;\n}\n\nexport async function* streamAsk(question: string, ctx: Context): AsyncGenerator<AgenticEvent> {\n if (isSmokeProtocolTrigger(question)) {\n yield { type: \"tool_call\", name: \"smoke.compute_diagnosis\" };\n yield { type: \"tool_call\", name: \"smoke.deep_analysis_fixture\" };\n yield { type: \"tool_call\", name: \"smoke.save_strategy\" };\n yield { type: \"tool_call\", name: \"smoke.propose_writeback\" };\n const result = await runSmokeProtocol(question, ctx);\n yield { type: \"finding\", finding: result.finding };\n yield { type: \"answer\", text: result.answer };\n yield {\n type: \"done\",\n findings: [result.finding],\n model_used: \"smoke-protocol-v1\",\n raw_prompt: question,\n conversation_history: [],\n };\n return;\n }\n\n assertReplAi(ctx);\n await hydrateAnalysisFromPersistedState(ctx);\n const snapshot = await ensureAskSnapshot(ctx);\n const { buildMemoryBlock } = await import(\"../memory/store.js\");\n const memoryBlock = await buildMemoryBlock(question).catch(() => \"\");\n const bundle = await loadSessionAnalysisBundle();\n const sessionArtifact = hasAnyAnalysis(bundle) ? buildExploreContextBlock(bundle, ctx) : \"\";\n const responseMode = resolveExploreResponseMode(question, ctx, ctx.conversation.length);\n yield* agenticFindings(snapshot, ctx.snapshot.divergences, {\n mode: \"fresh\",\n userQuestion: question,\n sessionContext: ctx.resumedSessionSummary,\n includeMetrics: true,\n analysisBlock: buildAnalysisBlock(ctx),\n conversationBlock: getConversationPhaseBlock(ctx),\n sessionArtifact,\n responseMode,\n priorMessages: ctx.conversation,\n memoryBlock,\n ctx,\n });\n}\n\nexport async function runAsk(question: string, ctx: Context): Promise<AskResult> {\n if (isSmokeProtocolTrigger(question)) {\n const result = await runSmokeProtocol(question, ctx);\n return {\n answer: result.answer,\n tool_calls: [\"smoke.compute_diagnosis\", \"smoke.deep_analysis_fixture\", \"smoke.save_strategy\", \"smoke.propose_writeback\"],\n findings: [result.finding],\n model_used: \"smoke-protocol-v1\",\n };\n }\n\n const toolCalls: string[] = [];\n const findings: unknown[] = [];\n let answer = \"\";\n let modelUsed: string | undefined;\n let providerUsed: string | undefined;\n let failover: boolean | undefined;\n for await (const event of streamAsk(question, ctx)) {\n if (event.type === \"tool_call\") toolCalls.push(event.name);\n if (event.type === \"finding\") findings.push(event.finding);\n if (event.type === \"answer\") answer = event.text;\n if (event.type === \"done\") {\n modelUsed = event.model_used;\n providerUsed = event.provider_used;\n failover = event.failover;\n }\n }\n return { answer, tool_calls: toolCalls, findings, model_used: modelUsed, provider_used: providerUsed, failover };\n}\n","/**\n * ntrp ask — chat with your data. Thin wrapper around the natural-language\n * agent so users have a discoverable slash command in /help.\n *\n * Free-form text typed at the REPL prompt already routes to the same agent;\n * this command exists so operators know the capability is there, and so\n * one-shot invocations work from the shell.\n */\n\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { canUseReplAi } from \"../ai/repl-api.js\";\nimport { runNaturalLanguage } from \"../cli/nl.js\";\nimport { paint } from \"../ui/theme.js\";\nimport { emitError, emitEvent, emitResult, isStructuredOutput } from \"../io/emit.js\";\nimport { NtrpError } from \"../io/errors.js\";\nimport { ExitCode } from \"../io/types.js\";\nimport { runAsk, streamAsk } from \"../services/ask.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const question = args.join(\" \").trim();\n\n if (!question) {\n if (isStructuredOutput(ctx.execution)) {\n emitError(\"ask\", new NtrpError(\"question_required\", \"Ask requires a question.\", ExitCode.Usage));\n }\n console.log();\n console.log(\" \" + chalk.dim(\"Ask a question about your pipeline in plain English.\"));\n console.log(\n \" \" +\n chalk.dim(\"Example: \") +\n paint(\"accent\", \"/ask which deals are stuck the longest?\"),\n );\n console.log(\" \" + chalk.dim(\"Or just type your question at the prompt — no slash needed.\"));\n console.log();\n return;\n }\n\n if (!canUseReplAi(ctx)) {\n if (isStructuredOutput(ctx.execution)) {\n const { NtrpError } = await import(\"../io/errors.js\");\n const { ExitCode } = await import(\"../io/types.js\");\n emitError(\"ask\", new NtrpError(\"repl_only\", \"Ask runs in the REPL or headless with stored LLM API keys.\", ExitCode.Auth));\n return;\n }\n console.log();\n console.log(\" \" + chalk.red(\"Ask runs only in the interactive REPL.\"));\n console.log(\" \" + chalk.dim(\"Start with \") + paint(\"accent\", \"ntrp\") + chalk.dim(\", set LLM keys via /config, then ask in plain English.\"));\n console.log();\n return;\n }\n\n if (ctx.execution.output === \"ndjson\") {\n try {\n for await (const event of streamAsk(question, ctx)) {\n emitEvent({\n type: \"progress\",\n command: \"ask\",\n phase: event.type,\n at: new Date().toISOString(),\n data: event,\n });\n }\n return;\n } catch (err) {\n emitError(\"ask\", err);\n }\n }\n\n if (isStructuredOutput(ctx.execution)) {\n try {\n emitResult(\"ask\", await runAsk(question, ctx));\n return;\n } catch (err) {\n emitError(\"ask\", err);\n }\n }\n\n await runNaturalLanguage(question, ctx);\n}\n","/**\n * ntrp metrics — compute and display SaaS revenue metrics with confidence gates.\n *\n * Progressive rendering with ora spinners, grouped tables.\n * Supports --segment <name> for per-segment drill-down.\n * Supports --findings for AI-calibrated metrics analysis.\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { initSchema } from \"../db/schema.js\";\nimport { autoGenerateSegments } from \"../pipeline/segments.js\";\nimport { renderMetricsReport } from \"../output/metrics-report.js\";\nimport { parseArgs, getString, getBool } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { hydrateAnalysisFromPersistedState, markLensCompleted, saveSessionState } from \"../cli/context.js\";\nimport { isStructuredOutput, emitResult, emitError } from \"../io/emit.js\";\nimport { runMetricsAnalysis } from \"../services/metrics-analysis.js\";\nimport { canUseReplAi } from \"../ai/repl-api.js\";\nimport { printCompanionBanner } from \"../metrics/companion.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n await hydrateAnalysisFromPersistedState(ctx);\n const { flags } = parseArgs(args, [\"findings\"]);\n const segmentFilter = getString(flags, \"segment\");\n const withFindings = getBool(flags, \"findings\");\n\n if (withFindings && !canUseReplAi(ctx)) {\n console.log();\n console.log(\" \" + chalk.red(\"AI findings run only in the interactive REPL.\"));\n console.log(\" \" + chalk.dim(\"Metrics numbers compute without a key — omit --findings for numbers only.\"));\n console.log(\" \" + chalk.dim(\"Start with \") + paint(\"accent\", \"ntrp\") + chalk.dim(\", set LLM keys via /config, then /metrics --findings.\"));\n console.log();\n return;\n }\n\n if (isStructuredOutput(ctx.execution)) {\n try {\n const result = await runMetricsAnalysis({\n segment: segmentFilter,\n findings: withFindings,\n sessionAnalysis: ctx.analysis,\n ctx,\n });\n emitResult(\"metrics\", {\n aggregate: result.metrics.aggregate,\n segments: result.metrics.segments,\n coverage: result.coverage,\n data_source_type: result.data_source_type,\n findings: result.findings,\n companion_recommendation: result.companion_recommendation,\n });\n markLensCompleted(ctx, \"revenue_metrics\");\n ctx.analysis.coverage = result.coverage;\n ctx.analysis.data_source_type = result.data_source_type;\n saveSessionState(ctx);\n return;\n } catch (err) {\n emitError(\"metrics\", err);\n }\n }\n\n await initSchema();\n await autoGenerateSegments();\n\n printCompanionBanner(\"metrics\", ctx.analysis.primary);\n\n const spinner = ora({\n text: \"Computing SaaS metrics…\",\n indent: 2,\n discardStdin: false,\n }).start();\n\n try {\n const result = await runMetricsAnalysis({\n segment: segmentFilter,\n findings: withFindings,\n sessionAnalysis: ctx.analysis,\n ctx,\n onProgress: (phase) => {\n if (phase === \"findings\") spinner.text = \"Generating findings…\";\n },\n });\n spinner.succeed(\"Metrics computed\");\n\n markLensCompleted(ctx, \"revenue_metrics\");\n ctx.analysis.coverage = result.coverage;\n ctx.analysis.data_source_type = result.data_source_type;\n ctx.analysis.recommended = result.companion_recommendation;\n if (ctx.stage === \"new\") ctx.stage = \"analyzed\";\n saveSessionState(ctx);\n\n if (segmentFilter && result.metrics.segments.length > 0) {\n const match = result.metrics.segments[0];\n if (match) {\n renderMetricsReport(ctx, match.result.metrics, result.coverage, result.data_source_type, {\n title: `SaaS Metrics — ${match.segment.name}`,\n snapshot: result.snapshot,\n findings: result.findings,\n companion: result.companion_recommendation ?? null,\n });\n }\n } else if (segmentFilter) {\n console.log();\n console.log(chalk.red(` No segment matching \"${segmentFilter}\".`));\n console.log();\n } else {\n renderMetricsReport(ctx, result.metrics.aggregate.metrics, result.coverage, result.data_source_type, {\n title: \"SaaS Metrics\",\n snapshot: result.snapshot,\n findings: result.findings,\n companion: result.companion_recommendation ?? null,\n });\n }\n } catch (err) {\n spinner.fail(\"Metrics computation failed\");\n console.error(chalk.red(String(err)));\n process.exit(1);\n }\n}\n","/**\n * feedback-apply — single-shot AI call that interprets natural-language\n * profile corrections and merges them into the CompanyProfile.\n *\n * Structured fields (sales_motion, sales_cycle_days, etc.) are updated when\n * the feedback maps cleanly. Remaining nuances are re-synthesized into a\n * concise `custom_context` paragraph (2-4 sentences) so contradictions\n * resolve and it never grows unbounded.\n */\n\nimport type { CompanyProfile, SalesMotion } from \"../types.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { assertReplAi } from \"./repl-api.js\";\nimport { llmCompleteText } from \"./llm/complete.js\";\n\nexport interface FeedbackResult {\n patch: Partial<CompanyProfile>;\n change_summary: string;\n}\n\nconst ALLOWED_MOTIONS = new Set<SalesMotion>([\"plg\", \"smb_velocity\", \"mid_market\", \"enterprise\"]);\nconst ALLOWED_CRMS = new Set([\"salesforce\", \"hubspot\", \"pipedrive\", \"other\"]);\nconst ALLOWED_ENGAGEMENT = new Set([\"outreach\", \"salesloft\", \"apollo\", \"none\"]);\n\nconst SYSTEM_PROMPT = `You are a profile-correction engine for NTRP, a GTM pipeline-health tool. The operator is giving you natural-language feedback to correct or augment their company profile.\n\nYOUR JOB:\n1. Map feedback to STRUCTURED profile fields when there's a clear match (e.g. \"our sales cycle is 6 months\" → sales_cycle_days: 180).\n2. Merge any remaining nuances — terminology preferences, org structure details, process quirks — into a \"custom_context\" paragraph. This paragraph must be 2-4 sentences, re-synthesized from scratch each time (incorporate the existing custom_context if present, but resolve contradictions in favor of the new feedback).\n3. Return a concise \"change_summary\" (1-3 bullet points) describing what changed, for terminal display.\n\nSTRUCTURED FIELDS you may update:\n- company_name (string)\n- industry (string)\n- product_description (string)\n- target_customer (string)\n- sales_motion: \"plg\" | \"smb_velocity\" | \"mid_market\" | \"enterprise\"\n- average_deal_size (string, e.g. \"$25K-$50K\")\n- sales_cycle_days (integer)\n- primary_crm: \"salesforce\" | \"hubspot\" | \"pipedrive\" | \"other\"\n- engagement_tool: \"outreach\" | \"salesloft\" | \"apollo\" | \"none\"\n- user_scope (string, first-person)\n- custom_context (string, 2-4 sentences)\n\nRULES:\n- Only include fields that the feedback actually changes or clarifies.\n- Always include custom_context — re-synthesize it from the existing value (if any) plus the new feedback.\n- NEVER invent data the operator didn't provide.\n- The change_summary should be human-readable markdown bullet points.\n\nOUTPUT FORMAT — STRICT JSON only, no preamble, no markdown fences:\n{\n \"updates\": { \"field\": \"value\", ... },\n \"change_summary\": \"- Changed X\\\\n- Added Y to context\"\n}`;\n\nfunction stripFences(text: string): string {\n const trimmed = text.trim();\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/i);\n if (fenced) return fenced[1]!.trim();\n return trimmed;\n}\n\nfunction formatProfile(p: CompanyProfile): string {\n const parts: string[] = [];\n parts.push(`Company: ${p.company_name}`);\n if (p.company_url) parts.push(`URL: ${p.company_url}`);\n parts.push(`Industry: ${p.industry}`);\n parts.push(`Product: ${p.product_description}`);\n parts.push(`Target customer: ${p.target_customer}`);\n parts.push(`Sales motion: ${p.sales_motion}`);\n if (p.average_deal_size) parts.push(`Avg deal size: ${p.average_deal_size}`);\n if (p.sales_cycle_days !== undefined) parts.push(`Sales cycle: ~${p.sales_cycle_days} days`);\n if (p.primary_crm) parts.push(`Primary CRM: ${p.primary_crm}`);\n if (p.engagement_tool) parts.push(`Engagement tool: ${p.engagement_tool}`);\n if (p.user_scope) parts.push(`User's scope: ${p.user_scope}`);\n if (p.custom_context) parts.push(`Additional context: ${p.custom_context}`);\n return parts.join(\"\\n\");\n}\n\nexport async function applyFeedback(\n profile: CompanyProfile,\n feedbackText: string,\n ctx: Context,\n): Promise<FeedbackResult> {\n assertReplAi(ctx);\n const profileBlock = formatProfile(profile);\n\n const userMessage = `CURRENT PROFILE:\\n${profileBlock}\\n\\nOPERATOR FEEDBACK:\\n\"${feedbackText}\"\\n\\nApply the feedback now as STRICT JSON.`;\n\n const { text } = await llmCompleteText(\"feedback\", SYSTEM_PROMPT, userMessage, 1024, ctx);\n const cleaned = stripFences(text);\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(cleaned);\n } catch {\n throw new Error(\"AI response is not valid JSON\");\n }\n\n const updates = typeof parsed.updates === \"object\" && parsed.updates !== null\n ? parsed.updates as Record<string, unknown>\n : {};\n const changeSummary = typeof parsed.change_summary === \"string\"\n ? parsed.change_summary\n : \"- Profile updated\";\n\n return {\n patch: validatePatch(updates),\n change_summary: changeSummary,\n };\n}\n\nfunction validatePatch(raw: Record<string, unknown>): Partial<CompanyProfile> {\n const out: Partial<CompanyProfile> = {};\n const str = (k: string): string | undefined => {\n const v = raw[k];\n return typeof v === \"string\" && v.trim().length > 0 ? v.trim() : undefined;\n };\n\n const companyName = str(\"company_name\");\n if (companyName) out.company_name = companyName;\n\n const industry = str(\"industry\");\n if (industry) out.industry = industry;\n\n const productDescription = str(\"product_description\");\n if (productDescription) out.product_description = productDescription;\n\n const targetCustomer = str(\"target_customer\");\n if (targetCustomer) out.target_customer = targetCustomer;\n\n const motion = str(\"sales_motion\")?.toLowerCase();\n if (motion && ALLOWED_MOTIONS.has(motion as SalesMotion)) {\n out.sales_motion = motion as SalesMotion;\n }\n\n const dealSize = str(\"average_deal_size\");\n if (dealSize) out.average_deal_size = dealSize;\n\n const cycleDays = raw[\"sales_cycle_days\"];\n if (typeof cycleDays === \"number\" && Number.isFinite(cycleDays) && cycleDays > 0) {\n out.sales_cycle_days = Math.round(cycleDays);\n }\n\n const crm = str(\"primary_crm\")?.toLowerCase();\n if (crm && ALLOWED_CRMS.has(crm)) out.primary_crm = crm;\n\n const engagement = str(\"engagement_tool\")?.toLowerCase();\n if (engagement && ALLOWED_ENGAGEMENT.has(engagement)) out.engagement_tool = engagement;\n\n const userScope = str(\"user_scope\");\n if (userScope) out.user_scope = userScope;\n\n const customContext = str(\"custom_context\");\n if (customContext) out.custom_context = customContext;\n\n return out;\n}\n","/**\n * ntrp feedback — apply natural-language corrections to your company profile.\n *\n * Example: ntrp feedback \"We don't have BDRs, our team is all SDRs\"\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { assertReplAi } from \"../ai/repl-api.js\";\nimport { loadProfile, updateProfile } from \"../config/profile.js\";\nimport { invalidateTaxonomy } from \"../demo/taxonomy-cache.js\";\nimport { applyFeedback } from \"../ai/feedback-apply.js\";\nimport { printMarkdown } from \"../ui/markdown.js\";\nimport { paint } from \"../ui/theme.js\";\nimport type { Context } from \"../cli/context.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const feedbackText = args.join(\" \").trim();\n\n if (!feedbackText) {\n console.log();\n console.log(\" \" + chalk.dim(\"Tell NTRP something it got wrong or doesn't know yet.\"));\n console.log(\n \" \" +\n chalk.dim(\"Example: \") +\n paint(\"accent\", '/feedback \"We have SDRs, not BDRs\"'),\n );\n console.log();\n return;\n }\n\n const profile = loadProfile();\n if (!profile) {\n console.log();\n console.log(\" \" + chalk.red(\"No company profile found.\"));\n console.log(\" \" + chalk.dim(\"Run \") + paint(\"accent\", \"/onboard\") + chalk.dim(\" first to create one.\"));\n console.log();\n return;\n }\n\n try {\n assertReplAi(ctx);\n } catch (err) {\n console.log();\n console.log(\" \" + chalk.red(String((err as Error).message ?? err)));\n console.log();\n return;\n }\n\n const spinner = ora({ text: \"Applying feedback…\", discardStdin: false }).start();\n try {\n const result = await applyFeedback(profile, feedbackText, ctx);\n spinner.succeed(\"Feedback applied\");\n\n updateProfile(result.patch);\n invalidateTaxonomy();\n\n console.log();\n printMarkdown(`### Changes Applied\\n\\n${result.change_summary}`);\n } catch (err) {\n spinner.fail(\"Couldn't apply feedback\");\n console.log(\" \" + chalk.dim(String((err as Error).message ?? err)));\n }\n}\n","/**\n * ntrp recap — AI-powered session summary.\n *\n * Reads all natural-language exchanges from the current session and sends\n * them to Claude for a structured summary: key findings, dollar impacts,\n * and recommended next steps.\n */\n\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport { assertReplAi } from \"../ai/repl-api.js\";\nimport { llmStreamText } from \"../ai/llm/complete.js\";\nimport { buildCompanyProfileBlock } from \"../ai/prompt-parts.js\";\nimport { printMarkdown } from \"../ui/markdown.js\";\nimport type { Context } from \"../cli/context.js\";\n\nexport async function handler(_args: string[], ctx: Context): Promise<string | void> {\n if (ctx.messages.length === 0) {\n console.log();\n console.log(\" \" + chalk.dim(\"Nothing to recap — no NL exchanges this session.\"));\n console.log(\" \" + chalk.dim(\"Ask a plain-English question first, then run /recap.\"));\n console.log();\n return;\n }\n\n try {\n assertReplAi(ctx);\n } catch (err) {\n console.log();\n console.log(\" \" + chalk.red(String((err as Error).message ?? err)));\n console.log();\n return;\n }\n\n const companyBlock = buildCompanyProfileBlock();\n const systemPrompt = [\n \"You are a GTM health analyst summarizing an interactive diagnostic session.\",\n \"\",\n companyBlock ? `## Company Context\\n${companyBlock}` : \"\",\n \"\",\n \"Produce a concise session recap in markdown:\",\n \"1. **Overview** — one sentence summarizing what was investigated.\",\n \"2. **Key Findings** — 3-5 bullet points, each with specific numbers and dollar values when available.\",\n \"3. **Next Steps** — 2-3 actionable recommendations.\",\n \"\",\n \"Keep the total output under 300 words. Use plain language, not jargon.\",\n ].filter(Boolean).join(\"\\n\");\n\n const conversationLines: string[] = [];\n for (const msg of ctx.messages) {\n const prefix = msg.role === \"user\" ? \"USER\" : \"ASSISTANT\";\n conversationLines.push(`[${prefix}]: ${msg.content}`);\n }\n\n const spinner = ora({ text: \"Summarizing session…\", color: \"cyan\", discardStdin: false }).start();\n\n try {\n const { text: fullText } = await llmStreamText(\n \"recap\",\n systemPrompt,\n `Here is the session conversation (${ctx.messages.length} messages):\\n\\n${conversationLines.join(\"\\n\\n\")}`,\n 1024,\n ctx,\n );\n\n spinner.succeed(\"Session recap\");\n console.log();\n printMarkdown(fullText, { indent: 2 });\n console.log();\n\n const exchangeCount = Math.floor(ctx.messages.length / 2);\n return `${exchangeCount} exchange${exchangeCount === 1 ? \"\" : \"s\"} summarized`;\n } catch (err) {\n spinner.fail(\"Recap failed\");\n console.error(\" \" + chalk.red(String((err as Error).message ?? err)));\n console.log();\n }\n}\n","/**\n * ntrp remember — teach the analyst a durable fact about the business.\n *\n * /remember <fact> — store a fact\n * /remember decision: <text> — store a decision\n * /remember preference: <text>— store a preference\n *\n * Stored facts flow into every future analysis via the memory block.\n */\n\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { addFact } from \"../memory/store.js\";\nimport type { FactKind } from \"../memory/types.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n let text = args.join(\" \").trim();\n\n if (!text) {\n console.log();\n console.log(\" \" + chalk.dim(\"Teach me something durable about the business.\"));\n console.log(\" \" + chalk.dim(\"Example: \") + paint(\"accent\", \"/remember we only sell to FinServ above 500 employees\"));\n console.log(\" \" + chalk.dim(\"Prefix with \") + paint(\"accent\", \"decision:\") + chalk.dim(\" or \") + paint(\"accent\", \"preference:\") + chalk.dim(\" to tag it.\"));\n console.log();\n return;\n }\n\n let kind: FactKind = \"fact\";\n const tagMatch = text.match(/^(decision|preference|fact)\\s*:\\s*(.+)$/i);\n if (tagMatch) {\n kind = tagMatch[1]!.toLowerCase() as FactKind;\n text = tagMatch[2]!.trim();\n }\n\n const fact = addFact({ text, kind, source: \"user\", session_id: ctx.sessionId });\n\n console.log();\n console.log(\" \" + paint(\"accent\", \"Noted.\") + \" \" + chalk.dim(`I'll carry this into future analyses${kind !== \"fact\" ? ` (${kind})` : \"\"}.`));\n console.log(\" \" + chalk.dim(\"• \" + fact.text));\n console.log();\n return \"Saved to memory\";\n}\n","/**\n * ntrp recall — jog the analyst's memory with minimal effort.\n *\n * /recall — show what's in long-term memory (facts + recent analyses)\n * /recall <query> — show what the analyst remembers about a topic\n */\n\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { buildMemoryBlock, listFacts, listLedger } from \"../memory/store.js\";\nimport { printMarkdown } from \"../ui/markdown.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport async function handler(args: string[], _ctx: Context): Promise<string | void> {\n const query = args.join(\" \").trim();\n\n if (query) {\n const block = await buildMemoryBlock(query, { maxFacts: 6, maxLedger: 5, maxStrategies: 3, maxWins: 3, maxKnowledge: 3 });\n console.log();\n if (!block) {\n console.log(\" \" + chalk.dim(`Nothing in memory about \"${query}\" yet.`));\n console.log();\n return;\n }\n console.log(\" \" + paint(\"accent\", `What I remember about \"${query}\"`));\n console.log();\n printMarkdown(block, { indent: 2 });\n console.log();\n return \"Recalled memory\";\n }\n\n const facts = listFacts().slice(-12).reverse();\n const ledger = listLedger().slice(-8).reverse();\n\n console.log();\n if (facts.length === 0 && ledger.length === 0) {\n console.log(\" \" + chalk.dim(\"Memory is empty. Teach me with \") + paint(\"accent\", \"/remember <fact>\") + chalk.dim(\".\"));\n console.log();\n return;\n }\n\n if (facts.length > 0) {\n console.log(\" \" + paint(\"accent\", \"What I know about your business\"));\n for (const f of facts) {\n const tag = f.kind !== \"fact\" ? chalk.dim(` (${f.kind})`) : \"\";\n console.log(\" \" + chalk.dim(\"• \") + f.text + tag);\n }\n console.log();\n }\n\n if (ledger.length > 0) {\n console.log(\" \" + paint(\"accent\", \"Analyses I've already run\"));\n for (const l of ledger) {\n console.log(\" \" + chalk.dim(\"• \") + chalk.dim(`${l.question} → ${l.summary}`));\n }\n console.log();\n }\n\n return `${facts.length} fact${facts.length === 1 ? \"\" : \"s\"} in memory`;\n}\n","/**\n * Lightweight answer feedback.\n *\n * Captures a quick \"that was useful / that was off\" signal on the analyst's\n * last answer and turns it into a durable preference fact, so future analyses\n * lean into what works and avoid what doesn't. Also logged to feedback.jsonl.\n */\n\nimport { appendFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { getMemoryDir } from \"../config/store.js\";\nimport { addFact, scrubText } from \"./store.js\";\n\nexport type Rating = \"positive\" | \"negative\";\n\nexport interface FeedbackEntry {\n id: string;\n rating: Rating;\n question: string;\n answer_summary: string;\n note?: string;\n session_id?: string;\n created_at: string;\n}\n\nexport interface RecordFeedbackInput {\n rating: Rating;\n question: string;\n answer: string;\n note?: string;\n session_id?: string;\n}\n\nfunction summarize(text: string): string {\n return text.replace(/[#*`>_]/g, \"\").replace(/\\s+/g, \" \").trim().slice(0, 200);\n}\n\nexport function recordFeedback(input: RecordFeedbackInput): FeedbackEntry {\n const entry: FeedbackEntry = {\n id: randomUUID(),\n rating: input.rating,\n question: scrubText(input.question).slice(0, 300),\n answer_summary: scrubText(summarize(input.answer)),\n note: input.note ? scrubText(input.note) : undefined,\n session_id: input.session_id,\n created_at: new Date().toISOString(),\n };\n\n try {\n appendFileSync(join(getMemoryDir(), \"feedback.jsonl\"), JSON.stringify(entry) + \"\\n\");\n } catch {\n // best-effort\n }\n\n // Turn the signal into a durable preference so it biases future analysis.\n if (input.rating === \"positive\") {\n addFact({\n text: `The user found this analysis valuable: \"${entry.question}\".${entry.note ? ` They noted: ${entry.note}.` : \" Keep using this depth and framing for similar questions.\"}`,\n kind: \"preference\",\n source: \"user\",\n session_id: input.session_id,\n });\n } else {\n addFact({\n text: `The user pushed back on a prior answer to \"${entry.question}\".${entry.note ? ` Their correction: ${entry.note}.` : \" Re-examine that conclusion and don't repeat the same framing.\"} Adjust future analysis accordingly.`,\n kind: \"preference\",\n source: \"user\",\n session_id: input.session_id,\n });\n }\n\n return entry;\n}\n","/**\n * ntrp rate — give quick feedback on the analyst's last answer.\n *\n * /rate good [note] — mark the last answer useful (reinforces the approach)\n * /rate bad <note> — mark it off-base (the note steers future analysis)\n *\n * Feedback becomes a durable preference so the analyst improves with the user.\n */\n\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { recordFeedback, type Rating } from \"../memory/feedback.js\";\nimport { paint } from \"../ui/theme.js\";\n\nconst POSITIVE = new Set([\"good\", \"useful\", \"great\", \"helpful\", \"up\", \"yes\", \"+1\", \"👍\"]);\nconst NEGATIVE = new Set([\"bad\", \"wrong\", \"off\", \"unhelpful\", \"down\", \"no\", \"-1\", \"👎\"]);\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n const verdict = (args[0] ?? \"\").toLowerCase();\n const note = args.slice(1).join(\" \").trim();\n\n if (!verdict || (!POSITIVE.has(verdict) && !NEGATIVE.has(verdict))) {\n console.log();\n console.log(\" \" + chalk.dim(\"Tell me how the last answer landed so I improve.\"));\n console.log(\" \" + paint(\"accent\", \"/rate good\") + chalk.dim(\" or \") + paint(\"accent\", \"/rate bad <what was off>\"));\n console.log();\n return;\n }\n\n if (!ctx.lastExchange) {\n console.log();\n console.log(\" \" + chalk.dim(\"Nothing to rate yet — ask a question first, then rate the answer.\"));\n console.log();\n return;\n }\n\n const rating: Rating = POSITIVE.has(verdict) ? \"positive\" : \"negative\";\n\n if (rating === \"negative\" && !note) {\n console.log();\n console.log(\" \" + chalk.yellow(\"Add a quick note so I know what to fix:\"));\n console.log(\" \" + paint(\"accent\", '/rate bad you ignored the enterprise segment'));\n console.log();\n return;\n }\n\n recordFeedback({\n rating,\n question: ctx.lastExchange.question,\n answer: ctx.lastExchange.answer,\n note: note || undefined,\n session_id: ctx.sessionId,\n });\n\n console.log();\n if (rating === \"positive\") {\n console.log(\" \" + paint(\"accent\", \"Noted — glad that helped.\") + \" \" + chalk.dim(\"I'll keep that approach for similar questions.\"));\n } else {\n console.log(\" \" + paint(\"accent\", \"Got it — thank you.\") + \" \" + chalk.dim(\"I'll adjust and won't repeat that.\"));\n }\n console.log();\n return rating === \"positive\" ? \"Feedback: helpful\" : \"Feedback: needs adjustment\";\n}\n","/**\n * ntrp knowledge — ingest and inspect external knowledge packs.\n *\n * /knowledge add <file> — ingest a case study / framework / benchmark report\n * /knowledge list — show indexed docs (and any staged, unindexed files)\n */\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport type { Context } from \"../cli/context.js\";\nimport { addKnowledgeFile, listKnowledgeDocs, listKnowledgeDirFiles } from \"../memory/knowledge.js\";\nimport { getKnowledgeDir } from \"../config/store.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n const sub = (args[0] ?? \"list\").toLowerCase();\n\n if (sub === \"add\") {\n const path = args.slice(1).join(\" \").trim();\n if (!path) {\n console.log();\n console.log(\" \" + chalk.red(\"knowledge add requires a file path.\"));\n console.log(\" \" + chalk.dim(\"Example: \") + paint(\"accent\", \"/knowledge add ~/Downloads/plg-benchmarks-2026.pdf\"));\n console.log();\n return;\n }\n const spin = ctx.execution.progress ? ora({ text: \"Ingesting knowledge…\", color: \"cyan\", discardStdin: false }).start() : null;\n try {\n const result = await addKnowledgeFile(path);\n spin?.succeed(`Indexed \"${result.title}\"`);\n console.log();\n console.log(\" \" + chalk.dim(`${result.chunks} passage${result.chunks === 1 ? \"\" : \"s\"} indexed and available to the analyst.`));\n console.log();\n return `Indexed ${result.chunks} passages`;\n } catch (err) {\n spin?.fail(\"Knowledge ingest failed\");\n console.error(\" \" + chalk.red(String((err as Error).message ?? err)));\n console.log();\n return;\n }\n }\n\n if (sub === \"list\") {\n const docs = listKnowledgeDocs();\n const staged = listKnowledgeDirFiles(getKnowledgeDir());\n\n console.log();\n if (docs.length === 0) {\n console.log(\" \" + chalk.dim(\"No knowledge indexed yet.\"));\n } else {\n console.log(\" \" + paint(\"accent\", \"Indexed Knowledge\"));\n for (const d of docs) {\n console.log(\n \" \" + chalk.dim(\"• \") + chalk.bold(d.title) +\n chalk.dim(` (${d.chunks} passage${d.chunks === 1 ? \"\" : \"s\"}${d.source_path ? `, ${d.source_path.split(\"/\").pop()}` : \"\"})`),\n );\n }\n }\n\n if (staged.length > 0) {\n console.log();\n console.log(\" \" + chalk.dim(\"Staged in ~/.ntrp/knowledge (run \") + paint(\"accent\", \"/knowledge add <file>\") + chalk.dim(\" to index):\"));\n for (const f of staged) console.log(\" \" + chalk.dim(\" - \" + f));\n }\n console.log();\n return `${docs.length} doc${docs.length === 1 ? \"\" : \"s\"} indexed`;\n }\n\n console.log();\n console.log(\" \" + chalk.red(`Unknown knowledge subcommand: ${sub}`));\n console.log(\" \" + chalk.dim(\"Use \") + paint(\"accent\", \"/knowledge add <file>\") + chalk.dim(\" or \") + paint(\"accent\", \"/knowledge list\") + chalk.dim(\".\"));\n console.log();\n return;\n}\n","/**\n * ntrp sessions — browse and inspect past sessions.\n *\n * /sessions — list last 10 sessions\n * /sessions list — same as above\n * /sessions show <id> — view a specific session's exchanges\n */\n\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { listSessions, loadSessionFile } from \"../cli/context.js\";\nimport { paint, bold } from \"../ui/theme.js\";\nimport { padRight } from \"../ui/layout.js\";\n\nexport async function handler(args: string[], _ctx: Context): Promise<string | void> {\n const sub = args[0] ?? \"list\";\n\n if (sub === \"list\" || !args[0]) {\n return showList();\n }\n\n if (sub === \"show\") {\n const idArg = args[1];\n if (!idArg) {\n console.log();\n console.log(\" \" + chalk.red(\"Usage: /sessions show <id>\"));\n console.log(\" \" + chalk.dim(\"Use a full session ID or 4-char suffix.\"));\n console.log();\n return;\n }\n return showSession(idArg);\n }\n\n // Maybe the user typed `/sessions <id>` directly — treat as show\n return showSession(sub);\n}\n\nfunction showList(): string | undefined {\n const sessions = listSessions({ limit: 10 });\n\n if (sessions.length === 0) {\n console.log();\n console.log(\" \" + chalk.dim(\"No sessions yet. Ask a question to start your first session.\"));\n console.log();\n return;\n }\n\n console.log();\n console.log(\" \" + paint(\"accent\", bold(\"Session History\")));\n console.log(\" \" + chalk.dim(\"─\".repeat(58)));\n\n for (const s of sessions) {\n const date = s.created_at?.slice(0, 10) ?? s.id.slice(0, 10);\n const shortId = s.id.slice(-4);\n const nameTag = s.name ? paint(\"accent\", `[${s.name}]`) + \" \" : \"\";\n const summary = s.summary ?? chalk.dim(\"(no summary)\");\n const exch = chalk.dim(`${s.exchange_count} exch.`);\n console.log(` ${chalk.dim(date)} ${shortId} ${nameTag}${padRight(summary, 36)} ${exch}`);\n }\n\n console.log(\" \" + chalk.dim(\"─\".repeat(58)));\n console.log(\n \" \" +\n chalk.dim(`${sessions.length} session${sessions.length === 1 ? \"\" : \"s\"} · `) +\n paint(\"accent\", \"/sessions show <id>\") +\n chalk.dim(\" to review · \") +\n paint(\"accent\", \"/resume\") +\n chalk.dim(\" to continue\"),\n );\n console.log();\n\n return `${sessions.length} session${sessions.length === 1 ? \"\" : \"s\"} listed`;\n}\n\nfunction showSession(idArg: string): string | undefined {\n // Resolve ID: try exact match first, then suffix match\n const all = listSessions();\n let matches = all.filter((s) => s.id === idArg);\n if (matches.length === 0) {\n matches = all.filter((s) => s.id.endsWith(idArg));\n }\n\n if (matches.length === 0) {\n console.log();\n console.log(\" \" + chalk.red(`No session found matching \"${idArg}\".`));\n console.log(\" \" + chalk.dim(\"Use /sessions to see available session IDs.\"));\n console.log();\n return;\n }\n\n if (matches.length > 1) {\n console.log();\n console.log(\" \" + chalk.red(`Ambiguous ID \"${idArg}\" matches ${matches.length} sessions:`));\n for (const m of matches) {\n console.log(\" \" + chalk.dim(` ${m.id}`));\n }\n console.log(\" \" + chalk.dim(\"Use a longer ID to disambiguate.\"));\n console.log();\n return;\n }\n\n const entry = matches[0]!;\n const session = loadSessionFile(entry.id);\n if (!session) {\n console.log();\n console.log(\" \" + chalk.red(`Could not read session file for ${entry.id}.`));\n console.log();\n return;\n }\n\n const shortId = session.id.slice(-4);\n const dateStr = session.created_at?.slice(0, 10) ?? session.id.slice(0, 10);\n\n console.log();\n console.log(\" \" + paint(\"accent\", bold(`Session ${session.id}`)) + chalk.dim(` · ${dateStr}`));\n if (session.summary) {\n console.log(\" \" + chalk.dim(\"Summary: \") + session.summary);\n }\n console.log(\" \" + chalk.dim(\"─\".repeat(40)));\n\n let exchangeNum = 0;\n for (let i = 0; i < session.messages.length; i++) {\n const msg = session.messages[i]!;\n const time = msg.at ? new Date(msg.at).toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false }) : \"\";\n\n if (msg.role === \"user\") {\n exchangeNum++;\n console.log();\n console.log(\" \" + chalk.dim(`[${exchangeNum}]`) + \" \" + chalk.bold(\"USER\") + chalk.dim(` (${time})`));\n console.log(\" \" + msg.content);\n } else {\n console.log();\n console.log(\" \" + chalk.bold(\"AGENT\") + chalk.dim(` (${time})`));\n if (msg.content.length > 200) {\n console.log(\" \" + msg.content.slice(0, 200) + \"…\");\n console.log(\" \" + chalk.dim(`(truncated — ${msg.content.length.toLocaleString()} chars)`));\n } else {\n console.log(\" \" + msg.content);\n }\n }\n }\n\n console.log();\n const exchangeCount = session.exchange_count ?? Math.floor(session.messages.length / 2);\n return `Session ${shortId}: ${exchangeCount} exchange${exchangeCount === 1 ? \"\" : \"s\"}`;\n}\n","/**\n * ntrp resume — load a previous session's context for continuity.\n *\n * /resume — resume the most recent session with NL exchanges\n * /resume <id> — resume a specific session by full ID or 4-char suffix\n */\n\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { listSessions, loadSessionFile } from \"../cli/context.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n // Block bare /resume if already resumed, but allow explicit /resume <id>\n if (ctx.resumedFromId && !args[0]) {\n console.log();\n console.log(\" \" + chalk.yellow(\"Already resumed session \") + paint(\"accent\", ctx.resumedFromId.slice(-4)));\n console.log(\" \" + chalk.dim(\"Context: \" + (ctx.resumedSessionSummary ?? \"(no summary)\")));\n console.log(\" \" + chalk.dim(\"Use \") + paint(\"accent\", \"/resume <id>\") + chalk.dim(\" to resume a specific session.\"));\n console.log();\n return;\n }\n\n // Find the target session\n const all = listSessions()\n .filter((s) => s.exchange_count > 0 && s.id !== ctx.sessionId);\n\n if (all.length === 0) {\n console.log();\n console.log(\" \" + chalk.dim(\"No prior sessions with NL exchanges to resume.\"));\n console.log();\n return;\n }\n\n let targetId: string;\n if (args[0]) {\n // Match by full ID or suffix\n const idArg = args[0];\n let matches = all.filter((s) => s.id === idArg);\n if (matches.length === 0) {\n matches = all.filter((s) => s.id.endsWith(idArg));\n }\n if (matches.length === 0) {\n console.log();\n console.log(\" \" + chalk.red(`No session found matching \"${idArg}\".`));\n console.log(\" \" + chalk.dim(\"Use /sessions to see available IDs.\"));\n console.log();\n return;\n }\n if (matches.length > 1) {\n console.log();\n console.log(\" \" + chalk.red(`Ambiguous ID \"${idArg}\" — matches ${matches.length} sessions.`));\n console.log(\" \" + chalk.dim(\"Use a longer ID to disambiguate.\"));\n console.log();\n return;\n }\n targetId = matches[0]!.id;\n } else {\n // Default: most recent session with NL exchanges\n targetId = all[0]!.id;\n }\n\n const session = loadSessionFile(targetId);\n if (!session) {\n console.log();\n console.log(\" \" + chalk.red(`Could not read session file for ${targetId}.`));\n console.log();\n return;\n }\n\n // Get summary: use persisted summary, or generate on-the-fly, or fall back to metadata\n let summary = session.summary;\n\n if (!summary) {\n const date = session.created_at?.slice(0, 10) ?? targetId.slice(0, 10);\n const n = session.exchange_count ?? Math.floor(session.messages.length / 2);\n summary = `Session from ${date} with ${n} exchange${n === 1 ? \"\" : \"s\"}`;\n }\n\n ctx.resumedSessionSummary = summary;\n ctx.resumedFromId = targetId;\n // Rehydrate the real conversation thread so the agent picks up exactly where\n // it left off — not just from an 80-char summary.\n if (session.thread && session.thread.length > 0) {\n ctx.conversation = session.thread;\n }\n if (session.llm) {\n ctx.llm = { ...session.llm };\n }\n\n const shortId = targetId.slice(-4);\n console.log();\n console.log(\" \" + paint(\"accent\", `Resumed session ${shortId}`));\n console.log(\" \" + chalk.dim(\"Context: \") + summary);\n console.log();\n\n return `Resumed ${shortId}`;\n}\n","/**\n * ntrp name — tag the current session with a human-readable label.\n *\n * /name — show current name or usage hint\n * /name <label> — set session name (max 40 chars)\n */\n\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { findSessionByName } from \"../cli/context.js\";\nimport { paint } from \"../ui/theme.js\";\n\nconst MAX_NAME_LENGTH = 40;\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n if (args.length === 0) {\n console.log();\n if (ctx.sessionName) {\n console.log(\" \" + chalk.dim(\"Session name: \") + paint(\"accent\", ctx.sessionName));\n } else {\n console.log(\" \" + chalk.dim(\"No name set. Usage: \") + paint(\"accent\", \"/name <label>\"));\n }\n console.log();\n return;\n }\n\n const label = args.join(\" \").trim();\n\n if (label.length > MAX_NAME_LENGTH) {\n console.log();\n console.log(\" \" + chalk.red(`Name too long (${label.length} chars). Max is ${MAX_NAME_LENGTH}.`));\n console.log();\n return `Too long (max ${MAX_NAME_LENGTH})`;\n }\n\n // Warn if name is already used by a different session\n const existing = findSessionByName(label);\n if (existing && existing.id !== ctx.sessionId) {\n console.log();\n console.log(\" \" + chalk.yellow(`\"${label}\" is already used by session ${existing.id.slice(-4)}.`));\n console.log(\" \" + chalk.dim(\"Use \") + paint(\"accent\", `/switch ${label}`) + chalk.dim(\" to jump to it instead.\"));\n console.log();\n return `\"${label}\" taken — use /switch`;\n }\n\n ctx.sessionName = label;\n\n console.log();\n console.log(\" \" + paint(\"accent\", `Session named \"${label}\"`));\n console.log();\n\n return `Named \"${label}\"`;\n}\n","/**\n * ntrp switch — save current session and jump to a named session.\n *\n * /switch — list all named sessions\n * /switch <name> — switch to named session (creates if new)\n */\n\nimport { join } from \"node:path\";\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport {\n closeSession,\n findSessionByName,\n loadSessionFile,\n buildSwitchContext,\n resetContextForSwitch,\n makeSessionId,\n getSessionsDir,\n listSessions,\n} from \"../cli/context.js\";\nimport { paint, bold } from \"../ui/theme.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<string | void> {\n // No args → list all named sessions\n if (args.length === 0) {\n return listNamedSessions(ctx);\n }\n\n const targetName = args.join(\" \").trim();\n\n // Already in that session?\n if (ctx.sessionName && ctx.sessionName.toLowerCase() === targetName.toLowerCase()) {\n console.log();\n console.log(\" \" + chalk.dim(\"Already in session \") + paint(\"accent\", ctx.sessionName));\n console.log();\n return;\n }\n\n // Save current session if it has exchanges\n const exchangeCount = Math.floor(ctx.messages.length / 2);\n if (exchangeCount > 0) {\n const spinner = ora({ text: \"Saving current session…\", color: \"cyan\", discardStdin: false }).start();\n await closeSession(ctx);\n const fromLabel = ctx.sessionName ? `\"${ctx.sessionName}\"` : ctx.sessionId.slice(-4);\n spinner.succeed(`Saved ${fromLabel}`);\n }\n\n // Check if target name exists\n const existing = findSessionByName(targetName);\n\n if (existing) {\n // Switch to existing named session\n const session = loadSessionFile(existing.id);\n if (!session) {\n console.log(\" \" + chalk.red(`Could not read session file for ${existing.id}.`));\n console.log();\n return;\n }\n\n const context = buildSwitchContext(session);\n const newId = makeSessionId();\n const newFile = join(getSessionsDir(), `${newId}.json`);\n\n resetContextForSwitch(ctx, {\n sessionId: newId,\n sessionFile: newFile,\n sessionName: targetName,\n messages: [...session.messages],\n conversation: session.thread ? [...session.thread] : [],\n resumedFromId: existing.id,\n resumedSessionSummary: context,\n analysis: session.analysis,\n stage: session.stage,\n dataset: session.dataset,\n deliverables: session.deliverables,\n llm: session.llm ? { ...session.llm } : undefined,\n });\n\n console.log();\n console.log(\" \" + paint(\"accent\", `Switched to \"${targetName}\"`));\n if (session.summary) {\n console.log(\" \" + chalk.dim(\"Context: \") + session.summary);\n }\n const exch = session.exchange_count ?? Math.floor(session.messages.length / 2);\n console.log(\" \" + chalk.dim(`${exch} prior exchange${exch === 1 ? \"\" : \"s\"} loaded`));\n console.log();\n\n return `Switched to \"${targetName}\"`;\n } else {\n // Create new named session\n const newId = makeSessionId();\n const newFile = join(getSessionsDir(), `${newId}.json`);\n\n resetContextForSwitch(ctx, {\n sessionId: newId,\n sessionFile: newFile,\n sessionName: targetName,\n messages: [],\n });\n\n console.log();\n console.log(\" \" + paint(\"accent\", `New session \"${targetName}\"`));\n console.log();\n\n return `New session \"${targetName}\"`;\n }\n}\n\nfunction listNamedSessions(ctx: Context): string | undefined {\n const all = listSessions();\n const named = all.filter((s) => s.name);\n\n if (named.length === 0) {\n console.log();\n console.log(\" \" + chalk.dim(\"No named sessions. Use \") + paint(\"accent\", \"/name <label>\") + chalk.dim(\" to name one.\"));\n console.log();\n return;\n }\n\n console.log();\n console.log(\" \" + paint(\"accent\", bold(\"Named Sessions\")));\n console.log(\" \" + chalk.dim(\"─\".repeat(50)));\n\n // Deduplicate by name (keep most recent)\n const byName = new Map<string, typeof named[0]>();\n for (const s of named) {\n const key = s.name!.toLowerCase();\n if (!byName.has(key)) byName.set(key, s);\n }\n\n for (const [, s] of byName) {\n const isActive = ctx.sessionName?.toLowerCase() === s.name!.toLowerCase();\n const marker = isActive ? paint(\"accent\", \" ◀\") : \"\";\n const summary = s.summary ?? chalk.dim(\"(no summary)\");\n const exch = chalk.dim(`${s.exchange_count} exch.`);\n console.log(` ${paint(\"accent\", s.name!)} ${summary} ${exch}${marker}`);\n }\n\n console.log(\" \" + chalk.dim(\"─\".repeat(50)));\n console.log(\" \" + paint(\"accent\", \"/switch <name>\") + chalk.dim(\" to jump to a session\"));\n console.log();\n\n return `${byName.size} named session${byName.size === 1 ? \"\" : \"s\"}`;\n}\n","import chalk from \"chalk\";\nimport { parseArgs, getBool } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport {\n availableEngineLabels,\n clearLlmSession,\n countAvailableEngines,\n ensureLlmSession,\n formatActiveStack,\n resolveActiveProvider,\n resolveAutoFailoverEnabled,\n} from \"../ai/llm/session-state.js\";\nimport { hasProviderKey, loadLlmConfig } from \"../config/llm-config.js\";\nimport { setConfigValue } from \"../config/store.js\";\nimport { saveSessionState } from \"../cli/context.js\";\nimport { paint } from \"../ui/theme.js\";\nimport type { LlmProvider } from \"../types.js\";\n\nconst PROVIDERS: LlmProvider[] = [\"anthropic\", \"openai\"];\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { positional, flags } = parseArgs(args, [\"default\"]);\n const sub = positional[0]?.toLowerCase();\n\n if (!sub || sub === \"list\") {\n printStatus(ctx);\n return;\n }\n\n if (sub === \"reset\") {\n clearLlmSession(ctx);\n if (!ctx.oneShot) saveSessionState(ctx);\n console.log();\n console.log(\" \" + paint(\"success\", \"✓\") + \" Session engine reset — using config defaults.\");\n console.log(\" \" + chalk.dim(`Default: ${loadLlmConfig().primary}`));\n console.log();\n return;\n }\n\n if (sub === \"save\") {\n const active = resolveActiveProvider(ctx);\n setConfigValue(\"llm-primary\", active);\n const session = ctx.llm;\n if (session?.tier) setConfigValue(\"llm-tier\", session.tier);\n if (session?.autoFailover !== undefined) {\n setConfigValue(\"llm-auto-failover\", session.autoFailover ? \"on\" : \"off\");\n }\n console.log();\n console.log(\" \" + paint(\"success\", \"✓\") + ` Saved ${chalk.bold(active)} as default engine.`);\n console.log();\n return;\n }\n\n if (sub === \"failover\") {\n const on = positional[1]?.toLowerCase();\n const session = ensureLlmSession(ctx);\n if (on === \"on\" || on === \"off\") {\n session.autoFailover = on === \"on\";\n } else {\n session.autoFailover = !resolveAutoFailoverEnabled(ctx);\n }\n if (!ctx.oneShot) saveSessionState(ctx);\n const persist = getBool(flags, \"default\");\n if (persist) {\n setConfigValue(\"llm-auto-failover\", session.autoFailover ? \"on\" : \"off\");\n }\n console.log();\n console.log(\n \" \" + paint(\"success\", \"✓\")\n + ` Auto-failover ${session.autoFailover ? chalk.bold(\"on\") : chalk.bold(\"off\")} for this session.`,\n );\n if (persist) console.log(\" \" + chalk.dim(\"Also saved as config default.\"));\n console.log();\n return;\n }\n\n if (!PROVIDERS.includes(sub as LlmProvider)) {\n console.log();\n console.log(\" \" + chalk.red(`Unknown engine: ${sub}`));\n console.log(\" \" + chalk.dim(\"Usage: /provider [anthropic|openai|list|reset|save|failover on|off]\"));\n console.log();\n return;\n }\n\n const provider = sub as LlmProvider;\n if (!hasProviderKey(provider)) {\n const keyHint = provider === \"anthropic\" ? \"api-key\" : \"openai-api-key\";\n console.log();\n console.log(\" \" + chalk.red(`No ${provider} key configured.`));\n console.log(\" \" + chalk.dim(`Run `) + paint(\"accent\", `/config set ${keyHint}`) + chalk.dim(\" to add one.\"));\n console.log();\n return;\n }\n\n ensureLlmSession(ctx).provider = provider;\n if (!ctx.oneShot) saveSessionState(ctx);\n\n console.log();\n console.log(\" \" + paint(\"success\", \"✓\") + ` Active engine: ${chalk.bold(provider)}`);\n console.log(\" \" + chalk.dim(`Stack: ${formatActiveStack(ctx)}`));\n const others = availableEngineLabels().filter((p) => p !== provider);\n if (others.length > 0) {\n console.log(\" \" + chalk.dim(`Also available: ${others.join(\", \")}`));\n }\n console.log();\n}\n\nfunction printStatus(ctx: Context): void {\n const cfg = loadLlmConfig();\n const active = resolveActiveProvider(ctx);\n const sessionOverride = ctx.llm?.provider !== undefined;\n const autoFailover = resolveAutoFailoverEnabled(ctx);\n const engines = countAvailableEngines();\n\n console.log();\n console.log(chalk.bold(\" LLM engines\"));\n console.log(` Available: ${engines} engine${engines === 1 ? \"\" : \"s\"}`);\n for (const p of PROVIDERS) {\n const key = hasProviderKey(p) ? paint(\"success\", \"✓\") : chalk.dim(\"·\");\n const marker = p === active ? paint(\"accent\", \" ► active\") : \"\";\n console.log(` ${key} ${p}${marker}`);\n }\n console.log();\n console.log(chalk.bold(\" Active stack\"));\n console.log(` ${formatActiveStack(ctx)}`);\n if (sessionOverride) {\n console.log(chalk.dim(\" (session override — /provider reset to use default)\"));\n } else {\n console.log(chalk.dim(` (config default: ${cfg.primary})`));\n }\n console.log();\n console.log(` Auto-failover: ${autoFailover ? paint(\"success\", \"on\") : chalk.dim(\"off\")}`);\n console.log(chalk.dim(\" /provider anthropic|openai — switch engine\"));\n console.log(chalk.dim(\" /provider failover on|off — rate-limit safety net\"));\n console.log(chalk.dim(\" /provider save — persist active engine to config\"));\n console.log();\n}\n","import chalk from \"chalk\";\nimport { parseArgs, getBool } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { listCatalogEntries } from \"../ai/llm/catalog.js\";\nimport {\n ensureLlmSession,\n formatActiveStack,\n resolveActiveProvider,\n resolveModelForActive,\n} from \"../ai/llm/session-state.js\";\nimport { loadLlmConfig } from \"../config/llm-config.js\";\nimport { setConfigValue } from \"../config/store.js\";\nimport { saveSessionState } from \"../cli/context.js\";\nimport { paint } from \"../ui/theme.js\";\nimport type { InferenceTier, LlmProvider } from \"../types.js\";\n\nconst TIERS: InferenceTier[] = [\"high\", \"medium\", \"low\"];\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { positional, flags } = parseArgs(args, [\"default\"]);\n const sub = positional[0]?.toLowerCase();\n\n if (!sub || sub === \"list\") {\n printCatalog(ctx);\n return;\n }\n\n if (!TIERS.includes(sub as InferenceTier)) {\n console.log();\n console.log(\" \" + chalk.red(`Unknown tier: ${sub}`));\n console.log(\" \" + chalk.dim(\"Usage: /tier [high|medium|low|list] [--default]\"));\n console.log();\n return;\n }\n\n const tier = sub as InferenceTier;\n const persist = getBool(flags, \"default\");\n\n if (persist) {\n setConfigValue(\"llm-tier\", tier);\n } else {\n ensureLlmSession(ctx).tier = tier;\n if (!ctx.oneShot) saveSessionState(ctx);\n }\n\n console.log();\n console.log(\n \" \" + paint(\"success\", \"✓\")\n + ` Inference tier set to ${chalk.bold(tier.toUpperCase())}`\n + (persist ? chalk.dim(\" (saved as default)\") : chalk.dim(\" (this session)\")),\n );\n console.log(\" \" + chalk.dim(`Stack: ${formatActiveStack(ctx)}`));\n console.log();\n}\n\nfunction printCatalog(ctx: Context): void {\n const cfg = loadLlmConfig();\n const active = resolveModelForActive(ctx, \"agentic_investigation\");\n const sessionTier = ctx.llm?.tier;\n\n console.log();\n console.log(chalk.bold(\" Inference settings\"));\n console.log(` Active: ${paint(\"accent\", formatActiveStack(ctx))}`);\n if (sessionTier) {\n console.log(chalk.dim(\" (session tier override)\"));\n } else {\n console.log(chalk.dim(` Config default tier: ${cfg.tier.toUpperCase()}`));\n }\n console.log();\n\n for (const tier of TIERS) {\n console.log(chalk.bold(` ${tier.toUpperCase()}`));\n for (const provider of [\"anthropic\", \"openai\"] as LlmProvider[]) {\n const models = listCatalogEntries(provider).filter((m) => m.tier === tier);\n for (const m of models) {\n const isActive = provider === active.provider && tier === active.tier && m.id === active.modelId;\n const marker = isActive ? paint(\"accent\", \"► \") : \" \";\n const status = m.status === \"active\" ? \"\" : chalk.yellow(` [${m.status}]`);\n console.log(`${marker}${provider}/${m.id}${status} — ${m.display_name}`);\n }\n }\n console.log();\n }\n\n console.log(chalk.dim(\" /tier high|medium|low — set tier for this session\"));\n console.log(chalk.dim(\" /tier high --default — also save as config default\"));\n console.log(chalk.dim(\" /provider anthropic|openai — switch engine\"));\n console.log();\n}\n","import chalk from \"chalk\";\nimport { parseArgs, getBool } from \"../cli/argparse.js\";\nimport type { Context } from \"../cli/context.js\";\nimport { getCatalogEntry } from \"../ai/llm/catalog.js\";\nimport {\n ensureLlmSession,\n formatActiveStack,\n resolveActiveProvider,\n resolveEffectiveModelOverride,\n validateModelForProvider,\n} from \"../ai/llm/session-state.js\";\nimport { loadLlmConfig } from \"../config/llm-config.js\";\nimport { getConfigValue, setConfigValue, deleteConfigValue } from \"../config/store.js\";\nimport { saveSessionState } from \"../cli/context.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport async function handler(args: string[], ctx: Context): Promise<void> {\n const { positional, flags } = parseArgs(args, [\"default\"]);\n const sub = positional[0]?.toLowerCase();\n\n if (sub === \"clear\") {\n const persist = getBool(flags, \"default\");\n if (ctx.llm) ctx.llm.modelOverride = undefined;\n if (persist) deleteConfigValue(\"llm-model-override\");\n if (!ctx.oneShot) saveSessionState(ctx);\n console.log();\n console.log(\" \" + paint(\"success\", \"✓\") + \" Model override cleared — using tier defaults.\");\n console.log(\" \" + chalk.dim(`Stack: ${formatActiveStack(ctx)}`));\n console.log();\n return;\n }\n\n if (sub === \"set\") {\n const modelId = positional[1];\n if (!modelId) {\n console.log();\n console.log(\" \" + chalk.red(\"Usage: /model set <model-id> [--default]\"));\n console.log();\n return;\n }\n\n const active = resolveActiveProvider(ctx);\n const providerErr = validateModelForProvider(modelId, active);\n const entry = getCatalogEntry(modelId);\n\n if (providerErr) {\n console.log();\n console.log(\" \" + chalk.red(providerErr));\n console.log();\n return;\n }\n\n if (!entry) {\n console.log();\n console.log(\" \" + chalk.yellow(\"⚠\") + ` Unknown model ${modelId} — saving for active engine anyway.`);\n }\n\n const persist = getBool(flags, \"default\");\n if (persist) {\n setConfigValue(\"llm-model-override\", modelId);\n } else {\n ensureLlmSession(ctx).modelOverride = modelId;\n if (!ctx.oneShot) saveSessionState(ctx);\n }\n\n console.log();\n console.log(\n \" \" + paint(\"success\", \"✓\")\n + ` Model: ${chalk.bold(modelId)}`\n + (persist ? chalk.dim(\" (saved as default)\") : chalk.dim(\" (this session)\")),\n );\n console.log(\" \" + chalk.dim(`Stack: ${formatActiveStack(ctx)}`));\n console.log();\n return;\n }\n\n const sessionOverride = ctx.llm?.modelOverride;\n const globalOverride = getConfigValue(\"llm-model-override\");\n console.log();\n console.log(chalk.bold(\" Model\"));\n if (sessionOverride) {\n console.log(` Session override: ${paint(\"accent\", sessionOverride)}`);\n } else if (globalOverride) {\n console.log(` Config default: ${paint(\"accent\", globalOverride)}`);\n } else {\n console.log(\" \" + chalk.dim(\"No override — tier defaults apply.\"));\n }\n console.log(` Active stack: ${formatActiveStack(ctx)}`);\n console.log(chalk.dim(\" /model set <id> · /model clear · /tier list · /provider list\"));\n console.log();\n}\n","import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { ntrpHome } from \"./store.js\";\n\nexport interface UpdateCheckCache {\n lastCheck: number;\n latestVersion: string;\n}\n\nconst CACHE_TTL_MS = 86_400_000;\n\nfunction cachePath(): string {\n return join(ntrpHome(), \"update-check.json\");\n}\n\nfunction ensureDir(): void {\n const dir = ntrpHome();\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function loadUpdateCheckCache(): UpdateCheckCache | null {\n const path = cachePath();\n if (!existsSync(path)) return null;\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf-8\")) as UpdateCheckCache;\n if (\n !parsed ||\n typeof parsed !== \"object\" ||\n typeof parsed.lastCheck !== \"number\" ||\n typeof parsed.latestVersion !== \"string\"\n ) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function saveUpdateCheckCache(cache: UpdateCheckCache): void {\n ensureDir();\n writeFileSync(cachePath(), JSON.stringify(cache, null, 2) + \"\\n\");\n}\n\nexport function isCacheFresh(cache: UpdateCheckCache | null, ttlMs = CACHE_TTL_MS): cache is UpdateCheckCache {\n if (!cache) return false;\n return Date.now() - cache.lastCheck < ttlMs;\n}\n\nexport function invalidateUpdateCheckCache(): void {\n const path = cachePath();\n if (existsSync(path)) {\n unlinkSync(path);\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nlet cachedVersion: string | undefined;\n\n/** Installed package version from package.json (bundled entry → package root). */\nexport function getInstalledVersion(): string {\n if (cachedVersion) return cachedVersion;\n\n const start = dirname(fileURLToPath(import.meta.url));\n for (const rel of [\"../package.json\", \"../../package.json\"]) {\n const path = join(start, rel);\n if (!existsSync(path)) continue;\n try {\n const pkg = JSON.parse(readFileSync(path, \"utf-8\")) as { version?: string };\n if (typeof pkg.version === \"string\" && pkg.version.length > 0) {\n cachedVersion = pkg.version;\n return cachedVersion;\n }\n } catch {\n // try next candidate\n }\n }\n\n cachedVersion = \"0.0.0\";\n return cachedVersion;\n}\n","import {\n isCacheFresh,\n loadUpdateCheckCache,\n saveUpdateCheckCache,\n type UpdateCheckCache,\n} from \"../config/update-check.js\";\nimport { getInstalledVersion } from \"../version.js\";\n\nexport const NPM_PACKAGE = \"@sonnechasser/ntrp\";\n\nfunction registryUrl(): string {\n return process.env.NTRP_REGISTRY_URL ?? \"https://registry.npmjs.org/@sonnechasser/ntrp/latest\";\n}\n\nexport interface UpdateCheckResult {\n current: string;\n latest: string;\n updateAvailable: boolean;\n}\n\nfunction parseVersionParts(version: string): [number, number, number] {\n const cleaned = version.trim().replace(/^v/i, \"\");\n const core = cleaned.split(\"-\")[0] ?? cleaned;\n const parts = core.split(\".\").map((p) => parseInt(p, 10));\n return [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0];\n}\n\nexport function isNewerVersion(latest: string, current: string): boolean {\n const [lMaj, lMin, lPatch] = parseVersionParts(latest);\n const [cMaj, cMin, cPatch] = parseVersionParts(current);\n if (lMaj !== cMaj) return lMaj > cMaj;\n if (lMin !== cMin) return lMin > cMin;\n return lPatch > cPatch;\n}\n\nexport function formatUpdateNudge(current: string, latest: string): string {\n return `⚡ NTRP v${latest} available (you're on v${current}) — type /update to upgrade`;\n}\n\nexport async function fetchLatestVersion(timeoutMs = 5000): Promise<string | null> {\n try {\n const res = await fetch(registryUrl(), { signal: AbortSignal.timeout(timeoutMs) });\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: unknown };\n return typeof data.version === \"string\" && data.version.length > 0 ? data.version : null;\n } catch {\n return null;\n }\n}\n\nfunction buildResult(current: string, latest: string): UpdateCheckResult {\n return {\n current,\n latest,\n updateAvailable: isNewerVersion(latest, current),\n };\n}\n\nexport async function checkForUpdate(options?: {\n force?: boolean;\n timeoutMs?: number;\n}): Promise<UpdateCheckResult | null> {\n const current = getInstalledVersion();\n const timeoutMs = options?.timeoutMs ?? 5000;\n const cached = loadUpdateCheckCache();\n\n if (!options?.force && isCacheFresh(cached)) {\n return buildResult(current, cached.latestVersion);\n }\n\n const latest = await fetchLatestVersion(timeoutMs);\n if (!latest) {\n if (cached?.latestVersion) {\n return buildResult(current, cached.latestVersion);\n }\n return null;\n }\n\n const nextCache: UpdateCheckCache = { lastCheck: Date.now(), latestVersion: latest };\n saveUpdateCheckCache(nextCache);\n return buildResult(current, latest);\n}\n","/**\n * /update — install the latest globally published NTRP package.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { invalidateUpdateCheckCache } from \"../config/update-check.js\";\nimport {\n fetchLatestVersion,\n isNewerVersion,\n NPM_PACKAGE,\n} from \"../update/registry.js\";\nimport { getInstalledVersion } from \"../version.js\";\n\nconst PERMISSIONS_URL =\n \"https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally\";\n\nfunction tailLines(text: string, count = 5): string {\n return text\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0)\n .slice(-count)\n .join(\"\\n\");\n}\n\nfunction runGlobalInstall(): { ok: boolean; output: string } {\n const result = spawnSync(\n \"npm\",\n [\"install\", \"-g\", `${NPM_PACKAGE}@latest`],\n {\n encoding: \"utf-8\",\n shell: process.platform === \"win32\",\n },\n );\n const output = [result.stdout, result.stderr].filter(Boolean).join(\"\\n\");\n return { ok: result.status === 0, output };\n}\n\nexport async function handler(_args: string[], _ctx: Context): Promise<void> {\n const current = getInstalledVersion();\n const latest = await fetchLatestVersion(10_000);\n\n if (!latest) {\n console.log();\n console.log(chalk.yellow(\" Could not reach the npm registry.\"));\n console.log(chalk.dim(` Try manually: npm install -g ${NPM_PACKAGE}`));\n console.log();\n return;\n }\n\n if (!isNewerVersion(latest, current)) {\n console.log();\n console.log(chalk.green(` ✓ You're on the latest version (v${current})`));\n console.log();\n return;\n }\n\n console.log();\n console.log(` Updating NTRP v${current} → v${latest}...`);\n\n const { ok, output } = runGlobalInstall();\n if (ok) {\n invalidateUpdateCheckCache();\n console.log(chalk.green(` ✓ Updated! Restart NTRP to use v${latest}`));\n console.log();\n return;\n }\n\n const lower = output.toLowerCase();\n if (lower.includes(\"eacces\") || lower.includes(\"permission denied\") || lower.includes(\"eperm\")) {\n console.log(chalk.red(` Could not install ${NPM_PACKAGE} (permission denied).`));\n console.log(chalk.dim(` Try: sudo npm install -g ${NPM_PACKAGE}`));\n console.log(chalk.dim(` Or fix npm global permissions: ${PERMISSIONS_URL}`));\n console.log();\n return;\n }\n\n const detail = tailLines(output);\n console.log(chalk.red(` Could not install ${NPM_PACKAGE}.`));\n if (detail) {\n console.log(chalk.dim(` ${detail.split(\"\\n\").join(\"\\n \")}`));\n }\n console.log(chalk.dim(` Try manually: npm install -g ${NPM_PACKAGE}`));\n console.log();\n}\n","/**\n * Workflow registry — defines the available slash commands + their metadata\n * + which handler module runs them. Markdown-style frontmatter is embedded\n * as strings below so tsup can bundle everything into a single-file CLI.\n *\n * Handlers are loaded lazily (dynamic import) the first time each command is\n * dispatched. The registry is the single source of truth for the /help output\n * and the welcome dashboard's command list.\n */\n\nimport type { Context } from \"../cli/context.js\";\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface WorkflowMeta {\n name: string; // \"diagnose\"\n description: string; // short one-liner\n section: string; // \"Analysis\", \"Data\", etc.\n args?: string; // \"[--deep] [--segment <name>]\"\n handler: string; // \"../commands/diagnose.js\" (runtime relative)\n body: string; // long-form text after frontmatter (for /help <name>)\n hidden?: boolean; // if true, omit from welcome list + /help (still dispatchable)\n}\n\nexport type Handler = (args: string[], ctx: Context) => Promise<string | void>;\n\nexport interface WorkflowEntry {\n meta: WorkflowMeta;\n handler: Handler | null; // lazily populated\n}\n\n// ============================================================\n// Frontmatter parser (YAML subset — good enough for our files)\n// ============================================================\n\nfunction parseFrontmatter(raw: string): { meta: Record<string, string>; body: string } {\n if (!raw.startsWith(\"---\")) return { meta: {}, body: raw };\n const end = raw.indexOf(\"\\n---\", 3);\n if (end === -1) return { meta: {}, body: raw };\n\n const fm = raw.slice(3, end).trim();\n const body = raw.slice(end + 4).replace(/^\\r?\\n/, \"\");\n\n const meta: Record<string, string> = {};\n for (const line of fm.split(\"\\n\")) {\n const match = line.match(/^(\\w+):\\s*(.*)$/);\n if (!match) continue;\n let value = match[2]!.trim();\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n meta[match[1]!] = value;\n }\n return { meta, body: body.trim() };\n}\n\n// ============================================================\n// Discovery\n// ============================================================\n\nlet registry: Map<string, WorkflowEntry> | null = null;\n\n/** Load the registry once and cache it. */\nexport function loadRegistry(): Map<string, WorkflowEntry> {\n if (registry) return registry;\n\n registry = new Map();\n\n for (const entry of EMBEDDED_WORKFLOWS) {\n const { meta: fm, body } = parseFrontmatter(entry.raw);\n const meta: WorkflowMeta = {\n name: fm.name ?? entry.name,\n description: fm.description ?? \"\",\n section: fm.section ?? \"Other\",\n args: fm.args,\n handler: fm.handler ?? \"\",\n body,\n hidden: fm.hidden === \"true\",\n };\n registry.set(meta.name, { meta, handler: null });\n }\n\n return registry;\n}\n\nexport function hasCommand(name: string): boolean {\n return loadRegistry().has(name);\n}\n\nexport function getWorkflow(name: string): WorkflowEntry | undefined {\n return loadRegistry().get(name);\n}\n\n/**\n * List workflows for display in /help and the welcome dashboard. Hidden\n * workflows (e.g. `/demo`, now subsumed by `/ingest --demo`) are filtered\n * out unless `includeHidden` is true. Hidden commands remain dispatchable\n * via `getWorkflow`/`resolveHandler`.\n */\nexport function listWorkflows(includeHidden = false): WorkflowMeta[] {\n const all = Array.from(loadRegistry().values()).map((e) => e.meta);\n return includeHidden ? all : all.filter((m) => !m.hidden);\n}\n\n/** List registered command names for completion and suggestion surfaces. */\nexport function listCommandNames(includeHidden = true): string[] {\n return listWorkflows(includeHidden).map((m) => m.name).sort((a, b) => a.localeCompare(b));\n}\n\n/** Suggest a likely command for a partial or mistyped command token. */\nexport function suggestCommand(input: string): string | null {\n const normalized = normalizeCommandName(input);\n if (!normalized) return null;\n\n const commandNames = listCommandNames(true);\n const prefixMatches = commandNames.filter((name) => name.startsWith(normalized));\n if (prefixMatches.length === 1) return prefixMatches[0]!;\n\n const ranked = commandNames\n .map((name) => ({ name, distance: levenshteinDistance(normalized, name) }))\n .sort((a, b) => a.distance - b.distance || a.name.localeCompare(b.name));\n\n const best = ranked[0];\n if (!best) return null;\n\n const threshold = normalized.length <= 5 ? 2 : 3;\n return best.distance <= threshold ? best.name : null;\n}\n\nfunction normalizeCommandName(input: string): string {\n return input.trim().replace(/^\\//, \"\").toLowerCase();\n}\n\nfunction levenshteinDistance(a: string, b: string): number {\n const previous = Array.from({ length: b.length + 1 }, (_, i) => i);\n const current = Array.from({ length: b.length + 1 }, () => 0);\n\n for (let i = 1; i <= a.length; i++) {\n current[0] = i;\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n current[j] = Math.min(\n current[j - 1]! + 1,\n previous[j]! + 1,\n previous[j - 1]! + cost,\n );\n }\n previous.splice(0, previous.length, ...current);\n }\n\n return previous[b.length]!;\n}\n\n/** Dynamically load the handler module for a given command. */\nexport async function resolveHandler(name: string): Promise<Handler | null> {\n const entry = loadRegistry().get(name);\n if (!entry) return null;\n if (entry.handler) return entry.handler;\n\n const modulePath = entry.meta.handler;\n if (!modulePath) return null;\n\n // Map \"../commands/diagnose.ts\" → \"../commands/diagnose.js\" for ESM runtime\n const runtimePath = modulePath.replace(/\\.ts$/, \".js\");\n\n try {\n const mod = await importHandler(runtimePath);\n if (!mod) return null;\n const handler = (mod as { handler?: Handler }).handler;\n if (typeof handler !== \"function\") return null;\n entry.handler = handler;\n return handler;\n } catch (err) {\n console.error(`Failed to load handler for /${name}:`, err);\n return null;\n }\n}\n\n// ============================================================\n// Static handler map — required so tsup can bundle handler modules.\n// Each case is a static dynamic import that tsup can follow.\n// ============================================================\n\nasync function importHandler(runtimePath: string): Promise<unknown> {\n switch (runtimePath) {\n case \"../commands/new.js\": return import(\"../commands/new.js\");\n case \"../commands/end.js\": return import(\"../commands/end.js\");\n case \"../commands/session.js\": return import(\"../commands/session.js\");\n case \"../commands/handoff.js\": return import(\"../commands/handoff.js\");\n case \"../commands/diagnose.js\": return import(\"../commands/diagnose.js\");\n case \"../commands/actions.js\": return import(\"../commands/actions.js\");\n case \"../commands/ingest.js\": return import(\"../commands/ingest.js\");\n case \"../commands/generate.js\": return import(\"../commands/generate.js\");\n case \"../commands/segment.js\": return import(\"../commands/segment.js\");\n case \"../commands/strategy.js\": return import(\"../commands/strategy.js\");\n case \"../commands/report.js\": return import(\"../commands/report.js\");\n case \"../commands/status.js\": return import(\"../commands/status.js\");\n case \"../commands/scratch.js\": return import(\"../commands/scratch.js\");\n case \"../commands/cleanup.js\": return import(\"../commands/cleanup.js\");\n case \"../commands/deactivate-demo.js\": return import(\"../commands/deactivate-demo.js\");\n case \"../commands/reset.js\": return import(\"../commands/reset.js\");\n case \"../commands/playbook.js\": return import(\"../commands/playbook.js\");\n case \"../commands/export.js\": return import(\"../commands/export.js\");\n case \"../commands/publish.js\": return import(\"../commands/publish.js\");\n case \"../commands/profile.js\": return import(\"../commands/profile.js\");\n case \"../commands/config.js\": return import(\"../commands/config.js\");\n case \"../commands/activate.js\": return import(\"../commands/activate.js\");\n case \"../commands/onboard.js\": return import(\"../commands/onboard.js\");\n case \"../commands/setup.js\": return import(\"../commands/setup.js\");\n case \"../commands/ask.js\": return import(\"../commands/ask.js\");\n case \"../commands/metrics.js\": return import(\"../commands/metrics.js\");\n case \"../commands/feedback.js\": return import(\"../commands/feedback.js\");\n case \"../commands/recap.js\": return import(\"../commands/recap.js\");\n case \"../commands/remember.js\": return import(\"../commands/remember.js\");\n case \"../commands/recall.js\": return import(\"../commands/recall.js\");\n case \"../commands/rate.js\": return import(\"../commands/rate.js\");\n case \"../commands/knowledge.js\": return import(\"../commands/knowledge.js\");\n case \"../commands/sessions.js\": return import(\"../commands/sessions.js\");\n case \"../commands/resume.js\": return import(\"../commands/resume.js\");\n case \"../commands/name.js\": return import(\"../commands/name.js\");\n case \"../commands/switch.js\": return import(\"../commands/switch.js\");\n case \"../commands/backmeup.js\": return import(\"../commands/backmeup.js\");\n case \"../commands/provider.js\": return import(\"../commands/provider.js\");\n case \"../commands/tier.js\": return import(\"../commands/tier.js\");\n case \"../commands/model.js\": return import(\"../commands/model.js\");\n case \"../commands/update.js\": return import(\"../commands/update.js\");\n default: return null;\n }\n}\n\n// ============================================================\n// Embedded workflow definitions. The raw strings are equivalent to the\n// contents of src/workflows/*.md files. Edit here; do not add separate files.\n// ============================================================\n\ninterface EmbeddedWorkflow {\n name: string;\n raw: string;\n}\n\nconst EMBEDDED_WORKFLOWS: EmbeddedWorkflow[] = [\n {\n name: \"new\",\n raw: `---\nname: new\ndescription: Start a new analysis — one menu picks data + first report\nsection: Hidden\nhidden: true\nargs: [<file.csv>] | --demo [--scenario <name>] | --empty [--lens health|metrics]\nhandler: ../commands/new.ts\n---\n\nStart a fresh point-in-time analysis. Interactive mode uses **one menu**: demo →\nhealth, demo → metrics, your CSV, or empty. Loads data and runs the first report\n(formulas only — no AI unless you add \\`--findings\\` later). Demo metrics works\nwithout \\`/onboard\\`; your own CSV needs a profile for metrics calibration.\nAfter the report, **ask questions in plain English** — no slash needed.`,\n },\n {\n name: \"end\",\n raw: `---\nname: end\ndescription: Close the current analysis without a handoff\nsection: Start\nargs: \nhandler: ../commands/end.ts\n---\n\nMark the current session as finished even when you didn't produce a report or\nother output. It drops off the \"in progress\" list, saves your transcript and\ndataset anchor for later, and rotates you to a fresh empty session. Use\n\\`/handoff\\` instead when you want to ship something.`,\n },\n {\n name: \"session\",\n raw: `---\nname: session\ndescription: Pick up or browse your analyses\nsection: Hidden\nhidden: true\nargs: [<id|name>] | new\nhandler: ../commands/session.ts\n---\n\nMove between your point-in-time analyses. With no arguments, lists your\nsessions with unfinished work (reached insight, never delivered) surfaced\nfirst. Pass a session id (or type the 4-char suffix after listing) to pick it\nback up — this rebinds its dataset and conversation so you continue exactly\nwhere you left off. \\`new\\` starts a fresh analysis.`,\n },\n {\n name: \"handoff\",\n raw: `---\nname: handoff\ndescription: Turn the analysis into an output\nsection: Start\nargs: [report|notes|csv|publish|prompt] [deck|asana|clay|plan]\nhandler: ../commands/handoff.ts\n---\n\nClose the loop to action. Produce a markdown report, a notes export, CSV\nreceipts, or a repository package — or generate a ready-to-paste prompt for\nanother agent to build a review deck, an Asana project, a Clay table, or an\naction plan from this diagnosis. Producing an output marks the session\ndelivered so it stops showing up as unfinished work.`,\n },\n {\n name: \"onboard\",\n raw: `---\nname: onboard\ndescription: Set up your company profile\nsection: Settings\nhandler: ../commands/onboard.ts\n---\n\nRun the first-run wizard to build a rich company profile. Configures one or\ntwo LLM engines (Anthropic and/or OpenAI), then asks\na few seed questions and uses AI to draft industry, ICP, deal size, and stack\nguesses. Profile is stored at \\`~/.ntrp/profile.json\\` and flows into every\nAI surface (findings, NL answers, demo generation).`,\n },\n {\n name: \"sessions\",\n raw: `---\nname: sessions\ndescription: Browse past session history\nsection: More\nargs: [list|show <id>]\nhandler: ../commands/sessions.ts\nhidden: true\n---\n\nList and inspect past REPL sessions. Shows session dates, AI-generated\nsummaries, and exchange counts. Use \\`show <id>\\` to view the full\nconversation from a specific session.`,\n },\n {\n name: \"setup\",\n raw: `---\nname: setup\ndescription: Configure NTRP for headless and agent use\nsection: Settings\nargs: check | agent [--profile <file|->]\nhandler: ../commands/setup.ts\n---\n\nValidate local readiness or configure NTRP non-interactively for automation.\n\\`setup check --json\\` reports license, profile, API key, database, and writable\ndirectory state. \\`setup agent\\` accepts a profile JSON file or direct flags.`,\n },\n {\n name: \"update\",\n raw: `---\nname: update\ndescription: Update NTRP to the latest version\nsection: Settings\nhandler: ../commands/update.ts\n---\n\nUpdate the globally installed NTRP package via npm.`,\n },\n {\n name: \"resume\",\n raw: `---\nname: resume\ndescription: Continue a previous session\nsection: More\nargs: [id]\nhandler: ../commands/resume.ts\nhidden: true\n---\n\nLoad a previous session's context so the AI can reference what was\ndiscussed before. Without an ID, resumes the most recent session.\nUse a full session ID or 4-char suffix.`,\n },\n {\n name: \"name\",\n raw: `---\nname: name\ndescription: Tag this session with a label\nsection: More\nargs: [label]\nhandler: ../commands/name.ts\n---\n\nGive the current session a human-readable name so you can find it\nlater. The name appears in the REPL prompt, session list, and\nwelcome dashboard. Max 40 characters.`,\n },\n {\n name: \"switch\",\n raw: `---\nname: switch\ndescription: Jump to a named session\nsection: More\nargs: [name]\nhandler: ../commands/switch.ts\nhidden: true\n---\n\nSave the current session and switch to a named one. If the name\nexists, loads its context and messages. If new, creates a fresh\nsession with that name. Without arguments, lists all named sessions.`,\n },\n {\n name: \"actions\",\n raw: `---\nname: actions\ndescription: Propose, approve, and execute actions\nsection: More\nargs: [list|test|show|approve|reject|execute|continue] [id]\nhandler: ../commands/actions.ts\n---\n\nCreate and manage action proposals. \\`/actions test\\` creates a local manual\ndry-run proposal that exercises the approval and execution lifecycle without\ntouching external tools. Execute-class actions require local approval before\nthey can run. Use \\`/actions continue\\` to advance the newest pending or\napproved proposal without copying a handle during the active workflow.`,\n },\n {\n name: \"diagnose\",\n raw: `---\nname: diagnose\ndescription: Compute vital signs and generate findings\nsection: Hidden\nhidden: true\nargs: [--deep] [--segment <name>]\nhandler: ../commands/diagnose.ts\n---\n\nCompute the 5 vital signs (freshness, flow rate, drop rate, signal-to-noise,\nthread depth) for either the full dataset or a segment. Companion to \\`/metrics\\`\nwhen your session primary is SaaS metrics. Use \\`--deep\\` to run the agentic\ninvestigation loop instead of the single-shot findings path.`,\n },\n {\n name: \"metrics\",\n raw: `---\nname: metrics\ndescription: SaaS metrics — refresh or add the revenue view\nsection: Hidden\nhidden: true\nargs: [--findings] [--segment <name>]\nhandler: ../commands/metrics.ts\n---\n\nCompute SaaS revenue metrics from pipeline or revenue-ledger data: ARR, NRR/GRR,\nWin Rate, Pipeline Coverage, and more. Each metric includes a confidence score\nand reliability gate showing what data unlocks the next tier. Use \\`--findings\\`\nfor AI analysis calibrated to your company profile. Revenue ledger CSV format:\naccount, period, mrr, event_type.`,\n },\n {\n name: \"ask\",\n raw: `---\nname: ask\ndescription: Chat with your pipeline data\nsection: Hidden\nhidden: true\nargs: <question>\nhandler: ../commands/ask.ts\n---\n\nAsk a plain-English question about your GTM health and SaaS metrics. Free-form\ntext at the REPL prompt routes to the same agent. Respects your session primary\nlens; can cross-reference vital signs and revenue metrics via tools.`,\n },\n {\n name: \"recap\",\n raw: `---\nname: recap\ndescription: Summarize the current session\nsection: More\nhandler: ../commands/recap.ts\n---\n\nSummarize the current REPL session using AI. Reads all natural-language\nexchanges from the session and produces a structured overview: key findings,\ndollar impacts, and recommended next steps.`,\n },\n {\n name: \"remember\",\n raw: `---\nname: remember\ndescription: Teach the analyst a durable fact\nsection: More\nargs: <fact> | decision: <text> | preference: <text>\nhandler: ../commands/remember.ts\n---\n\nStore a durable fact, decision, or preference about your business. Stored\nmemory flows into every future analysis so the agent gets to know your\nbusiness better over time — like a consultant building up a client file.`,\n },\n {\n name: \"recall\",\n raw: `---\nname: recall\ndescription: See what the analyst remembers\nsection: More\nargs: [topic]\nhandler: ../commands/recall.ts\n---\n\nJog the analyst's memory. With no arguments, lists the durable facts it knows\nand the analyses it has already run. Pass a topic to see what it remembers\nabout that subject — pulled from facts, strategies, wins, and ingested\nknowledge.`,\n },\n {\n name: \"rate\",\n raw: `---\nname: rate\ndescription: Give feedback on the last answer\nsection: More\nargs: good [note] | bad <note>\nhandler: ../commands/rate.ts\n---\n\nTell the analyst how its last answer landed. \\`/rate good\\` reinforces the\napproach; \\`/rate bad <what was off>\\` records a correction. Feedback becomes a\ndurable preference so the analyst gets better at working with you over time.`,\n },\n {\n name: \"knowledge\",\n raw: `---\nname: knowledge\ndescription: Ingest external case studies & frameworks\nsection: More\nargs: [add <file> | list]\nhandler: ../commands/knowledge.ts\n---\n\nTeach the analyst from work done outside the platform. \\`/knowledge add <file>\\`\ningests a markdown, text, or PDF case study, framework, or benchmark report and\nindexes it for retrieval during analysis. \\`/knowledge list\\` shows what's\nindexed. Drop files into ~/.ntrp/knowledge to stage them.`,\n },\n {\n name: \"ingest\",\n raw: `---\nname: ingest\ndescription: Import CRM CSV exports (or --demo)\nsection: Hidden\nhidden: true\nargs: <file> | --demo [--scenario <name>]\nhandler: ../commands/ingest.ts\n---\n\nImport a CSV file from your CRM (Salesforce, HubSpot, Outreach). The command\nauto-detects the entity type based on column headers and runs identity\nresolution after import.\n\nPass \\`--demo\\` instead of a file to generate a synthetic dataset shaped by\nyour company profile. Accepts \\`--scenario <name>\\` to pick a scenario (else\nrandom) and \\`--regen-taxonomy\\` to rebuild the profile-derived market\ntaxonomy. Rep names draw from a curated music / sports / film roster for a\nlittle demo delight; pass \\`--no-whimsy\\` to use generic names instead.`,\n },\n {\n name: \"demo\",\n raw: `---\nname: demo\ndescription: Generate demo scenario data\nsection: Getting Started\nargs: [--scenario <name>] [--regen-taxonomy] [--no-whimsy]\nhandler: ../commands/generate.ts\nhidden: true\n---\n\nGenerate a complete dataset for one of 5 demo scenarios: hidden_crisis,\nleaky_bucket, stale_pipeline, lone_wolf, busy_bees. Without \\`--scenario\\`,\npicks one at random each run. Use \\`--list-scenarios\\` to see descriptions.\nUse \\`--regen-taxonomy\\` to force a fresh AI-built market taxonomy.\nBy default, sales rep names are drawn from a curated music / sports / film\nroster; pass \\`--no-whimsy\\` for generic placeholder names.\n\nThis command is hidden — prefer \\`/ingest --demo\\` which delegates here.`,\n },\n {\n name: \"strategy\",\n raw: `---\nname: strategy\ndescription: Ingest and manage GTM strategies\nsection: More\nargs: [list|ingest|add|show|sync|sources] [file|text|id|folder]\nhandler: ../commands/strategy.ts\n---\n\nAdd user-authored or agent-authored GTM strategies to NTRP's strategy library.\n\\`/strategy ingest <file>\\` accepts markdown, YAML, PDF, or plain text files.\n\\`/strategy ingest -\\` reads strategy text from stdin, and \\`/strategy add \"...\"\\`\ncreates a strategy from a short pasted description.\n\\`/strategy sync --path <folder>\\` scans an Obsidian-style local library and\nimports supported strategy documents. Use \\`/strategy sources\\` to see available\nlibrary connector types.`,\n },\n {\n name: \"segment\",\n raw: `---\nname: segment\ndescription: Browse and inspect segments\nsection: More\nargs: [list|show|compare|create|delete] [args]\nhandler: ../commands/segment.ts\n---\n\nBrowse, inspect, and manage data segments. With no arguments, lists all\nsegments sorted worst-first. Subcommands: \\`show <name>\\`, \\`compare <a> <b>\\`,\n\\`create <name> --entity <type> --filter <expr>\\`, \\`delete <name>\\`.`,\n },\n {\n name: \"report\",\n raw: `---\nname: report\ndescription: Export latest diagnosis\nsection: More\nargs: [--format terminal|md|json] [--output <file>]\nhandler: ../commands/report.ts\n---\n\nExport the most recent diagnosis as terminal output, markdown, or JSON. Use\n\\`--output <file>\\` to write to disk instead of stdout.`,\n },\n {\n name: \"status\",\n raw: `---\nname: status\ndescription: Show last diagnosis and entity counts\nsection: More\nhandler: ../commands/status.ts\n---\n\nShow what data you currently have loaded and the result of your last\ndiagnosis, if any.`,\n },\n {\n name: \"scratch\",\n raw: `---\nname: scratch\ndescription: Wipe config, profile, and all datasets\nsection: Admin\nargs: [--confirm]\nhandler: ../commands/scratch.ts\nhidden: true\n---\n\nMinimal factory reset: removes API key, config, company profile, all sessions,\nper-session datasets, and demo taxonomy cache. Preserves memory, strategies,\nwins, knowledge, exports, and audit. Requires typing \\`scratch\\` in the REPL\nor passing \\`--confirm\\` one-shot. Triggers onboarding on next interactive use.`,\n },\n {\n name: \"cleanup\",\n raw: `---\nname: cleanup\ndescription: Close all active sessions\nsection: Admin\nargs: [--confirm]\nhandler: ../commands/cleanup.ts\nhidden: true\n---\n\nMark every in-progress session as ended without deleting transcripts or dataset\nfiles. Interactive REPL only. Confirm with y/N or \\`--confirm\\` one-shot.`,\n },\n {\n name: \"deactivate-demo\",\n raw: `---\nname: deactivate-demo\ndescription: Disable demo data generators\nsection: Admin\nargs: [--confirm]\nhandler: ../commands/deactivate-demo.ts\nhidden: true\n---\n\nPersistently disable demo generators (\\`/ingest --demo\\`, \\`/new --demo\\`, NL\n\"use demo data\"). Re-enable with \\`/config set demo-enabled true\\`.`,\n },\n {\n name: \"reset\",\n raw: `---\nname: reset\ndescription: Clear all data and start fresh\nsection: More\nargs: [--force]\nhandler: ../commands/reset.ts\n---\n\nDrop all rows from every table in the local DuckDB database. Requires\n\\`--force\\` to proceed.`,\n },\n {\n name: \"playbook\",\n raw: `---\nname: playbook\ndescription: Show or extend recommended plays\nsection: More\nargs: [--vital-sign <name>] [play-id] | add\nhandler: ../commands/playbook.ts\n---\n\nShow the playbook of recommended plays keyed to each vital sign. Pass a\nplay-id to drill into a single play's steps and expected outcome. Run\n\\`/playbook add\\` and the analyst walks you through capturing a new play, step by\nstep — no flags or quoting needed. Learned plays become recommendable during\nanalysis. (Power users can still pass everything as flags in one shot.)`,\n },\n {\n name: \"export\",\n raw: `---\nname: export\ndescription: Save diagnosis to Obsidian notes\nsection: More\nargs: [--dir <path>] [--segment <name>]\nhandler: ../commands/export.ts\n---\n\nWrite the most recent diagnosis to your configured notes directory as\nmarkdown, ready for Obsidian, Logseq, or any other note tool.`,\n },\n {\n name: \"publish\",\n raw: `---\nname: publish\ndescription: Preview and propose repository exports\nsection: More\nargs: [preview|propose|targets] [--target markdown] [--dir <path>]\nhandler: ../commands/publish.ts\n---\n\nBuild a full repository export package from the latest diagnosis, findings,\nstrategies, evidence, and action receipts. \\`preview\\` shows the write plan;\n\\`propose\\` creates an approval-gated action proposal. The first executable\ntarget is local markdown for Obsidian-compatible repositories. Notion,\nAirtable, and GitHub mappings are documented via \\`/publish targets\\`.`,\n },\n {\n name: \"backmeup\",\n raw: `---\nname: backmeup\ndescription: Export diagnosis receipts as CSV\nsection: More\nargs: [--output <dir>]\nhandler: ../commands/backmeup.ts\n---\n\nExport your latest diagnosis as a folder of CSV files you can attach to a\nSlack thread, email, or slide deck. Creates a timestamped folder under\n~/.ntrp/exports/ containing a cover sheet with headline numbers, a findings\nfile, and per-vital-sign evidence CSVs showing exactly which deals, contacts,\nor orgs drove each score. Use --output <dir> to write somewhere else.`,\n },\n {\n name: \"profile\",\n raw: `---\nname: profile\ndescription: Set sales motion\nsection: Settings\nargs: [list|set|show] [preset]\nhandler: ../commands/profile.ts\n---\n\nChoose a sales motion preset (PLG, SMB Velocity, Mid-Market, Enterprise). Each\npreset adjusts the vital-sign thresholds to match your deal cycle.`,\n },\n {\n name: \"config\",\n raw: `---\nname: config\ndescription: Get/set config values\nsection: Settings\nargs: [get|set|list|delete] <key> [value]\nhandler: ../commands/config.ts\n---\n\nManage CLI configuration stored at \\`~/.ntrp/config.json\\`. Useful keys:\n\\`api-key\\` (Anthropic), \\`openai-api-key\\`, \\`llm-primary\\` (default engine),\n\\`llm-tier\\`, \\`llm-auto-failover\\`, \\`default-format\\`, \\`export-dir\\`.\n\n\\`/config set api-key\\` and \\`/config set openai-api-key\\` open hidden prompts.`,\n },\n {\n name: \"provider\",\n raw: `---\nname: provider\ndescription: Switch active LLM engine\nsection: Settings\nargs: [anthropic|openai|list|reset|save|failover on|off]\nhandler: ../commands/provider.ts\n---\n\nChoose which engine answers this session — Anthropic or OpenAI when both keys\nare configured. Session-scoped by default; \\`/provider save\\` writes the default\nto config. \\`/provider failover on\\` enables rate-limit auto-failover.`,\n },\n {\n name: \"tier\",\n raw: `---\nname: tier\ndescription: Set inference tier (HIGH/MEDIUM/LOW)\nsection: Settings\nargs: [high|medium|low|list] [--default]\nhandler: ../commands/tier.ts\n---\n\nSet quality/cost tier for this REPL session. Agentic surfaces respect your tier;\nsome single-shot surfaces keep fixed defaults. \\`/tier list\\` highlights the\nactive stack. Add \\`--default\\` to persist to config.`,\n },\n {\n name: \"model\",\n raw: `---\nname: model\ndescription: Override the active LLM model\nsection: Settings\nargs: [set <id>|clear] [--default]\nhandler: ../commands/model.ts\n---\n\nPin a catalog model on the **active engine** (e.g. claude-opus-4-6 on anthropic).\nCross-provider IDs are rejected — switch with \\`/provider\\` first.`,\n },\n {\n name: \"activate\",\n raw: `---\nname: activate\ndescription: Enter license key\nsection: Settings\nargs: <license>\nhandler: ../commands/activate.ts\n---\n\nActivate NTRP with your license key (format: NTRP-XXXX-XXXX-XXXX). Most\ncommands require a valid license.`,\n },\n {\n name: \"feedback\",\n raw: `---\nname: feedback\ndescription: Correct your profile in plain English\nsection: Settings\nargs: <correction>\nhandler: ../commands/feedback.ts\n---\n\nApply natural-language corrections to your company profile. Maps structured\nfields when possible (e.g. \"our sales cycle is 6 months\" updates\nsales_cycle_days) and merges remaining nuances into a custom_context\nparagraph that flows into all AI surfaces.`,\n },\n];\n","import chalk from \"chalk\";\nimport type { Context } from \"../cli/context.js\";\nimport { canUseReplAi } from \"../ai/repl-api.js\";\nimport { resolveConversationPhase } from \"./phase.js\";\nimport {\n extractFilePath,\n looksLikeFilePath,\n ingestFromChat,\n isDemoIntent,\n loadDemoFromChat,\n} from \"./ingest-chat.js\";\nimport { isComputeIntent, runConversationCompute } from \"./compute.js\";\nimport { refreshGapAudit } from \"./gap-audit.js\";\nimport { printGapCard } from \"./gap-card.js\";\nimport {\n handleDeterministic,\n handleDeliverFlow,\n handleExploreWithoutKey,\n} from \"./orchestrator.js\";\nimport { isShipIntent } from \"./handoff-draft.js\";\nimport { isAnalysisReady } from \"../cli/context.js\";\nimport { guardDemoEnabled } from \"../config/demo.js\";\n\nexport type ConversationRouterResult =\n | { handled: true; summary?: string }\n | { handled: false }\n | { handled: true; delegateNl: true };\n\nconst FRESH_START_RE =\n /\\b(start (over|fresh)|new analysis|start again|reset session)\\b/i;\n\n/**\n * Conversation-first routing for interactive REPL input (non-slash).\n * Returns handled:false to fall through to slash commands / legacy paths.\n */\nexport async function conversationRouter(\n input: string,\n ctx: Context,\n): Promise<ConversationRouterResult> {\n if (ctx.oneShot || (ctx.wizardDepth ?? 0) > 0) {\n return { handled: false };\n }\n\n const line = input.trim();\n if (!line) return { handled: true };\n\n if (FRESH_START_RE.test(line)) {\n console.log();\n console.log(\n \" \" +\n chalk.dim(\"Start a fresh analysis? This keeps prior sessions — say \") +\n chalk.cyan(\"yes\") +\n chalk.dim(\" to confirm or \") +\n chalk.cyan(\"/home\") +\n chalk.dim(\" for the dashboard.\"),\n );\n console.log();\n return { handled: true };\n }\n\n const phase = resolveConversationPhase(ctx);\n\n if (looksLikeFilePath(line)) {\n const path = extractFilePath(line)!;\n await ingestFromChat(ctx, path);\n return { handled: true, summary: \"Data ingested\" };\n }\n\n if (isDemoIntent(line)) {\n if (!guardDemoEnabled()) {\n return { handled: true, summary: \"Demo disabled\" };\n }\n await loadDemoFromChat(ctx);\n return { handled: true, summary: \"Demo loaded\" };\n }\n\n if (isShipIntent(line) && (phase === \"explore\" || isAnalysisReady(ctx))) {\n ctx.deliverIntent = true;\n const summary = (await handleDeliverFlow(line, ctx)) ?? undefined;\n return { handled: true, summary };\n }\n\n if (isComputeIntent(line)) {\n const audit = ctx.gapAudit ?? (await refreshGapAudit(ctx));\n if (!audit.can_compute) {\n printGapCard(audit);\n return { handled: true, summary: \"Cannot compute\" };\n }\n const summary = (await runConversationCompute(ctx)) ?? undefined;\n return { handled: true, summary };\n }\n\n if (phase === \"compute\") {\n console.log();\n console.log(\" \" + chalk.dim(\"Analysis running — wait for it to finish before typing another question.\"));\n console.log();\n return { handled: true };\n }\n\n if (phase === \"orient\" || phase === \"scope\" || phase === \"awaiting_data\") {\n const summary = (await handleDeterministic(line, ctx)) ?? undefined;\n return { handled: true, summary };\n }\n\n if (phase === \"deliver\") {\n const summary = (await handleDeliverFlow(line, ctx)) ?? undefined;\n return { handled: true, summary };\n }\n\n if (phase === \"explore\") {\n if (!canUseReplAi(ctx)) {\n await handleExploreWithoutKey(ctx);\n return { handled: true };\n }\n return { handled: true, delegateNl: true };\n }\n\n return { handled: false };\n}\n","/**\n * Dispatcher — routes a single input line to a slash-command handler, a\n * REPL built-in, or the natural-language agent.\n */\n\nimport chalk from \"chalk\";\nimport { tokenize } from \"./args.js\";\nimport type { Context } from \"./context.js\";\nimport { isGlobalAdminCommand, runGlobalAdminCommand } from \"./global-admin.js\";\nimport { resolvePostAction, type PostActionNav } from \"./post-action.js\";\nimport { parseGlobalReplCommand } from \"./repl-globals.js\";\nimport { hasCommand, resolveHandler, suggestCommand } from \"../workflows/registry.js\";\nimport { paint } from \"../ui/theme.js\";\n\nexport type DispatchResult =\n | { kind: \"handled\"; summary?: string; navigate?: PostActionNav }\n | { kind: \"exit\" }\n | { kind: \"help\" }\n | { kind: \"home\" }\n | { kind: \"clear\" }\n | { kind: \"unknown\"; token: string; suggestion?: string };\n\nfunction handledResult(command: string, summary: string | undefined, ctx: Context): DispatchResult {\n return {\n kind: \"handled\",\n summary,\n navigate: resolvePostAction({ command, summary, ctx }),\n };\n}\n\nexport async function dispatch(input: string, ctx: Context): Promise<DispatchResult> {\n const line = input.trim();\n if (!line) return { kind: \"handled\" };\n\n // Global navigation — always honored, even during nested wizards.\n const globalCommand = parseGlobalReplCommand(line);\n if (globalCommand) {\n if (isGlobalAdminCommand(globalCommand)) {\n const summary = await runGlobalAdminCommand(globalCommand, line, ctx);\n return handledResult(globalCommand, summary ?? undefined, ctx);\n }\n return { kind: globalCommand };\n }\n\n if ((ctx.wizardDepth ?? 0) > 0) {\n return { kind: \"handled\" };\n }\n\n const tokens = tokenize(line);\n const first = tokens[0] ?? \"\";\n\n // 2. Slash command: `/diagnose --deep`\n if (first.startsWith(\"/\")) {\n const name = first.slice(1);\n if (hasCommand(name)) {\n const summary = await runSlashCommand(name, tokens.slice(1), ctx);\n return handledResult(name, summary, ctx);\n }\n const suggestion = suggestCommand(name);\n return suggestion ? { kind: \"unknown\", token: first, suggestion: `/${suggestion}` } : { kind: \"unknown\", token: first };\n }\n\n // 3. Known subcommand (no slash): `diagnose`, `ingest`, etc.\n if (hasCommand(first)) {\n const summary = await runSlashCommand(first, tokens.slice(1), ctx);\n return handledResult(first, summary, ctx);\n }\n\n // 4. Conversation-first router (interactive REPL, non-slash)\n if (!ctx.oneShot) {\n const { conversationRouter } = await import(\"../conversation/router.js\");\n const routed = await conversationRouter(line, ctx);\n if (routed.handled) {\n if (\"delegateNl\" in routed) {\n const summary = await runNaturalLanguage(line, ctx);\n return { kind: \"handled\", summary };\n }\n return { kind: \"handled\", summary: routed.summary };\n }\n }\n\n if (tokens.length === 1) {\n if (/^\\d$/.test(first)) {\n console.log(\n \" \" +\n chalk.dim(\"Looks like a menu pick — run \") +\n paint(\"accent\", \"/new\") +\n chalk.dim(\" to start (pick Demo, then choose your analysis type).\"),\n );\n return { kind: \"handled\" };\n }\n const suggestion = suggestCommand(first);\n if (suggestion) return { kind: \"unknown\", token: first, suggestion };\n }\n\n // 5. Bare session id (REPL only) — after /session lists, type e.g. `b2ca` to pick up.\n // Single digits are menu picks (wizard leftovers), not session ids.\n if (!ctx.oneShot && tokens.length === 1 && !/^\\d$/.test(first)) {\n const { resolveSessionByToken } = await import(\"./context.js\");\n const target = resolveSessionByToken(first);\n if (target === null) return { kind: \"handled\" };\n if (target) {\n const summary = await runSlashCommand(\"session\", [first], ctx);\n return { kind: \"handled\", summary };\n }\n }\n\n // 6. REPL explore phase only — never fall through to the agent from other phases or one-shot mode.\n if (!ctx.oneShot) {\n const { resolveConversationPhase } = await import(\"../conversation/phase.js\");\n if (resolveConversationPhase(ctx) === \"explore\") {\n const summary = await runNaturalLanguage(line, ctx);\n return { kind: \"handled\", summary };\n }\n console.log(\n \" \" +\n chalk.dim(\"Not in Q&A yet — confirm scope, load data, and run analysis first. Type \") +\n paint(\"accent\", \"/home\") +\n chalk.dim(\" for status.\"),\n );\n return { kind: \"handled\" };\n }\n\n console.log(\n \" \" +\n chalk.dim(\"Natural-language questions run in the interactive REPL. Start with \") +\n paint(\"accent\", \"ntrp\") +\n chalk.dim(\" and ask after analysis.\"),\n );\n return { kind: \"handled\" };\n}\n\nasync function runSlashCommand(name: string, args: string[], ctx: Context): Promise<string | undefined> {\n const handler = await resolveHandler(name);\n if (!handler) {\n console.error(chalk.red(` Unknown command: /${name}`));\n return undefined;\n }\n const result = await handler(args, ctx);\n return result ?? undefined;\n}\n\n/**\n * Natural language route — phase 2 wires this up. For phase 1 it prints a\n * friendly placeholder.\n */\nasync function runNaturalLanguage(input: string, ctx: Context): Promise<string | undefined> {\n const mod = await import(\"./nl.js\");\n const result = await mod.runNaturalLanguage(input, ctx);\n return result ?? undefined;\n}\n","/**\n * Welcome dashboard — two-column layout that collapses to a single column\n * when the terminal is narrower than 70 cols.\n */\n\nimport chalk from \"chalk\";\nimport type { Context, DatasetMeta, SessionListEntry } from \"../cli/context.js\";\nimport {\n getActiveSessions,\n getLastActivityRelative,\n getLastWorkedSession,\n getUnfinishedSessions,\n isSessionInProgress,\n lensBadgeLabel,\n listSessions,\n loadSessionFile,\n} from \"../cli/context.js\";\nimport type { AnalysisScope } from \"../conversation/types.js\";\nimport { formatPhaseLabel, resolveConversationPhase } from \"../conversation/phase.js\";\nimport { padRight, truncateVisible, visibleWidth, termWidth } from \"./layout.js\";\nimport { actionHint, badge, paint, sectionHeading, GRADIENT } from \"./theme.js\";\nimport { renderLogo } from \"./banner.js\";\nimport { loadConfig } from \"../config/store.js\";\nimport { loadProfile, isProfileConfigured } from \"../config/profile.js\";\nimport { PRESET_LABELS } from \"../commands/profile.js\";\nimport { getEntityCounts } from \"../db/queries.js\";\nimport { initSchema } from \"../db/schema.js\";\n\n// ============================================================\n// Public API\n// ============================================================\n\nconst TAGLINE = \"Pipeline intelligence for GTM operators\";\n\nconst NO_SUMMARY = \"(no summary yet)\";\nconst CARD_MAX_W = 128;\nconst CARD_SIDE_MARGIN = 6;\nconst WIDE_LAYOUT_MIN = 70;\n\ninterface HelpEntry {\n command: string;\n description: string;\n dynamicDescription?: (unfinishedCount: number) => string;\n}\n\nconst WELCOME_HELP_SECTIONS: { heading: string; entries: HelpEntry[] }[] = [\n {\n heading: \"Navigation\",\n entries: [\n {\n command: \"/session\",\n description: \"Pick up an analysis in progress\",\n dynamicDescription: (n) =>\n n > 0 ? `Pick up an analysis · ${n} active` : \"Pick up an analysis in progress\",\n },\n { command: \"/new\", description: \"Start a fresh analysis\" },\n { command: \"/home\", description: \"Return to this dashboard\" },\n { command: \"/help\", description: \"Show shortcuts\" },\n ],\n },\n {\n heading: \"Workflow\",\n entries: [\n { command: \"/handoff\", description: \"Turn investigation into an output\" },\n { command: \"/end\", description: \"Close session without a handoff\" },\n { command: \"/clear\", description: \"Clear terminal scrollback\" },\n ],\n },\n {\n heading: \"Inference\",\n entries: [\n { command: \"/provider\", description: \"Switch active LLM engine\" },\n { command: \"/tier\", description: \"Set quality/cost tier for this session\" },\n { command: \"/model\", description: \"Pin a specific model on active engine\" },\n ],\n },\n];\n\nfunction resolveSessionSummary(input: {\n scope?: AnalysisScope;\n summary?: string;\n dataset?: DatasetMeta;\n}): string {\n if (input.scope?.intent_summary?.trim()) return input.scope.intent_summary.trim();\n if (input.summary?.trim()) return input.summary.trim();\n if (input.dataset?.label?.trim()) return input.dataset.label.trim();\n return NO_SUMMARY;\n}\n\nfunction formatSessionId(id: string, name?: string): string {\n const shortId = paint(\"accent\", id.slice(-4));\n return name ? `${paint(\"accent\", name)} ${shortId}` : shortId;\n}\n\nfunction sessionStatusSuffix(s: SessionListEntry): string {\n if ((s.deliverables?.length ?? 0) > 0 || s.stage === \"delivered\") return \"done\";\n if (s.stage === \"ended\") return \"closed\";\n if (s.stage === \"analyzed\") return \"in progress\";\n if (s.dataset?.label || (s.exchange_count ?? 0) > 0) return \"setup\";\n return \"new\";\n}\n\n/** Phase-style label for a persisted session (dashboard display). */\nfunction sessionPhaseLabel(s: SessionListEntry, ctx?: Context): string {\n if (s.id === ctx?.sessionId) {\n return formatPhaseLabel(resolveConversationPhase(ctx));\n }\n if ((s.deliverables?.length ?? 0) > 0 || s.stage === \"delivered\") return \"done\";\n if (s.stage === \"ended\") return \"closed\";\n if (s.stage === \"analyzed\") return \"ready to ask\";\n return \"setup\";\n}\n\nfunction sessionSummaryText(s: SessionListEntry): string {\n const file = loadSessionFile(s.id);\n const summary = resolveSessionSummary({\n scope: file?.scope,\n summary: s.summary,\n dataset: s.dataset,\n });\n return summary === NO_SUMMARY ? chalk.dim(summary) : summary;\n}\n\n/** Last session — id, lens, phase, summary. */\nfunction formatLastSessionLine(\n s: SessionListEntry,\n colW: number,\n ctx?: Context,\n opts?: { markCurrent?: boolean },\n): string {\n const phase = sessionPhaseLabel(s, ctx);\n const current =\n opts?.markCurrent && s.id === ctx?.sessionId ? chalk.dim(\" · current\") : \"\";\n const meta = `${formatSessionId(s.id, s.name)} ${chalk.dim(\"·\")} ${chalk.dim(lensBadgeLabel(s.analysis))} ${chalk.dim(\"·\")} ${paint(\"accent\", phase)} ${chalk.dim(\"·\")} ${sessionSummaryText(s)}${current}`;\n return truncateVisible(` ${meta}`, colW);\n}\n\n/** Active sessions list — id, summary, status (no redundant phase/lens). */\nfunction formatActiveSessionLine(\n s: SessionListEntry,\n colW: number,\n ctx?: Context,\n opts?: { markCurrent?: boolean },\n): string {\n const indent = \" \";\n const idPart = formatSessionId(s.id, s.name);\n const status = chalk.dim(` · ${sessionStatusSuffix(s)}`);\n const current =\n opts?.markCurrent && s.id === ctx?.sessionId ? chalk.dim(\" · current\") : \"\";\n const suffix = `${status}${current}`;\n const summaryBudget = Math.max(8, colW - visibleWidth(indent) - visibleWidth(idPart) - visibleWidth(suffix) - 2);\n const summaryPart = truncateVisible(sessionSummaryText(s), summaryBudget);\n return `${indent}${idPart} ${summaryPart}${suffix}`;\n}\n\nfunction resolveWelcomeNextAction(input: {\n profileReady: boolean;\n hasData: boolean;\n ctx: Context;\n unfinishedCount: number;\n}): { label: string; command: string; detail: string } {\n const { profileReady, hasData, ctx, unfinishedCount } = input;\n if (!profileReady && !hasData) {\n return { label: \"Try:\", command: \"\", detail: 'type what you want to investigate (e.g. \"pipeline health\")' };\n }\n if (!profileReady) {\n return { label: \"Calibrate:\", command: \"/onboard\", detail: \"company context for your own CSV data\" };\n }\n if (ctx.stage === \"analyzed\") {\n const completed = new Set(ctx.analysis.completed);\n if (completed.size === 1) {\n const companion = ctx.analysis.primary === \"revenue_metrics\" ? \"/diagnose\" : \"/metrics\";\n const companionDetail =\n ctx.analysis.primary === \"revenue_metrics\"\n ? \"add pipeline health view\"\n : \"add SaaS metrics view\";\n return { label: \"Other view:\", command: companion, detail: companionDetail };\n }\n return { label: \"Next:\", command: \"/handoff\", detail: \"turn this into an output\" };\n }\n if (hasData) {\n const primaryCmd = ctx.analysis.primary === \"revenue_metrics\" ? \"/metrics\" : \"/diagnose\";\n const primaryDetail =\n ctx.analysis.primary === \"revenue_metrics\"\n ? \"run SaaS metrics analysis\"\n : \"run GTM health snapshot\";\n return { label: \"Next:\", command: primaryCmd, detail: primaryDetail };\n }\n if (unfinishedCount > 0) {\n return { label: \"Continue:\", command: \"/session\", detail: `${unfinishedCount} analysis in progress` };\n }\n return { label: \"Start:\", command: \"\", detail: \"type what you want to investigate\" };\n}\n\nfunction buildSystemLines(\n colW: number,\n statusRows: { label: string; state: string; detail: string }[],\n recent: string | null,\n): string[] {\n const lines: string[] = [\"\"];\n lines.push(sectionHeading(\"System\"));\n for (const item of statusRows) {\n const label = chalk.dim(padRight(item.label, 8));\n const state = padRight(item.state, 10);\n const detailW = Math.max(1, colW - 21);\n lines.push(`${label} ${state} ${chalk.dim(truncateVisible(item.detail, detailW))}`);\n }\n if (recent) {\n lines.push(`${chalk.dim(padRight(\"last used\", 8))} ${chalk.dim(recent)}`);\n }\n return lines;\n}\n\nfunction buildHelpLines(colW: number, unfinishedCount: number): string[] {\n const lines: string[] = [\"\"];\n for (const section of WELCOME_HELP_SECTIONS) {\n lines.push(sectionHeading(section.heading));\n for (const entry of section.entries) {\n const desc = entry.dynamicDescription\n ? entry.dynamicDescription(unfinishedCount)\n : entry.description;\n const text = ` ${paint(\"accent\", entry.command)} ${chalk.dim(desc)}`;\n lines.push(truncateVisible(text, colW));\n }\n }\n return lines;\n}\n\nfunction buildLastSessionLines(\n colW: number,\n ctx: Context,\n lastSession: SessionListEntry | null,\n nextAction: { label: string; command: string; detail: string },\n emptyDataHint: string | null,\n): string[] {\n const lines: string[] = [\"\"];\n lines.push(sectionHeading(\"Last Session\"));\n\n if (!lastSession) {\n lines.push(` ${chalk.dim(\"(none yet)\")}`);\n lines.push(\n truncateVisible(\n ` ${nextAction.command ? actionHint(nextAction.label, nextAction.command, nextAction.detail) : `${chalk.dim(nextAction.label)} ${chalk.dim(nextAction.detail)}`}`,\n colW,\n ),\n );\n return lines;\n }\n\n lines.push(formatLastSessionLine(lastSession, colW, ctx, { markCurrent: true }));\n\n const isCurrent = lastSession.id === ctx.sessionId;\n if (!isCurrent) {\n lines.push(\n truncateVisible(\n ` ${chalk.dim(\"Resume:\")} ${paint(\"accent\", `/session ${lastSession.id.slice(-4)}`)}`,\n colW,\n ),\n );\n } else if (nextAction.command) {\n lines.push(\n truncateVisible(` ${actionHint(nextAction.label, nextAction.command, nextAction.detail)}`, colW),\n );\n } else {\n lines.push(truncateVisible(` ${chalk.dim(nextAction.label)} ${chalk.dim(nextAction.detail)}`, colW));\n }\n if (isCurrent && emptyDataHint) {\n lines.push(truncateVisible(` ${emptyDataHint}`, colW));\n }\n return lines;\n}\n\nfunction buildActiveSessionsLines(\n colW: number,\n ctx: Context,\n activeSessions: SessionListEntry[],\n): string[] {\n const lines: string[] = [\"\"];\n lines.push(sectionHeading(\"Active Sessions\"));\n if (activeSessions.length === 0) {\n lines.push(` ${chalk.dim(\"(none in progress)\")}`);\n return lines;\n }\n for (const s of activeSessions.slice(0, 5)) {\n lines.push(formatActiveSessionLine(s, colW, ctx, { markCurrent: true }));\n }\n if (activeSessions.length > 5) {\n lines.push(` ${chalk.dim(`+${activeSessions.length - 5} more · `)}${paint(\"accent\", \"/session\")}`);\n }\n return lines;\n}\n\nexport async function printWelcome(ctx: Context, version: string): Promise<void> {\n const width = termWidth();\n const cardW = Math.min(Math.max(72, width - CARD_SIDE_MARGIN * 2), CARD_MAX_W);\n const innerW = cardW - 2;\n const contentW = innerW - 2;\n const outerPad = \" \".repeat(Math.max(0, Math.floor((width - cardW) / 2)));\n\n const border = (ch: string) => chalk.dim(ch);\n const push = (line: string) => console.log(outerPad + line);\n\n const fitCell = (content: string, width: number): string => {\n if (visibleWidth(content) > width) return truncateVisible(content, width);\n return padRight(content, width);\n };\n\n const row = (content: string): string =>\n `${border(\"│\")} ${fitCell(content, contentW)} ${border(\"│\")}`;\n const emptyRow = (): string =>\n `${border(\"│\")}${\" \".repeat(innerW)}${border(\"│\")}`;\n\n const useWideLayout = contentW >= WIDE_LAYOUT_MIN;\n const divColW = useWideLayout ? 3 : 0;\n const leftW = useWideLayout ? Math.floor((contentW - divColW) / 2) : 0;\n const rightW = useWideLayout ? contentW - divColW - leftW : 0;\n\n const twoColRow = (left: string, right: string): string => {\n if (!useWideLayout) return row(left || right);\n return row(\n `${fitCell(left, leftW)}${border(\" │ \")}${fitCell(right, rightW)}`,\n );\n };\n\n // ----- Gather data -----\n const config = loadConfig();\n const companyProfile = loadProfile();\n const profileReady = isProfileConfigured(companyProfile);\n const profileLabel = profileReady\n ? `${companyProfile!.company_name} · ${PRESET_LABELS[companyProfile!.sales_motion]}`\n : \"not configured\";\n\n let counts: Record<string, number> = { people: 0, organizations: 0, opportunities: 0, activities: 0 };\n try {\n await initSchema();\n counts = await getEntityCounts();\n } catch {\n // silent — no DB yet\n }\n\n const recent = getLastActivityRelative();\n const unfinishedSessions = getUnfinishedSessions(ctx.sessionId);\n const lastSession = getLastWorkedSession();\n const activeSessions = getActiveSessions();\n const hasData = Object.values(counts).some((count) => count > 0);\n const countStr = `p:${counts.people ?? 0} o:${counts.organizations ?? 0} d:${counts.opportunities ?? 0} a:${counts.activities ?? 0}`;\n const savedSessions = listSessions().filter(\n (s) =>\n s.id !== ctx.sessionId &&\n (s.exchange_count > 0 || s.stage === \"analyzed\" || s.stage === \"delivered\" || !!s.dataset?.label),\n );\n const datasetDetail = hasData\n ? (ctx.dataset?.label ?? countStr)\n : savedSessions.length > 0\n ? `none loaded · ${savedSessions.length} saved`\n : \"none loaded\";\n const { describeLlmReadiness } = await import(\"../ai/repl-api.js\");\n const { countAvailableEngines, formatActiveStack, availableEngineLabels } = await import(\"../ai/llm/session-state.js\");\n const llmReady = describeLlmReadiness();\n const engineCount = countAvailableEngines();\n const llmDetail =\n engineCount === 0\n ? \"needs key\"\n : engineCount === 1\n ? `1 engine · ${availableEngineLabels()[0]}`\n : `${engineCount} engines`;\n const llmState =\n engineCount >= 2\n ? badge(\"READY\", \"success\")\n : engineCount === 1\n ? badge(\"READY\", \"success\")\n : badge(\"MISSING\", \"warning\");\n const inferenceDetail =\n engineCount > 0 ? `active: ${formatActiveStack(ctx)}` : \"not configured\";\n const statusRows = [\n {\n label: \"engines\",\n state: llmState,\n detail: llmDetail,\n },\n {\n label: \"inference\",\n state: engineCount > 0 ? badge(\"SET\", \"success\") : badge(\"MISSING\", \"warning\"),\n detail: inferenceDetail,\n },\n {\n label: \"profile\",\n state: profileReady ? badge(\"READY\", \"success\") : badge(\"MISSING\", \"warning\"),\n detail: profileReady ? profileLabel : \"run /onboard\",\n },\n {\n label: \"dataset\",\n state: hasData ? badge(\"LOADED\", \"success\") : badge(\"EMPTY\", \"warning\"),\n detail: datasetDetail,\n },\n ];\n const nextAction = resolveWelcomeNextAction({\n profileReady,\n hasData,\n ctx,\n unfinishedCount: unfinishedSessions.length,\n });\n const emptyDataHint = !hasData\n ? savedSessions.length > 0\n ? chalk.dim(\"Run \") +\n paint(\"accent\", \"/session\") +\n chalk.dim(\" to resume a saved analysis, or \") +\n paint(\"accent\", \"/new\") +\n chalk.dim(\" for a fresh start\")\n : chalk.dim(\"Run \") +\n paint(\"accent\", \"/new\") +\n chalk.dim(\" → pick Demo to explore sample data\")\n : null;\n\n const colW = useWideLayout ? leftW : contentW;\n const rightColW = useWideLayout ? rightW : contentW;\n\n const systemLines = buildSystemLines(colW, statusRows, recent);\n const helpLines = buildHelpLines(colW, activeSessions.length);\n const otherActiveSessions = lastSession\n ? activeSessions.filter((s) => s.id !== lastSession.id)\n : activeSessions;\n const lastSessionLines = buildLastSessionLines(rightColW, ctx, lastSession, nextAction, emptyDataHint);\n const activeSessionsLines = buildActiveSessionsLines(rightColW, ctx, otherActiveSessions);\n\n // ----- Paint the ASCII logo -----\n push(\"\");\n if (cardW >= 60) {\n const logo = renderLogo();\n const maxLogoW = Math.max(...logo.map((l) => visibleWidth(l)));\n const logoOffset = \" \".repeat(Math.max(0, Math.floor((cardW - maxLogoW) / 2)));\n for (const line of logo) push(logoOffset + line);\n const taglineOffset = \" \".repeat(Math.max(0, Math.floor((cardW - visibleWidth(TAGLINE)) / 2)));\n push(taglineOffset + chalk.dim(TAGLINE));\n push(\"\");\n }\n\n // ----- Card top border with version tag -----\n const versionTag = ` v${version} `;\n const gap = Math.max(0, innerW - versionTag.length);\n const gapL = Math.floor(gap / 2);\n push(\n border(`╭${\"─\".repeat(gapL)}`) +\n chalk.dim(versionTag) +\n border(`${\"─\".repeat(gap - gapL)}╮`),\n );\n\n if (useWideLayout) {\n const leftLines = [...systemLines, ...helpLines];\n const rightLines = [...lastSessionLines, ...activeSessionsLines];\n const maxRows = Math.max(leftLines.length, rightLines.length);\n for (let i = 0; i < maxRows; i++) {\n push(twoColRow(leftLines[i] ?? \"\", rightLines[i] ?? \"\"));\n }\n } else {\n push(emptyRow());\n for (const line of systemLines) {\n if (line === \"\") push(emptyRow());\n else push(row(line));\n }\n for (const line of lastSessionLines) {\n if (line === \"\") push(emptyRow());\n else push(row(line));\n }\n for (const line of activeSessionsLines) {\n if (line === \"\") push(emptyRow());\n else push(row(line));\n }\n for (const line of helpLines) {\n if (line === \"\") push(emptyRow());\n else push(row(line));\n }\n }\n\n push(border(`╰${\"─\".repeat(innerW)}╯`));\n push(\"\");\n}\n\nexport { GRADIENT };\n","/**\n * Readline REPL — reads a line, dispatches it, loops. Handles Ctrl+C with\n * a double-press-to-quit guard and prints a short farewell on exit.\n */\n\nimport { createInterface, type Interface } from \"node:readline/promises\";\nimport { clearLine, cursorTo } from \"node:readline\";\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport type { Context } from \"./context.js\";\nimport { closeSession } from \"./context.js\";\nimport { buildConversationPrompt } from \"../conversation/phase.js\";\nimport { dispatch, type DispatchResult } from \"./dispatch.js\";\nimport { resolvePostAction } from \"./post-action.js\";\nimport { isGlobalAdminCommand, runGlobalAdminCommand } from \"./global-admin.js\";\nimport { GlobalReplCommandError } from \"./repl-globals.js\";\nimport { listCommandNames, listWorkflows } from \"../workflows/registry.js\";\nimport { paint, sectionHeading } from \"../ui/theme.js\";\nimport { padRight } from \"../ui/layout.js\";\nimport { printReplHeader } from \"../ui/banner.js\";\nimport { printWelcome } from \"../ui/welcome.js\";\nimport { formatUpdateNudge } from \"../update/registry.js\";\n\ninterface HistoryEntry {\n input: string;\n summary?: string;\n}\n\ntype ReplInterface = Interface & {\n line: string;\n cursor: number;\n};\n\nconst REPL_BUILTINS = [\n \"/help\",\n \"/home\",\n \"/clear\",\n \"/scratch\",\n \"/cleanup\",\n \"/deactivate-demo\",\n \"/exit\",\n \"/quit\",\n];\nconst ANSI_PATTERN = /\\x1B\\[[0-?]*[ -/]*[@-~]/g;\nconst GOODBYES = [\n \"Bye.\",\n \"Goodbye.\",\n \"See you soon.\",\n \"Catch you later.\",\n \"Talk soon.\",\n \"Take it easy.\",\n \"Take care.\",\n \"Later.\",\n \"Laters.\",\n \"Cheers.\",\n \"Cheerio.\",\n \"Ta-ra.\",\n \"Toodle-oo.\",\n \"So long.\",\n \"Fare thee well.\",\n \"Until next time.\",\n \"Peace out.\",\n \"Adios.\",\n \"Adieu.\",\n \"Au revoir.\",\n \"Sayonara.\",\n \"Ciao for now.\",\n \"Don't be a stranger.\",\n \"See you in the funny papers.\",\n \"Smell you later.\",\n \"Mind how you go.\",\n \"Be seeing you.\",\n \"Happy trails.\",\n \"May your pipeline stay hydrated.\",\n \"Don't let the zombie deals bite.\",\n];\n\n/** Build the REPL prompt — phase-aware conversation surface. */\nexport function buildPrompt(ctx: Context): string {\n return buildConversationPrompt(ctx);\n}\n\nfunction visibleLength(value: string): number {\n return value.replace(ANSI_PATTERN, \"\").length;\n}\n\nfunction randomGoodbye(): string {\n return GOODBYES[Math.floor(Math.random() * GOODBYES.length)] ?? \"Bye.\";\n}\n\nfunction commandCompletionCandidates(): string[] {\n return [\n ...REPL_BUILTINS,\n ...listCommandNames(false).map((name) => `/${name}`),\n ];\n}\n\nfunction completeCommand(line: string): [string[], string] {\n const firstToken = line.split(/\\s/, 1)[0] ?? \"\";\n if (!firstToken.startsWith(\"/\") || line !== firstToken) return [[], line];\n\n const commands = commandCompletionCandidates();\n const hits = commands.filter((command) => command.startsWith(firstToken));\n return [hits.length > 0 ? hits : commands, firstToken];\n}\n\nfunction inlineCommandSuggestion(line: string): string | null {\n if (!line.startsWith(\"/\") || /\\s/.test(line)) return null;\n\n const matches = commandCompletionCandidates().filter((command) => command.startsWith(line));\n if (matches.length !== 1 || matches[0] === line) return null;\n return matches[0]!.slice(line.length);\n}\n\nfunction renderInlineSuggestion(rl: ReplInterface, prompt: string): void {\n const line = rl.line;\n const cursor = rl.cursor;\n const suffix = cursor === line.length ? inlineCommandSuggestion(line) : null;\n\n clearLine(process.stdout, 0);\n cursorTo(process.stdout, 0);\n process.stdout.write(prompt + line + (suffix ? chalk.dim(suffix) : \"\"));\n cursorTo(process.stdout, visibleLength(prompt) + cursor);\n}\n\n/** Append a compressed one-liner for the turn without clearing prior output. */\nfunction appendTurnLine(\n current: string,\n promptLabel: string,\n currentSummary?: string,\n): void {\n const currentLine = currentSummary\n ? `${promptLabel} ${current} ${chalk.white(\"→\")} ${currentSummary}`\n : `${promptLabel} ${current}`;\n console.log(\" \" + chalk.dim(currentLine));\n console.log();\n}\n\nasync function goHome(\n ctx: Context,\n version: string,\n history: HistoryEntry[],\n opts?: { banner?: string },\n): Promise<void> {\n ctx.wizardDepth = 0;\n ctx.secretInputActive = false;\n history.length = 0;\n process.stdout.write(\"\\x1b[2J\\x1b[H\");\n if (opts?.banner) {\n console.log();\n console.log(\" \" + paint(\"accent\", \"✓\") + \" \" + chalk.dim(opts.banner));\n }\n await printWelcome(ctx, version);\n}\n\nasync function handleDispatchResult(\n result: DispatchResult,\n ctx: Context,\n version: string,\n history: HistoryEntry[],\n): Promise<\"continue\" | \"exit\"> {\n if (result.kind === \"exit\") return \"exit\";\n\n switch (result.kind) {\n case \"help\":\n printHelp();\n break;\n case \"home\":\n await goHome(ctx, version, history);\n break;\n case \"clear\":\n ctx.wizardDepth = 0;\n ctx.secretInputActive = false;\n history.length = 0;\n process.stdout.write(\"\\x1b[2J\\x1b[H\");\n printReplHeader(version);\n break;\n case \"unknown\":\n if (result.suggestion) {\n console.log(\n \" \" +\n chalk.red(`Unknown command: ${result.token}.`) +\n chalk.dim(\" Did you mean \") +\n paint(\"accent\", result.suggestion) +\n chalk.dim(\"?\"),\n );\n } else {\n console.log(\n \" \" +\n chalk.red(`Unknown command: ${result.token}`) +\n chalk.dim(\" Type \") +\n paint(\"accent\", \"/help\") +\n chalk.dim(\" to see available commands.\"),\n );\n }\n break;\n case \"handled\":\n if (result.navigate === \"home\") {\n await goHome(ctx, version, history, { banner: result.summary });\n }\n break;\n }\n\n return \"continue\";\n}\n\nexport async function runRepl(ctx: Context, version: string): Promise<void> {\n const history: HistoryEntry[] = [];\n ctx.replStarted = true;\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true,\n completer: completeCommand,\n }) as ReplInterface;\n ctx.rl = rl;\n\n console.log();\n console.log(\n \" \" +\n chalk.dim(\"What do you want to look at? \") +\n chalk.dim('(e.g. \"pipeline health\", \"is NRR real?\", \"board deck on Q3\")'),\n );\n console.log();\n\n if (ctx.pendingUpdateCheck) {\n void ctx.pendingUpdateCheck.then((result) => {\n if (result?.updateAvailable) {\n console.log(` ${formatUpdateNudge(result.current, result.latest)}`);\n console.log();\n }\n });\n }\n\n let pendingSuggestionRender: NodeJS.Immediate | null = null;\n const scheduleInlineSuggestionRender = () => {\n if ((ctx.wizardDepth ?? 0) > 0 || ctx.secretInputActive) return;\n if (pendingSuggestionRender) return;\n pendingSuggestionRender = setImmediate(() => {\n pendingSuggestionRender = null;\n renderInlineSuggestion(rl, buildPrompt(ctx));\n });\n };\n process.stdin.on(\"keypress\", scheduleInlineSuggestionRender);\n\n let sigintPrimed = false;\n let running = true;\n\n const sigintHandler = () => {\n if (sigintPrimed) {\n running = false;\n shutdownRepl();\n return;\n }\n sigintPrimed = true;\n console.log(\"\\n \" + chalk.dim(\"Type /exit to quit, or press Ctrl+C again.\"));\n };\n rl.on(\"SIGINT\", sigintHandler);\n\n function shutdownRepl(): void {\n rl.off(\"SIGINT\", sigintHandler);\n process.stdin.off(\"keypress\", scheduleInlineSuggestionRender);\n if (pendingSuggestionRender) {\n clearImmediate(pendingSuggestionRender);\n pendingSuggestionRender = null;\n }\n if (process.stdin.isTTY && process.stdin.isRaw) {\n process.stdin.setRawMode(false);\n }\n if (!(rl as Interface & { closed?: boolean }).closed) {\n rl.close();\n }\n ctx.rl = undefined;\n }\n\n while (running) {\n sigintPrimed = false;\n const prompt = buildPrompt(ctx);\n const promptLabel = buildPrompt(ctx);\n\n let rawLine: string;\n try {\n rawLine = await rl.question(prompt);\n } catch {\n break;\n }\n\n const line = rawLine.trim();\n if (!line) continue;\n\n let summary: string | undefined;\n try {\n const result = await dispatch(line, ctx);\n if (result.kind === \"handled\") summary = result.summary;\n const willHome =\n result.kind === \"home\" ||\n (result.kind === \"handled\" && result.navigate === \"home\");\n if (!willHome) {\n appendTurnLine(line, promptLabel, summary);\n }\n const next = await handleDispatchResult(result, ctx, version, history);\n if (next === \"exit\") {\n running = false;\n break;\n }\n } catch (err) {\n if (err instanceof GlobalReplCommandError) {\n ctx.wizardDepth = 0;\n ctx.secretInputActive = false;\n if (isGlobalAdminCommand(err.command)) {\n summary = (await runGlobalAdminCommand(err.command, line, ctx)) ?? undefined;\n const navigate = resolvePostAction({ command: err.command, summary, ctx });\n if (navigate !== \"home\") {\n appendTurnLine(line, promptLabel, summary);\n }\n const next = await handleDispatchResult(\n { kind: \"handled\", summary, navigate },\n ctx,\n version,\n history,\n );\n if (next === \"exit\") {\n running = false;\n break;\n }\n } else {\n const next = await handleDispatchResult({ kind: err.command }, ctx, version, history);\n if (next === \"exit\") {\n running = false;\n break;\n }\n }\n } else {\n console.error(\" \" + chalk.red(\"Error: \" + String((err as Error).message ?? err)));\n }\n }\n\n history.push({ input: line, summary });\n }\n\n shutdownRepl();\n\n const exchangeCount = Math.floor(ctx.messages.length / 2);\n if (exchangeCount > 0) {\n const spinner = ora({ text: \"Saving session…\", color: \"cyan\", discardStdin: false }).start();\n const summary = await closeSession(ctx);\n if (summary) {\n spinner.succeed(`Session saved (${summary})`);\n } else {\n spinner.succeed(\"Session saved\");\n }\n } else {\n await closeSession(ctx);\n }\n console.log(\" \" + chalk.dim(randomGoodbye()));\n}\n\n// ============================================================\n// /help — prints all registered workflows from the registry.\n// ============================================================\n\nexport function printHelpOneShot(): void {\n printHelp();\n}\n\nfunction printHelp(): void {\n console.log();\n console.log(\" \" + sectionHeading(\"Conversation\"));\n console.log(\" \" + chalk.dim(\"Type what you want to investigate — no slash needed.\"));\n console.log(\" \" + chalk.dim(\"Paste a CSV path or say \") + paint(\"accent\", '\"use demo data\"') + chalk.dim(\" to load data.\"));\n console.log(\" \" + chalk.dim(\"After analysis, ask questions in plain English.\"));\n console.log(\" \" + chalk.dim('Say ') + paint(\"accent\", '\"ship a board deck\"') + chalk.dim(\" to draft a handoff prompt.\"));\n console.log();\n console.log(\" \" + sectionHeading(\"Shortcuts\"));\n const shortcuts = [\n [\"/home\", \"Status dashboard\"],\n [\"/update\", \"Upgrade to the latest version\"],\n [\"/handoff\", \"Export or agent prompts\"],\n [\"/demo\", \"Load demo data\"],\n [\"/clear\", \"Clear scrollback\"],\n [\"/exit\", \"Quit\"],\n ] as const;\n const maxW = Math.max(...shortcuts.map(([c]) => c.length)) + 2;\n for (const [cmd, desc] of shortcuts) {\n console.log(` ${paint(\"accent\", padRight(cmd, maxW))} ${chalk.dim(desc)}`);\n }\n console.log();\n console.log(\" \" + sectionHeading(\"Admin\"));\n const admin = [\n [\"/scratch\", \"Wipe config, profile, and datasets\"],\n [\"/cleanup\", \"Close all active sessions\"],\n [\"/deactivate-demo\", \"Disable demo data generators\"],\n ] as const;\n const adminMaxW = Math.max(...admin.map(([c]) => c.length)) + 2;\n for (const [cmd, desc] of admin) {\n console.log(` ${paint(\"accent\", padRight(cmd, adminMaxW))} ${chalk.dim(desc)}`);\n }\n console.log();\n console.log(\" \" + chalk.dim(\"Power-user commands (\") + paint(\"accent\", \"/new\") + chalk.dim(\", \") + paint(\"accent\", \"/diagnose\") + chalk.dim(\", \") + paint(\"accent\", \"/metrics\") + chalk.dim(\") remain available.\"));\n console.log();\n}\n","/**\n * ntrp — GTM Health Diagnostic CLI (new shell).\n *\n * When invoked with no arguments → prints the welcome dashboard and drops\n * into a natural-language REPL. With any arguments → dispatches a single\n * command and exits. The `diagnose` binary shortcut is also honored.\n */\n\nimport chalk from \"chalk\";\nimport { parseArgs } from \"./cli/args.js\";\nimport { initContext } from \"./cli/context.js\";\nimport { ensureLlmConfigMigrated } from \"./config/llm-config.js\";\nimport { dispatch } from \"./cli/dispatch.js\";\nimport { isGlobalAdminCommand, runGlobalAdminCommand } from \"./cli/global-admin.js\";\nimport { GlobalReplCommandError } from \"./cli/repl-globals.js\";\nimport { runRepl } from \"./cli/repl.js\";\nimport { checkLicense } from \"./license/verify.js\";\nimport { isProfileConfigured } from \"./config/profile.js\";\nimport { paint } from \"./ui/theme.js\";\nimport { emitError, isStructuredOutput } from \"./io/emit.js\";\nimport { NtrpError } from \"./io/errors.js\";\nimport { ExitCode, type OutputMode } from \"./io/types.js\";\nimport { getInstalledVersion } from \"./version.js\";\n\nconst VERSION = getInstalledVersion();\n\n// Commands that are allowed without a license (match pre-refactor gating).\nconst UNGATED = new Set([\n \"activate\",\n \"config\",\n \"profile\",\n \"onboard\",\n \"setup\",\n \"help\",\n \"home\",\n \"exit\",\n \"quit\",\n \"clear\",\n \"scratch\",\n \"cleanup\",\n \"deactivate-demo\",\n \"update\",\n]);\nconst DB_COMMANDS = new Set([\"actions\", \"ask\", \"backmeup\", \"demo\", \"diagnose\", \"export\", \"handoff\", \"ingest\", \"metrics\", \"new\", \"playbook\", \"publish\", \"report\", \"reset\", \"segment\", \"session\", \"status\", \"strategy\"]);\n\nfunction firstToken(input: string): string {\n const trimmed = input.trim();\n if (!trimmed) return \"\";\n const tok = trimmed.split(/\\s+/)[0]!;\n return tok.startsWith(\"/\") ? tok.slice(1) : tok;\n}\n\nasync function closeDb(): Promise<void> {\n const { close } = await import(\"./db/connection.js\");\n await close();\n}\n\nasync function main(): Promise<boolean> {\n ensureLlmConfigMigrated();\n const args = parseArgs(process.argv);\n const output: OutputMode = args.globals.ndjson ? \"ndjson\" : args.globals.json ? \"json\" : \"terminal\";\n const ctx = initContext(args.oneShot, {\n mode: args.globals.headless || args.globals.json || args.globals.ndjson ? \"headless\" : args.oneShot ? \"one_shot\" : \"interactive\",\n output,\n progress: !args.globals.noProgress,\n color: !args.globals.noColor,\n strictStdout: args.globals.headless || args.globals.json || args.globals.ndjson,\n quiet: args.globals.quiet,\n });\n if (!ctx.execution.color) {\n chalk.level = 0;\n }\n if (args.globals.stdin) {\n args.input = (await readStdin()).trim();\n }\n\n // One-shot mode\n if (args.oneShot) {\n const cmd = firstToken(args.input);\n if (!UNGATED.has(cmd)) {\n const lic = checkLicense();\n if (!lic.valid) {\n if (isStructuredOutput(ctx.execution)) {\n emitError(cmd || \"ntrp\", new NtrpError(\"license_invalid\", lic.message, ExitCode.Auth));\n }\n console.error(chalk.red(`\\n ${lic.message}`));\n console.error(chalk.dim(\" Purchase a license at https://ntrp.dev\\n\"));\n process.exit(1);\n }\n }\n\n // Gentle hint when running one-shot without a profile — the wizard\n // itself needs interactive prompts, so we never force it here. Skip\n // the hint for ungated built-ins that don't care about profile state.\n const PROFILE_HINT_SKIP = new Set([\"onboard\", \"setup\", \"config\", \"activate\", \"help\", \"home\", \"exit\", \"quit\", \"clear\", \"profile\"]);\n if (!isProfileConfigured() && !PROFILE_HINT_SKIP.has(cmd) && !ctx.execution.quiet) {\n console.error(\n \" \" +\n chalk.dim(\"Tip: run \") +\n paint(\"accent\", \"ntrp\") +\n chalk.dim(\" interactively to set up your company profile for richer answers.\"),\n );\n }\n\n const result = await dispatch(args.input, ctx);\n switch (result.kind) {\n case \"unknown\":\n if (isStructuredOutput(ctx.execution)) {\n const message = result.suggestion\n ? `Unknown command: ${result.token}. Did you mean ${result.suggestion}?`\n : `Unknown command: ${result.token}`;\n emitError(cmd || \"ntrp\", new NtrpError(\"unknown_command\", message, ExitCode.Usage));\n }\n if (result.suggestion) {\n console.error(\n chalk.red(` Unknown command: ${result.token}.`) +\n chalk.dim(\" Did you mean \") +\n paint(\"accent\", result.suggestion) +\n chalk.dim(\"?\"),\n );\n } else {\n console.error(chalk.red(` Unknown command: ${result.token}`));\n }\n console.error(chalk.dim(\" Run 'ntrp' for the interactive prompt.\"));\n process.exit(1);\n break;\n case \"help\":\n case \"home\":\n case \"clear\":\n case \"exit\": {\n // Built-ins are REPL conveniences; print /help in one-shot mode.\n if (result.kind === \"help\") {\n const { printHelpOneShot } = await import(\"./cli/repl.js\");\n printHelpOneShot();\n } else if (result.kind === \"home\") {\n const { printWelcome } = await import(\"./ui/welcome.js\");\n await printWelcome(ctx, VERSION);\n }\n break;\n }\n case \"handled\":\n break;\n }\n return DB_COMMANDS.has(cmd);\n }\n\n // First-run detection: if no profile exists, run the wizard before\n // showing the welcome dashboard. The wizard itself is ungated, so a\n // fresh install that also lacks a license can still complete onboarding.\n if (!isProfileConfigured()) {\n try {\n const { handler: onboard } = await import(\"./commands/onboard.js\");\n await onboard([], ctx);\n } catch (err) {\n if (err instanceof GlobalReplCommandError) {\n if (err.command === \"exit\") {\n await closeDb();\n process.exit(0);\n }\n if (isGlobalAdminCommand(err.command)) {\n await runGlobalAdminCommand(err.command, `/${err.command}`, ctx);\n }\n // /home, /clear, /help — skip onboarding and open the REPL.\n } else {\n throw err;\n }\n }\n }\n\n const {\n isCacheFresh,\n loadUpdateCheckCache,\n } = await import(\"./config/update-check.js\");\n const {\n checkForUpdate,\n formatUpdateNudge,\n isNewerVersion,\n } = await import(\"./update/registry.js\");\n\n const currentVersion = getInstalledVersion();\n const cachedUpdate = loadUpdateCheckCache();\n if (isCacheFresh(cachedUpdate)) {\n if (cachedUpdate.latestVersion && isNewerVersion(cachedUpdate.latestVersion, currentVersion)) {\n console.log(formatUpdateNudge(currentVersion, cachedUpdate.latestVersion));\n }\n } else {\n ctx.pendingUpdateCheck = checkForUpdate({ timeoutMs: 200 });\n }\n\n // Bind this interactive session to its own dataset file so each\n // point-in-time analysis owns its data. (No-op when NTRP_DB_PATH pins the DB.)\n const { setActiveDbPath } = await import(\"./db/connection.js\");\n const { datasetPathForSession } = await import(\"./cli/context.js\");\n ctx.datasetPath = datasetPathForSession(ctx.sessionId);\n await setActiveDbPath(ctx.datasetPath);\n\n // REPL mode — license check runs on the first gated command via dispatch.\n const { printWelcome } = await import(\"./ui/welcome.js\");\n await printWelcome(ctx, VERSION);\n await runRepl(ctx, VERSION);\n await closeDb();\n process.exit(0);\n}\n\nmain()\n .then((shouldCloseDb) => shouldCloseDb ? closeDb() : undefined)\n .catch((err) => {\n console.error(err);\n closeDb().finally(() => process.exit(1));\n });\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWP;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,K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","names":["now","close","resolve","basename","join","resolve","existsSync","mkdirSync","rmSync","randomUUID","now","uuid","loadLatestDiagnosis","loadLatestMetricsAnalysis","initSchema","setActiveDbPath","close","all","init_context","readFileSync","writeFileSync","existsSync","mkdirSync","homedir","join","resolve","NTRP_DIR","ensureDir","parseArgs","chalk","resolve","chalk","existsSync","rmSync","join","close","readFileSync","writeFileSync","existsSync","mkdirSync","join","ensureDir","NTRP_DIR","now","chalk","pad","chalk","readFileSync","writeFileSync","existsSync","mkdirSync","unlinkSync","homedir","join","ensureDir","NTRP_DIR","parseResponse","stripFences","ALLOWED_MOTIONS","ALLOWED_CRMS","ALLOWED_ENGAGEMENT","getConfigValue","chalk","parseArgs","marker","init_profile","handler","chalk","parseArgs","now","init_profile","handler","chalk","parseArgs","init_context","handler","chalk","parseArgs","init_context","chalk","handler","chalk","parseArgs","handler","init_types","ExitCode","init_errors","init_types","init_types","init_errors","init_resolver","now","now","numActivities","now","Papa","Papa","findOrgName","findOrgSourceId","Papa","chalk","chalk","ora","Table","SYSTEM_PROMPT","stripFences","handler","chalk","ora","parseArgs","handler","chalk","ora","readFileSync","existsSync","basename","parseArgs","detectRevenueLedgerHeaders","importRevenueRows","uploadId","result","init_resolver","now","now","now","now","now","init_context","now","now","periodKey","now","init_context","existsSync","readFileSync","join","chalk","buildMetricsComputeContext","getEntityCounts","chalk","buildSystemPrompt","res","json","existsSync","mkdirSync","appendFileSync","homedir","join","chalk","init_context","chalk","compute_exports","ora","chalk","runMetricsAnalysis","renderMetricsReport","init_compute","init_context","existsSync","basename","resolve","homedir","chalk","detectEntityType","readFileSync","parseCSV","proposeScopeFromIntent","init_context","init_compute","debigint","computeFullMetrics","prefetchSnapshot","computeMetricTimeseries","getAgentContext","proposeScopeFromIntent","saveSessionState","confirmScope","refreshGapAudit","ingestFromChat","runConversationCompute","buildDeliverableDraft","handler","companyContextSection","buildSystemPrompt","computeFullMetrics","findings","final","handler","chalk","ora","parseArgs","init_context","handler","chalk","existsSync","basename","parseArgs","datasetLabel","ora","runMetricsAnalysis","renderMetricsReport","lens","init_context","handler","chalk","init_context","handler","chalk","join","ora","all","init_context","init_markdown","homedir","resolve","sep","init_errors","init_types","handler","chalk","writeFileSync","dirname","parseArgs","init_report","init_markdown","writeFileSync","join","now","handler","chalk","parseArgs","handler","chalk","Papa","mkdirSync","writeFileSync","join","parseArgs","now","stamp","init_errors","init_types","mkdirSync","writeFileSync","basename","dirname","join","resolve","init_markdown","init_markdown","init_errors","init_types","init_errors","init_types","handler","chalk","parseArgs","init_publish","init_errors","init_types","handler","chalk","writeFileSync","join","runPublish","buildDeliverableDraft","init_context","init_errors","init_types","handler","chalk","parseArgs","statusBadge","init_actions","init_errors","init_types","handler","chalk","parseArgs","init_errors","init_types","stripFences","SYSTEM_PROMPT","existsSync","readFileSync","resolve","text","init_errors","init_types","writeFileSync","join","stringifyYaml","readdirSync","statSync","homedir","basename","extname","join","resolve","sep","resolveUserPath","init_errors","init_types","init_errors","init_types","strategy_exports","handler","chalk","ora","parseArgs","statusBadge","init_strategy","init_errors","init_types","handler","chalk","statusDot","init_status","handler","chalk","ora","parseArgs","handler","chalk","parseArgs","init_playbook","init_errors","init_types","handler","chalk","parseArgs","handler","chalk","parseArgs","existsSync","mkdirSync","readFileSync","writeFileSync","join","now","handler","chalk","parseArgs","profilePath","init_setup","init_errors","init_types","chalk","writeFileSync","join","audit","stamp","init_context","init_compute","init_context","tokenize","isEmbeddingsEnabled","embedText","embedItems","existsSync","readFileSync","appendFileSync","readdirSync","join","randomUUID","store_exports","existsSync","readFileSync","appendFileSync","readdirSync","writeFileSync","join","randomUUID","getStrategies","init_store","join","ora","chalk","spinner","init_context","init_store","buildMemoryBlock","init_context","handler","chalk","NtrpError","ExitCode","init_ask","init_errors","init_types","handler","chalk","ora","parseArgs","init_context","stripFences","SYSTEM_PROMPT","ALLOWED_MOTIONS","ALLOWED_CRMS","ALLOWED_ENGAGEMENT","handler","chalk","ora","handler","ora","chalk","handler","chalk","init_store","handler","chalk","init_store","appendFileSync","join","randomUUID","init_feedback","init_store","handler","chalk","init_feedback","handler","chalk","ora","init_knowledge","handler","chalk","all","init_context","handler","chalk","all","init_context","handler","chalk","init_context","handler","join","ora","chalk","all","marker","init_context","handler","chalk","parseArgs","marker","init_context","handler","chalk","parseArgs","marker","init_context","handler","chalk","parseArgs","init_context","existsSync","mkdirSync","readFileSync","unlinkSync","writeFileSync","join","ensureDir","cache","existsSync","readFileSync","dirname","join","handler","chalk","all","handler","init_registry","chalk","init_compute","init_context","chalk","conversationRouter","runNaturalLanguage","resolveSessionByToken","resolveConversationPhase","handler","init_registry","chalk","width","describeLlmReadiness","countAvailableEngines","formatActiveStack","availableEngineLabels","init_context","init_profile","createInterface","clearLine","cursorTo","ora","chalk","firstToken","init_context","init_registry","init_context","init_errors","init_types","chalk","close","printHelpOneShot","printWelcome","isCacheFresh","loadUpdateCheckCache","checkForUpdate","formatUpdateNudge","isNewerVersion","setActiveDbPath","datasetPathForSession"]}
|