@redaksjon/protokoll 1.0.0 → 1.0.1
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/main.js +3 -2
- package/dist/main.js.map +1 -1
- package/dist/mcp/prompts/batch_transcription.md +50 -1
- package/dist/mcp/prompts/edit_entity.md +50 -1
- package/dist/mcp/prompts/enrich_entity.md +95 -2
- package/dist/mcp/prompts/find_and_analyze.md +127 -0
- package/dist/mcp/prompts/review_transcript.md +39 -1
- package/dist/mcp/server.js +41 -8
- package/dist/mcp/server.js.map +1 -1
- package/dist/term-assist.js +4 -2
- package/dist/term-assist.js.map +1 -1
- package/dist/term-context.js +4 -2
- package/dist/term-context.js.map +1 -1
- package/dist/transcript.js +335 -288
- package/dist/transcript.js.map +1 -1
- package/docs/mcp-tools/get-version.md +57 -0
- package/package.json +4 -2
package/dist/transcript.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript.js","sources":["../src/constants.ts","../src/logging.ts","../src/util/storage.ts","../src/context/types.ts","../src/context/storage.ts","../src/context/discovery.ts","../src/context/index.ts","../src/routing/router.ts","../src/routing/classifier.ts","../src/routing/index.ts","../src/util/sound.ts","../src/cli/content-fetcher.ts","../src/util/openai.ts","../src/interactive/handler.ts","../src/interactive/onboarding.ts","../src/interactive/index.ts","../src/util/metadata.ts","../src/output/manager.ts","../src/output/index.ts","../src/reflection/collector.ts","../src/reflection/reporter.ts","../src/reflection/index.ts","../src/util/media.ts","../src/transcription/types.ts","../src/transcription/service.ts","../src/transcription/index.ts","../src/reasoning/client.ts","../src/reasoning/strategy.ts","../src/reasoning/index.ts","../src/agentic/tools/lookup-person.ts","../src/agentic/tools/lookup-project.ts","../src/agentic/tools/verify-spelling.ts","../src/agentic/tools/route-note.ts","../src/agentic/tools/store-context.ts","../src/agentic/registry.ts","../src/agentic/executor.ts","../src/agentic/index.ts","../src/phases/complete.ts","../src/pipeline/orchestrator.ts","../src/pipeline/index.ts","../src/cli/project-assist.ts","../src/cli/action.ts","../src/cli/feedback.ts","../src/cli/transcript.ts"],"sourcesContent":["import os from 'node:os';\nimport { FilenameOption } from '@theunwalked/dreadcabinet';\nimport { FilesystemStructure } from '@theunwalked/dreadcabinet';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'protokoll';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_TIMEZONE = 'Etc/UTC';\nexport const DATE_FORMAT_MONTH_DAY = 'M-D';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-M';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-M-D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/M/D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-M-D-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-M-D-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-M-D-HHmmss.SSS';\nexport const DATE_FORMAT_MONTH = 'M';\nexport const DATE_FORMAT_DAY = 'D';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_CONTENT_TYPES = ['diff'];\nexport const DEFAULT_RECURSIVE = false;\nexport const DEFAULT_INPUT_DIRECTORY = './';\nexport const DEFAULT_OUTPUT_DIRECTORY = './';\n\nexport const DEFAULT_AUDIO_EXTENSIONS = ['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm', 'qta'];\n\nexport const ALLOWED_CONTENT_TYPES = ['log', 'diff'];\nexport const ALLOWED_AUDIO_EXTENSIONS = ['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm', 'qta'];\n\nexport const DEFAULT_OUTPUT_STRUCTURE = 'month' as FilesystemStructure;\nexport const DEFAULT_OUTPUT_FILENAME_OPTIONS = ['date', 'time', 'subject'] as FilenameOption[];\n\nexport const ALLOWED_OUTPUT_STRUCTURES = ['none', 'year', 'month', 'day'] as FilesystemStructure[];\nexport const ALLOWED_OUTPUT_FILENAME_OPTIONS = ['date', 'time', 'subject'] as FilenameOption[];\n\nexport const DEFAULT_CONFIG_DIR = `./.${PROGRAM_NAME}`;\nexport const DEFAULT_PROCESSED_DIR = './processed';\n\n// Context System Constants\nexport const DEFAULT_CONTEXT_DIR_NAME = '.protokoll';\nexport const DEFAULT_CONTEXT_CONFIG_FILE_NAME = 'config.yaml';\nexport const DEFAULT_MAX_DISCOVERY_LEVELS = 10;\n\nexport const CONTEXT_SUBDIRECTORIES = {\n people: 'people',\n projects: 'projects',\n companies: 'companies',\n terms: 'terms',\n} as const;\n\nexport const DEFAULT_PERSONAS_DIR = `/personas`;\n\nexport const DEFAULT_PERSONA_TRANSCRIBER_FILE = `${DEFAULT_PERSONAS_DIR}/transcriber.md`;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `/instructions`;\n\nexport const DEFAULT_INSTRUCTIONS_TRANSCRIBE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/transcribe.md`;\n\n// Note: We no longer maintain a static allowlist of models\n// This allows for dynamic model discovery and future model additions\n// Users can specify any model supported by their OpenAI API\n\nexport const DEFAULT_TRANSCRIPTION_MODEL = 'whisper-1';\nexport const DEFAULT_MODEL = 'gpt-5.2';\nexport const DEFAULT_REASONING_LEVEL = 'medium';\n\n// Smart Assistance Constants\nexport const DEFAULT_PHONETIC_MODEL = 'gpt-5-nano';\nexport const DEFAULT_ANALYSIS_MODEL = 'gpt-5-mini';\nexport const DEFAULT_SMART_ASSISTANCE = true;\n\n// Project-specific smart assistance\nexport const DEFAULT_SOUNDS_LIKE_ON_ADD = true; // Generate phonetic variants\nexport const DEFAULT_TRIGGER_PHRASES_ON_ADD = true; // Generate content-matching phrases\nexport const DEFAULT_PROMPT_FOR_SOURCE = true;\n\n// Term-specific smart assistance\nexport const DEFAULT_TERMS_ENABLED = true;\nexport const DEFAULT_TERM_SOUNDS_LIKE_ON_ADD = true;\nexport const DEFAULT_TERM_DESCRIPTION_ON_ADD = true;\nexport const DEFAULT_TERM_TOPICS_ON_ADD = true;\nexport const DEFAULT_TERM_PROJECT_SUGGESTIONS = true;\n\n// Content limits\nexport const MAX_CONTENT_LENGTH = 15000; // Max characters to send to LLM\nexport const MAX_TERM_CONTEXT_LENGTH = 10000; // Max characters for term context\nexport const ASSIST_TIMEOUT_MS = 30000; // 30 second timeout for LLM calls\nexport const TERM_ASSIST_TIMEOUT_MS = 20000; // 20 second timeout for term LLM calls\n\nexport const DEFAULT_OVERRIDES = false;\nexport const DEFAULT_MAX_AUDIO_SIZE = 26214400; // 25MB in bytes\nexport const DEFAULT_TEMP_DIRECTORY = os.tmpdir(); // Use OS default temp directory\nexport const DEFAULT_INTERACTIVE = true; // Interactive prompts enabled by default\nexport const DEFAULT_SELF_REFLECTION = true;\nexport const DEFAULT_SILENT = false; // Sound notifications enabled by default\n\n// Output Management Constants\nexport const DEFAULT_INTERMEDIATE_DIRECTORY = './output/protokoll';\nexport const DEFAULT_KEEP_INTERMEDIATES = true;\nexport const OUTPUT_FILE_TYPES = [\n 'transcript',\n 'context',\n 'request',\n 'response',\n 'reflection',\n 'session',\n] as const;\n\n// Define Protokoll-specific defaults\nexport const PROTOKOLL_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n diff: DEFAULT_DIFF,\n log: DEFAULT_LOG,\n transcriptionModel: DEFAULT_TRANSCRIPTION_MODEL,\n model: DEFAULT_MODEL,\n reasoningLevel: DEFAULT_REASONING_LEVEL,\n contentTypes: DEFAULT_CONTENT_TYPES,\n overrides: DEFAULT_OVERRIDES,\n maxAudioSize: DEFAULT_MAX_AUDIO_SIZE,\n tempDirectory: DEFAULT_TEMP_DIRECTORY || os.tmpdir(),\n configDirectory: DEFAULT_CONFIG_DIR,\n interactive: DEFAULT_INTERACTIVE,\n selfReflection: DEFAULT_SELF_REFLECTION,\n silent: DEFAULT_SILENT,\n};\n","import winston from 'winston';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, PROGRAM_NAME } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\nconst createLogger = (level: string = 'info') => {\n\n let format = winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.json()\n );\n\n let transports = [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${level}: ${message}${metaStr}`;\n })\n )\n })\n ];\n\n if (level === 'info') {\n format = winston.format.combine(\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n );\n\n transports = [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message }) => {\n return `${level}: ${message}`;\n })\n )\n })\n ];\n }\n\n return winston.createLogger({\n level,\n format,\n defaultMeta: { service: PROGRAM_NAME },\n transports,\n });\n};\n\nlet logger = createLogger();\n\nexport const setLogLevel = (level: string) => {\n logger = createLogger(level);\n};\n\nexport const getLogger = () => logger; ","// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\n/**\n * This module exists to isolate filesystem operations from the rest of the codebase.\n * This makes testing easier by avoiding direct fs mocking in jest configuration.\n * \n * Additionally, abstracting storage operations allows for future flexibility - \n * this export utility may need to work with storage systems other than the local filesystem\n * (e.g. S3, Google Cloud Storage, etc).\n */\n\nexport interface Utility {\n exists: (path: string) => Promise<boolean>;\n isDirectory: (path: string) => Promise<boolean>;\n isFile: (path: string) => Promise<boolean>;\n isReadable: (path: string) => Promise<boolean>;\n isWritable: (path: string) => Promise<boolean>;\n isFileReadable: (path: string) => Promise<boolean>;\n isDirectoryWritable: (path: string) => Promise<boolean>;\n isDirectoryReadable: (path: string) => Promise<boolean>;\n createDirectory: (path: string) => Promise<void>;\n readFile: (path: string, encoding: string) => Promise<string>;\n readStream: (path: string) => Promise<fs.ReadStream>;\n writeFile: (path: string, data: string | Buffer, encoding: string) => Promise<void>;\n forEachFileIn: (directory: string, callback: (path: string) => Promise<void>, options?: { pattern: string }) => Promise<void>;\n hashFile: (path: string, length: number) => Promise<string>;\n listFiles: (directory: string) => Promise<string[]>;\n deleteFile: (path: string) => Promise<void>;\n getFileSize: (path: string) => Promise<number>;\n}\n\nexport const create = (params: { log?: (message: string, ...args: any[]) => void }): Utility => {\n\n // eslint-disable-next-line no-console\n const log = params.log || console.log;\n\n const exists = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.stat(path);\n return true;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error: any) {\n return false;\n }\n }\n\n const isDirectory = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isDirectory()) {\n log(`${path} is not a directory`);\n return false;\n }\n return true;\n }\n\n const isFile = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isFile()) {\n log(`${path} is not a file`);\n return false;\n }\n return true;\n }\n\n const isReadable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.R_OK);\n } catch (error: any) {\n log(`${path} is not readable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isWritable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.W_OK);\n } catch (error: any) {\n log(`${path} is not writable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isFileReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isFile(path) && await isReadable(path);\n }\n\n const isDirectoryWritable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isWritable(path);\n }\n\n const isDirectoryReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isReadable(path);\n }\n\n const createDirectory = async (path: string): Promise<void> => {\n try {\n await fs.promises.mkdir(path, { recursive: true });\n } catch (mkdirError: any) {\n throw new Error(`Failed to create output directory ${path}: ${mkdirError.message} ${mkdirError.stack}`);\n }\n }\n\n const readFile = async (path: string, encoding: string): Promise<string> => {\n return await fs.promises.readFile(path, { encoding: encoding as BufferEncoding });\n }\n\n const writeFile = async (path: string, data: string | Buffer, encoding: string): Promise<void> => {\n await fs.promises.writeFile(path, data, { encoding: encoding as BufferEncoding });\n }\n\n const forEachFileIn = async (directory: string, callback: (file: string) => Promise<void>, options: { pattern: string | string[] } = { pattern: '*.*' }): Promise<void> => {\n try {\n const files = await glob(options.pattern, { cwd: directory, nodir: true });\n for (const file of files) {\n await callback(path.join(directory, file));\n }\n } catch (err: any) {\n throw new Error(`Failed to glob pattern ${options.pattern} in ${directory}: ${err.message}`);\n }\n }\n\n const readStream = async (path: string): Promise<fs.ReadStream> => {\n return fs.createReadStream(path);\n }\n\n const hashFile = async (path: string, length: number): Promise<string> => {\n const file = await readFile(path, 'utf8');\n return crypto.createHash('sha256').update(file).digest('hex').slice(0, length);\n }\n\n const listFiles = async (directory: string): Promise<string[]> => {\n return await fs.promises.readdir(directory);\n }\n\n const deleteFile = async (path: string): Promise<void> => {\n await fs.promises.unlink(path);\n }\n\n const getFileSize = async (path: string): Promise<number> => {\n const stats = await fs.promises.stat(path);\n return stats.size;\n }\n\n return {\n exists,\n isDirectory,\n isFile,\n isReadable,\n isWritable,\n isFileReadable,\n isDirectoryWritable,\n isDirectoryReadable,\n createDirectory,\n readFile,\n readStream,\n writeFile,\n forEachFileIn,\n hashFile,\n listFiles,\n deleteFile,\n getFileSize,\n };\n}","/**\n * Context System Types\n *\n * Types for storing knowledge about entities that appear in transcripts:\n * - People: Named individuals the user frequently mentions\n * - Projects: Work contexts that affect routing and understanding\n * - Companies: Organizations referenced in notes\n * - Terms: Domain-specific terminology and acronyms\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nexport type EntityType = 'person' | 'project' | 'company' | 'term' | 'ignored';\n\nexport interface BaseEntity {\n id: string; // Unique identifier (slug)\n name: string; // Display name (always the preferred/correct spelling)\n type: EntityType;\n createdAt?: Date;\n updatedAt?: Date;\n notes?: string;\n}\n\nexport interface Person extends BaseEntity {\n type: 'person';\n firstName?: string;\n lastName?: string;\n company?: string; // Company ID reference\n role?: string; // e.g., \"Manager\", \"Developer\"\n sounds_like?: string[]; // Common mishearings: \"a nil\", \"a nill\"\n context?: string; // How user knows them\n}\n\n/**\n * Project Relationship Configuration\n * Defines how projects relate to each other in the ecosystem\n */\nexport interface ProjectRelationships {\n parent?: string; // Parent project ID (e.g., redaksjon for kronologi)\n children?: string[]; // Child project IDs\n siblings?: string[]; // Related peer projects\n dependsOn?: string[]; // Dependencies\n relatedTerms?: string[]; // Terms strongly associated with this project\n}\n\nexport interface ProjectClassification {\n context_type: 'work' | 'personal' | 'mixed';\n associated_people?: string[]; // Person IDs\n associated_companies?: string[]; // Company IDs\n topics?: string[]; // Topic keywords\n explicit_phrases?: string[]; // High-confidence trigger phrases\n}\n\nexport interface ProjectRouting {\n destination?: string; // Optional - if omitted, uses global default\n structure: 'none' | 'year' | 'month' | 'day';\n filename_options: Array<'date' | 'time' | 'subject'>;\n auto_tags?: string[];\n}\n\nexport interface Project extends BaseEntity {\n type: 'project';\n description?: string;\n \n // Classification signals (not just triggers)\n classification: ProjectClassification;\n \n // Routing configuration (uses Dreadcabinet structures)\n routing: ProjectRouting;\n \n // Phonetic variants for when Whisper mishears the project name\n // Useful for non-English names (Norwegian, etc.) that may be transcribed differently\n sounds_like?: string[];\n \n // Project relationship graph\n relationships?: ProjectRelationships;\n \n active?: boolean;\n}\n\nexport interface Company extends BaseEntity {\n type: 'company';\n fullName?: string;\n industry?: string;\n sounds_like?: string[];\n}\n\nexport interface Term extends BaseEntity {\n type: 'term';\n expansion?: string; // Full form if it's an acronym\n domain?: string; // E.g., \"engineering\", \"finance\", \"devops\"\n sounds_like?: string[];\n projects?: string[]; // Associated project IDs - triggers routing to these projects\n \n // Smart assistance fields\n description?: string; // Clear explanation of what the term means\n topics?: string[]; // Thematic keywords related to this term\n}\n\n/**\n * Ignored terms - phrases the user doesn't want to be prompted about.\n * These are common phrases that aren't worth defining as proper terms.\n */\nexport interface IgnoredTerm extends BaseEntity {\n type: 'ignored';\n reason?: string; // Optional note about why it's ignored\n ignoredAt?: string; // ISO date when it was ignored\n}\n\nexport type Entity = Person | Project | Company | Term | IgnoredTerm;\n\nexport interface ContextStore {\n people: Map<string, Person>;\n projects: Map<string, Project>;\n companies: Map<string, Company>;\n terms: Map<string, Term>;\n ignored: Map<string, IgnoredTerm>;\n}\n\n/**\n * Hierarchical configuration following Cardigantime pattern.\n * Config is discovered by walking up the directory tree.\n */\nexport interface ContextDiscoveryOptions {\n configDirName: string; // '.protokoll'\n configFileName: string; // 'config.yaml'\n maxLevels?: number; // How far up to search (default: 10)\n startingDir?: string; // Where to start (default: process.cwd())\n}\n\nexport interface DiscoveredContextDir {\n path: string;\n level: number; // 0 = closest, higher = further up\n}\n\nexport interface HierarchicalContextResult {\n config: Record<string, unknown>;\n discoveredDirs: DiscoveredContextDir[];\n contextDirs: string[]; // All context subdirectories to load\n}\n\n/**\n * Smart Assistance Configuration\n * Controls LLM-assisted project and term metadata generation\n */\nexport interface SmartAssistanceConfig {\n enabled: boolean;\n phoneticModel: string; // Fast model for phonetic variants (e.g., gpt-5-nano)\n analysisModel: string; // More capable model for content analysis (e.g., gpt-5-mini)\n \n // Project-specific settings\n soundsLikeOnAdd: boolean; // Generate phonetic variants for project name\n triggerPhrasesOnAdd: boolean; // Generate content-matching phrases\n promptForSource: boolean;\n \n // Term-specific settings\n termsEnabled?: boolean; // Enable smart assistance for terms\n termSoundsLikeOnAdd?: boolean; // Generate phonetic variants for terms\n termDescriptionOnAdd?: boolean; // Generate term descriptions\n termTopicsOnAdd?: boolean; // Generate related topics\n termProjectSuggestions?: boolean; // Suggest relevant projects based on topics\n \n timeout?: number;\n}\n\n/**\n * Protokoll Configuration\n * Top-level configuration structure\n */\nexport interface ProtokollConfig {\n version?: number;\n smartAssistance?: SmartAssistanceConfig;\n // Other config fields can be added here as needed\n}\n\n/**\n * Helper functions for Term type\n */\n\n/**\n * Check if a term is associated with a given project\n */\nexport const isTermAssociatedWithProject = (term: Term, projectId: string): boolean => {\n return term.projects?.includes(projectId) ?? false;\n};\n\n/**\n * Add a project association to a term\n */\nexport const addProjectToTerm = (term: Term, projectId: string): Term => {\n const projects = term.projects || [];\n if (projects.includes(projectId)) {\n return term;\n }\n return {\n ...term,\n projects: [...projects, projectId],\n updatedAt: new Date(),\n };\n};\n\n/**\n * Remove a project association from a term\n */\nexport const removeProjectFromTerm = (term: Term, projectId: string): Term => {\n const projects = term.projects || [];\n return {\n ...term,\n projects: projects.filter(id => id !== projectId),\n updatedAt: new Date(),\n };\n};\n\n/**\n * Helper functions for Project Relationships\n */\n\n/**\n * Check if projectA is a parent of projectB\n */\nexport const isParentProject = (projectA: Project, projectB: Project): boolean => {\n return projectB.relationships?.parent === projectA.id;\n};\n\n/**\n * Check if projectA is a child of projectB\n */\nexport const isChildProject = (projectA: Project, projectB: Project): boolean => {\n return projectA.relationships?.parent === projectB.id;\n};\n\n/**\n * Check if two projects are siblings\n */\nexport const areSiblingProjects = (projectA: Project, projectB: Project): boolean => {\n const aSiblings = projectA.relationships?.siblings || [];\n const bSiblings = projectB.relationships?.siblings || [];\n return aSiblings.includes(projectB.id) || bSiblings.includes(projectA.id);\n};\n\n/**\n * Get relationship distance between two projects (lower = closer)\n * Returns: 0 = same, 1 = parent/child, 2 = siblings/cousins, -1 = unrelated\n */\nexport const getProjectRelationshipDistance = (projectA: Project, projectB: Project): number => {\n if (projectA.id === projectB.id) return 0;\n if (isParentProject(projectA, projectB) || isChildProject(projectA, projectB)) return 1;\n if (areSiblingProjects(projectA, projectB)) return 2;\n \n // Check if they share a parent (cousins)\n if (projectA.relationships?.parent && projectB.relationships?.parent &&\n projectA.relationships.parent === projectB.relationships.parent) {\n return 2;\n }\n \n return -1; // unrelated\n};\n\n\n","/**\n * Context Storage\n * \n * Handles loading and saving entity YAML files from context directories.\n * Supports hierarchical loading where later directories override earlier ones.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport * as yaml from 'js-yaml';\nimport * as fs from 'fs/promises';\n// eslint-disable-next-line no-restricted-imports\nimport { existsSync, statSync } from 'fs';\nimport * as path from 'node:path';\nimport { Entity, EntityType } from './types';\n\nexport interface StorageInstance {\n load(contextDirs: string[]): Promise<void>;\n save(entity: Entity, targetDir: string): Promise<void>;\n delete(type: EntityType, id: string, targetDir: string): Promise<boolean>;\n get<T extends Entity>(type: EntityType, id: string): T | undefined;\n getAll<T extends Entity>(type: EntityType): T[];\n search(query: string): Entity[];\n findBySoundsLike(phonetic: string): Entity | undefined;\n clear(): void;\n getEntityFilePath(type: EntityType, id: string, contextDirs: string[]): string | undefined;\n}\n\ntype DirectoryName = 'people' | 'projects' | 'companies' | 'terms' | 'ignored';\n\nconst DIRECTORY_TO_TYPE: Record<DirectoryName, EntityType> = {\n 'people': 'person',\n 'projects': 'project',\n 'companies': 'company',\n 'terms': 'term',\n 'ignored': 'ignored',\n};\n\nconst TYPE_TO_DIRECTORY: Record<EntityType, DirectoryName> = {\n 'person': 'people',\n 'project': 'projects',\n 'company': 'companies',\n 'term': 'terms',\n 'ignored': 'ignored',\n};\n\nexport const create = (): StorageInstance => {\n const entities: Map<EntityType, Map<string, Entity>> = new Map([\n ['person', new Map()],\n ['project', new Map()],\n ['company', new Map()],\n ['term', new Map()],\n ['ignored', new Map()],\n ]);\n\n const load = async (contextDirs: string[]): Promise<void> => {\n // Load from all context directories (later directories override)\n for (const contextDir of contextDirs) {\n for (const dirName of Object.keys(DIRECTORY_TO_TYPE) as DirectoryName[]) {\n const typeDir = path.join(contextDir, dirName);\n const entityType = DIRECTORY_TO_TYPE[dirName];\n \n try {\n const files = await fs.readdir(typeDir);\n for (const file of files) {\n if (!file.endsWith('.yaml') && !file.endsWith('.yml')) continue;\n \n const content = await fs.readFile(path.join(typeDir, file), 'utf-8');\n const parsed = yaml.load(content) as Partial<Entity>;\n \n if (parsed && parsed.id) {\n entities.get(entityType)?.set(parsed.id, {\n ...parsed,\n type: entityType,\n } as Entity);\n }\n }\n } catch {\n // Directory doesn't exist, skip\n }\n }\n }\n };\n\n const save = async (entity: Entity, targetDir: string): Promise<void> => {\n const dirName = TYPE_TO_DIRECTORY[entity.type];\n // Save to context subdirectory (context/people/, context/projects/, etc.)\n const dirPath = path.join(targetDir, 'context', dirName);\n await fs.mkdir(dirPath, { recursive: true });\n \n const filePath = path.join(dirPath, `${entity.id}.yaml`);\n \n // Remove type from saved YAML (it's inferred from directory)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { type: _entityType, ...entityWithoutType } = entity;\n const content = yaml.dump(entityWithoutType, { lineWidth: -1 });\n await fs.writeFile(filePath, content, 'utf-8');\n \n entities.get(entity.type)?.set(entity.id, entity);\n };\n\n const deleteEntity = async (type: EntityType, id: string, targetDir: string): Promise<boolean> => {\n const dirName = TYPE_TO_DIRECTORY[type];\n \n // Try both possible locations (with and without 'context' subdirectory)\n const possiblePaths = [\n path.join(targetDir, dirName, `${id}.yaml`),\n path.join(targetDir, dirName, `${id}.yml`),\n path.join(targetDir, 'context', dirName, `${id}.yaml`),\n path.join(targetDir, 'context', dirName, `${id}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n try {\n await fs.unlink(filePath);\n entities.get(type)?.delete(id);\n return true;\n } catch {\n // File doesn't exist at this path, try next\n }\n }\n \n return false;\n };\n\n const getEntityFilePath = (type: EntityType, id: string, contextDirs: string[]): string | undefined => {\n const dirName = TYPE_TO_DIRECTORY[type];\n \n // Search in reverse order (closest first) to find where the entity is defined\n for (const contextDir of [...contextDirs].reverse()) {\n const possiblePaths = [\n path.join(contextDir, dirName, `${id}.yaml`),\n path.join(contextDir, dirName, `${id}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n // Use sync access check - this is only for CLI, not hot path\n if (existsSync(filePath)) {\n const stat = statSync(filePath);\n if (stat.isFile()) {\n return filePath;\n }\n }\n }\n }\n \n return undefined;\n };\n\n const get = <T extends Entity>(type: EntityType, id: string): T | undefined => {\n return entities.get(type)?.get(id) as T | undefined;\n };\n\n const getAll = <T extends Entity>(type: EntityType): T[] => {\n return Array.from(entities.get(type)?.values() ?? []) as T[];\n };\n\n const search = (query: string): Entity[] => {\n const normalizedQuery = query.toLowerCase();\n const results: Entity[] = [];\n const seen = new Set<string>(); // Track by ID to avoid duplicates\n \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n let matched = false;\n \n // Check name\n if (entity.name.toLowerCase().includes(normalizedQuery)) {\n matched = true;\n }\n \n // Also check sounds_like field\n if (!matched) {\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase().includes(normalizedQuery))) {\n matched = true;\n }\n }\n \n // Also check exact match in sounds_like (for full phrase matching)\n if (!matched) {\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase() === normalizedQuery)) {\n matched = true;\n }\n }\n \n if (matched && !seen.has(entity.id)) {\n results.push(entity);\n seen.add(entity.id);\n }\n }\n }\n \n return results;\n };\n\n const findBySoundsLike = (phonetic: string): Entity | undefined => {\n const normalized = phonetic.toLowerCase().trim();\n \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n // Check sounds_like field on entities that have it\n const entityWithSoundsLike = entity as Entity & { sounds_like?: string[] };\n const variants = entityWithSoundsLike.sounds_like;\n if (variants?.some(v => v.toLowerCase() === normalized)) {\n return entity;\n }\n }\n }\n \n return undefined;\n };\n\n const clear = (): void => {\n for (const entityMap of entities.values()) {\n entityMap.clear();\n }\n };\n\n return { load, save, delete: deleteEntity, get, getAll, search, findBySoundsLike, clear, getEntityFilePath };\n};\n\n","/**\n * Hierarchical Configuration Discovery\n * \n * Follows Cardigantime pattern: walks up directory tree finding .protokoll/\n * directories. Merges config with local taking precedence.\n * \n * Example:\n * /home/user/projects/work/projectA/ <- CWD\n * └── .protokoll/config.yaml <- Highest precedence\n * /home/user/projects/work/\n * └── .protokoll/config.yaml <- Work context\n * /home/user/\n * └── .protokoll/config.yaml <- User defaults\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'fs/promises';\nimport * as yaml from 'js-yaml';\nimport { ContextDiscoveryOptions, DiscoveredContextDir, HierarchicalContextResult } from './types';\n\n/**\n * Discover configuration directories by walking up the directory tree\n */\nexport const discoverConfigDirectories = async (\n options: ContextDiscoveryOptions\n): Promise<DiscoveredContextDir[]> => {\n const {\n configDirName,\n maxLevels = 10,\n startingDir = process.cwd(),\n } = options;\n\n const discovered: DiscoveredContextDir[] = [];\n let currentDir = path.resolve(startingDir);\n let level = 0;\n const visited = new Set<string>();\n\n while (level < maxLevels) {\n const realPath = path.resolve(currentDir);\n if (visited.has(realPath)) break;\n visited.add(realPath);\n\n const configDirPath = path.join(currentDir, configDirName);\n \n try {\n const stat = await fs.stat(configDirPath);\n if (stat.isDirectory()) {\n discovered.push({ path: configDirPath, level });\n }\n } catch {\n // Directory doesn't exist, continue searching\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n \n currentDir = parentDir;\n level++;\n }\n\n return discovered;\n};\n\n/**\n * Load and merge hierarchical configuration\n */\nexport const loadHierarchicalConfig = async (\n options: ContextDiscoveryOptions\n): Promise<HierarchicalContextResult> => {\n const discoveredDirs = await discoverConfigDirectories(options);\n \n if (discoveredDirs.length === 0) {\n return {\n config: {},\n discoveredDirs: [],\n contextDirs: [],\n };\n }\n\n // Sort by level descending (lowest precedence first)\n const sortedDirs = [...discoveredDirs].sort((a, b) => b.level - a.level);\n \n const configs: Record<string, unknown>[] = [];\n const contextDirs: string[] = [];\n \n for (const dir of sortedDirs) {\n const configPath = path.join(dir.path, options.configFileName);\n \n try {\n const content = await fs.readFile(configPath, 'utf-8');\n const parsed = yaml.load(content);\n if (parsed && typeof parsed === 'object') {\n configs.push(parsed as Record<string, unknown>);\n }\n } catch {\n // No config file in this directory\n }\n \n // Add context directory\n const contextDir = path.join(dir.path, 'context');\n try {\n const stat = await fs.stat(contextDir);\n if (stat.isDirectory()) {\n contextDirs.push(contextDir);\n }\n } catch {\n // No context subdirectory\n }\n }\n\n // Merge configs (later entries override earlier)\n const mergedConfig = configs.reduce(\n (acc, curr) => deepMerge(acc, curr), \n {} as Record<string, unknown>\n );\n\n return {\n config: mergedConfig,\n discoveredDirs,\n contextDirs,\n };\n};\n\n/**\n * Deep merge utility (similar to Cardigantime's implementation)\n */\nexport function deepMerge<T extends Record<string, unknown>>(target: T, source: T): T {\n if (source === null || source === undefined) return target;\n if (target === null || target === undefined) return source;\n \n if (typeof source !== 'object' || typeof target !== 'object') {\n return source;\n }\n \n if (Array.isArray(source)) {\n return [...source] as unknown as T;\n }\n \n const result = { ...target } as Record<string, unknown>;\n \n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const targetVal = result[key];\n const sourceVal = source[key];\n \n if (\n typeof targetVal === 'object' && \n typeof sourceVal === 'object' &&\n targetVal !== null &&\n sourceVal !== null &&\n !Array.isArray(targetVal) && \n !Array.isArray(sourceVal)\n ) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>, \n sourceVal as Record<string, unknown>\n );\n } else {\n result[key] = sourceVal;\n }\n }\n }\n \n return result as T;\n}\n\n","/**\n * Context System\n * \n * Main entry point for the context system. Provides a factory function\n * to create context instances that can discover, load, and manage\n * entity data from hierarchical .protokoll directories.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport { \n Entity, \n Person, \n Project, \n Company, \n Term,\n IgnoredTerm,\n ContextDiscoveryOptions,\n DiscoveredContextDir,\n HierarchicalContextResult,\n SmartAssistanceConfig,\n getProjectRelationshipDistance\n} from './types';\nimport * as Storage from './storage';\nimport * as Discovery from './discovery';\nimport {\n DEFAULT_PHONETIC_MODEL,\n DEFAULT_ANALYSIS_MODEL,\n DEFAULT_SMART_ASSISTANCE,\n DEFAULT_SOUNDS_LIKE_ON_ADD,\n DEFAULT_TRIGGER_PHRASES_ON_ADD,\n DEFAULT_PROMPT_FOR_SOURCE,\n DEFAULT_TERMS_ENABLED,\n DEFAULT_TERM_SOUNDS_LIKE_ON_ADD,\n DEFAULT_TERM_DESCRIPTION_ON_ADD,\n DEFAULT_TERM_TOPICS_ON_ADD,\n DEFAULT_TERM_PROJECT_SUGGESTIONS,\n ASSIST_TIMEOUT_MS\n} from '../constants';\n\nexport interface ContextInstance {\n // Initialization\n load(): Promise<void>;\n reload(): Promise<void>;\n \n // Discovery info\n getDiscoveredDirs(): DiscoveredContextDir[];\n getConfig(): Record<string, unknown>;\n getContextDirs(): string[];\n \n // Smart Assistance config\n getSmartAssistanceConfig(): SmartAssistanceConfig;\n \n // Entity access\n getPerson(id: string): Person | undefined;\n getProject(id: string): Project | undefined;\n getCompany(id: string): Company | undefined;\n getTerm(id: string): Term | undefined;\n getIgnored(id: string): IgnoredTerm | undefined;\n \n getAllPeople(): Person[];\n getAllProjects(): Project[];\n getAllCompanies(): Company[];\n getAllTerms(): Term[];\n getAllIgnored(): IgnoredTerm[];\n \n // Check if a term is ignored\n isIgnored(term: string): boolean;\n \n // Search\n search(query: string): Entity[];\n findBySoundsLike(phonetic: string): Entity | undefined;\n \n // Advanced search with context awareness (prefers entities related to context project)\n searchWithContext(query: string, contextProjectId?: string): Entity[];\n getRelatedProjects(projectId: string, maxDistance?: number): Project[];\n \n // Modification (for self-update mode)\n saveEntity(entity: Entity): Promise<void>;\n deleteEntity(entity: Entity): Promise<boolean>;\n getEntityFilePath(entity: Entity): string | undefined;\n \n // Check if context is available\n hasContext(): boolean;\n}\n\nexport interface CreateOptions {\n startingDir?: string;\n configDirName?: string;\n configFileName?: string;\n}\n\n/**\n * Get smart assistance configuration with defaults\n */\nconst getSmartAssistanceConfig = (config: Record<string, unknown>): SmartAssistanceConfig => {\n const smartConfig = config.smartAssistance as Partial<SmartAssistanceConfig> | undefined;\n \n return {\n enabled: smartConfig?.enabled ?? DEFAULT_SMART_ASSISTANCE,\n phoneticModel: smartConfig?.phoneticModel ?? DEFAULT_PHONETIC_MODEL,\n analysisModel: smartConfig?.analysisModel ?? DEFAULT_ANALYSIS_MODEL,\n \n // Project settings\n soundsLikeOnAdd: smartConfig?.soundsLikeOnAdd ?? DEFAULT_SOUNDS_LIKE_ON_ADD,\n triggerPhrasesOnAdd: smartConfig?.triggerPhrasesOnAdd ?? DEFAULT_TRIGGER_PHRASES_ON_ADD,\n promptForSource: smartConfig?.promptForSource ?? DEFAULT_PROMPT_FOR_SOURCE,\n \n // Term settings\n termsEnabled: smartConfig?.termsEnabled ?? DEFAULT_TERMS_ENABLED,\n termSoundsLikeOnAdd: smartConfig?.termSoundsLikeOnAdd ?? DEFAULT_TERM_SOUNDS_LIKE_ON_ADD,\n termDescriptionOnAdd: smartConfig?.termDescriptionOnAdd ?? DEFAULT_TERM_DESCRIPTION_ON_ADD,\n termTopicsOnAdd: smartConfig?.termTopicsOnAdd ?? DEFAULT_TERM_TOPICS_ON_ADD,\n termProjectSuggestions: smartConfig?.termProjectSuggestions ?? DEFAULT_TERM_PROJECT_SUGGESTIONS,\n \n timeout: smartConfig?.timeout ?? ASSIST_TIMEOUT_MS,\n };\n};\n\n/**\n * Create a new context instance\n */\nexport const create = async (options: CreateOptions = {}): Promise<ContextInstance> => {\n const discoveryOptions: ContextDiscoveryOptions = {\n configDirName: options.configDirName ?? '.protokoll',\n configFileName: options.configFileName ?? 'config.yaml',\n startingDir: options.startingDir,\n };\n\n const storage = Storage.create();\n let discoveryResult: HierarchicalContextResult = {\n config: {},\n discoveredDirs: [],\n contextDirs: [],\n };\n\n const loadContext = async (): Promise<void> => {\n discoveryResult = await Discovery.loadHierarchicalConfig(discoveryOptions);\n storage.clear();\n await storage.load(discoveryResult.contextDirs);\n };\n\n // Initial load\n await loadContext();\n\n return {\n load: loadContext,\n \n reload: async () => {\n storage.clear();\n await storage.load(discoveryResult.contextDirs);\n },\n \n getDiscoveredDirs: () => discoveryResult.discoveredDirs,\n getConfig: () => discoveryResult.config,\n getContextDirs: () => discoveryResult.contextDirs,\n \n getSmartAssistanceConfig: () => getSmartAssistanceConfig(discoveryResult.config),\n \n getPerson: (id) => storage.get<Person>('person', id),\n getProject: (id) => storage.get<Project>('project', id),\n getCompany: (id) => storage.get<Company>('company', id),\n getTerm: (id) => storage.get<Term>('term', id),\n getIgnored: (id) => storage.get<IgnoredTerm>('ignored', id),\n \n getAllPeople: () => storage.getAll<Person>('person'),\n getAllProjects: () => storage.getAll<Project>('project'),\n getAllCompanies: () => storage.getAll<Company>('company'),\n getAllTerms: () => storage.getAll<Term>('term'),\n getAllIgnored: () => storage.getAll<IgnoredTerm>('ignored'),\n \n isIgnored: (term: string) => {\n const normalizedTerm = term.toLowerCase().replace(/[^a-z0-9]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n const ignoredTerms = storage.getAll<IgnoredTerm>('ignored');\n return ignoredTerms.some(ignored => \n ignored.id === normalizedTerm || \n ignored.name.toLowerCase() === term.toLowerCase()\n );\n },\n \n search: (query) => storage.search(query),\n findBySoundsLike: (phonetic) => storage.findBySoundsLike(phonetic),\n \n /**\n * Context-aware search that prefers entities related to context project.\n * Still returns standard search results if no context provided.\n */\n searchWithContext: (query, contextProjectId) => {\n // First, do a standard search\n const results = storage.search(query);\n \n // If no context project specified, return standard results\n if (!contextProjectId) {\n return results;\n }\n \n // Get the context project\n const contextProject = storage.get<Project>('project', contextProjectId);\n if (!contextProject) {\n return results;\n }\n \n // Score and sort results based on context relationships\n const scoredResults = results.map(entity => {\n let score = 0;\n \n // For projects, consider relationship distance\n if (entity.type === 'project') {\n const distance = getProjectRelationshipDistance(contextProject, entity as Project);\n if (distance >= 0) {\n // Closer relationships get higher scores\n score += (3 - distance) * 50; // 150 for same, 100 for parent/child, 50 for sibling\n }\n }\n \n // For terms, check if associated with context project\n if (entity.type === 'term') {\n const term = entity as Term;\n if (term.projects?.includes(contextProjectId)) {\n score += 100;\n }\n }\n \n return { entity, score };\n });\n \n // Sort by score (highest first) and return entities\n return scoredResults\n .sort((a, b) => b.score - a.score)\n .map(r => r.entity);\n },\n \n /**\n * Get all projects related to a given project within maxDistance\n * Distance: 0 = same, 1 = parent/child, 2 = siblings/cousins\n */\n getRelatedProjects: (projectId, maxDistance = 2) => {\n const project = storage.get<Project>('project', projectId);\n if (!project) return [];\n \n const allProjects = storage.getAll<Project>('project');\n const related: Array<{ project: Project; distance: number }> = [];\n \n for (const otherProject of allProjects) {\n if (otherProject.id === projectId) continue;\n \n const distance = getProjectRelationshipDistance(project, otherProject);\n if (distance >= 0 && distance <= maxDistance) {\n related.push({ project: otherProject, distance });\n }\n }\n \n // Sort by distance (closest first)\n return related\n .sort((a, b) => a.distance - b.distance)\n .map(r => r.project);\n },\n \n saveEntity: async (entity) => {\n // Save to the closest .protokoll directory\n const closestDir = discoveryResult.discoveredDirs\n .sort((a, b) => a.level - b.level)[0];\n \n if (!closestDir) {\n throw new Error('No .protokoll directory found. Run with --init-config to create one.');\n }\n \n await storage.save(entity, closestDir.path);\n },\n \n deleteEntity: async (entity) => {\n // Delete from the closest .protokoll directory that contains it\n const filePath = storage.getEntityFilePath(entity.type, entity.id, discoveryResult.contextDirs);\n if (!filePath) {\n return false;\n }\n \n // Extract the context directory from the file path\n const contextDir = discoveryResult.contextDirs.find(dir => filePath.startsWith(dir));\n if (!contextDir) {\n return false;\n }\n \n return storage.delete(entity.type, entity.id, contextDir);\n },\n \n getEntityFilePath: (entity) => {\n return storage.getEntityFilePath(entity.type, entity.id, discoveryResult.contextDirs);\n },\n \n hasContext: () => discoveryResult.discoveredDirs.length > 0,\n };\n};\n\n// Re-export types\nexport * from './types';\n\n// Re-export discovery utilities for direct use if needed\nexport { discoverConfigDirectories, loadHierarchicalConfig, deepMerge } from './discovery';\n\n","/**\n * Router\n * \n * Handles routing decisions and path building using Dreadcabinet patterns.\n * Takes classification results and builds output paths with appropriate\n * directory structure and filenames.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { \n RoutingContext, \n RouteDecision,\n RoutingConfig,\n FilesystemStructure\n} from './types';\nimport * as Classifier from './classifier';\n\nexport interface RouterInstance {\n route(context: RoutingContext): RouteDecision;\n buildOutputPath(decision: RouteDecision, context: RoutingContext): string;\n}\n\nexport const create = (\n config: RoutingConfig,\n classifier: Classifier.ClassifierInstance\n): RouterInstance => {\n \n const route = (context: RoutingContext): RouteDecision => {\n const results = classifier.classify(context, config.projects);\n \n if (results.length === 0) {\n return {\n projectId: null,\n destination: config.default,\n confidence: 1.0,\n signals: [],\n reasoning: 'No project matches found, using default routing',\n };\n }\n \n const bestMatch = results[0];\n const matchedProject = config.projects.find(p => p.projectId === bestMatch.projectId)!;\n \n // Handle conflict resolution if multiple high-confidence matches\n const highConfidenceMatches = results.filter(r => r.confidence > 0.5);\n \n if (highConfidenceMatches.length > 1 && config.conflict_resolution !== 'primary') {\n // Return best with alternates noted\n return {\n projectId: bestMatch.projectId,\n destination: matchedProject.destination,\n confidence: bestMatch.confidence,\n signals: bestMatch.signals,\n reasoning: bestMatch.reasoning,\n auto_tags: matchedProject.auto_tags,\n alternateMatches: highConfidenceMatches.slice(1),\n };\n }\n \n return {\n projectId: bestMatch.projectId,\n destination: matchedProject.destination,\n confidence: bestMatch.confidence,\n signals: bestMatch.signals,\n reasoning: bestMatch.reasoning,\n auto_tags: matchedProject.auto_tags,\n };\n };\n \n const buildOutputPath = (decision: RouteDecision, context: RoutingContext): string => {\n const { destination } = decision;\n \n // Expand ~ to home directory\n const basePath = expandPath(destination.path);\n \n // Build directory structure using Dreadcabinet patterns\n const directoryPath = buildDirectoryPath(basePath, destination.structure, context.audioDate);\n \n // Build filename using Dreadcabinet patterns\n // Pass structure so filename doesn't repeat info already in path\n const filename = buildFilename(destination.filename_options, context, destination.structure);\n \n return path.join(directoryPath, filename + '.md');\n };\n \n return { route, buildOutputPath };\n};\n\n// Dreadcabinet-style directory building\nfunction buildDirectoryPath(\n basePath: string, \n structure: FilesystemStructure, \n date: Date\n): string {\n const year = date.getFullYear().toString();\n const month = (date.getMonth() + 1).toString();\n const day = date.getDate().toString();\n \n switch (structure) {\n case 'none':\n return basePath;\n case 'year':\n return path.join(basePath, year);\n case 'month':\n return path.join(basePath, year, month);\n case 'day':\n return path.join(basePath, year, month, day);\n }\n}\n\n// Dreadcabinet-style filename building\n// The date portion is adjusted based on what's already in the directory path\nfunction buildFilename(\n options: Array<'date' | 'time' | 'subject'>,\n context: RoutingContext,\n structure: FilesystemStructure\n): string {\n const parts: string[] = [];\n const date = context.audioDate;\n const pad = (n: number) => n.toString().padStart(2, '0');\n \n for (const option of options) {\n switch (option) {\n case 'date': {\n // Adjust date format based on directory structure\n // Don't repeat info already in the path\n const day = pad(date.getDate());\n const month = pad(date.getMonth() + 1);\n const year = date.getFullYear().toString().slice(2);\n \n switch (structure) {\n case 'day':\n // Path has year/month/day - no date needed in filename\n break;\n case 'month':\n // Path has year/month - only day in filename\n parts.push(day);\n break;\n case 'year':\n // Path has year - month+day in filename\n parts.push(`${month}-${day}`);\n break;\n case 'none':\n // No date in path - full date in filename (YYMMDD)\n parts.push(`${year}${month}${day}`);\n break;\n }\n break;\n }\n case 'time': {\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n parts.push(`${hours}${minutes}`);\n break;\n }\n case 'subject': {\n const subject = extractSubject(context.transcriptText, context.sourceFile);\n if (subject) {\n parts.push(subject);\n }\n break;\n }\n }\n }\n \n // Join and clean up any double dashes\n return parts.join('-').replace(/--+/g, '-');\n}\n\nfunction extractSubject(text: string, sourceFile: string): string {\n // Try to extract from first sentence\n const firstSentence = text.split(/[.!?]/)[0]?.trim() ?? '';\n \n // Remove common prefixes\n const cleaned = firstSentence\n .replace(/^(this is a note about|note about|regarding|re:|meeting notes?:?)/i, '')\n .trim();\n \n if (cleaned.length > 3 && cleaned.length < 50) {\n return slugify(cleaned);\n }\n \n // Fall back to source filename\n return path.basename(sourceFile, path.extname(sourceFile))\n .replace(/[^a-zA-Z0-9-]/g, '-')\n .toLowerCase();\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with dash\n .replace(/--+/g, '-') // Collapse multiple dashes\n .replace(/^-|-$/g, '') // Remove leading/trailing dashes\n .slice(0, 40);\n}\n\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\n","/**\n * Intelligent Classifier\n * \n * Multi-signal classification system for routing transcripts to projects.\n * Uses various signals (explicit phrases, associated people/companies, topics)\n * to determine the best project match with confidence scoring.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport { \n ClassificationResult, \n ClassificationSignal, \n ProjectRoute, \n RoutingContext \n} from './types';\nimport * as Context from '../context';\n\nexport interface ClassifierInstance {\n classify(context: RoutingContext, routes: ProjectRoute[]): ClassificationResult[];\n calculateConfidence(signals: ClassificationSignal[]): number;\n}\n\nexport const create = (contextInstance: Context.ContextInstance): ClassifierInstance => {\n \n const classify = (\n routingContext: RoutingContext, \n routes: ProjectRoute[]\n ): ClassificationResult[] => {\n const results: ClassificationResult[] = [];\n const normalizedText = routingContext.transcriptText.toLowerCase();\n \n for (const route of routes) {\n if (route.active === false) continue;\n \n const signals: ClassificationSignal[] = [];\n const classification = route.classification;\n \n // 1. Check explicit phrases (highest weight)\n for (const phrase of classification.explicit_phrases ?? []) {\n if (normalizedText.includes(phrase.toLowerCase())) {\n signals.push({\n type: 'explicit_phrase',\n value: phrase,\n weight: 0.9, // High confidence\n });\n }\n }\n \n // 2. Check associated people\n const peopleInText = routingContext.detectedPeople ?? \n detectPeopleFromContext(normalizedText, contextInstance);\n \n for (const personId of classification.associated_people ?? []) {\n if (peopleInText.includes(personId)) {\n const person = contextInstance.getPerson(personId);\n signals.push({\n type: 'associated_person',\n value: person?.name ?? personId,\n weight: 0.6,\n });\n }\n }\n \n // 3. Check associated companies\n const companiesInText = routingContext.detectedCompanies ?? \n detectCompaniesFromContext(normalizedText, contextInstance);\n \n for (const companyId of classification.associated_companies ?? []) {\n if (companiesInText.includes(companyId)) {\n const company = contextInstance.getCompany(companyId);\n signals.push({\n type: 'associated_company',\n value: company?.name ?? companyId,\n weight: 0.5,\n });\n }\n }\n \n // 4. Check topics\n for (const topic of classification.topics ?? []) {\n if (normalizedText.includes(topic.toLowerCase())) {\n signals.push({\n type: 'topic',\n value: topic,\n weight: 0.3,\n });\n }\n }\n \n // 5. Context type (if we can infer work vs personal)\n // This is a weaker signal but helps with disambiguation\n const inferredContextType = inferContextType(normalizedText);\n if (inferredContextType === classification.context_type) {\n signals.push({\n type: 'context_type',\n value: classification.context_type,\n weight: 0.2,\n });\n }\n \n // Only include if we have at least one signal\n if (signals.length > 0) {\n const confidence = calculateConfidence(signals);\n results.push({\n projectId: route.projectId,\n confidence,\n signals,\n reasoning: buildReasoning(signals),\n });\n }\n }\n \n // Sort by confidence descending\n return results.sort((a, b) => b.confidence - a.confidence);\n };\n \n const calculateConfidence = (signals: ClassificationSignal[]): number => {\n if (signals.length === 0) return 0;\n \n // Weighted average with diminishing returns for multiple signals\n let totalWeight = 0;\n let weightedSum = 0;\n \n for (let i = 0; i < signals.length; i++) {\n const signal = signals[i];\n // Later signals contribute less (diminishing returns)\n const positionFactor = 1 / (1 + i * 0.3);\n const effectiveWeight = signal.weight * positionFactor;\n \n weightedSum += effectiveWeight;\n totalWeight += positionFactor;\n }\n \n // Normalize and cap at 0.99\n return Math.min(weightedSum / Math.max(totalWeight, 1), 0.99);\n };\n \n const buildReasoning = (signals: ClassificationSignal[]): string => {\n const parts = signals.map(s => {\n switch (s.type) {\n case 'explicit_phrase': return `explicit phrase: \"${s.value}\"`;\n case 'associated_person': return `mentioned ${s.value} (associated)`;\n case 'associated_company': return `mentioned ${s.value} (associated company)`;\n case 'topic': return `topic: ${s.value}`;\n case 'context_type': return `context: ${s.value}`;\n }\n });\n return parts.join(', ');\n };\n \n return { classify, calculateConfidence };\n};\n\n// Helper functions\nfunction detectPeopleFromContext(\n text: string, \n context: Context.ContextInstance\n): string[] {\n const found: string[] = [];\n \n for (const person of context.getAllPeople()) {\n const nameNormalized = person.name.toLowerCase();\n if (text.includes(nameNormalized)) {\n found.push(person.id);\n continue;\n }\n \n // Check phonetic variants (sounds_like)\n for (const variant of person.sounds_like ?? []) {\n if (text.includes(variant.toLowerCase())) {\n found.push(person.id);\n break;\n }\n }\n }\n \n return found;\n}\n\nfunction detectCompaniesFromContext(\n text: string, \n context: Context.ContextInstance\n): string[] {\n const found: string[] = [];\n \n for (const company of context.getAllCompanies()) {\n const nameNormalized = company.name.toLowerCase();\n if (text.includes(nameNormalized)) {\n found.push(company.id);\n continue;\n }\n \n // Check full name\n if (company.fullName && text.includes(company.fullName.toLowerCase())) {\n found.push(company.id);\n continue;\n }\n \n // Check phonetic variants (sounds_like)\n for (const variant of company.sounds_like ?? []) {\n if (text.includes(variant.toLowerCase())) {\n found.push(company.id);\n break;\n }\n }\n }\n \n return found;\n}\n\nfunction inferContextType(text: string): 'work' | 'personal' | 'mixed' {\n const workIndicators = ['meeting', 'project', 'deadline', 'team', 'client', 'report'];\n const personalIndicators = ['family', 'weekend', 'vacation', 'hobby', 'friend'];\n \n let workScore = 0;\n let personalScore = 0;\n \n for (const word of workIndicators) {\n if (text.includes(word)) workScore++;\n }\n \n for (const word of personalIndicators) {\n if (text.includes(word)) personalScore++;\n }\n \n if (workScore > personalScore + 1) return 'work';\n if (personalScore > workScore + 1) return 'personal';\n return 'mixed';\n}\n\n","/**\n * Routing System\n * \n * Main entry point for the routing system. Provides a factory function\n * to create routing instances that can classify transcripts and determine\n * output destinations using Dreadcabinet patterns.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport { RoutingConfig, RouteDecision, RoutingContext, RouteDestination, ProjectRoute } from './types';\nimport * as Router from './router';\nimport * as Classifier from './classifier';\nimport * as Context from '../context';\n\nexport interface RoutingInstance {\n route(context: RoutingContext): RouteDecision;\n buildOutputPath(decision: RouteDecision, context: RoutingContext): string;\n addProject(project: ProjectRoute): void;\n updateDefaultRoute(destination: RouteDestination): void;\n getConfig(): RoutingConfig;\n}\n\nexport const create = (\n config: RoutingConfig,\n context: Context.ContextInstance\n): RoutingInstance => {\n const classifier = Classifier.create(context);\n const router = Router.create(config, classifier);\n \n // Mutable config for self-update feature\n const currentConfig = { ...config };\n \n return {\n route: (ctx) => router.route(ctx),\n buildOutputPath: (decision, ctx) => router.buildOutputPath(decision, ctx),\n \n addProject: (project) => {\n currentConfig.projects.push(project);\n },\n \n updateDefaultRoute: (destination) => {\n currentConfig.default = destination;\n },\n \n getConfig: () => ({ ...currentConfig }),\n };\n};\n\n// Re-export types\nexport * from './types';\n\n","/**\n * Sound Notification Utility\n * \n * Plays system sounds to notify the user when interactive input is needed.\n * Similar to Cursor's notification behavior.\n * \n * Platform support:\n * - macOS: Uses afplay with system sounds (Glass.aiff)\n * - Windows: Uses PowerShell to play system notification sound\n * - Linux/Other: Falls back to terminal bell\n */\n\nimport { spawn } from 'child_process';\nimport * as Logging from '../logging';\n\nexport interface SoundConfig {\n /** Whether sounds are disabled (silent mode) */\n silent: boolean;\n}\n\nexport interface SoundInstance {\n /** Play a notification sound to get user's attention */\n playNotification(): Promise<void>;\n /** Check if sounds are enabled */\n isEnabled(): boolean;\n}\n\n// macOS system sounds that work well for notifications\nconst MACOS_NOTIFICATION_SOUNDS = [\n '/System/Library/Sounds/Glass.aiff',\n '/System/Library/Sounds/Ping.aiff', \n '/System/Library/Sounds/Pop.aiff',\n '/System/Library/Sounds/Tink.aiff',\n];\n\n// Default sound to use (Glass is similar to Cursor's notification)\nconst DEFAULT_MACOS_SOUND = MACOS_NOTIFICATION_SOUNDS[0];\n\n/**\n * Play a sound file using afplay (macOS)\n */\nconst playWithAfplay = (soundPath: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const afplay = spawn('afplay', [soundPath], {\n stdio: 'ignore',\n detached: true,\n });\n\n afplay.on('error', () => {\n resolve(false);\n });\n\n afplay.on('close', (code) => {\n resolve(code === 0);\n });\n\n // Don't wait for the sound to finish - just fire and forget\n afplay.unref();\n \n // Consider it successful if spawn didn't throw\n setTimeout(() => resolve(true), 50);\n });\n};\n\n/**\n * Play Windows system notification sound using PowerShell\n * Uses SystemSounds.Asterisk which is a pleasant notification tone\n */\nconst playWithPowerShell = (): Promise<boolean> => {\n return new Promise((resolve) => {\n // Use PowerShell to access .NET System.Media.SystemSounds\n // Asterisk is a pleasant notification sound, similar to macOS Glass\n const ps = spawn('powershell', [\n '-NoProfile',\n '-NonInteractive', \n '-Command',\n '[System.Media.SystemSounds]::Asterisk.Play()'\n ], {\n stdio: 'ignore',\n detached: true,\n // On Windows, use shell to ensure PowerShell is found\n shell: true,\n });\n\n ps.on('error', () => {\n resolve(false);\n });\n\n ps.on('close', (code) => {\n resolve(code === 0);\n });\n\n ps.unref();\n \n // Consider it successful if spawn didn't throw\n setTimeout(() => resolve(true), 50);\n });\n};\n\n/**\n * Play terminal bell as fallback for Linux and other platforms\n */\nconst playTerminalBell = (): void => {\n // Write ASCII bell character to stdout\n process.stdout.write('\\x07');\n};\n\nexport const create = (config: SoundConfig): SoundInstance => {\n const logger = Logging.getLogger();\n \n const playNotification = async (): Promise<void> => {\n if (config.silent) {\n logger.debug('Sound notification skipped (silent mode)');\n return;\n }\n\n try {\n // macOS: use afplay with system sounds\n if (process.platform === 'darwin') {\n const success = await playWithAfplay(DEFAULT_MACOS_SOUND);\n if (success) {\n logger.debug('Played notification sound: %s', DEFAULT_MACOS_SOUND);\n return;\n }\n }\n \n // Windows: use PowerShell to play system sound\n if (process.platform === 'win32') {\n const success = await playWithPowerShell();\n if (success) {\n logger.debug('Played Windows notification sound via PowerShell');\n return;\n }\n }\n \n // Linux and others: fall back to terminal bell\n playTerminalBell();\n logger.debug('Played terminal bell notification');\n } catch (error) {\n // Sound failures should never interrupt the workflow\n logger.debug('Failed to play notification sound: %s', error);\n // Try terminal bell as last resort\n try {\n playTerminalBell();\n } catch {\n // Silently ignore - sound is not critical\n }\n }\n };\n\n const isEnabled = (): boolean => !config.silent;\n\n return {\n playNotification,\n isEnabled,\n };\n};\n\n","/**\n * Content Fetcher\n * \n * Fetches content from URLs and local files for LLM analysis.\n * Handles GitHub URLs specially to get raw README content.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { MAX_CONTENT_LENGTH } from '../constants';\nimport { getLogger } from '../logging';\nimport { htmlToText } from 'html-to-text';\n\nexport interface FetchResult {\n success: boolean;\n content?: string;\n sourceType: 'url' | 'file' | 'directory' | 'github';\n sourceName: string;\n error?: string;\n}\n\nexport interface ContentFetcherInstance {\n fetch(source: string): Promise<FetchResult>;\n isUrl(source: string): boolean;\n isGitHubUrl(source: string): boolean;\n}\n\nexport const create = (): ContentFetcherInstance => {\n const logger = getLogger();\n\n const isUrl = (source: string): boolean => {\n return source.startsWith('http://') || source.startsWith('https://');\n };\n\n const isGitHubUrl = (source: string): boolean => {\n try {\n const parsed = new URL(source);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return false;\n }\n\n const hostname = parsed.hostname.toLowerCase();\n const allowedGitHubHosts = new Set([\n 'github.com',\n 'raw.githubusercontent.com',\n ]);\n\n return allowedGitHubHosts.has(hostname);\n } catch {\n // If the URL cannot be parsed, it is not a valid GitHub URL\n return false;\n }\n };\n\n // Simple HTML tag stripper\n const stripHtml = (html: string): string => {\n // Use a well-tested library to convert HTML to plain text,\n // which removes tags, scripts, and styles safely.\n let text = htmlToText(html, {\n wordwrap: false,\n preserveNewlines: false,\n // Keep links and other markup as simple text when possible.\n selectors: [\n { selector: 'script', format: 'skip' },\n { selector: 'style', format: 'skip' },\n { selector: 'h1', options: { uppercase: false } },\n { selector: 'h2', options: { uppercase: false } },\n { selector: 'h3', options: { uppercase: false } },\n { selector: 'h4', options: { uppercase: false } },\n { selector: 'h5', options: { uppercase: false } },\n { selector: 'h6', options: { uppercase: false } }\n ]\n });\n\n // Normalize whitespace\n text = text.replace(/\\s+/g, ' ').trim();\n\n return text;\n };\n\n const fetchUrl = async (url: string): Promise<FetchResult> => {\n logger.debug('Fetching URL: %s', url);\n\n try {\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'protokoll/1.0',\n 'Accept': 'text/html,text/plain,text/markdown,application/json',\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n return {\n success: false,\n sourceType: 'url',\n sourceName: url,\n error: `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const contentType = response.headers.get('content-type') || '';\n let content = await response.text();\n\n // Strip HTML tags for basic text extraction\n if (contentType.includes('text/html')) {\n content = stripHtml(content);\n }\n\n // Truncate to max length\n if (content.length > MAX_CONTENT_LENGTH) {\n content = content.substring(0, MAX_CONTENT_LENGTH) + '\\n\\n[Content truncated...]';\n }\n\n return {\n success: true,\n content,\n sourceType: 'url',\n sourceName: new URL(url).hostname,\n };\n } catch (error: any) {\n return {\n success: false,\n sourceType: 'url',\n sourceName: url,\n error: error.message,\n };\n }\n };\n\n const fetchGitHubReadme = async (url: string): Promise<FetchResult> => {\n logger.debug('Fetching GitHub repository: %s', url);\n\n try {\n // Parse GitHub URL: https://github.com/owner/repo\n const match = url.match(/github\\.com\\/([^/]+)\\/([^/]+)/);\n if (!match) {\n // Fall back to regular URL fetch\n return await fetchUrl(url);\n }\n\n const [, owner, repo] = match;\n const repoName = repo.replace(/\\.git$/, '');\n \n // Try to fetch raw README.md from main branch\n const readmeUrls = [\n `https://raw.githubusercontent.com/${owner}/${repoName}/main/README.md`,\n `https://raw.githubusercontent.com/${owner}/${repoName}/master/README.md`,\n `https://raw.githubusercontent.com/${owner}/${repoName}/main/readme.md`,\n `https://raw.githubusercontent.com/${owner}/${repoName}/master/readme.md`,\n ];\n\n for (const readmeUrl of readmeUrls) {\n try {\n const response = await fetch(readmeUrl, {\n headers: { 'User-Agent': 'protokoll/1.0' },\n signal: AbortSignal.timeout(10000),\n });\n\n if (response.ok) {\n let content = await response.text();\n \n if (content.length > MAX_CONTENT_LENGTH) {\n content = content.substring(0, MAX_CONTENT_LENGTH) + '\\n\\n[Content truncated...]';\n }\n\n return {\n success: true,\n content,\n sourceType: 'github',\n sourceName: `${owner}/${repoName}`,\n };\n }\n } catch {\n // Try next URL\n }\n }\n\n // Fall back to regular URL fetch if README not found\n return await fetchUrl(url);\n } catch (error: any) {\n return {\n success: false,\n sourceType: 'github',\n sourceName: url,\n error: error.message,\n };\n }\n };\n\n const fetchFile = async (filePath: string): Promise<FetchResult> => {\n logger.debug('Reading file: %s', filePath);\n\n try {\n const ext = path.extname(filePath).toLowerCase();\n const supportedExtensions = ['.md', '.txt', '.yaml', '.yml', '.json', '.rst', '.adoc'];\n\n if (!supportedExtensions.includes(ext)) {\n return {\n success: false,\n sourceType: 'file',\n sourceName: path.basename(filePath),\n error: `Unsupported file type: ${ext}. Supported: ${supportedExtensions.join(', ')}`,\n };\n }\n\n let content = await fs.readFile(filePath, 'utf-8');\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = content.substring(0, MAX_CONTENT_LENGTH) + '\\n\\n[Content truncated...]';\n }\n\n return {\n success: true,\n content,\n sourceType: 'file',\n sourceName: path.basename(filePath),\n };\n } catch (error: any) {\n return {\n success: false,\n sourceType: 'file',\n sourceName: path.basename(filePath),\n error: error.message,\n };\n }\n };\n\n const fetchDirectory = async (dirPath: string): Promise<FetchResult> => {\n logger.debug('Reading directory: %s', dirPath);\n\n try {\n const files = await fs.readdir(dirPath);\n \n // Priority order for finding content\n const priorityFiles = [\n 'README.md',\n 'readme.md',\n 'README.txt',\n 'readme.txt',\n 'package.json',\n 'README.rst',\n 'README.adoc',\n ];\n\n for (const priorityFile of priorityFiles) {\n if (files.includes(priorityFile)) {\n const filePath = path.join(dirPath, priorityFile);\n const result = await fetchFile(filePath);\n \n if (result.success) {\n return {\n ...result,\n sourceType: 'directory',\n sourceName: `${path.basename(dirPath)}/${priorityFile}`,\n };\n }\n }\n }\n\n // If no priority file found, try first .md file\n const mdFile = files.find(f => f.endsWith('.md'));\n if (mdFile) {\n const result = await fetchFile(path.join(dirPath, mdFile));\n if (result.success) {\n return {\n ...result,\n sourceType: 'directory',\n sourceName: `${path.basename(dirPath)}/${mdFile}`,\n };\n }\n }\n\n return {\n success: false,\n sourceType: 'directory',\n sourceName: path.basename(dirPath),\n error: 'No readable documentation files found in directory',\n };\n } catch (error: any) {\n return {\n success: false,\n sourceType: 'directory',\n sourceName: path.basename(dirPath),\n error: error.message,\n };\n }\n };\n\n const fetchContent = async (source: string): Promise<FetchResult> => {\n logger.debug('Fetching content from: %s', source);\n\n try {\n if (isUrl(source)) {\n if (isGitHubUrl(source)) {\n return await fetchGitHubReadme(source);\n }\n return await fetchUrl(source);\n }\n\n // Local path\n const resolvedPath = path.resolve(source);\n const stat = await fs.stat(resolvedPath);\n\n if (stat.isDirectory()) {\n return await fetchDirectory(resolvedPath);\n } else {\n return await fetchFile(resolvedPath);\n }\n } catch (error: any) {\n logger.error('Failed to fetch content: %s', error.message);\n return {\n success: false,\n sourceType: isUrl(source) ? 'url' : 'file',\n sourceName: source,\n error: error.message,\n };\n }\n };\n\n return { \n fetch: fetchContent, \n isUrl, \n isGitHubUrl \n };\n};\n","import { OpenAI } from 'openai';\nimport { ChatCompletionCreateParamsNonStreaming, ChatCompletionMessageParam } from 'openai/resources/chat/completions';\nimport * as Storage from '@/util/storage';\nimport { getLogger } from '@/logging';\nimport { DEFAULT_MODEL, DEFAULT_TRANSCRIPTION_MODEL } from '@/constants';\n\nexport interface Transcription {\n text: string;\n}\n\nexport class OpenAIError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OpenAIError';\n }\n}\n\n\nexport async function createCompletion(messages: ChatCompletionMessageParam[], options: { responseFormat?: any, model?: string, reasoningLevel?: 'none' | 'low' | 'medium' | 'high', maxTokens?: number, debug?: boolean, debugFile?: string, reason?: string } = {}): Promise<string | any> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n try {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new OpenAIError('OPENAI_API_KEY environment variable is not set');\n }\n\n const openai = new OpenAI({\n apiKey: apiKey,\n });\n\n const model = options.model || DEFAULT_MODEL;\n \n // Check if model supports reasoning_effort\n const supportsReasoning = model.includes('gpt-5') || \n model.includes('o1') || model.includes('o3');\n const isReasoningCall = supportsReasoning && options.reasoningLevel && options.reasoningLevel !== 'none';\n \n logger.debug('Sending prompt to OpenAI: %j', messages);\n\n const startTime = Date.now();\n \n const requestParams: Record<string, unknown> = {\n model,\n messages,\n max_completion_tokens: options.maxTokens || 10000,\n response_format: options.responseFormat,\n };\n \n if (isReasoningCall) {\n requestParams.reasoning_effort = options.reasoningLevel;\n logger.debug('Using reasoning_effort: %s', options.reasoningLevel);\n }\n \n const completion = await openai.chat.completions.create(\n requestParams as unknown as ChatCompletionCreateParamsNonStreaming\n );\n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n\n // Log token usage with reason if provided\n const usage = completion.usage;\n const reasonSuffix = options.reason ? ` - ${options.reason}` : '';\n if (usage) {\n logger.info('%s (%ss, %d→%d tokens)%s', \n model, duration, usage.prompt_tokens, usage.completion_tokens, reasonSuffix);\n } else {\n logger.info('%s (%ss)%s', model, duration, reasonSuffix);\n }\n\n if (options.debug && options.debugFile) {\n await storage.writeFile(options.debugFile, JSON.stringify(completion, null, 2), 'utf8');\n logger.debug('Wrote debug file to %s', options.debugFile);\n }\n\n const response = completion.choices[0]?.message?.content?.trim();\n if (!response) {\n // Log the full completion object to help debug\n logger.error('Empty response from OpenAI. Full completion object: %j', completion);\n throw new OpenAIError('No response received from OpenAI');\n }\n\n logger.debug('Received response from OpenAI: %s', response);\n if (options.responseFormat) {\n return JSON.parse(response);\n } else {\n return response;\n }\n\n } catch (error: any) {\n logger.error('Error calling OpenAI API: %s %s', error.message, error.stack);\n throw new OpenAIError(`Failed to create completion: ${error.message}`);\n }\n}\n\nexport async function transcribeAudio(filePath: string, options: { model?: string, debug?: boolean, debugFile?: string } = {}): Promise<Transcription> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n try {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new OpenAIError('OPENAI_API_KEY environment variable is not set');\n }\n\n const openai = new OpenAI({\n apiKey: apiKey,\n });\n\n const model = options.model || DEFAULT_TRANSCRIPTION_MODEL;\n const fileName = filePath.split('/').pop() || filePath;\n logger.debug('Transcribing: %s (full path: %s)', fileName, filePath);\n\n const startTime = Date.now();\n const audioStream = await storage.readStream(filePath);\n const transcription = await openai.audio.transcriptions.create({\n model,\n file: audioStream,\n response_format: \"json\",\n });\n \n if (!transcription) {\n throw new OpenAIError('No transcription received from OpenAI');\n }\n \n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n logger.info('%s (%ss, %d chars)', model, duration, transcription.text?.length || 0);\n\n if (options.debug && options.debugFile) {\n await storage.writeFile(options.debugFile, JSON.stringify(transcription, null, 2), 'utf8');\n logger.debug('Wrote debug file to %s', options.debugFile);\n }\n\n logger.debug('Received transcription from OpenAI: %s', transcription);\n return transcription;\n\n } catch (error: any) {\n logger.error('Error transcribing audio file: %s %s', error.message, error.stack);\n throw new OpenAIError(`Failed to transcribe audio: ${error.message}`);\n }\n}\n","/**\n * Interactive Handler\n * \n * Manages interactive sessions and clarification requests.\n * Uses readline for actual user prompting.\n * Plays notification sounds when user input is needed (like Cursor).\n */\n\nimport * as readline from 'readline';\nimport { \n InteractiveConfig, \n InteractiveSession, \n ClarificationRequest, \n ClarificationResponse,\n NewProjectWizardResult,\n NewPersonWizardResult,\n} from './types';\nimport * as Logging from '../logging';\nimport * as Sound from '../util/sound';\nimport * as ContentFetcher from '../cli/content-fetcher';\nimport * as OpenAI from '../util/openai';\n\nexport interface HandlerInstance {\n startSession(): void;\n endSession(): InteractiveSession;\n handleClarification(request: ClarificationRequest): Promise<ClarificationResponse>;\n isEnabled(): boolean;\n getSession(): InteractiveSession | null;\n // File tracking\n startFile(filePath: string): void;\n endFile(outputPath?: string, movedTo?: string): void;\n // Entity tracking\n trackTermAdded(termName: string): void;\n trackTermUpdated(termName: string): void;\n trackProjectAdded(projectName: string): void;\n trackProjectUpdated(projectName: string): void;\n trackPersonAdded(personName: string): void;\n trackAlias(alias: string, linkedTo: string): void;\n // Session control\n requestStop(): void;\n shouldStopSession(): boolean;\n // Summary\n printSummary(): void;\n}\n\nconst createReadlineInterface = () => {\n // Ensure stdin is in the correct mode for readline\n // This helps prevent issues with some terminal emulators\n if (process.stdin.setRawMode) {\n try {\n // Ensure we're NOT in raw mode - readline handles this itself\n process.stdin.setRawMode(false);\n } catch {\n // Ignore errors - some environments don't support setRawMode\n }\n }\n \n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true, // Explicitly enable terminal mode for proper echo handling\n });\n};\n\nconst askQuestion = (rl: readline.Interface, question: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n};\n\n// Helper to write to stdout without triggering no-console lint rule\nconst write = (text: string) => process.stdout.write(text + '\\n');\n\n/**\n * Analyze content from URL/file to determine if it's a Project or Term\n * and extract relevant metadata\n */\ninterface ContentAnalysis {\n entityType: 'project' | 'term' | 'unknown';\n name: string;\n description?: string;\n expansion?: string; // For terms that are acronyms\n topics?: string[];\n confidence: 'high' | 'medium' | 'low';\n reasoning: string;\n}\n\nconst analyzeContentForEntity = async (\n content: string,\n sourceName: string,\n originalTerm: string\n): Promise<ContentAnalysis> => {\n const logger = Logging.getLogger();\n \n logger.debug('Analyzing content to determine entity type for: %s', originalTerm);\n \n const prompt = `You are analyzing content to determine if \"${originalTerm}\" refers to a PROJECT or a TERM.\n\nDEFINITIONS:\n- PROJECT: A specific initiative, codebase, client engagement, or ongoing work effort with deliverables\n- TERM: A technology, concept, tool, methodology, or technical term that needs to be understood and referenced\n\nSOURCE: ${sourceName}\nCONTENT:\n---\n${content.substring(0, 8000)}\n---\n\nBased on this content, determine:\n1. Is \"${originalTerm}\" a PROJECT or a TERM?\n2. What is the correct/full name?\n3. What is a brief description (1-2 sentences)?\n4. If it's a TERM and an acronym, what does it stand for?\n5. What are related topics/keywords (5-10 words)?\n6. How confident are you? (high/medium/low)\n\nRespond in JSON format:\n{\n \"entityType\": \"project\" | \"term\",\n \"name\": \"string\",\n \"description\": \"string\",\n \"expansion\": \"string or null\",\n \"topics\": [\"keyword1\", \"keyword2\", ...],\n \"confidence\": \"high\" | \"medium\" | \"low\",\n \"reasoning\": \"Brief explanation of your determination\"\n}`;\n\n try {\n const response = await OpenAI.createCompletion(\n [{ role: 'user', content: prompt }],\n { \n responseFormat: { type: 'json_object' },\n reasoningLevel: 'medium',\n maxTokens: 2000,\n reason: `analyze content for \"${originalTerm}\"`,\n }\n );\n \n const analysis = response as ContentAnalysis;\n logger.debug('Content analysis result: %j', analysis);\n \n return analysis;\n } catch (error: any) {\n logger.error('Failed to analyze content: %s', error.message);\n \n // Return fallback analysis\n return {\n entityType: 'unknown',\n name: originalTerm,\n confidence: 'low',\n reasoning: `Failed to analyze: ${error.message}`,\n };\n }\n};\n\n// Simplified project creation (used when creating project from term/person association)\nconst runCreateProjectFlow = async (\n rl: readline.Interface,\n contextMessage?: string\n): Promise<NewProjectWizardResult> => {\n if (contextMessage) {\n write('');\n write(contextMessage);\n }\n \n // Step 1: Project name (required)\n const projectName = await askQuestion(rl, '\\nProject name: ');\n \n if (!projectName) {\n write('Project name is required. Skipping project creation.');\n return { action: 'skip' };\n }\n \n // Step 2: Destination\n const destination = await askQuestion(rl, '\\nWhere should output be routed to? (Enter for default): ');\n \n // Step 3: Description\n const description = await askQuestion(rl, '\\nCan you tell me something about this project? (Enter to skip): ');\n \n return {\n action: 'create',\n projectName: projectName.trim(),\n destination: destination || undefined,\n description: description || undefined,\n };\n};\n\n/**\n * Calculate string similarity (simple Levenshtein-based)\n * Returns a score from 0 (completely different) to 1 (identical)\n */\nconst calculateSimilarity = (str1: string, str2: string): number => {\n const s1 = str1.toLowerCase();\n const s2 = str2.toLowerCase();\n \n if (s1 === s2) return 1.0;\n \n // Simple character overlap heuristic\n const set1 = new Set(s1.split(''));\n const set2 = new Set(s2.split(''));\n const intersection = new Set([...set1].filter(x => set2.has(x)));\n const union = new Set([...set1, ...set2]);\n \n return intersection.size / union.size;\n};\n\n/**\n * Find similar existing terms\n */\nconst findSimilarTerms = (term: string, existingTerms: string[]): string[] => {\n const similarities = existingTerms.map(existing => ({\n term: existing,\n score: calculateSimilarity(term, existing),\n }));\n \n // Return terms with similarity > 0.6, sorted by score\n return similarities\n .filter(s => s.score > 0.6)\n .sort((a, b) => b.score - a.score)\n .map(s => s.term);\n};\n\n/**\n * New streamlined wizard flow\n */\nconst runNewProjectWizard = async (\n rl: readline.Interface,\n term: string,\n context: string | undefined,\n projectOptions: string[] | undefined\n): Promise<NewProjectWizardResult> => {\n const fetcher = ContentFetcher.create();\n \n write('');\n write('─'.repeat(60));\n write(`[Unknown: \"${term}\"]`);\n if (context) {\n write(context);\n }\n write('─'.repeat(60));\n \n // Quick ignore option\n const ignoreCheck = await askQuestion(rl, '\\nIgnore this? (X to ignore, or Enter to continue): ');\n if (ignoreCheck.toLowerCase() === 'x' || ignoreCheck.toLowerCase() === 'ignore') {\n write(`\\n[Adding \"${term}\" to ignore list]`);\n return { action: 'ignore', ignoredTerm: term };\n }\n \n // TODO: Get existing terms from context to check for similar matches\n // For now, we'll skip this step but the infrastructure is here\n const existingTerms: string[] = []; // Would come from context.getTerms()\n const similarTerms = findSimilarTerms(term, existingTerms);\n \n if (similarTerms.length > 0) {\n write(`\\nFound similar term(s): ${similarTerms.join(', ')}`);\n const useSimilar = await askQuestion(rl, `Is \"${term}\" the same as \"${similarTerms[0]}\"? (Y/N): `);\n \n if (useSimilar.toLowerCase() === 'y' || useSimilar.toLowerCase() === 'yes') {\n return {\n action: 'link',\n linkedTermName: similarTerms[0],\n aliasName: term,\n };\n }\n }\n \n // Step 1: Get source of information\n write('\\n[How should I learn about this?]');\n write('Options:');\n write(' 1. Provide a file path (e.g., ~/docs/project.md)');\n write(' 2. Provide a URL (e.g., https://example.com)');\n write(' 3. Paste text directly');\n write(' 4. Enter details manually');\n \n const sourceChoice = await askQuestion(rl, '\\nEnter 1-4, or paste path/URL directly: ');\n \n let analysis: ContentAnalysis | null = null;\n \n // Check if user pasted a URL or path directly\n if (fetcher.isUrl(sourceChoice) || sourceChoice.includes('/') || sourceChoice.includes('\\\\')) {\n write(`\\nFetching content from: ${sourceChoice}...`);\n const fetchResult = await fetcher.fetch(sourceChoice);\n \n if (fetchResult.success && fetchResult.content) {\n write(`Analyzing content from ${fetchResult.sourceName}...`);\n analysis = await analyzeContentForEntity(fetchResult.content, fetchResult.sourceName, term);\n } else {\n write(`\\nError: ${fetchResult.error}`);\n }\n } else if (sourceChoice === '1') {\n // File path\n const filePath = await askQuestion(rl, '\\nFile path: ');\n write(`\\nReading file: ${filePath}...`);\n const fetchResult = await fetcher.fetch(filePath);\n \n if (fetchResult.success && fetchResult.content) {\n write(`Analyzing content...`);\n analysis = await analyzeContentForEntity(fetchResult.content, fetchResult.sourceName, term);\n } else {\n write(`\\nError: ${fetchResult.error}`);\n }\n } else if (sourceChoice === '2') {\n // URL\n const url = await askQuestion(rl, '\\nURL: ');\n write(`\\nFetching from: ${url}...`);\n const fetchResult = await fetcher.fetch(url);\n \n if (fetchResult.success && fetchResult.content) {\n write(`Analyzing content from ${fetchResult.sourceName}...`);\n analysis = await analyzeContentForEntity(fetchResult.content, fetchResult.sourceName, term);\n } else {\n write(`\\nError: ${fetchResult.error}`);\n }\n } else if (sourceChoice === '3') {\n // Paste text\n write('\\nPaste or type text (end with empty line):');\n const lines: string[] = [];\n let line: string;\n do {\n line = await askQuestion(rl, '');\n if (line) lines.push(line);\n } while (line);\n \n const pastedText = lines.join('\\n');\n if (pastedText) {\n write('\\nAnalyzing pasted text...');\n analysis = await analyzeContentForEntity(pastedText, 'pasted text', term);\n }\n }\n \n // If we have analysis, show results and confirm\n if (analysis && analysis.entityType !== 'unknown') {\n write('\\n─'.repeat(60));\n write('[Analysis Results]');\n write(`Type: ${analysis.entityType.toUpperCase()}`);\n write(`Name: ${analysis.name}`);\n if (analysis.description) {\n write(`Description: ${analysis.description}`);\n }\n if (analysis.expansion) {\n write(`Stands for: ${analysis.expansion}`);\n }\n if (analysis.topics && analysis.topics.length > 0) {\n write(`Topics: ${analysis.topics.join(', ')}`);\n }\n write(`Confidence: ${analysis.confidence}`);\n write('─'.repeat(60));\n \n const confirm = await askQuestion(rl, '\\nUse this? (Y/N, or Enter to accept): ');\n \n if (confirm.toLowerCase() !== 'n' && confirm.toLowerCase() !== 'no') {\n // User accepted the analysis\n if (analysis.entityType === 'project') {\n return {\n action: 'create',\n projectName: analysis.name,\n description: analysis.description,\n };\n } else {\n // It's a term - ask which project(s)\n const selectedProjects = await promptProjectSelection(rl, analysis.name, projectOptions);\n \n return {\n action: 'term',\n termName: analysis.name,\n termExpansion: analysis.expansion,\n termDescription: analysis.description,\n termProjects: selectedProjects,\n };\n }\n }\n }\n \n // Fall back to manual entry\n write('\\n[Manual Entry]');\n const entityType = await askQuestion(rl, 'Is this a Project or a Term? (P/T): ');\n \n if (entityType.toLowerCase() === 'p' || entityType.toLowerCase() === 'project') {\n const projectName = await askQuestion(rl, `Project name [${term}]: `);\n const finalName = projectName || term;\n const description = await askQuestion(rl, 'Description (Enter to skip): ');\n \n return {\n action: 'create',\n projectName: finalName,\n description: description || undefined,\n };\n } else {\n const termName = await askQuestion(rl, `Term name [${term}]: `);\n const finalName = termName || term;\n const expansion = await askQuestion(rl, 'Expansion (if acronym, Enter to skip): ');\n const description = await askQuestion(rl, 'Description (Enter to skip): ');\n \n const selectedProjects = await promptProjectSelection(rl, finalName, projectOptions);\n \n return {\n action: 'term',\n termName: finalName,\n termExpansion: expansion || undefined,\n termDescription: description || undefined,\n termProjects: selectedProjects,\n };\n }\n};\n\n/**\n * Prompt for project selection with clean UI (just names)\n */\nconst promptProjectSelection = async (\n rl: readline.Interface,\n termName: string,\n projectOptions: string[] | undefined\n): Promise<number[] | undefined> => {\n if (!projectOptions || projectOptions.length === 0) {\n return undefined;\n }\n \n write('\\nWhich project(s) is this related to?');\n \n // Extract just the project names (before \" - \")\n const projectNames = projectOptions.map(opt => {\n const match = opt.match(/^([^-]+)/);\n return match ? match[1].trim() : opt;\n });\n \n projectNames.forEach((name, i) => {\n write(` ${i + 1}. ${name}`);\n });\n write(` N. Create new project`);\n \n const selection = await askQuestion(rl, '\\nEnter numbers (comma-separated) or N, or Enter to skip: ');\n \n if (!selection) {\n return undefined;\n }\n \n if (selection.toLowerCase().includes('n')) {\n // TODO: Handle new project creation\n write('[New project creation not yet implemented in this flow]');\n return undefined;\n }\n \n const indices = selection\n .split(',')\n .map(s => parseInt(s.trim(), 10) - 1)\n .filter(idx => !isNaN(idx) && idx >= 0 && idx < projectNames.length);\n \n if (indices.length > 0) {\n write(`Associated with: ${indices.map(i => projectNames[i]).join(', ')}`);\n return indices;\n }\n \n return undefined;\n};\n\nconst runNewPersonWizard = async (\n rl: readline.Interface,\n name: string,\n context: string | undefined,\n projectOptions: string[] | undefined\n): Promise<NewPersonWizardResult> => {\n write('');\n write('─'.repeat(60));\n write(`[Unknown Person Detected]`);\n write(`Name heard: \"${name}\"`);\n write('');\n if (context) {\n // Display context with proper formatting (it now includes file info)\n write(context);\n }\n write('─'.repeat(60));\n \n // Step 1: Confirm name spelling\n const nameCorrection = await askQuestion(rl, `\\nIs the name spelled correctly? (Enter to accept, or type correction): `);\n const finalName = nameCorrection || name;\n \n if (nameCorrection) {\n write(`Name updated to: \"${finalName}\"`);\n }\n \n // Step 2: Ask for organization/company\n const organization = await askQuestion(rl, `\\nWhat organization/company is ${finalName} with? (Enter to skip): `);\n \n // Step 3: Project association\n let linkedProjectIndex: number | undefined;\n let createdProject: NewProjectWizardResult | undefined;\n \n // Show project options with \"N\" for new project\n if (projectOptions && projectOptions.length > 0) {\n write('\\nExisting projects:');\n projectOptions.forEach((opt, i) => {\n write(` ${i + 1}. ${opt}`);\n });\n write(` N. Create a new project`);\n \n const projectSelection = await askQuestion(rl, `\\nWhich project is ${finalName} related to? (Enter number, N for new, or Enter to skip): `);\n \n if (projectSelection.toLowerCase() === 'n') {\n // User wants to create a new project for this person\n write('');\n write(`[Create New Project for ${finalName}]`);\n const contextMsg = organization \n ? `Creating project for ${finalName} (${organization})`\n : `Creating project for ${finalName}`;\n createdProject = await runCreateProjectFlow(rl, contextMsg);\n \n if (createdProject.action === 'create' && createdProject.projectName) {\n write(`\\n[Project \"${createdProject.projectName}\" will be created and linked to ${finalName}]`);\n }\n } else if (projectSelection && /^\\d+$/.test(projectSelection)) {\n const idx = parseInt(projectSelection, 10) - 1;\n if (idx >= 0 && idx < projectOptions.length) {\n linkedProjectIndex = idx;\n write(`Linked to: ${projectOptions[idx]}`);\n }\n }\n } else {\n // No existing projects - offer to create one\n const createNew = await askQuestion(rl, `\\nNo existing projects found. Create a new project for ${finalName}? (Y/N, or Enter to skip): `);\n \n if (createNew.toLowerCase() === 'y' || createNew.toLowerCase() === 'yes') {\n write('');\n write(`[Create New Project for ${finalName}]`);\n const contextMsg = organization \n ? `Creating project for ${finalName} (${organization})`\n : `Creating project for ${finalName}`;\n createdProject = await runCreateProjectFlow(rl, contextMsg);\n \n if (createdProject.action === 'create' && createdProject.projectName) {\n write(`\\n[Project \"${createdProject.projectName}\" will be created and linked to ${finalName}]`);\n }\n }\n }\n \n // Step 4: Ask for notes about the person\n const notes = await askQuestion(rl, `\\nAny notes about ${finalName}? (Enter to skip): `);\n \n // Determine if we should create the person\n const hasInfo = organization || linkedProjectIndex !== undefined || createdProject || notes;\n \n if (!hasInfo) {\n // User skipped everything - confirm if they want to skip entirely\n const confirm = await askQuestion(rl, `\\nNo information provided. Skip saving ${finalName}? (Enter to skip, or any key to save anyway): `);\n if (confirm === '') {\n return { action: 'skip' };\n }\n }\n \n return {\n action: 'create',\n personName: finalName,\n organization: organization || undefined,\n linkedProjectIndex,\n notes: notes || undefined,\n createdProject,\n };\n};\n\nconst formatClarificationPrompt = (request: ClarificationRequest): string => {\n const lines: string[] = [];\n \n lines.push('');\n lines.push('─'.repeat(60));\n \n switch (request.type) {\n case 'name_spelling':\n lines.push(`[Name Spelling Clarification]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Heard: \"${request.term}\"`);\n if (request.suggestion) {\n lines.push(`Suggested correction: \"${request.suggestion}\"`);\n }\n lines.push('');\n lines.push('Enter correct spelling (or press Enter to accept suggestion):');\n break;\n \n case 'new_person':\n lines.push(`[New Person Detected]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Name heard: \"${request.term}\"`);\n lines.push('');\n lines.push('Who is this person? (brief description, or press Enter to skip):');\n break;\n \n case 'new_project':\n // This case is handled by the wizard, but provide fallback prompt\n lines.push(`[Unknown Project/Term]`);\n lines.push(`Term: \"${request.term}\"`);\n if (request.context) {\n lines.push(`${request.context}`);\n }\n lines.push('');\n lines.push('Is this a new project? (Y/N, or Enter to skip):');\n break;\n \n case 'new_company':\n lines.push(`[New Company Detected]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Company name: \"${request.term}\"`);\n lines.push('');\n lines.push('Any notes about this company? (or press Enter to skip):');\n break;\n \n case 'new_term':\n lines.push(`[New Term Found]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Term: \"${request.term}\"`);\n lines.push('');\n lines.push('What does this term mean? (brief description, or press Enter to skip):');\n break;\n \n case 'routing_decision':\n lines.push(`[Routing Decision Required]`);\n lines.push(`Context: ${request.context}`);\n if (request.options && request.options.length > 0) {\n lines.push('Available destinations:');\n request.options.forEach((opt, i) => {\n lines.push(` ${i + 1}. ${opt}`);\n });\n lines.push('');\n lines.push('Enter number or destination path:');\n } else {\n lines.push('');\n lines.push('Where should this note be filed?');\n }\n break;\n \n case 'low_confidence_routing':\n lines.push(`[Confirm Note Routing]`);\n lines.push(`Confidence: ${request.term}`);\n lines.push(`${request.context}`);\n lines.push('');\n lines.push('Is this correct? (Y/Enter to accept, or enter different path):');\n break;\n \n case 'first_run_onboarding':\n lines.push(`[First Run Setup]`);\n lines.push(`${request.context}`);\n lines.push('');\n if (request.options && request.options.length > 0) {\n request.options.forEach((opt, i) => {\n lines.push(` ${i + 1}. ${opt}`);\n });\n lines.push('');\n lines.push('Enter your choice:');\n } else {\n lines.push('Enter your response:');\n }\n break;\n \n case 'general':\n default:\n lines.push(`[Clarification Needed]`);\n lines.push(`${request.context}`);\n if (request.term) {\n lines.push(`Term: \"${request.term}\"`);\n }\n if (request.suggestion) {\n lines.push(`Suggested spelling: \"${request.suggestion}\"`);\n lines.push('');\n lines.push('Press Enter or Y to accept suggestion, or type alternative:');\n } else {\n lines.push('');\n lines.push('Your response:');\n }\n break;\n }\n \n lines.push('─'.repeat(60));\n \n return lines.join('\\n') + '\\n> ';\n};\n\nexport const create = (config: InteractiveConfig): HandlerInstance => {\n const logger = Logging.getLogger();\n const sound = Sound.create({ silent: config.silent ?? false });\n \n let session: InteractiveSession | null = null;\n let rl: readline.Interface | null = null;\n \n const startSession = () => {\n session = {\n requests: [],\n responses: [],\n startedAt: new Date(),\n filesProcessed: [],\n changes: {\n termsAdded: [],\n termsUpdated: [],\n projectsAdded: [],\n projectsUpdated: [],\n peopleAdded: [],\n aliasesAdded: [],\n },\n shouldStop: false,\n };\n \n // Check if we can run interactively:\n // 1. Interactive mode must be enabled (not --batch)\n // 2. stdin must be a TTY (not piped/cron/etc)\n const isTTY = process.stdin.isTTY === true;\n \n if (config.enabled && isTTY) {\n // Only create readline interface if one doesn't already exist\n // This prevents duplicate input handlers when processing multiple files\n if (!rl) {\n rl = createReadlineInterface();\n logger.info('Interactive session started - will prompt for clarifications');\n \n // Setup Ctrl+C handler for graceful summary output\n process.on('SIGINT', () => {\n if (session) {\n write('\\n\\n[Session interrupted by user]\\n');\n printSummary();\n process.exit(0);\n }\n });\n } else {\n logger.debug('Interactive session continued (readline already active)');\n }\n } else if (config.enabled && !isTTY) {\n logger.info('Interactive mode enabled but stdin is not a TTY - running in auto-resolve mode');\n } else {\n logger.debug('Interactive session started (batch mode)');\n }\n };\n \n const endSession = (): InteractiveSession => {\n if (!session) {\n throw new Error('No active session');\n }\n \n session.completedAt = new Date();\n \n // Print summary before closing\n if (config.enabled && session.responses.length > 0) {\n printSummary();\n }\n \n if (rl) {\n // Remove all listeners before closing to prevent any lingering handlers\n // Check if method exists (may not in mocks)\n if (typeof rl.removeAllListeners === 'function') {\n rl.removeAllListeners();\n }\n rl.close();\n rl = null;\n \n // Resume stdin in case it was paused\n if (process.stdin.isPaused && process.stdin.isPaused()) {\n process.stdin.resume();\n }\n }\n \n const completed = session;\n session = null;\n \n logger.info('Interactive session ended', { \n requests: completed.requests.length,\n responses: completed.responses.length,\n });\n \n return completed;\n };\n \n const handleClarification = async (\n request: ClarificationRequest\n ): Promise<ClarificationResponse> => {\n if (session) {\n session.requests.push(request);\n }\n \n // In non-interactive mode, return the suggestion or the original term\n if (!config.enabled || !rl) {\n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: config.defaultToSuggestion && request.suggestion \n ? request.suggestion \n : request.term,\n shouldRemember: false,\n };\n \n if (session) {\n session.responses.push(response);\n }\n \n logger.debug('Clarification auto-resolved (non-interactive)', { \n type: request.type, \n term: request.term,\n response: response.response,\n });\n \n return response;\n }\n \n // Interactive mode - actually prompt the user\n // Play notification sound to get user's attention (like Cursor does)\n await sound.playNotification();\n \n // Special handling for new_project - use wizard\n if (request.type === 'new_project') {\n const wizardResult = await runNewProjectWizard(\n rl,\n request.term,\n request.context,\n request.options\n );\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: wizardResult.action,\n shouldRemember: wizardResult.action !== 'skip',\n additionalInfo: wizardResult as unknown as Record<string, unknown>,\n };\n \n if (session) {\n session.responses.push(response);\n \n // Increment prompt counter for current file\n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n session.filesProcessed[fileIndex].promptsAnswered++;\n }\n }\n \n logger.debug('New project wizard completed', {\n term: request.term,\n action: wizardResult.action,\n additionalInfo: wizardResult,\n });\n \n return response;\n }\n \n // Special handling for new_person - use wizard\n if (request.type === 'new_person') {\n const wizardResult = await runNewPersonWizard(\n rl,\n request.term,\n request.context,\n request.options\n );\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: wizardResult.action,\n shouldRemember: wizardResult.action !== 'skip',\n additionalInfo: wizardResult as unknown as Record<string, unknown>,\n };\n \n if (session) {\n session.responses.push(response);\n \n // Increment prompt counter for current file\n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n session.filesProcessed[fileIndex].promptsAnswered++;\n }\n }\n \n logger.debug('New person wizard completed', {\n term: request.term,\n action: wizardResult.action,\n additionalInfo: wizardResult,\n });\n \n return response;\n }\n \n // Standard single-prompt flow for other types\n // Show file context if available\n let promptWithContext = formatClarificationPrompt(request);\n if (session && session.currentFile) {\n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n const fileProc = session.filesProcessed[fileIndex];\n promptWithContext = `[File: ${fileProc.inputPath}] [Prompts: ${fileProc.promptsAnswered}]\\n` +\n `(Type 'S' to skip remaining prompts for this file)\\n\\n` +\n promptWithContext;\n }\n }\n \n const userInput = await askQuestion(rl, promptWithContext);\n \n // Check for skip rest of file command\n if (userInput.toLowerCase() === 's' || userInput.toLowerCase() === 'skip') {\n write('\\n[Skipping remaining prompts for this file...]');\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: 'skip',\n shouldRemember: false,\n skipRestOfFile: true,\n };\n \n if (session) {\n session.responses.push(response);\n \n // Mark current file as skipped\n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n session.filesProcessed[fileIndex].skipped = true;\n }\n }\n \n logger.info('User requested to skip rest of file');\n return response;\n }\n \n // Process the user's response\n let finalResponse: string;\n let shouldRemember = false;\n \n if (userInput === '' || userInput.toLowerCase() === 'y') {\n // User pressed Enter or typed Y - use suggestion or original\n finalResponse = request.suggestion || request.term;\n } else if (request.options && /^\\d+$/.test(userInput)) {\n // User entered a number - select from options\n const index = parseInt(userInput, 10) - 1;\n if (index >= 0 && index < request.options.length) {\n finalResponse = request.options[index];\n } else {\n finalResponse = userInput;\n }\n } else {\n finalResponse = userInput;\n // If user provided a custom answer, they might want to remember it\n shouldRemember = true;\n }\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: finalResponse,\n shouldRemember,\n };\n \n if (session) {\n session.responses.push(response);\n \n // Increment prompt counter for current file\n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n session.filesProcessed[fileIndex].promptsAnswered++;\n }\n }\n \n logger.debug('Clarification resolved via user input', { \n type: request.type, \n term: request.term,\n response: response.response,\n shouldRemember,\n });\n \n return response;\n };\n \n const isEnabled = () => config.enabled;\n \n const getSession = () => session;\n \n // File tracking methods\n const startFile = (filePath: string) => {\n if (!session) return;\n \n session.currentFile = filePath;\n session.filesProcessed.push({\n inputPath: filePath,\n promptsAnswered: 0,\n skipped: false,\n startedAt: new Date(),\n });\n \n logger.debug('Started processing file: %s', filePath);\n };\n \n const endFile = (outputPath?: string, movedTo?: string) => {\n if (!session || !session.currentFile) return;\n \n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n const fileProc = session.filesProcessed[fileIndex];\n fileProc.completedAt = new Date();\n fileProc.outputPath = outputPath;\n fileProc.movedTo = movedTo;\n \n logger.debug('Completed file: %s (%d prompts)', fileProc.inputPath, fileProc.promptsAnswered);\n }\n \n session.currentFile = undefined;\n };\n \n // Entity tracking methods\n const trackTermAdded = (termName: string) => {\n if (!session) return;\n if (!session.changes.termsAdded.includes(termName)) {\n session.changes.termsAdded.push(termName);\n logger.debug('Tracked term added: %s', termName);\n }\n };\n \n const trackTermUpdated = (termName: string) => {\n if (!session) return;\n if (!session.changes.termsUpdated.includes(termName)) {\n session.changes.termsUpdated.push(termName);\n logger.debug('Tracked term updated: %s', termName);\n }\n };\n \n const trackProjectAdded = (projectName: string) => {\n if (!session) return;\n if (!session.changes.projectsAdded.includes(projectName)) {\n session.changes.projectsAdded.push(projectName);\n logger.debug('Tracked project added: %s', projectName);\n }\n };\n \n const trackProjectUpdated = (projectName: string) => {\n if (!session) return;\n if (!session.changes.projectsUpdated.includes(projectName)) {\n session.changes.projectsUpdated.push(projectName);\n logger.debug('Tracked project updated: %s', projectName);\n }\n };\n \n const trackPersonAdded = (personName: string) => {\n if (!session) return;\n if (!session.changes.peopleAdded.includes(personName)) {\n session.changes.peopleAdded.push(personName);\n logger.debug('Tracked person added: %s', personName);\n }\n };\n \n const trackAlias = (alias: string, linkedTo: string) => {\n if (!session) return;\n session.changes.aliasesAdded.push({ alias, linkedTo });\n logger.debug('Tracked alias: %s -> %s', alias, linkedTo);\n };\n \n // Session control methods\n const requestStop = () => {\n if (!session) return;\n session.shouldStop = true;\n logger.info('Session stop requested by user');\n };\n \n const shouldStopSession = (): boolean => {\n return session?.shouldStop ?? false;\n };\n \n // Summary generation\n const printSummary = () => {\n if (!session) {\n write('\\nNo active session to summarize.');\n return;\n }\n \n const duration = session.completedAt \n ? (session.completedAt.getTime() - session.startedAt.getTime()) / 1000\n : (new Date().getTime() - session.startedAt.getTime()) / 1000;\n \n write('\\n');\n write('═'.repeat(60));\n write(' INTERACTIVE SESSION SUMMARY');\n write('═'.repeat(60));\n write('');\n \n // Session duration\n const minutes = Math.floor(duration / 60);\n const seconds = Math.floor(duration % 60);\n write(`Duration: ${minutes}m ${seconds}s`);\n write(`Total prompts answered: ${session.responses.length}`);\n write('');\n \n // Files processed\n if (session.filesProcessed.length > 0) {\n write('─'.repeat(60));\n write(' FILES PROCESSED');\n write('─'.repeat(60));\n \n session.filesProcessed.forEach((file, idx) => {\n write(`\\n${idx + 1}. ${file.inputPath}`);\n write(` Prompts answered: ${file.promptsAnswered}`);\n if (file.skipped) {\n write(` Status: SKIPPED (user requested)`);\n } else {\n write(` Status: Completed`);\n }\n if (file.outputPath) {\n write(` Transcript: ${file.outputPath}`);\n }\n if (file.movedTo) {\n write(` Audio moved to: ${file.movedTo}`);\n }\n });\n write('');\n }\n \n // Changes made\n const hasChanges = \n session.changes.termsAdded.length > 0 ||\n session.changes.termsUpdated.length > 0 ||\n session.changes.projectsAdded.length > 0 ||\n session.changes.projectsUpdated.length > 0 ||\n session.changes.peopleAdded.length > 0 ||\n session.changes.aliasesAdded.length > 0;\n \n if (hasChanges) {\n write('─'.repeat(60));\n write(' CHANGES MADE');\n write('─'.repeat(60));\n \n if (session.changes.termsAdded.length > 0) {\n write(`\\n✓ Terms added (${session.changes.termsAdded.length}):`);\n session.changes.termsAdded.forEach(term => write(` - ${term}`));\n }\n \n if (session.changes.termsUpdated.length > 0) {\n write(`\\n✓ Terms updated (${session.changes.termsUpdated.length}):`);\n session.changes.termsUpdated.forEach(term => write(` - ${term}`));\n }\n \n if (session.changes.projectsAdded.length > 0) {\n write(`\\n✓ Projects added (${session.changes.projectsAdded.length}):`);\n session.changes.projectsAdded.forEach(proj => write(` - ${proj}`));\n }\n \n if (session.changes.projectsUpdated.length > 0) {\n write(`\\n✓ Projects updated (${session.changes.projectsUpdated.length}):`);\n session.changes.projectsUpdated.forEach(proj => write(` - ${proj}`));\n }\n \n if (session.changes.peopleAdded.length > 0) {\n write(`\\n✓ People added (${session.changes.peopleAdded.length}):`);\n session.changes.peopleAdded.forEach(person => write(` - ${person}`));\n }\n \n if (session.changes.aliasesAdded.length > 0) {\n write(`\\n✓ Aliases created (${session.changes.aliasesAdded.length}):`);\n session.changes.aliasesAdded.forEach(({ alias, linkedTo }) => {\n write(` - \"${alias}\" → \"${linkedTo}\"`);\n });\n }\n \n write('');\n } else {\n write('No changes made during this session.');\n write('');\n }\n \n write('═'.repeat(60));\n write('');\n };\n \n return {\n startSession,\n endSession,\n handleClarification,\n isEnabled,\n getSession,\n startFile,\n endFile,\n trackTermAdded,\n trackTermUpdated,\n trackProjectAdded,\n trackProjectUpdated,\n trackPersonAdded,\n trackAlias,\n requestStop,\n shouldStopSession,\n printSummary,\n };\n};\n","/**\n * Onboarding\n * \n * Handles first-run detection and bootstrap onboarding flow.\n */\n\nimport { OnboardingState, OnboardingResult } from './types';\nimport * as Context from '../context';\nimport * as Logging from '../logging';\n\nexport interface OnboardingInstance {\n checkNeedsOnboarding(): OnboardingState;\n // Note: Full interactive onboarding requires inquirer\n // This provides the state detection and result structure\n}\n\nexport const create = (context: Context.ContextInstance): OnboardingInstance => {\n const logger = Logging.getLogger();\n \n const checkNeedsOnboarding = (): OnboardingState => {\n const projects = context.getAllProjects();\n const config = context.getConfig();\n \n const hasProjects = projects.length > 0;\n const configWithRouting = config as { routing?: { default?: { path?: string } } };\n const hasDefaultDestination = !!configWithRouting?.routing?.default?.path;\n const hasAnyContext = context.hasContext();\n \n const state: OnboardingState = {\n hasProjects,\n hasDefaultDestination,\n hasAnyContext,\n needsOnboarding: !hasAnyContext,\n };\n \n logger.debug('Onboarding state checked', state);\n \n return state;\n };\n \n return { checkNeedsOnboarding };\n};\n\n/**\n * Create a default onboarding result for non-interactive mode\n */\nexport const createDefaultOnboardingResult = (): OnboardingResult => ({\n defaultDestination: '~/notes',\n defaultStructure: 'month',\n projects: [],\n completed: false,\n});\n\n","/**\n * Interactive Mode System\n * \n * Main entry point for the interactive mode system. Provides session management,\n * clarification handling, and onboarding detection.\n */\n\nimport { \n InteractiveConfig, \n InteractiveSession, \n ClarificationRequest, \n ClarificationResponse,\n OnboardingState \n} from './types';\nimport * as Handler from './handler';\nimport * as Onboarding from './onboarding';\nimport * as Context from '../context';\n\nexport interface InteractiveInstance {\n // Session management\n startSession(): void;\n endSession(): InteractiveSession;\n getSession(): InteractiveSession | null;\n \n // Clarification handling\n handleClarification(request: ClarificationRequest): Promise<ClarificationResponse>;\n \n // State\n isEnabled(): boolean;\n \n // Onboarding\n checkNeedsOnboarding(): OnboardingState;\n}\n\nexport const create = (\n config: InteractiveConfig,\n context: Context.ContextInstance\n): InteractiveInstance => {\n const handler = Handler.create(config);\n const onboarding = Onboarding.create(context);\n \n return {\n startSession: handler.startSession,\n endSession: handler.endSession,\n getSession: handler.getSession,\n handleClarification: handler.handleClarification,\n isEnabled: handler.isEnabled,\n checkNeedsOnboarding: onboarding.checkNeedsOnboarding,\n };\n};\n\n// Re-export types\nexport * from './types';\n\n// Re-export utilities\nexport { createDefaultOnboardingResult } from './onboarding';\n\n","import * as Routing from '@/routing';\n\nexport interface EntityReference {\n id: string;\n name: string;\n type: 'person' | 'project' | 'term' | 'company';\n}\n\nexport interface TranscriptMetadata {\n title?: string;\n project?: string;\n projectId?: string;\n routing?: RoutingMetadata;\n tags?: string[];\n date?: Date;\n recordingTime?: string;\n confidence?: number;\n duration?: string;\n \n // Entity references - entities mentioned/used in this transcript\n entities?: {\n people?: EntityReference[];\n projects?: EntityReference[];\n terms?: EntityReference[];\n companies?: EntityReference[];\n };\n}\n\nexport interface RoutingMetadata {\n destination: string;\n confidence: number;\n signals: Routing.ClassificationSignal[];\n reasoning: string;\n}\n\n/**\n * Format metadata as Markdown heading section\n */\nexport const formatMetadataMarkdown = (metadata: TranscriptMetadata): string => {\n const lines: string[] = [];\n \n // Title section\n if (metadata.title) {\n lines.push(`# ${metadata.title}`);\n lines.push('');\n }\n \n // Metadata frontmatter as readable markdown\n lines.push('## Metadata');\n lines.push('');\n \n // Date and Time\n if (metadata.date) {\n const dateStr = metadata.date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n });\n lines.push(`**Date**: ${dateStr}`);\n \n if (metadata.recordingTime) {\n lines.push(`**Time**: ${metadata.recordingTime}`);\n } else {\n const timeStr = metadata.date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n });\n lines.push(`**Time**: ${timeStr}`);\n }\n }\n \n lines.push('');\n \n // Project\n if (metadata.project) {\n lines.push(`**Project**: ${metadata.project}`);\n if (metadata.projectId) {\n lines.push(`**Project ID**: \\`${metadata.projectId}\\``);\n }\n lines.push('');\n }\n \n // Routing Information\n if (metadata.routing) {\n lines.push('### Routing');\n lines.push('');\n lines.push(`**Destination**: ${metadata.routing.destination}`);\n lines.push(`**Confidence**: ${(metadata.routing.confidence * 100).toFixed(1)}%`);\n lines.push('');\n \n if (metadata.routing.signals.length > 0) {\n lines.push('**Classification Signals**:');\n for (const signal of metadata.routing.signals) {\n const signalType = signal.type.replace(/_/g, ' ');\n const weight = (signal.weight * 100).toFixed(0);\n lines.push(`- ${signalType}: \"${signal.value}\" (${weight}% weight)`);\n }\n lines.push('');\n }\n \n if (metadata.routing.reasoning) {\n lines.push(`**Reasoning**: ${metadata.routing.reasoning}`);\n lines.push('');\n }\n }\n \n // Tags\n if (metadata.tags && metadata.tags.length > 0) {\n lines.push('**Tags**: ' + metadata.tags.map(tag => `\\`${tag}\\``).join(', '));\n lines.push('');\n }\n \n // Duration\n if (metadata.duration) {\n lines.push(`**Duration**: ${metadata.duration}`);\n lines.push('');\n }\n \n // Separator\n lines.push('---');\n lines.push('');\n \n return lines.join('\\n');\n};\n\n/**\n * Format entity metadata as Markdown footer section\n * This goes at the END of the transcript for machine readability\n */\nexport const formatEntityMetadataMarkdown = (metadata: TranscriptMetadata): string => {\n if (!metadata.entities) {\n return '';\n }\n \n const lines: string[] = [];\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## Entity References');\n lines.push('');\n lines.push('<!-- Machine-readable entity metadata for indexing and querying -->');\n lines.push('');\n \n // People\n if (metadata.entities.people && metadata.entities.people.length > 0) {\n lines.push('### People');\n lines.push('');\n for (const person of metadata.entities.people) {\n lines.push(`- \\`${person.id}\\`: ${person.name}`);\n }\n lines.push('');\n }\n \n // Projects\n if (metadata.entities.projects && metadata.entities.projects.length > 0) {\n lines.push('### Projects');\n lines.push('');\n for (const project of metadata.entities.projects) {\n lines.push(`- \\`${project.id}\\`: ${project.name}`);\n }\n lines.push('');\n }\n \n // Terms\n if (metadata.entities.terms && metadata.entities.terms.length > 0) {\n lines.push('### Terms');\n lines.push('');\n for (const term of metadata.entities.terms) {\n lines.push(`- \\`${term.id}\\`: ${term.name}`);\n }\n lines.push('');\n }\n \n // Companies\n if (metadata.entities.companies && metadata.entities.companies.length > 0) {\n lines.push('### Companies');\n lines.push('');\n for (const company of metadata.entities.companies) {\n lines.push(`- \\`${company.id}\\`: ${company.name}`);\n }\n lines.push('');\n }\n \n return lines.join('\\n');\n};\n\n/**\n * Parse entity metadata from a transcript\n * Reads the Entity References section if present\n */\nexport const parseEntityMetadata = (content: string): TranscriptMetadata['entities'] | undefined => {\n const entitySection = content.match(/## Entity References\\s*\\n([\\s\\S]*?)(?:\\n##|$)/);\n if (!entitySection) {\n return undefined;\n }\n \n const sectionContent = entitySection[1];\n const entities: NonNullable<TranscriptMetadata['entities']> = {\n people: [],\n projects: [],\n terms: [],\n companies: [],\n };\n \n // Parse each entity type\n const parseEntities = (type: 'People' | 'Projects' | 'Terms' | 'Companies'): EntityReference[] => {\n // Map plural type names to singular entity types\n const typeMap: Record<string, 'person' | 'project' | 'term' | 'company'> = {\n 'People': 'person',\n 'Projects': 'project',\n 'Terms': 'term',\n 'Companies': 'company',\n };\n \n const entityType = typeMap[type];\n \n // Find the section for this type\n const sectionStart = sectionContent.indexOf(`### ${type}`);\n if (sectionStart === -1) return [];\n \n // Find the end (next ### or end of content)\n const afterSection = sectionContent.substring(sectionStart + type.length + 4); // +4 for \"### \"\n const nextSection = afterSection.search(/\\n###/);\n const sectionText = nextSection === -1 ? afterSection : afterSection.substring(0, nextSection);\n \n // Extract items\n const items: EntityReference[] = [];\n const itemRegex = /- `([^`]+)`: (.+?)$/gm;\n let itemMatch;\n \n while ((itemMatch = itemRegex.exec(sectionText)) !== null) {\n items.push({\n id: itemMatch[1],\n name: itemMatch[2].trim(),\n type: entityType,\n });\n }\n \n return items;\n };\n \n entities.people = parseEntities('People');\n entities.projects = parseEntities('Projects');\n entities.terms = parseEntities('Terms');\n entities.companies = parseEntities('Companies');\n \n // Only return if we found any entities\n const hasEntities = \n entities.people.length > 0 ||\n entities.projects.length > 0 ||\n entities.terms.length > 0 ||\n entities.companies.length > 0;\n \n return hasEntities ? entities : undefined;\n};\n\n/**\n * Extract routing metadata from a RouteDecision\n */\nexport const createRoutingMetadata = (decision: Routing.RouteDecision): RoutingMetadata => {\n return {\n destination: decision.destination.path,\n confidence: decision.confidence,\n signals: decision.signals,\n reasoning: decision.reasoning,\n };\n};\n\n/**\n * Format duration in seconds to readable format (e.g., \"2m 30s\")\n */\nexport const formatDuration = (seconds: number): string => {\n const minutes = Math.floor(seconds / 60);\n const secs = Math.round(seconds % 60);\n \n if (minutes === 0) {\n return `${secs}s`;\n }\n \n if (secs === 0) {\n return `${minutes}m`;\n }\n \n return `${minutes}m ${secs}s`;\n};\n\n/**\n * Format time as HH:MM AM/PM\n */\nexport const formatTime = (date: Date): string => {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n });\n};\n\n/**\n * Extract topic from routing signals\n */\nexport const extractTopicFromSignals = (signals: Routing.ClassificationSignal[]): string | undefined => {\n const topicSignal = signals.find(s => s.type === 'topic' || s.type === 'context_type');\n return topicSignal?.value;\n};\n\n/**\n * Extract all tags from routing signals\n * Tags are deduplicated to avoid duplicates from multiple signal sources\n */\nexport const extractTagsFromSignals = (signals: Routing.ClassificationSignal[]): string[] => {\n const tags = signals\n .filter(s => s.type !== 'context_type') // Skip generic context type\n .map(s => s.value)\n .filter((v): v is string => typeof v === 'string');\n \n // Deduplicate tags using Set\n return Array.from(new Set(tags));\n};\n\n\n","/**\n * Output Manager\n *\n * Manages intermediate files and final output destinations.\n * Follows the kodrdriv pattern for debugging and intermediate file management.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'fs/promises';\nimport { OutputConfig, IntermediateFiles, OutputPaths, RawTranscriptData } from './types';\nimport * as Logging from '../logging';\nimport * as Metadata from '../util/metadata';\n\nexport interface ManagerInstance {\n createOutputPaths(\n audioFile: string,\n routedDestination: string,\n hash: string,\n date: Date\n ): OutputPaths;\n \n ensureDirectories(paths: OutputPaths): Promise<void>;\n \n writeIntermediate(\n paths: OutputPaths,\n type: keyof IntermediateFiles,\n content: unknown\n ): Promise<string>;\n \n /**\n * Write the raw Whisper transcript to the .transcript/ directory alongside final output.\n * This enables compare and reanalyze workflows.\n */\n writeRawTranscript(paths: OutputPaths, data: RawTranscriptData): Promise<string>;\n \n writeTranscript(paths: OutputPaths, content: string, metadata?: Metadata.TranscriptMetadata): Promise<string>;\n \n cleanIntermediates(paths: OutputPaths): Promise<void>;\n \n /**\n * Read a previously stored raw transcript from the .transcript/ directory.\n * Returns null if no raw transcript exists.\n */\n readRawTranscript(finalOutputPath: string): Promise<RawTranscriptData | null>;\n}\n\nexport const create = (config: OutputConfig): ManagerInstance => {\n const logger = Logging.getLogger();\n \n const formatTimestamp = (date: Date): string => {\n // Format: YYYY-MM-DD-HHmm (full year, dashes for separation)\n const pad = (n: number) => n.toString().padStart(2, '0');\n const year = date.getFullYear().toString();\n const month = pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n return `${year}-${month}-${day}-${hours}${minutes}`;\n };\n \n const createOutputPaths = (\n _audioFile: string,\n routedDestination: string,\n hash: string,\n date: Date\n ): OutputPaths => {\n const timestamp = formatTimestamp(date);\n const shortHash = hash.slice(0, 6);\n // Hash at the end for easier filename correlation\n const buildFilename = (type: string, ext: string) => `${timestamp}-${type}-${shortHash}${ext}`;\n \n const intermediateDir = config.intermediateDir;\n \n // Generate raw transcript path in .transcript/ directory alongside final output\n // e.g., /notes/2026/1/14-meeting.md -> /notes/2026/1/.transcript/14-meeting.json\n const finalDir = path.dirname(routedDestination);\n const finalBasename = path.basename(routedDestination, path.extname(routedDestination));\n const rawTranscriptPath = path.join(finalDir, '.transcript', `${finalBasename}.json`);\n\n return {\n final: routedDestination,\n rawTranscript: rawTranscriptPath,\n intermediate: {\n transcript: path.join(intermediateDir, buildFilename('transcript', '.json')),\n context: path.join(intermediateDir, buildFilename('context', '.json')),\n request: path.join(intermediateDir, buildFilename('request', '.json')),\n response: path.join(intermediateDir, buildFilename('response', '.json')),\n reflection: path.join(intermediateDir, buildFilename('reflection', '.md')),\n session: path.join(intermediateDir, buildFilename('session', '.json')),\n },\n };\n };\n \n const ensureDirectories = async (paths: OutputPaths): Promise<void> => {\n // Ensure intermediate directory\n await fs.mkdir(path.dirname(paths.intermediate.transcript), { recursive: true });\n \n // Ensure final directory\n await fs.mkdir(path.dirname(paths.final), { recursive: true });\n \n // Ensure .transcript directory alongside final output\n await fs.mkdir(path.dirname(paths.rawTranscript), { recursive: true });\n \n logger.debug('Ensured output directories', {\n intermediate: path.dirname(paths.intermediate.transcript),\n final: path.dirname(paths.final),\n rawTranscript: path.dirname(paths.rawTranscript),\n });\n };\n \n const writeIntermediate = async (\n paths: OutputPaths,\n type: keyof IntermediateFiles,\n content: unknown\n ): Promise<string> => {\n const filePath = paths.intermediate[type];\n if (!filePath) {\n throw new Error(`Invalid intermediate type: ${type}`);\n }\n \n const contentStr = typeof content === 'string' \n ? content \n : JSON.stringify(content, null, 2);\n \n await fs.writeFile(filePath, contentStr, 'utf-8');\n logger.debug('Wrote intermediate file', { type, path: filePath });\n \n return filePath;\n };\n \n const writeTranscript = async (\n paths: OutputPaths,\n content: string,\n metadata?: Metadata.TranscriptMetadata\n ): Promise<string> => {\n let finalContent = content;\n \n if (metadata) {\n // Prepend header metadata\n const metadataSection = Metadata.formatMetadataMarkdown(metadata);\n finalContent = metadataSection + content;\n \n // Append entity metadata at the end\n const entitySection = Metadata.formatEntityMetadataMarkdown(metadata);\n if (entitySection) {\n finalContent = finalContent + entitySection;\n }\n }\n \n await fs.writeFile(paths.final, finalContent, 'utf-8');\n logger.info('Wrote final transcript', { path: paths.final });\n return paths.final;\n };\n \n const cleanIntermediates = async (paths: OutputPaths): Promise<void> => {\n if (config.keepIntermediates) {\n logger.debug('Keeping intermediate files');\n return;\n }\n \n for (const [type, filePath] of Object.entries(paths.intermediate)) {\n if (filePath) {\n try {\n await fs.unlink(filePath);\n logger.debug('Removed intermediate file', { type, path: filePath });\n } catch {\n // File might not exist, that's OK\n }\n }\n }\n };\n \n /**\n * Write the raw Whisper transcript to the .transcript/ directory.\n * This preserves the original transcription for compare/reanalyze workflows.\n */\n const writeRawTranscript = async (\n paths: OutputPaths,\n data: RawTranscriptData\n ): Promise<string> => {\n const filePath = paths.rawTranscript;\n \n await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');\n logger.debug('Wrote raw transcript to .transcript/', { path: filePath });\n \n return filePath;\n };\n \n /**\n * Read a previously stored raw transcript from the .transcript/ directory.\n * Calculates the path based on the final output path.\n * Returns null if no raw transcript exists.\n */\n const readRawTranscript = async (finalOutputPath: string): Promise<RawTranscriptData | null> => {\n const finalDir = path.dirname(finalOutputPath);\n const finalBasename = path.basename(finalOutputPath, path.extname(finalOutputPath));\n const rawTranscriptPath = path.join(finalDir, '.transcript', `${finalBasename}.json`);\n \n try {\n const content = await fs.readFile(rawTranscriptPath, 'utf-8');\n return JSON.parse(content) as RawTranscriptData;\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n logger.debug('No raw transcript found', { path: rawTranscriptPath });\n return null;\n }\n throw error;\n }\n };\n \n return {\n createOutputPaths,\n ensureDirectories,\n writeIntermediate,\n writeRawTranscript,\n writeTranscript,\n readRawTranscript,\n cleanIntermediates,\n };\n};\n\n","/**\n * Output Management System\n *\n * Main entry point for the output management system. Handles intermediate\n * files and final output destinations.\n */\n\nimport { OutputConfig, OutputPaths, IntermediateFiles, RawTranscriptData } from './types';\nimport * as Manager from './manager';\nimport * as Metadata from '../util/metadata';\n\nexport interface OutputInstance {\n createOutputPaths(\n audioFile: string,\n routedDestination: string,\n hash: string,\n date: Date\n ): OutputPaths;\n ensureDirectories(paths: OutputPaths): Promise<void>;\n writeIntermediate(\n paths: OutputPaths,\n type: keyof IntermediateFiles,\n content: unknown\n ): Promise<string>;\n /**\n * Write the raw Whisper transcript to the .transcript/ directory alongside final output.\n * This enables compare and reanalyze workflows.\n */\n writeRawTranscript(paths: OutputPaths, data: RawTranscriptData): Promise<string>;\n writeTranscript(paths: OutputPaths, content: string, metadata?: Metadata.TranscriptMetadata): Promise<string>;\n /**\n * Read a previously stored raw transcript from the .transcript/ directory.\n * Returns null if no raw transcript exists.\n */\n readRawTranscript(finalOutputPath: string): Promise<RawTranscriptData | null>;\n cleanIntermediates(paths: OutputPaths): Promise<void>;\n}\n\nexport const create = (config: OutputConfig): OutputInstance => {\n return Manager.create(config);\n};\n\nexport const DEFAULT_OUTPUT_CONFIG: OutputConfig = {\n intermediateDir: './output/protokoll',\n keepIntermediates: true,\n timestampFormat: 'YYMMDD-HHmm',\n};\n\n// Re-export types\nexport * from './types';\n\n","/**\n * Metrics Collector\n *\n * Collects metrics during transcription for self-reflection reporting.\n */\n\nimport { TranscriptionMetrics, ToolEffectiveness, ContextChange, RoutingDecisionRecord } from './types';\nimport * as Logging from '../logging';\n\nexport interface CollectorInstance {\n start(): void;\n recordWhisper(duration: number): void;\n recordToolCall(name: string, duration: number, success: boolean): void;\n recordCorrection(original: string, corrected: string): void;\n recordUnknownEntity(entity: string): void;\n recordResolvedEntity(entity: string, resolved: string): void;\n recordModelResponse(model: string, tokens: number): void;\n recordContextChange(change: ContextChange): void;\n recordRoutingDecision(decision: RoutingDecisionRecord): void;\n getMetrics(): TranscriptionMetrics;\n getToolEffectiveness(): ToolEffectiveness[];\n getContextChanges(): ContextChange[];\n getRoutingDecision(): RoutingDecisionRecord | undefined;\n}\n\ninterface ToolStats {\n count: number;\n successCount: number;\n totalDuration: number;\n}\n\nexport const create = (): CollectorInstance => {\n const logger = Logging.getLogger();\n \n let startTime: Date = new Date();\n let whisperDuration = 0;\n let iterations = 0;\n let originalLength = 0;\n let correctedLength = 0;\n let correctionsApplied = 0;\n let model = '';\n let tokensUsed = 0;\n \n const unknownEntities: string[] = [];\n const resolvedEntities: Map<string, string> = new Map();\n const toolCalls: Map<string, ToolStats> = new Map();\n const contextChanges: ContextChange[] = [];\n let routingDecision: RoutingDecisionRecord | undefined;\n \n const start = () => {\n startTime = new Date();\n logger.debug('Reflection collector started');\n };\n \n const recordWhisper = (duration: number) => {\n whisperDuration = duration;\n };\n \n const recordToolCall = (name: string, duration: number, success: boolean) => {\n iterations++;\n \n if (!toolCalls.has(name)) {\n toolCalls.set(name, { count: 0, successCount: 0, totalDuration: 0 });\n }\n \n const stats = toolCalls.get(name)!;\n stats.count++;\n stats.totalDuration += duration;\n if (success) {\n stats.successCount++;\n }\n };\n \n const recordCorrection = (original: string, corrected: string) => {\n if (originalLength === 0) {\n originalLength = original.length;\n }\n correctedLength = corrected.length;\n correctionsApplied++;\n };\n \n const recordUnknownEntity = (entity: string) => {\n unknownEntities.push(entity);\n };\n \n const recordResolvedEntity = (entity: string, resolved: string) => {\n resolvedEntities.set(entity, resolved);\n };\n \n const recordModelResponse = (m: string, tokens: number) => {\n model = m;\n tokensUsed += tokens;\n };\n \n const recordContextChange = (change: ContextChange) => {\n contextChanges.push(change);\n logger.info('Context change recorded: %s %s \"%s\"', change.action, change.entityType, change.entityName);\n };\n\n const getContextChanges = (): ContextChange[] => {\n return [...contextChanges];\n };\n\n const recordRoutingDecision = (decision: RoutingDecisionRecord) => {\n routingDecision = decision;\n logger.debug('Routing decision recorded: project=%s, confidence=%.1f%%', \n decision.projectId || 'default', decision.confidence * 100);\n };\n\n const getRoutingDecision = (): RoutingDecisionRecord | undefined => {\n return routingDecision;\n };\n \n const getMetrics = (): TranscriptionMetrics => {\n const endTime = new Date();\n const totalDuration = endTime.getTime() - startTime.getTime();\n const reasoningDuration = totalDuration - whisperDuration;\n \n return {\n startTime,\n endTime,\n totalDuration,\n whisperDuration,\n reasoningDuration,\n iterations,\n toolCallsExecuted: Array.from(toolCalls.values()).reduce((sum, t) => sum + t.count, 0),\n toolsUsed: Array.from(toolCalls.keys()),\n originalLength,\n correctedLength,\n correctionsApplied,\n unknownEntitiesFound: unknownEntities.length,\n entitiesResolved: resolvedEntities.size,\n model,\n tokensUsed,\n };\n };\n \n const getToolEffectiveness = (): ToolEffectiveness[] => {\n return Array.from(toolCalls.entries()).map(([name, stats]) => ({\n name,\n callCount: stats.count,\n successCount: stats.successCount,\n failureCount: stats.count - stats.successCount,\n avgDuration: stats.count > 0 ? stats.totalDuration / stats.count : 0,\n successRate: stats.count > 0 ? stats.successCount / stats.count : 0,\n }));\n };\n \n return {\n start,\n recordWhisper,\n recordToolCall,\n recordCorrection,\n recordUnknownEntity,\n recordResolvedEntity,\n recordModelResponse,\n recordContextChange,\n recordRoutingDecision,\n getMetrics,\n getToolEffectiveness,\n getContextChanges,\n getRoutingDecision,\n };\n};\n\n","/**\n * Report Generator\n *\n * Generates self-reflection reports in markdown or JSON format.\n */\n\nimport { \n ReflectionReport, \n ReflectionConfig, \n TranscriptionMetrics, \n ToolEffectiveness,\n QualityAssessment,\n Recommendation \n} from './types';\nimport * as Collector from './collector';\nimport * as fs from 'fs/promises';\nimport * as Logging from '../logging';\n\nexport interface ReporterInstance {\n generate(\n collector: Collector.CollectorInstance,\n audioFile: string,\n outputFile: string,\n conversationHistory?: unknown[],\n output?: string\n ): ReflectionReport;\n \n formatMarkdown(report: ReflectionReport): string;\n formatJson(report: ReflectionReport): string;\n save(report: ReflectionReport, path: string): Promise<void>;\n}\n\nexport const create = (config: ReflectionConfig): ReporterInstance => {\n const logger = Logging.getLogger();\n \n const assessQuality = (\n metrics: TranscriptionMetrics,\n toolEffectiveness: ToolEffectiveness[]\n ): QualityAssessment => {\n // Calculate name accuracy based on resolution rate\n const nameAccuracy = metrics.unknownEntitiesFound > 0\n ? metrics.entitiesResolved / metrics.unknownEntitiesFound\n : 1.0;\n \n // Content preservation (should be close to 1.0)\n const contentPreservation = metrics.originalLength > 0\n ? Math.min(metrics.correctedLength / metrics.originalLength, 1.0)\n : 1.0;\n \n // Tool success rate\n const avgToolSuccess = toolEffectiveness.length > 0\n ? toolEffectiveness.reduce((sum, t) => sum + t.successRate, 0) / toolEffectiveness.length\n : 1.0;\n \n // Overall confidence\n const confidence = (nameAccuracy * 0.4) + (contentPreservation * 0.3) + (avgToolSuccess * 0.3);\n \n return {\n confidence,\n nameAccuracy,\n routingConfidence: 0.9, // Would be calculated from routing decision\n contentPreservation,\n overallScore: confidence,\n };\n };\n \n const generateRecommendations = (\n metrics: TranscriptionMetrics,\n toolEffectiveness: ToolEffectiveness[],\n quality: QualityAssessment\n ): Recommendation[] => {\n const recommendations: Recommendation[] = [];\n \n // Check for tool failures\n const failedTools = toolEffectiveness.filter(t => t.successRate < 0.8);\n if (failedTools.length > 0) {\n recommendations.push({\n type: 'tool-issue',\n severity: 'high',\n message: `${failedTools.length} tool(s) had low success rates`,\n suggestion: `Review tool implementations: ${failedTools.map(t => t.name).join(', ')}`,\n });\n }\n \n // Check for unresolved entities\n if (metrics.unknownEntitiesFound > metrics.entitiesResolved) {\n const unresolved = metrics.unknownEntitiesFound - metrics.entitiesResolved;\n recommendations.push({\n type: 'context-gap',\n severity: 'medium',\n message: `${unresolved} entities could not be resolved`,\n suggestion: 'Run in interactive mode to add new context entries',\n });\n }\n \n // Check for high iteration count (real issue is usually unclear routing)\n if (metrics.iterations > 10) {\n recommendations.push({\n type: 'context-gap',\n severity: 'medium',\n message: `High iteration count (${metrics.iterations}) - model may be struggling to route this note`,\n suggestion: 'Add explicit trigger phrases to your project context files (e.g., \"update on [project]\")',\n });\n }\n \n // Only flag extremely long processing (> 5 minutes) as potential issue\n // Normal reasoning with gpt-5.2 can take 1-3 minutes and that's fine\n if (metrics.totalDuration > 300000) { // > 5 minutes\n recommendations.push({\n type: 'performance',\n severity: 'low',\n message: `Processing took ${(metrics.totalDuration / 1000).toFixed(1)}s`,\n suggestion: 'Consider reviewing context files - unclear routing can cause excessive iterations',\n });\n }\n \n // Check content preservation\n if (quality.contentPreservation < 0.9) {\n recommendations.push({\n type: 'quality',\n severity: 'high',\n message: 'Significant content may have been lost',\n suggestion: 'Review prompt to ensure full content preservation',\n });\n }\n \n return recommendations;\n };\n \n const generate = (\n collector: Collector.CollectorInstance,\n audioFile: string,\n outputFile: string,\n conversationHistory?: unknown[],\n output?: string\n ): ReflectionReport => {\n const metrics = collector.getMetrics();\n const toolEffectiveness = collector.getToolEffectiveness();\n const contextChanges = collector.getContextChanges();\n const routingDecision = collector.getRoutingDecision();\n const quality = assessQuality(metrics, toolEffectiveness);\n const recommendations = generateRecommendations(metrics, toolEffectiveness, quality);\n \n return {\n id: `reflection-${Date.now()}`,\n generated: new Date(),\n audioFile,\n outputFile,\n summary: {\n duration: metrics.totalDuration,\n iterations: metrics.iterations,\n toolCalls: metrics.toolCallsExecuted,\n corrections: metrics.correctionsApplied,\n confidence: quality.confidence,\n },\n metrics,\n toolEffectiveness,\n quality,\n recommendations,\n routingDecision,\n contextChanges: contextChanges.length > 0 ? contextChanges : undefined,\n conversationHistory: config.includeConversation ? conversationHistory : undefined,\n output: config.includeOutput ? output : undefined,\n };\n };\n \n const formatMarkdown = (report: ReflectionReport): string => {\n let md = `# Protokoll - Self-Reflection Report\\n\\n`;\n md += `**Generated:** ${report.generated.toISOString()}\\n`;\n md += `**Audio File:** ${report.audioFile}\\n`;\n md += `**Output:** ${report.outputFile}\\n\\n`;\n \n md += `## Summary\\n\\n`;\n md += `- **Duration**: ${(report.summary.duration / 1000).toFixed(1)}s\\n`;\n md += `- **Iterations**: ${report.summary.iterations}\\n`;\n md += `- **Tool Calls**: ${report.summary.toolCalls}\\n`;\n md += `- **Corrections**: ${report.summary.corrections}\\n`;\n md += `- **Confidence**: ${(report.summary.confidence * 100).toFixed(1)}%\\n\\n`;\n \n md += `## Quality Assessment\\n\\n`;\n md += `- **Overall Score**: ${(report.quality.overallScore * 100).toFixed(1)}%\\n`;\n md += `- **Name Accuracy**: ${(report.quality.nameAccuracy * 100).toFixed(1)}%\\n`;\n md += `- **Content Preservation**: ${(report.quality.contentPreservation * 100).toFixed(1)}%\\n`;\n md += `- **Routing Confidence**: ${(report.quality.routingConfidence * 100).toFixed(1)}%\\n\\n`;\n \n // Routing Decision with Reasoning\n if (report.routingDecision) {\n const rd = report.routingDecision;\n md += `## Routing Decision\\n\\n`;\n md += `**Project**: ${rd.projectId || '(default routing)'}\\n`;\n md += `**Destination**: \\`${rd.destination}\\`\\n`;\n md += `**Confidence**: ${(rd.confidence * 100).toFixed(1)}%\\n\\n`;\n \n md += `### Reasoning\\n\\n`;\n md += `${rd.reasoning}\\n\\n`;\n \n if (rd.signals && rd.signals.length > 0) {\n md += `### Classification Signals\\n\\n`;\n md += `| Signal Type | Value | Weight | Source |\\n`;\n md += `|-------------|-------|--------|--------|\\n`;\n for (const signal of rd.signals) {\n const source = signal.source || '-';\n md += `| ${signal.type} | \"${signal.value}\" | ${(signal.weight * 100).toFixed(0)}% | ${source} |\\n`;\n }\n md += '\\n';\n }\n \n if (rd.alternativesConsidered && rd.alternativesConsidered.length > 0) {\n md += `### Alternatives Considered\\n\\n`;\n for (const alt of rd.alternativesConsidered) {\n md += `- **${alt.projectId}** (${(alt.confidence * 100).toFixed(1)}% confidence)\\n`;\n md += ` - Not chosen because: ${alt.whyNotChosen}\\n`;\n }\n md += '\\n';\n }\n \n if (rd.userConfirmed) {\n md += `*User confirmed this routing decision in interactive mode.*\\n\\n`;\n }\n \n if (rd.feedbackProvided) {\n md += `### Feedback Received\\n\\n`;\n md += `This routing was later corrected: ${rd.feedbackCorrection}\\n\\n`;\n }\n }\n \n if (report.toolEffectiveness.length > 0) {\n md += `## Tool Effectiveness\\n\\n`;\n md += `| Tool | Calls | Success | Failure | Success Rate | Avg Duration |\\n`;\n md += `|------|-------|---------|---------|--------------|-------------|\\n`;\n \n for (const tool of report.toolEffectiveness) {\n md += `| ${tool.name} | ${tool.callCount} | ${tool.successCount} | ${tool.failureCount} | `;\n md += `${(tool.successRate * 100).toFixed(1)}% | ${tool.avgDuration.toFixed(0)}ms |\\n`;\n }\n md += '\\n';\n }\n \n if (report.recommendations.length > 0) {\n md += `## Recommendations\\n\\n`;\n \n const bySeverity = {\n high: report.recommendations.filter(r => r.severity === 'high'),\n medium: report.recommendations.filter(r => r.severity === 'medium'),\n low: report.recommendations.filter(r => r.severity === 'low'),\n };\n \n if (bySeverity.high.length > 0) {\n md += `### 🔴 High Priority\\n\\n`;\n bySeverity.high.forEach((rec, i) => {\n md += `${i + 1}. **${rec.message}**\\n`;\n if (rec.suggestion) md += ` - ${rec.suggestion}\\n`;\n });\n md += '\\n';\n }\n \n if (bySeverity.medium.length > 0) {\n md += `### 🟡 Medium Priority\\n\\n`;\n bySeverity.medium.forEach((rec, i) => {\n md += `${i + 1}. **${rec.message}**\\n`;\n if (rec.suggestion) md += ` - ${rec.suggestion}\\n`;\n });\n md += '\\n';\n }\n \n if (bySeverity.low.length > 0) {\n md += `### 🟢 Low Priority\\n\\n`;\n bySeverity.low.forEach((rec, i) => {\n md += `${i + 1}. **${rec.message}**\\n`;\n if (rec.suggestion) md += ` - ${rec.suggestion}\\n`;\n });\n md += '\\n';\n }\n }\n \n // Context changes section\n if (report.contextChanges && report.contextChanges.length > 0) {\n md += `## Context Changes\\n\\n`;\n md += `The following context entries were created or updated during this session:\\n\\n`;\n \n for (const change of report.contextChanges) {\n const emoji = change.action === 'created' ? '✨' : '📝';\n md += `${emoji} **${change.action.charAt(0).toUpperCase() + change.action.slice(1)} ${change.entityType}**: ${change.entityName}\\n`;\n if (change.details) {\n const details = change.details as Record<string, unknown>;\n const routing = details.routing as Record<string, unknown> | undefined;\n const destination = details.destination || routing?.destination;\n if (destination) {\n md += ` - Routing to: \\`${destination}\\`\\n`;\n }\n }\n }\n md += '\\n';\n }\n \n md += `---\\n\\n`;\n md += `*Report generated by Protokoll Self-Reflection System*\\n`;\n \n return md;\n };\n \n const formatJson = (report: ReflectionReport): string => {\n return JSON.stringify(report, null, 2);\n };\n \n const save = async (report: ReflectionReport, path: string): Promise<void> => {\n const content = config.format === 'markdown' \n ? formatMarkdown(report)\n : formatJson(report);\n \n await fs.writeFile(path, content, 'utf-8');\n logger.info('Saved reflection report', { path });\n };\n \n return {\n generate,\n formatMarkdown,\n formatJson,\n save,\n };\n};\n\n","/**\n * Self-Reflection System\n *\n * Main entry point for the self-reflection system. Provides metrics collection\n * and report generation for transcription quality analysis.\n */\n\nimport { ReflectionConfig, ReflectionReport } from './types';\nimport * as Collector from './collector';\nimport * as Reporter from './reporter';\n\nexport interface ReflectionInstance {\n collector: Collector.CollectorInstance;\n reporter: Reporter.ReporterInstance;\n generate(\n audioFile: string,\n outputFile: string,\n conversationHistory?: unknown[],\n output?: string\n ): ReflectionReport;\n save(report: ReflectionReport, path: string): Promise<void>;\n}\n\nexport const create = (config: ReflectionConfig): ReflectionInstance => {\n const collector = Collector.create();\n const reporter = Reporter.create(config);\n \n return {\n collector,\n reporter,\n generate: (audioFile, outputFile, conversationHistory, output) => \n reporter.generate(collector, audioFile, outputFile, conversationHistory, output),\n save: (report, path) => reporter.save(report, path),\n };\n};\n\nexport const DEFAULT_REFLECTION_CONFIG: ReflectionConfig = {\n enabled: false,\n format: 'markdown',\n includeConversation: false,\n includeOutput: true,\n};\n\n// Re-export types\nexport * from './types';\n\n","import ffmpeg from 'fluent-ffmpeg';\nimport { Logger } from 'winston';\nimport path from 'node:path';\nimport * as Storage from '@/util/storage';\n\nexport interface Media {\n getAudioCreationTime: (filePath: string) => Promise<Date | null>;\n getFileSize: (filePath: string) => Promise<number>;\n splitAudioFile: (filePath: string, outputDir: string, maxSizeBytes: number) => Promise<string[]>;\n convertToSupportedFormat: (filePath: string, outputDir: string) => Promise<string>;\n}\n\nconst ffprobeAsync = (filePath: string): Promise<any> => {\n return new Promise((resolve, reject) => {\n ffmpeg.ffprobe(filePath, (err, metadata) => {\n if (err) return reject(err);\n resolve(metadata);\n });\n });\n};\n\n\nexport const create = (logger: Logger): Media => {\n const storage = Storage.create({ log: logger.debug });\n\n // Extract creation time from audio file using ffmpeg\n const getAudioCreationTime = async (filePath: string): Promise<Date | null> => {\n try {\n const metadata = await ffprobeAsync(filePath);\n\n // Look for creation_time in format tags\n const formatTags = metadata?.format?.tags;\n if (formatTags?.creation_time) {\n logger.debug('Found creation_time in format tags: %s', formatTags.creation_time);\n return new Date(formatTags.creation_time);\n }\n\n // Check for creation_time in stream tags as fallback\n if (metadata?.streams?.length > 0) {\n for (const stream of metadata.streams) {\n if (stream.tags?.creation_time) {\n logger.debug('Found creation_time in stream tags: %s', stream.tags.creation_time);\n return new Date(stream.tags.creation_time);\n }\n }\n }\n\n logger.debug('No creation_time found in audio file metadata');\n return null;\n } catch (error) {\n logger.error('Error extracting creation time from audio file: %s', error);\n return null;\n }\n };\n\n // Get file size in bytes\n const getFileSize = async (filePath: string): Promise<number> => {\n try {\n return await storage.getFileSize(filePath);\n } catch (error) {\n logger.error('Error getting file size: %s', error);\n throw new Error(`Failed to get file size for ${filePath}: ${error}`);\n }\n };\n\n // Split large audio file into smaller chunks\n const splitAudioFile = async (filePath: string, outputDir: string, maxSizeBytes: number): Promise<string[]> => {\n try {\n const metadata = await ffprobeAsync(filePath);\n const duration = parseFloat(metadata.format.duration);\n\n // Calculate how many segments we need based on file size and max size\n const fileSize = await getFileSize(filePath);\n const segmentCount = Math.ceil(fileSize / maxSizeBytes);\n\n // Calculate segment duration\n const segmentDuration = duration / segmentCount;\n logger.debug(`Splitting ${filePath} (${fileSize} bytes) into ${segmentCount} segments of ~${segmentDuration} seconds each`);\n\n // Create output directory if it doesn't exist\n await storage.createDirectory(outputDir);\n\n const outputFiles: string[] = [];\n const fileExt = path.extname(filePath);\n const fileName = path.basename(filePath, fileExt);\n\n // Create a promise for each segment\n const promises = [];\n\n for (let i = 0; i < segmentCount; i++) {\n const startTime = i * segmentDuration;\n const outputPath = path.join(outputDir, `${fileName}_part${i + 1}${fileExt}`);\n outputFiles.push(outputPath);\n\n const promise = new Promise<void>((resolve, reject) => {\n ffmpeg(filePath)\n .setStartTime(startTime)\n .setDuration(segmentDuration)\n .output(outputPath)\n .on('end', () => {\n logger.debug(`Created segment ${i + 1}/${segmentCount}: ${outputPath}`);\n resolve();\n })\n .on('error', (err) => {\n logger.error(`Error creating segment ${i + 1}/${segmentCount}: ${err}`);\n reject(err);\n })\n .run();\n });\n\n promises.push(promise);\n }\n\n // Wait for all segments to be created\n await Promise.all(promises);\n return outputFiles;\n } catch (error) {\n logger.error('Error splitting audio file: %s', error);\n throw new Error(`Failed to split audio file ${filePath}: ${error}`);\n }\n };\n\n // Convert audio file to a format supported by OpenAI Whisper API\n // Supported formats: flac, m4a, mp3, mp4, mpeg, mpga, oga, ogg, wav, webm\n const convertToSupportedFormat = async (filePath: string, outputDir: string): Promise<string> => {\n try {\n const fileExt = path.extname(filePath).toLowerCase();\n\n // List of formats that OpenAI supports\n const supportedFormats = ['.flac', '.m4a', '.mp3', '.mp4', '.mpeg', '.mpga', '.oga', '.ogg', '.wav', '.webm'];\n\n // If already in a supported format, return as-is\n if (supportedFormats.includes(fileExt)) {\n logger.debug(`File ${filePath} is already in a supported format: ${fileExt}`);\n return filePath;\n }\n\n // Otherwise, convert to mp3 (widely supported and good compression)\n logger.info(`Converting ${fileExt} file to mp3 for transcription...`);\n const fileName = path.basename(filePath, fileExt);\n const outputPath = path.join(outputDir, `${fileName}.mp3`);\n\n // Check if converted file already exists\n if (await storage.exists(outputPath)) {\n logger.debug(`Converted file already exists: ${outputPath}`);\n return outputPath;\n }\n\n // Create output directory if it doesn't exist\n await storage.createDirectory(outputDir);\n\n return new Promise<string>((resolve, reject) => {\n ffmpeg(filePath)\n .toFormat('mp3')\n .audioBitrate('128k')\n .output(outputPath)\n .on('end', () => {\n logger.info(`Successfully converted to: ${outputPath}`);\n resolve(outputPath);\n })\n .on('error', (err) => {\n logger.error(`Error converting audio file: ${err}`);\n reject(new Error(`Failed to convert ${filePath} to mp3: ${err.message}`));\n })\n .run();\n });\n } catch (error) {\n logger.error('Error in convertToSupportedFormat: %s', error);\n throw new Error(`Failed to convert audio file ${filePath}: ${error}`);\n }\n };\n\n return {\n getAudioCreationTime,\n getFileSize,\n splitAudioFile,\n convertToSupportedFormat,\n }\n}\n","/**\n * Transcription System Types\n * \n * Supports multiple OpenAI transcription models with different capabilities.\n * The transcription service produces raw phonetic output that will be\n * corrected by the full reasoning pass.\n */\n\nexport type TranscriptionModel = \n | 'whisper-1'\n | 'gpt-4o-mini-transcribe'\n | 'gpt-4o-transcribe'\n | 'gpt-4o-transcribe-diarize';\n\nexport interface TranscriptionConfig {\n model: TranscriptionModel;\n language?: string;\n prompt?: string;\n response_format?: 'json' | 'text' | 'verbose_json' | 'srt' | 'vtt';\n temperature?: number;\n streaming?: boolean;\n}\n\nexport interface TranscriptionRequest {\n audioFile: string; // Path to audio file\n config: TranscriptionConfig;\n contextPrompt?: string; // Built from known entities (limited to 224 tokens)\n}\n\nexport interface TranscriptionSegment {\n start: number;\n end: number;\n text: string;\n speaker?: string; // For diarization\n}\n\nexport interface TranscriptionResult {\n text: string;\n model: string;\n segments?: TranscriptionSegment[];\n duration?: number;\n language?: string;\n}\n\nexport interface ModelCapabilities {\n supportsStreaming: boolean;\n supportsDiarization: boolean;\n maxFileSize: number;\n}\n\nexport const MODEL_CAPABILITIES: Record<TranscriptionModel, ModelCapabilities> = {\n 'whisper-1': {\n supportsStreaming: false,\n supportsDiarization: false,\n maxFileSize: 25 * 1024 * 1024, // 25 MB\n },\n 'gpt-4o-mini-transcribe': {\n supportsStreaming: true,\n supportsDiarization: false,\n maxFileSize: 25 * 1024 * 1024,\n },\n 'gpt-4o-transcribe': {\n supportsStreaming: true,\n supportsDiarization: false,\n maxFileSize: 25 * 1024 * 1024,\n },\n 'gpt-4o-transcribe-diarize': {\n supportsStreaming: true,\n supportsDiarization: true,\n maxFileSize: 25 * 1024 * 1024,\n },\n};\n\n","/**\n * Transcription Service\n * \n * Handles audio transcription using OpenAI's transcription models.\n * Keeps transcription simple - the complexity is in the reasoning pass.\n */\n\nimport OpenAI from 'openai';\nimport * as Storage from '../util/storage';\nimport * as Media from '../util/media';\nimport {\n TranscriptionRequest,\n TranscriptionResult,\n TranscriptionModel,\n MODEL_CAPABILITIES\n} from './types';\nimport * as Logging from '../logging';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\nexport interface ServiceInstance {\n transcribe(request: TranscriptionRequest): Promise<TranscriptionResult>;\n supportsStreaming(model: TranscriptionModel): boolean;\n supportsDiarization(model: TranscriptionModel): boolean;\n}\n\n// Alias for backwards compatibility\nexport type TranscriptionService = ServiceInstance;\n\nexport const create = (openai: OpenAI): ServiceInstance => {\n const logger = Logging.getLogger();\n const storage = Storage.create({ log: logger.debug });\n const media = Media.create(logger);\n\n const supportsStreaming = (model: TranscriptionModel): boolean => {\n return MODEL_CAPABILITIES[model]?.supportsStreaming ?? false;\n };\n\n const supportsDiarization = (model: TranscriptionModel): boolean => {\n return MODEL_CAPABILITIES[model]?.supportsDiarization ?? false;\n };\n\n const transcribe = async (request: TranscriptionRequest): Promise<TranscriptionResult> => {\n const { audioFile, config } = request;\n\n logger.debug('Starting transcription', { model: config.model, file: audioFile });\n\n // Convert audio file to a supported format if necessary\n const tempDir = path.join(os.tmpdir(), 'protokoll-conversions');\n const convertedAudioFile = await media.convertToSupportedFormat(audioFile, tempDir);\n logger.debug(`Using audio file for transcription: ${convertedAudioFile}`);\n\n const audioStream = await storage.readStream(convertedAudioFile);\n \n // Execute transcription\n const startTime = Date.now();\n const response = await openai.audio.transcriptions.create({\n model: config.model,\n file: audioStream,\n response_format: config.response_format ?? 'json',\n ...(config.language && { language: config.language }),\n ...(config.temperature !== undefined && { temperature: config.temperature }),\n ...(config.prompt && { prompt: config.prompt }),\n });\n const duration = Date.now() - startTime;\n \n logger.debug('Transcription complete', { duration, model: config.model });\n \n // Handle the response\n return {\n text: response.text,\n model: config.model,\n duration,\n };\n };\n \n return {\n transcribe,\n supportsStreaming,\n supportsDiarization,\n };\n};\n","/**\n * Transcription System\n * \n * Main entry point for the transcription system. Provides a factory function\n * to create transcription instances that can transcribe audio files using\n * various OpenAI models.\n * \n * Design Philosophy:\n * - Keep transcription simple - it produces raw phonetic output\n * - The reasoning pass handles corrections with full context\n * - Model choice is user preference (quality vs cost)\n */\n\nimport OpenAI from 'openai';\nimport { TranscriptionConfig, TranscriptionResult, TranscriptionModel } from './types';\nimport * as Service from './service';\n\nexport interface TranscriptionInstance {\n // Core transcription\n transcribe(audioFile: string, options?: Partial<TranscriptionConfig>): Promise<TranscriptionResult>;\n \n // Model capabilities\n supportsStreaming(model: TranscriptionModel): boolean;\n supportsDiarization(model: TranscriptionModel): boolean;\n \n // Configuration\n setDefaultModel(model: TranscriptionModel): void;\n getDefaultModel(): TranscriptionModel;\n}\n\nexport interface CreateOptions {\n apiKey?: string;\n defaultModel?: TranscriptionModel;\n openaiClient?: OpenAI;\n}\n\nexport const create = (options: CreateOptions = {}): TranscriptionInstance => {\n // Lazy-initialize OpenAI client (only when actually needed for transcription)\n let service: Service.ServiceInstance | null = null;\n const getService = (): Service.ServiceInstance => {\n if (!service) {\n const openai = options.openaiClient ?? new OpenAI({ apiKey: options.apiKey });\n service = Service.create(openai);\n }\n return service;\n };\n \n let defaultModel: TranscriptionModel = options.defaultModel ?? 'whisper-1';\n \n const transcribe = async (\n audioFile: string, \n configOptions: Partial<TranscriptionConfig> = {}\n ): Promise<TranscriptionResult> => {\n return getService().transcribe({\n audioFile,\n config: {\n model: configOptions.model ?? defaultModel,\n ...configOptions,\n },\n });\n };\n \n return {\n transcribe,\n supportsStreaming: (model) => getService().supportsStreaming(model),\n supportsDiarization: (model) => getService().supportsDiarization(model),\n setDefaultModel: (model) => { defaultModel = model; },\n getDefaultModel: () => defaultModel,\n };\n};\n\n// Re-export types\nexport * from './types';\n\n","/**\n * Reasoning Client\n * \n * Wrapper for reasoning model calls with tool/function calling support.\n * Uses OpenAI's native function calling for agentic workflows.\n */\n\nimport OpenAI from 'openai';\nimport { ReasoningConfig, ReasoningRequest, ReasoningResponse, ToolCall } from './types';\nimport * as Logging from '../logging';\n\nexport interface ToolCallRequest {\n messages: Array<{\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{ id: string; function: { name: string; arguments: string } }>;\n }>;\n tools?: Array<{\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n }>;\n}\n\nexport interface ToolCallResponse {\n content: string;\n tool_calls?: Array<{\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n finish_reason?: string;\n}\n\nexport interface ClientInstance {\n complete(request: ReasoningRequest): Promise<ReasoningResponse>;\n completeWithTools(request: ToolCallRequest): Promise<ToolCallResponse>;\n isReasoningModel(model: string): boolean;\n getModelFamily(model: string): 'openai' | 'anthropic' | 'gemini' | 'unknown';\n}\n\nexport const create = (config: ReasoningConfig): ClientInstance => {\n const logger = Logging.getLogger();\n \n // Lazy-initialize OpenAI client (only when actually needed)\n let client: OpenAI | null = null;\n const getClient = (): OpenAI => {\n if (!client) {\n client = new OpenAI({ apiKey: config.apiKey });\n }\n return client;\n };\n \n const getModelFamily = (model: string): 'openai' | 'anthropic' | 'gemini' | 'unknown' => {\n if (model.startsWith('gpt') || model.startsWith('o1') || model.startsWith('o3')) return 'openai';\n if (model.startsWith('claude')) return 'anthropic';\n if (model.startsWith('gemini')) return 'gemini';\n return 'unknown';\n };\n \n const isReasoningModel = (model: string): boolean => {\n // Models known for strong reasoning\n const reasoningModels = [\n 'gpt-4o', 'gpt-4-turbo', 'gpt-5', 'gpt-5-mini', 'gpt-5.1', 'gpt-5.2',\n 'o1', 'o1-mini', 'o1-preview', 'o3', 'o3-mini',\n 'claude-3-5-sonnet', 'claude-3-opus', 'claude-4',\n ];\n return reasoningModels.some(rm => model.includes(rm));\n };\n \n const supportsReasoningLevel = (model: string): boolean => {\n // Models that support reasoning_effort parameter\n const models = ['gpt-5.1', 'gpt-5.2', 'o1', 'o1-mini', 'o3', 'o3-mini'];\n return models.some(m => model.includes(m));\n };\n \n const complete = async (request: ReasoningRequest): Promise<ReasoningResponse> => {\n const startTime = Date.now();\n logger.debug('Reasoning request starting', { model: config.model });\n \n try {\n // Build messages for OpenAI\n const messages: Array<OpenAI.Chat.ChatCompletionMessageParam> = [];\n \n if (request.systemPrompt) {\n messages.push({ role: 'system', content: request.systemPrompt });\n }\n \n // Add the main prompt\n messages.push({ role: 'user', content: request.prompt });\n \n // Build tools if provided\n const tools: OpenAI.Chat.ChatCompletionTool[] | undefined = request.tools?.map(tool => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n \n // Build request options\n const requestOptions: Record<string, unknown> = {\n model: config.model,\n messages,\n tools: tools && tools.length > 0 ? tools : undefined,\n tool_choice: tools && tools.length > 0 ? 'auto' : undefined,\n };\n \n // Add reasoning_effort for models that support it (default to 'medium')\n if (supportsReasoningLevel(config.model)) {\n const reasoningLevel = config.reasoningLevel || 'medium';\n requestOptions.reasoning_effort = reasoningLevel;\n logger.debug('Using reasoning_effort: %s for model %s', reasoningLevel, config.model);\n }\n \n const response = await getClient().chat.completions.create(\n requestOptions as unknown as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n );\n \n const duration = Date.now() - startTime;\n logger.debug('Reasoning model responded in %dms', duration);\n \n const choice = response.choices[0];\n const message = choice.message;\n \n // Extract token usage\n const usage = response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined;\n \n // Extract tool calls if any\n const toolCalls: ToolCall[] | undefined = message.tool_calls?.map(tc => {\n // Handle both standard and custom tool call formats\n const fn = 'function' in tc ? tc.function : null;\n if (!fn) {\n return { id: tc.id, name: 'unknown', arguments: {} };\n }\n return {\n id: tc.id,\n name: fn.name,\n arguments: JSON.parse(fn.arguments),\n };\n });\n \n if (toolCalls && toolCalls.length > 0) {\n logger.debug('Model requested %d tool calls: %s', toolCalls.length, toolCalls.map(t => t.name).join(', '));\n }\n \n return {\n content: message.content || '',\n model: config.model,\n duration,\n usage,\n toolCalls,\n finishReason: choice.finish_reason,\n };\n } catch (error) {\n logger.error('Reasoning request failed', { error });\n throw error;\n }\n };\n \n const completeWithTools = async (request: ToolCallRequest): Promise<ToolCallResponse> => {\n logger.debug('Tool call request starting', { model: config.model, messageCount: request.messages.length });\n \n try {\n // Convert messages to OpenAI format\n const messages: Array<OpenAI.Chat.ChatCompletionMessageParam> = request.messages.map(msg => {\n if (msg.role === 'tool') {\n return {\n role: 'tool' as const,\n content: msg.content,\n tool_call_id: msg.tool_call_id || '',\n };\n }\n if (msg.role === 'assistant' && msg.tool_calls) {\n return {\n role: 'assistant' as const,\n content: msg.content || null,\n tool_calls: msg.tool_calls.map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: tc.function,\n })),\n };\n }\n return {\n role: msg.role as 'system' | 'user' | 'assistant',\n content: msg.content,\n };\n });\n \n // Build request options\n const requestOptions: Record<string, unknown> = {\n model: config.model,\n messages,\n tools: request.tools,\n tool_choice: request.tools && request.tools.length > 0 ? 'auto' : undefined,\n };\n \n // Add reasoning_effort for models that support it\n if (supportsReasoningLevel(config.model)) {\n requestOptions.reasoning_effort = config.reasoningLevel || 'medium';\n }\n \n const response = await getClient().chat.completions.create(\n requestOptions as unknown as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n );\n \n const choice = response.choices[0];\n const message = choice.message;\n \n // Extract tool calls if any\n const toolCalls = message.tool_calls?.map(tc => {\n // Handle both standard and custom tool call formats\n const fn = 'function' in tc ? tc.function : null;\n if (!fn) {\n return { id: tc.id, function: { name: 'unknown', arguments: '{}' } };\n }\n return {\n id: tc.id,\n function: {\n name: fn.name,\n arguments: fn.arguments,\n },\n };\n });\n \n if (toolCalls && toolCalls.length > 0) {\n logger.debug('Model requested %d tool calls: %s', toolCalls.length, toolCalls.map(t => t.function.name).join(', '));\n }\n \n return {\n content: message.content || '',\n tool_calls: toolCalls,\n finish_reason: choice.finish_reason,\n };\n } catch (error) {\n logger.error('Tool call request failed', { error });\n throw error;\n }\n };\n \n return {\n complete,\n completeWithTools,\n isReasoningModel,\n getModelFamily,\n };\n};\n","/**\n * Reasoning Strategy\n * \n * Strategy factory for different transcription processing approaches.\n * Uses riotprompt's IterationStrategyFactory for complex workflows.\n */\n\nimport { IterationStrategy, IterationStrategyFactory } from '@riotprompt/riotprompt';\nimport { ReasoningLevel } from './types';\n\nexport type TranscriptionStrategy = \n | 'simple' // Basic completion\n | 'investigate-then-respond' // Use tools to gather info, then respond\n | 'multi-pass' // Multiple refinement passes\n | 'adaptive'; // Changes based on complexity\n\nexport interface StrategyConfig {\n type: TranscriptionStrategy;\n maxIterations?: number;\n requireMinimumTools?: number;\n reasoningLevel?: ReasoningLevel;\n}\n\nexport const createStrategy = (config: StrategyConfig): IterationStrategy => {\n const maxIterations = config.maxIterations ?? getDefaultIterations(config.type);\n \n switch (config.type) {\n case 'simple':\n return IterationStrategyFactory.simple({\n maxIterations,\n allowTools: false,\n });\n \n case 'investigate-then-respond':\n return IterationStrategyFactory.investigateThenRespond({\n maxInvestigationSteps: Math.floor(maxIterations * 0.8),\n requireMinimumTools: config.requireMinimumTools ?? 2,\n finalSynthesis: true,\n });\n \n case 'multi-pass':\n return IterationStrategyFactory.multiPassRefinement({\n passes: 3,\n critiqueBetweenPasses: true,\n });\n \n case 'adaptive':\n return IterationStrategyFactory.adaptive({});\n \n default:\n return IterationStrategyFactory.simple({ maxIterations });\n }\n};\n\nconst getDefaultIterations = (type: TranscriptionStrategy): number => {\n switch (type) {\n case 'simple': return 1;\n case 'investigate-then-respond': return 15;\n case 'multi-pass': return 6;\n case 'adaptive': return 20;\n default: return 10;\n }\n};\n\nexport const getRecommendedStrategy = (\n transcriptLength: number,\n hasUnknownNames: boolean,\n complexity: 'low' | 'medium' | 'high'\n): TranscriptionStrategy => {\n // Short, simple transcripts\n if (transcriptLength < 500 && !hasUnknownNames && complexity === 'low') {\n return 'simple';\n }\n \n // Complex or with unknowns - need investigation\n if (hasUnknownNames || complexity === 'high') {\n return 'investigate-then-respond';\n }\n \n // Medium complexity - adaptive is good\n return 'adaptive';\n};\n\n","/**\n * Reasoning System\n * \n * Main entry point for the reasoning system. Provides a factory function\n * to create reasoning instances that can execute LLM calls with various\n * strategies using riotprompt.\n */\n\nimport { ReasoningConfig, ReasoningRequest, ReasoningResponse, ReasoningMetrics } from './types';\nimport * as Client from './client';\nimport * as Strategy from './strategy';\n\nexport interface ReasoningInstance {\n // Single completion\n complete(request: ReasoningRequest): Promise<ReasoningResponse>;\n \n // Multi-turn tool calling\n completeWithTools(request: Client.ToolCallRequest): Promise<Client.ToolCallResponse>;\n \n // Strategy-based execution\n executeWithStrategy(\n request: ReasoningRequest,\n strategyType: Strategy.TranscriptionStrategy\n ): Promise<ReasoningResponse & { metrics: ReasoningMetrics }>;\n \n // Model information\n isReasoningModel(model: string): boolean;\n getModelFamily(model: string): 'openai' | 'anthropic' | 'gemini' | 'unknown';\n \n // Strategy helpers\n getRecommendedStrategy(\n transcriptLength: number,\n hasUnknownNames: boolean,\n complexity: 'low' | 'medium' | 'high'\n ): Strategy.TranscriptionStrategy;\n}\n\nexport const create = (config: ReasoningConfig): ReasoningInstance => {\n const client = Client.create(config);\n \n return {\n complete: (request) => client.complete(request),\n completeWithTools: (request) => client.completeWithTools(request),\n \n executeWithStrategy: async (request, strategyType) => {\n // Create the strategy (for future use with full agentic execution)\n Strategy.createStrategy({\n type: strategyType,\n maxIterations: request.maxIterations,\n });\n \n // For now, simple execution\n // Full strategy execution will be implemented in Step 05 (Agentic)\n const response = await client.complete(request);\n \n return {\n ...response,\n metrics: {\n iterations: 1,\n toolCallsExecuted: response.toolCalls?.length ?? 0,\n totalDuration: response.duration ?? 0,\n tokensUsed: response.usage?.totalTokens ?? 0,\n },\n };\n },\n \n isReasoningModel: client.isReasoningModel,\n getModelFamily: client.getModelFamily,\n getRecommendedStrategy: Strategy.getRecommendedStrategy,\n };\n};\n\n// Re-export types\nexport * from './types';\nexport type { TranscriptionStrategy, StrategyConfig } from './strategy';\n\n","/**\n * Lookup Person Tool\n * \n * Looks up information about a person mentioned in the transcript.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\n/**\n * Extract context from transcript around where a name is mentioned.\n * Returns approximately one sentence before and after the name mention.\n */\nfunction extractNameContext(transcript: string, name: string): string | null {\n // Case-insensitive search for the name\n const lowerTranscript = transcript.toLowerCase();\n const lowerName = name.toLowerCase();\n const index = lowerTranscript.indexOf(lowerName);\n \n if (index === -1) {\n return null;\n }\n \n // Define strong sentence boundaries (., !, ?)\n const sentenceBoundary = /[.!?]/;\n \n // Look backwards for the start (find the sentence boundary 1 sentence before)\n let startIndex = 0;\n let boundariesFound = 0;\n for (let i = index - 1; i >= 0; i--) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence), \n // keep looking for the second (end of previous sentence)\n if (boundariesFound === 2) {\n // Start after this boundary\n startIndex = i + 1;\n break;\n }\n }\n }\n \n // Look forwards for the end (find sentence boundary 1 sentence after)\n let endIndex = transcript.length;\n boundariesFound = 0;\n for (let i = index + name.length; i < transcript.length; i++) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence),\n // keep looking for the second (end of next sentence)\n if (boundariesFound === 2) {\n // Include this boundary\n endIndex = i + 1;\n break;\n }\n }\n }\n \n // Extract and clean up the context\n let context = transcript.substring(startIndex, endIndex).trim();\n \n // Limit length to avoid overwhelming the prompt (max ~300 chars)\n if (context.length > 300) {\n // Try to cut at a sentence boundary\n const midPoint = context.indexOf(name);\n if (midPoint !== -1) {\n // Keep the sentence with the name, trim around it\n let sentenceStart = midPoint;\n let sentenceEnd = midPoint + name.length;\n \n // Find sentence start\n for (let i = midPoint - 1; i >= 0; i--) {\n if (sentenceBoundary.test(context[i])) {\n sentenceStart = i + 1;\n break;\n }\n }\n \n // Find sentence end\n for (let i = midPoint + name.length; i < context.length; i++) {\n if (sentenceBoundary.test(context[i])) {\n sentenceEnd = i + 1;\n break;\n }\n }\n \n context = context.substring(sentenceStart, sentenceEnd).trim();\n } else {\n // Just truncate if name not found in extracted context\n context = context.substring(0, 300) + '...';\n }\n }\n \n return context;\n}\n\nexport const create = (ctx: ToolContext): TranscriptionTool => ({\n name: 'lookup_person',\n description: 'Look up information about a person mentioned in the transcript. Use when you encounter a name that might need spelling verification or additional context.',\n parameters: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'The name to look up (as heard in transcript)',\n },\n phonetic: {\n type: 'string',\n description: 'How the name sounds (for alias matching)',\n },\n },\n required: ['name'],\n },\n execute: async (args: { name: string; phonetic?: string }): Promise<ToolResult> => {\n const context = ctx.contextInstance;\n \n // First, check if this person was already resolved in this session\n if (ctx.resolvedEntities?.has(args.name)) {\n const resolvedName = ctx.resolvedEntities.get(args.name);\n return {\n success: true,\n data: {\n found: true,\n suggestion: `Already resolved: use \"${resolvedName}\"`,\n cached: true,\n },\n };\n }\n \n // Try direct name search\n const people = context.search(args.name);\n const personMatches = people.filter(e => e.type === 'person');\n \n if (personMatches.length > 0) {\n return {\n success: true,\n data: {\n found: true,\n person: personMatches[0],\n suggestion: `Use \"${personMatches[0].name}\" for correct spelling`,\n },\n };\n }\n \n // Try phonetic match (sounds_like)\n if (args.phonetic) {\n const person = context.findBySoundsLike(args.phonetic);\n if (person) {\n return {\n success: true,\n data: {\n found: true,\n person,\n suggestion: `\"${args.phonetic}\" likely refers to \"${person.name}\"`,\n },\n };\n }\n }\n \n // Not found - always signal that we need user input\n // The executor will decide whether to actually prompt based on handler availability\n const allProjects = context.getAllProjects();\n const projectOptions = allProjects\n .filter(p => p.active !== false)\n .map(p => `${p.name}${p.description ? ` - ${p.description}` : ''}`);\n \n // Extract filename from sourceFile path for cleaner display\n const fileName = ctx.sourceFile.split('/').pop() || ctx.sourceFile;\n const fileDate = ctx.audioDate.toLocaleString('en-US', {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n \n // Find context from transcript where the name is mentioned\n const transcriptContext = extractNameContext(ctx.transcriptText, args.name);\n \n const promptLines = [\n `File: ${fileName}`,\n `Date: ${fileDate}`,\n '',\n `Unknown person mentioned: \"${args.name}\"`,\n ];\n \n if (transcriptContext) {\n promptLines.push('');\n promptLines.push('Context from transcript:');\n promptLines.push(`\"${transcriptContext}\"`);\n }\n \n return {\n success: true,\n needsUserInput: true,\n userPrompt: promptLines.join('\\n'),\n data: {\n found: false,\n clarificationType: 'new_person',\n term: args.name,\n message: `Person \"${args.name}\" not found. Asking user for details.`,\n knownProjects: allProjects.filter(p => p.active !== false),\n options: projectOptions,\n },\n };\n },\n});\n\n","/**\n * Lookup Project Tool\n * \n * Looks up project information for routing and context.\n * Prompts to create unknown projects when user input is available.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\n/**\n * Extract context from transcript around where a term is mentioned.\n * Returns approximately one sentence before and after the term mention.\n */\nfunction extractTermContext(transcript: string, term: string): string | null {\n // Case-insensitive search for the term\n const lowerTranscript = transcript.toLowerCase();\n const lowerTerm = term.toLowerCase();\n const index = lowerTranscript.indexOf(lowerTerm);\n \n if (index === -1) {\n return null;\n }\n \n // Define strong sentence boundaries (., !, ?)\n const sentenceBoundary = /[.!?]/;\n \n // Look backwards for the start (find the sentence boundary 1 sentence before)\n let startIndex = 0;\n let boundariesFound = 0;\n for (let i = index - 1; i >= 0; i--) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence), \n // keep looking for the second (end of previous sentence)\n if (boundariesFound === 2) {\n // Start after this boundary\n startIndex = i + 1;\n break;\n }\n }\n }\n \n // Look forwards for the end (find sentence boundary 1 sentence after)\n let endIndex = transcript.length;\n boundariesFound = 0;\n for (let i = index + term.length; i < transcript.length; i++) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence),\n // keep looking for the second (end of next sentence)\n if (boundariesFound === 2) {\n // Include this boundary\n endIndex = i + 1;\n break;\n }\n }\n }\n \n // Extract and clean up the context\n let context = transcript.substring(startIndex, endIndex).trim();\n \n // Limit length to avoid overwhelming the prompt (max ~300 chars)\n if (context.length > 300) {\n // Try to cut at a sentence boundary\n const midPoint = context.indexOf(term);\n if (midPoint !== -1) {\n // Keep the sentence with the term, trim around it\n let sentenceStart = midPoint;\n let sentenceEnd = midPoint + term.length;\n \n // Find sentence start\n for (let i = midPoint - 1; i >= 0; i--) {\n if (sentenceBoundary.test(context[i])) {\n sentenceStart = i + 1;\n break;\n }\n }\n \n // Find sentence end\n for (let i = midPoint + term.length; i < context.length; i++) {\n if (sentenceBoundary.test(context[i])) {\n sentenceEnd = i + 1;\n break;\n }\n }\n \n context = context.substring(sentenceStart, sentenceEnd).trim();\n } else {\n // Just truncate if term not found in extracted context\n context = context.substring(0, 300) + '...';\n }\n }\n \n return context;\n}\n\nexport const create = (ctx: ToolContext): TranscriptionTool => ({\n name: 'lookup_project',\n description: 'Look up project information for routing and context. Use when you need to determine where this note should be filed.',\n parameters: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'The project name or identifier',\n },\n triggerPhrase: {\n type: 'string',\n description: 'A phrase from the transcript that might indicate the project',\n },\n },\n required: ['name'],\n },\n execute: async (args: { name: string; triggerPhrase?: string }): Promise<ToolResult> => {\n const context = ctx.contextInstance;\n \n // First, check if this project/term was already resolved in this session\n if (ctx.resolvedEntities?.has(args.name)) {\n const resolvedName = ctx.resolvedEntities.get(args.name);\n return {\n success: true,\n data: {\n found: true,\n suggestion: `Already resolved: use \"${resolvedName}\"`,\n cached: true,\n },\n };\n }\n \n // Check if this term is on the ignore list\n if (context.isIgnored(args.name)) {\n return {\n success: true,\n data: {\n found: false,\n ignored: true,\n message: `\"${args.name}\" is on the ignore list - skipping without prompting`,\n },\n };\n }\n \n // Try to determine context from routing instance if available\n let contextProjectId: string | undefined;\n if (ctx.routingInstance) {\n const allProjects = context.getAllProjects();\n // Use the first active project as a context hint (could be improved)\n const activeProject = allProjects.find(p => p.active !== false);\n contextProjectId = activeProject?.id;\n }\n \n // Use context-aware search (prefers related projects)\n const searchResults = context.searchWithContext(args.name, contextProjectId);\n const projectMatches = searchResults.filter(e => e.type === 'project');\n const termMatches = searchResults.filter(e => e.type === 'term');\n \n if (projectMatches.length > 0) {\n const project = projectMatches[0];\n return {\n success: true,\n data: {\n found: true,\n project,\n matchedVia: 'context_aware_search',\n },\n };\n }\n \n // Check if we found a term that's associated with projects\n if (termMatches.length > 0) {\n const term = termMatches[0];\n const termProjects = term.projects || [];\n \n if (termProjects.length > 0) {\n // Get the first associated project\n const allProjects = context.getAllProjects();\n const associatedProject = allProjects.find(p => p.id === termProjects[0]);\n \n if (associatedProject) {\n return {\n success: true,\n data: {\n found: true,\n project: associatedProject,\n matchedVia: 'term',\n termName: term.name,\n },\n };\n }\n }\n }\n \n // Try findBySoundsLike as a fallback for exact phonetic matches\n const soundsLikeMatch = context.findBySoundsLike(args.name);\n if (soundsLikeMatch) {\n if (soundsLikeMatch.type === 'project') {\n return {\n success: true,\n data: {\n found: true,\n project: soundsLikeMatch,\n matchedVia: 'sounds_like',\n },\n };\n } else if (soundsLikeMatch.type === 'term') {\n const termProjects = soundsLikeMatch.projects || [];\n \n if (termProjects.length > 0) {\n const allProjects = context.getAllProjects();\n const associatedProject = allProjects.find(p => p.id === termProjects[0]);\n \n if (associatedProject) {\n return {\n success: true,\n data: {\n found: true,\n project: associatedProject,\n matchedVia: 'term_sounds_like',\n termName: soundsLikeMatch.name,\n },\n };\n }\n }\n }\n }\n \n // Try getting all projects and matching trigger phrases\n if (args.triggerPhrase) {\n const allProjects = context.getAllProjects();\n for (const project of allProjects) {\n const phrases = project.classification?.explicit_phrases ?? [];\n if (phrases.some(p => args.triggerPhrase?.toLowerCase().includes(p.toLowerCase()))) {\n return {\n success: true,\n data: {\n found: true,\n project,\n matchedTrigger: args.triggerPhrase,\n },\n };\n }\n }\n }\n \n // Project not found - always signal that we need user input\n // The executor will decide whether to actually prompt based on handler availability\n const allProjects = context.getAllProjects();\n const projectOptions = allProjects\n .filter(p => p.active !== false)\n .map(p => `${p.name}${p.description ? ` - ${p.description}` : ''}`);\n \n // Extract filename from sourceFile path for cleaner display\n const fileName = ctx.sourceFile.split('/').pop() || ctx.sourceFile;\n const fileDate = ctx.audioDate.toLocaleString('en-US', {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n \n // Find context from transcript where the project/term is mentioned\n const transcriptContext = extractTermContext(ctx.transcriptText, args.name);\n \n const contextLines = [\n `File: ${fileName}`,\n `Date: ${fileDate}`,\n '',\n `Unknown project/term: \"${args.name}\"`,\n ];\n \n if (transcriptContext) {\n contextLines.push('');\n contextLines.push('Context from transcript:');\n contextLines.push(`\"${transcriptContext}\"`);\n } else if (args.triggerPhrase) {\n contextLines.push('');\n contextLines.push('Context from transcript:');\n contextLines.push(`\"${args.triggerPhrase}\"`);\n }\n \n return {\n success: true,\n needsUserInput: true,\n userPrompt: contextLines.join('\\n'),\n data: {\n found: false,\n clarificationType: 'new_project',\n term: args.name,\n triggerPhrase: args.triggerPhrase,\n message: `Project \"${args.name}\" not found. Asking user if this is a new project.`,\n knownProjects: allProjects.filter(p => p.active !== false),\n options: projectOptions,\n },\n };\n },\n});\n\n","/**\n * Verify Spelling Tool\n * \n * Requests user verification for an unknown name or term.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\nexport const create = (ctx: ToolContext): TranscriptionTool => ({\n name: 'verify_spelling',\n description: 'Request user verification for an unknown name or term. Use when you encounter something that needs human confirmation.',\n parameters: {\n type: 'object',\n properties: {\n term: {\n type: 'string',\n description: 'The term that needs verification',\n },\n context: {\n type: 'string',\n description: 'Context around where this term appears',\n },\n suggestedSpelling: {\n type: 'string',\n description: 'Your best guess at the correct spelling',\n },\n },\n required: ['term'],\n },\n execute: async (args: { term: string; context?: string; suggestedSpelling?: string }): Promise<ToolResult> => {\n if (!ctx.interactiveMode) {\n // In batch mode, return best guess\n return {\n success: true,\n data: {\n verified: false,\n useSuggestion: true,\n spelling: args.suggestedSpelling || args.term,\n message: 'Non-interactive mode: using best guess',\n },\n };\n }\n \n // In interactive mode, mark for user input\n return {\n success: true,\n needsUserInput: true,\n userPrompt: `Unknown term: \"${args.term}\"${args.context ? ` (context: \"${args.context}\")` : ''}\n${args.suggestedSpelling ? `Suggested spelling: \"${args.suggestedSpelling}\"` : ''}\nPlease provide the correct spelling:`,\n data: {\n term: args.term,\n suggestedSpelling: args.suggestedSpelling,\n },\n };\n },\n});\n\n","/**\n * Route Note Tool\n * \n * Determines the destination for a note based on content analysis.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\nexport const create = (ctx: ToolContext): TranscriptionTool => ({\n name: 'route_note',\n description: 'Determine the destination for this note based on content analysis.',\n parameters: {\n type: 'object',\n properties: {\n projectHint: {\n type: 'string',\n description: 'The detected project name or hint',\n },\n contentSummary: {\n type: 'string',\n description: 'Brief summary of what the note is about',\n },\n },\n },\n execute: async (args: { projectHint?: string; contentSummary?: string }): Promise<ToolResult> => {\n const routing = ctx.routingInstance;\n \n const routingContext = {\n transcriptText: ctx.transcriptText,\n audioDate: ctx.audioDate,\n sourceFile: ctx.sourceFile,\n };\n \n const decision = routing.route(routingContext);\n const outputPath = routing.buildOutputPath(decision, routingContext);\n \n return {\n success: true,\n data: {\n projectId: decision.projectId,\n // Return the routing decision (base path + structure), NOT the built output path\n // The orchestrator will call buildOutputPath() later\n routingDecision: decision,\n // Also include the built path for informational purposes\n outputPath: outputPath,\n confidence: decision.confidence,\n reasoning: decision.reasoning,\n projectHint: args.projectHint,\n contentSummary: args.contentSummary,\n },\n };\n },\n});\n\n","/**\n * Store Context Tool\n * \n * Stores new context information for future use.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\nexport const create = (_ctx: ToolContext): TranscriptionTool => ({\n name: 'store_context',\n description: 'Store new context information for future use. Use when you learn something new that should be remembered.',\n parameters: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'project', 'company', 'term'],\n description: 'Type of entity to store',\n },\n name: {\n type: 'string',\n description: 'Name of the entity',\n },\n details: {\n type: 'object',\n description: 'Additional details about the entity',\n },\n },\n required: ['entityType', 'name'],\n },\n \n execute: async (args: { entityType: string; name: string; details?: any }): Promise<ToolResult> => {\n // This tool requires --self-update flag to actually persist\n // Otherwise it just acknowledges without saving\n \n return {\n success: true,\n data: {\n stored: false,\n message: 'Context storage requires --self-update flag. Information noted but not persisted.',\n entityType: args.entityType,\n name: args.name,\n },\n };\n },\n});\n\n","/**\n * Tool Registry\n * \n * Manages available tools for agentic transcription.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from './types';\nimport * as LookupPerson from './tools/lookup-person';\nimport * as LookupProject from './tools/lookup-project';\nimport * as VerifySpelling from './tools/verify-spelling';\nimport * as RouteNote from './tools/route-note';\nimport * as StoreContext from './tools/store-context';\n\nexport interface RegistryInstance {\n getTools(): TranscriptionTool[];\n \n getToolDefinitions(): any[]; // For LLM API format\n \n executeTool(name: string, args: any): Promise<ToolResult>;\n}\n\nexport const create = (ctx: ToolContext): RegistryInstance => {\n const tools: TranscriptionTool[] = [\n LookupPerson.create(ctx),\n LookupProject.create(ctx),\n VerifySpelling.create(ctx),\n RouteNote.create(ctx),\n StoreContext.create(ctx),\n ];\n \n const toolMap = new Map(tools.map(t => [t.name, t]));\n \n return {\n getTools: () => tools,\n \n // Return flat tool definitions - reasoning client handles OpenAI formatting\n getToolDefinitions: () => tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n })),\n \n \n executeTool: async (name: string, args: any): Promise<ToolResult> => {\n const tool = toolMap.get(name);\n if (!tool) {\n return {\n success: false,\n error: `Unknown tool: ${name}`,\n };\n }\n return tool.execute(args);\n },\n };\n};\n\n","/**\n * Agentic Executor\n * \n * Executes the agentic transcription loop with tool calls.\n * Maintains conversation history for multi-turn tool usage.\n */\n\nimport { ToolContext, TranscriptionState } from './types';\nimport * as Registry from './registry';\nimport * as Reasoning from '../reasoning';\nimport * as Logging from '../logging';\n\nexport interface ContextChangeRecord {\n entityType: 'person' | 'project' | 'company' | 'term' | 'ignored';\n entityId: string;\n entityName: string;\n action: 'created' | 'updated';\n details?: Record<string, unknown>;\n}\n\nexport interface ExecutorInstance {\n process(transcriptText: string): Promise<{\n enhancedText: string;\n state: TranscriptionState;\n toolsUsed: string[];\n iterations: number;\n totalTokens?: number;\n contextChanges?: ContextChangeRecord[];\n }>;\n}\n\n// Message types for conversation history\ninterface ConversationMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{ id: string; name: string; arguments: Record<string, unknown> }>;\n}\n\n/**\n * Clean response content by removing any leaked internal processing information\n * that should never appear in the user-facing transcript.\n */\nconst cleanResponseContent = (content: string): string => {\n // Remove common patterns of leaked internal processing\n // Pattern 1: \"Using tools to...\" type commentary\n let cleaned = content.replace(/^(?:Using tools?|Let me|I'll|I will|Now I'll|First,?\\s*I(?:'ll| will)).*?[\\r\\n]+/gim, '');\n \n // Pattern 2: JSON tool call artifacts like {\"tool\":\"...\",\"input\":{...}}\n cleaned = cleaned.replace(/\\{\"tool\":\\s*\"[^\"]+\",\\s*\"input\":\\s*\\{[^}]*\\}\\}/g, '');\n \n // Pattern 3: Tool call references in the format tool_name({...})\n cleaned = cleaned.replace(/\\b\\w+_\\w+\\(\\{[^}]*\\}\\)/g, '');\n \n // Pattern 4: Lines that are purely reasoning/commentary before the actual content\n // Look for lines like \"I'll verify...\", \"Checking...\", etc.\n const lines = cleaned.split('\\n');\n let startIndex = 0;\n \n // Skip leading lines that look like internal commentary\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n \n // Skip empty lines\n if (line === '') continue;\n \n // Check if line looks like commentary (starts with action verbs, contains \"tool\", etc.)\n const isCommentary = /^(checking|verifying|looking|searching|analyzing|processing|determining|using|calling|executing|I'm|I am|Let me)/i.test(line)\n || line.includes('tool')\n || line.includes('{\"')\n || line.includes('reasoning');\n \n if (!isCommentary) {\n // This looks like actual content - start from here\n startIndex = i;\n break;\n }\n }\n \n // Rejoin from the first real content line\n if (startIndex > 0) {\n cleaned = lines.slice(startIndex).join('\\n');\n }\n \n return cleaned.trim();\n};\n\nexport const create = (\n reasoning: Reasoning.ReasoningInstance,\n ctx: ToolContext\n): ExecutorInstance => {\n const logger = Logging.getLogger();\n const registry = Registry.create(ctx);\n \n const process = async (transcriptText: string) => {\n const state: TranscriptionState = {\n originalText: transcriptText,\n correctedText: transcriptText,\n unknownEntities: [],\n resolvedEntities: new Map(),\n referencedEntities: {\n people: new Set(),\n projects: new Set(),\n terms: new Set(),\n companies: new Set(),\n },\n confidence: 0,\n };\n \n // Make resolvedEntities available to tools so they can avoid re-asking\n ctx.resolvedEntities = state.resolvedEntities;\n \n const toolsUsed: string[] = [];\n const contextChanges: ContextChangeRecord[] = [];\n let iterations = 0;\n let totalTokens = 0;\n const maxIterations = 15;\n \n // Conversation history for multi-turn\n const conversationHistory: ConversationMessage[] = [];\n \n // Build the system prompt\n const systemPrompt = `You are an intelligent transcription assistant. Your job is to:\n1. Analyze the transcript for names, projects, and companies\n2. Use the available tools to verify spellings and gather context\n3. Correct any misheard names or terms\n4. Determine the appropriate destination for this note\n5. Produce a clean, accurate Markdown transcript\n\nCRITICAL RULES:\n- This is NOT a summary. Preserve ALL content from the original transcript.\n- Only fix obvious transcription errors like misheard names.\n- When you have finished processing, output the COMPLETE corrected transcript as Markdown.\n- Do NOT say you don't have the transcript - it's in the conversation history.\n\nOUTPUT REQUIREMENTS - EXTREMELY IMPORTANT:\n- Your final response MUST contain ONLY the corrected transcript text.\n- DO NOT include any commentary like \"Using tools to...\" or \"Let me verify...\".\n- DO NOT include any explanations about what you're doing or have done.\n- DO NOT include any tool call information or JSON in your response.\n- DO NOT include any reasoning or processing notes.\n- Your output will be inserted directly into the user-facing document.\n- If you need to use tools, use them silently - don't narrate what you're doing.\n\nAvailable tools:\n- lookup_person: Find information about people (use for any name that might be misspelled)\n- lookup_project: Find project routing information \n- verify_spelling: Ask user about unknown terms (if interactive mode)\n- route_note: Determine where to file this note\n- store_context: Remember new information for future use`;\n\n // Add system message to history\n conversationHistory.push({ role: 'system', content: systemPrompt });\n \n // Add the initial user message with transcript\n const initialPrompt = `Here is the raw transcript to process:\n\n--- BEGIN TRANSCRIPT ---\n${transcriptText}\n--- END TRANSCRIPT ---\n\nPlease:\n1. Identify any names, companies, or technical terms that might be misspelled\n2. Use the lookup_person tool to verify spelling of any names you find\n3. Use route_note to determine the destination\n4. Then output the COMPLETE corrected transcript as clean Markdown\n\nCRITICAL: Your response must contain ONLY the transcript text - no commentary, no explanations, no tool information.\nRemember: preserve ALL content, only fix transcription errors.`;\n\n conversationHistory.push({ role: 'user', content: initialPrompt });\n\n try {\n // Initial reasoning call\n logger.debug('Starting agentic transcription - analyzing for names and routing...');\n let response = await reasoning.complete({\n systemPrompt,\n prompt: initialPrompt,\n tools: registry.getToolDefinitions(),\n maxIterations,\n });\n \n // Track token usage\n if (response.usage) {\n totalTokens += response.usage.totalTokens;\n }\n \n // Add assistant response to history\n conversationHistory.push({ \n role: 'assistant', \n content: response.content,\n tool_calls: response.toolCalls?.map(tc => ({\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n })),\n });\n \n // Iterative tool use loop\n while (response.toolCalls && response.toolCalls.length > 0 && iterations < maxIterations) {\n iterations++;\n logger.debug('Iteration %d: Processing %d tool calls...', iterations, response.toolCalls.length);\n \n // Collect tool results\n const toolResults: Array<{ id: string; name: string; result: string }> = [];\n \n // Execute each tool call\n for (const toolCall of response.toolCalls) {\n logger.debug('Executing tool: %s', toolCall.name);\n toolsUsed.push(toolCall.name);\n \n try {\n const result = await registry.executeTool(toolCall.name, toolCall.arguments);\n \n // Format result for the model\n const resultStr = JSON.stringify(result.data || { success: result.success, message: result.error || 'OK' });\n toolResults.push({ id: toolCall.id, name: toolCall.name, result: resultStr });\n \n logger.debug('Tool %s result: %s', toolCall.name, result.success ? 'success' : 'failed');\n \n // Handle results that need user input\n // Check if interactive handler is available (not gated by interactiveMode flag)\n if (result.needsUserInput && ctx.interactiveInstance) {\n logger.info('Interactive: %s requires clarification', toolCall.name);\n \n const termName = String(toolCall.arguments.name || toolCall.arguments.term || '');\n \n const clarification = await ctx.interactiveInstance.handleClarification({\n type: result.data?.clarificationType || 'general',\n term: result.data?.term || termName,\n context: result.userPrompt || '',\n suggestion: result.data?.suggestion,\n options: result.data?.options,\n });\n \n if (clarification.response) {\n state.resolvedEntities.set(termName, clarification.response);\n logger.info('Clarified: %s -> %s', termName, clarification.response);\n \n // Handle new project/term wizard response\n if (result.data?.clarificationType === 'new_project' && clarification.additionalInfo) {\n const wizardResult = clarification.additionalInfo as {\n action: 'create' | 'link' | 'term' | 'skip' | 'ignore';\n projectName?: string;\n destination?: string;\n description?: string;\n linkedProjectIndex?: number;\n linkedTermName?: string;\n aliasName?: string;\n termDescription?: string;\n // For 'term' action\n termName?: string;\n termExpansion?: string;\n termProjects?: number[];\n // For nested project creation from term wizard\n createdProject?: {\n action: 'create' | 'link' | 'skip';\n projectName?: string;\n destination?: string;\n description?: string;\n };\n // For 'ignore' action\n ignoredTerm?: string;\n };\n \n const knownProjects = result.data?.knownProjects as Array<{\n id: string;\n name: string;\n description?: string;\n classification?: { explicit_phrases?: string[]; context_type?: string };\n routing?: { destination: string; structure?: string; filename_options?: string[] };\n }> | undefined;\n \n if (wizardResult.action === 'create') {\n // CREATE NEW PROJECT\n const projectName = wizardResult.projectName || termName;\n const projectId = projectName.toLowerCase().replace(/\\s+/g, '-');\n const projectDestination = wizardResult.destination;\n \n const newProject = {\n id: projectId,\n name: projectName,\n type: 'project' as const,\n description: wizardResult.description || `Project for \"${projectName}\"`,\n classification: {\n context_type: 'work' as const,\n explicit_phrases: [termName.toLowerCase(), projectName.toLowerCase()].filter((v, i, a) => a.indexOf(v) === i),\n },\n routing: {\n // Only include destination if explicitly provided - otherwise uses global default\n ...(projectDestination && { destination: projectDestination }),\n structure: 'month' as const,\n filename_options: ['date', 'time', 'subject'] as Array<'date' | 'time' | 'subject'>,\n },\n active: true,\n };\n \n try {\n await ctx.contextInstance.saveEntity(newProject);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Created new project: %s%s', projectName, projectDestination ? ` -> ${projectDestination}` : ' (using default destination)');\n \n contextChanges.push({\n entityType: 'project',\n entityId: projectId,\n entityName: projectName,\n action: 'created',\n details: {\n ...(projectDestination && { destination: projectDestination }),\n description: wizardResult.description,\n triggeredByTerm: termName,\n },\n });\n \n // Update routing if destination was specified\n if (projectDestination) {\n state.routeDecision = {\n projectId,\n destination: { path: projectDestination, structure: 'month' },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: termName, weight: 1.0 }],\n reasoning: `User created new project \"${projectName}\" routing to ${projectDestination}`,\n };\n }\n } catch (error) {\n logger.warn('Failed to save new project: %s', error);\n }\n \n } else if (wizardResult.action === 'link' && wizardResult.linkedTermName) {\n // LINK AS ALIAS TO EXISTING TERM\n const existingTermName = wizardResult.linkedTermName;\n const aliasVariant = wizardResult.aliasName || termName;\n \n // Search for the existing term\n const termSearch = await ctx.contextInstance.search(existingTermName);\n const existingTerm = termSearch.find(e => e.type === 'term' && \n e.name.toLowerCase() === existingTermName.toLowerCase());\n \n if (existingTerm) {\n // Add the new variant to sounds_like\n const existingVariants = (existingTerm as { sounds_like?: string[] }).sounds_like || [];\n const updatedVariants = [...existingVariants, aliasVariant.toLowerCase()]\n .filter((v, i, a) => a.indexOf(v) === i); // dedupe\n \n const updatedTerm = {\n ...existingTerm,\n type: 'term' as const,\n sounds_like: updatedVariants,\n };\n \n try {\n await ctx.contextInstance.saveEntity(updatedTerm);\n await ctx.contextInstance.reload();\n logger.info('Added alias \"%s\" to existing term \"%s\"', aliasVariant, existingTerm.name);\n \n // Mark as resolved\n state.resolvedEntities.set(termName, existingTerm.name);\n state.resolvedEntities.set(aliasVariant, existingTerm.name);\n \n contextChanges.push({\n entityType: 'term',\n entityId: existingTerm.id,\n entityName: existingTerm.name,\n action: 'updated',\n details: {\n addedAlias: aliasVariant,\n sounds_like: updatedVariants,\n },\n });\n \n // If term has associated projects, use for routing\n const termProjects = (existingTerm as { projects?: string[] }).projects || [];\n if (termProjects.length > 0) {\n const allProjects = ctx.contextInstance.getAllProjects();\n const primaryProject = allProjects.find(p => p.id === termProjects[0]);\n if (primaryProject?.routing?.destination) {\n state.routeDecision = {\n projectId: primaryProject.id,\n destination: {\n path: primaryProject.routing.destination,\n structure: 'month'\n },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: existingTerm.name, weight: 1.0 }],\n reasoning: `User linked \"${aliasVariant}\" as alias for term \"${existingTerm.name}\" associated with project \"${primaryProject.name}\"`,\n };\n }\n }\n } catch (error) {\n logger.warn('Failed to add alias to existing term: %s', error);\n }\n } else {\n logger.warn('Could not find existing term \"%s\" to link alias', existingTermName);\n }\n \n } else if (wizardResult.action === 'link' && typeof wizardResult.linkedProjectIndex === 'number') {\n // LINK TO EXISTING PROJECT\n if (knownProjects && wizardResult.linkedProjectIndex < knownProjects.length) {\n const linkedProject = knownProjects[wizardResult.linkedProjectIndex];\n \n // Add the term as an alias\n const existingPhrases = linkedProject.classification?.explicit_phrases || [];\n const updatedPhrases = [...existingPhrases, termName.toLowerCase()]\n .filter((v, i, a) => a.indexOf(v) === i); // dedupe\n \n const updatedProject = {\n ...linkedProject,\n type: 'project' as const,\n // Add term description to project notes if provided\n notes: wizardResult.termDescription \n ? `${linkedProject.description || ''}\\n\\n${termName}: ${wizardResult.termDescription}`.trim()\n : linkedProject.description,\n classification: {\n ...linkedProject.classification,\n context_type: (linkedProject.classification?.context_type || 'work') as 'work' | 'personal' | 'mixed',\n explicit_phrases: updatedPhrases,\n },\n routing: {\n // Preserve existing destination (or omit if not set)\n ...(linkedProject.routing?.destination && { destination: linkedProject.routing.destination }),\n structure: (linkedProject.routing?.structure || 'month') as 'none' | 'year' | 'month' | 'day',\n filename_options: (linkedProject.routing?.filename_options || ['date', 'time']) as Array<'date' | 'time' | 'subject'>,\n },\n };\n \n try {\n await ctx.contextInstance.saveEntity(updatedProject);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Linked \"%s\" to project \"%s\"', termName, linkedProject.name);\n \n contextChanges.push({\n entityType: 'project',\n entityId: linkedProject.id,\n entityName: linkedProject.name,\n action: 'updated',\n details: {\n addedAlias: termName,\n termDescription: wizardResult.termDescription,\n explicit_phrases: updatedPhrases,\n },\n });\n \n // Update routing to use the linked project\n if (linkedProject.routing?.destination) {\n state.routeDecision = {\n projectId: linkedProject.id,\n destination: { \n path: linkedProject.routing.destination, \n structure: 'month' \n },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: termName, weight: 1.0 }],\n reasoning: `User linked \"${termName}\" to existing project \"${linkedProject.name}\"`,\n };\n }\n } catch (error) {\n logger.warn('Failed to update project with alias: %s', error);\n }\n }\n } else if (wizardResult.action === 'term') {\n // CREATE NEW TERM ENTITY\n const termNameFinal = wizardResult.termName || termName;\n const termId = termNameFinal.toLowerCase().replace(/\\s+/g, '-');\n \n // Get project IDs from indices\n const projectIds: string[] = [];\n if (wizardResult.termProjects && knownProjects) {\n for (const idx of wizardResult.termProjects) {\n if (idx >= 0 && idx < knownProjects.length) {\n projectIds.push(knownProjects[idx].id);\n }\n }\n }\n \n // Handle nested project creation from term wizard\n if (wizardResult.createdProject?.action === 'create' && wizardResult.createdProject.projectName) {\n const projectName = wizardResult.createdProject.projectName;\n const projectId = projectName.toLowerCase().replace(/\\s+/g, '-');\n const projectDestination = wizardResult.createdProject.destination;\n \n const newProject = {\n id: projectId,\n name: projectName,\n type: 'project' as const,\n description: wizardResult.createdProject.description || `Project for \"${projectName}\"`,\n classification: {\n context_type: 'work' as const,\n explicit_phrases: [projectName.toLowerCase(), termNameFinal.toLowerCase()].filter((v, i, a) => a.indexOf(v) === i),\n },\n routing: {\n // Only include destination if explicitly provided - otherwise uses global default\n ...(projectDestination && { destination: projectDestination }),\n structure: 'month' as const,\n filename_options: ['date', 'time', 'subject'] as Array<'date' | 'time' | 'subject'>,\n },\n active: true,\n };\n \n try {\n await ctx.contextInstance.saveEntity(newProject);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Created new project from term wizard: %s%s', projectName, projectDestination ? ` -> ${projectDestination}` : ' (using default destination)');\n \n // Add the new project to the projectIds list for term association\n projectIds.push(projectId);\n \n contextChanges.push({\n entityType: 'project',\n entityId: projectId,\n entityName: projectName,\n action: 'created',\n details: {\n ...(projectDestination && { destination: projectDestination }),\n description: wizardResult.createdProject.description,\n createdForTerm: termNameFinal,\n },\n });\n \n // Update routing to use the new project (if destination was specified)\n if (projectDestination) {\n state.routeDecision = {\n projectId,\n destination: { path: projectDestination, structure: 'month' },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: termNameFinal, weight: 1.0 }],\n reasoning: `User created project \"${projectName}\" for term \"${termNameFinal}\"`,\n };\n }\n } catch (error) {\n logger.warn('Failed to save new project from term wizard: %s', error);\n }\n }\n \n const newTerm = {\n id: termId,\n name: termNameFinal,\n type: 'term' as const,\n expansion: wizardResult.termExpansion,\n notes: wizardResult.termDescription,\n projects: projectIds.length > 0 ? projectIds : undefined,\n sounds_like: [termName.toLowerCase()],\n };\n \n try {\n await ctx.contextInstance.saveEntity(newTerm);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Created new term: %s (projects: %s)', \n termNameFinal, \n projectIds.length > 0 ? projectIds.join(', ') : 'none'\n );\n \n contextChanges.push({\n entityType: 'term',\n entityId: termId,\n entityName: termNameFinal,\n action: 'created',\n details: {\n expansion: wizardResult.termExpansion,\n projects: projectIds,\n description: wizardResult.termDescription,\n },\n });\n \n // If term has associated projects and we haven't set routing yet, use the first one\n if (projectIds.length > 0 && !state.routeDecision) {\n // For newly created project, we already set routing above\n // For existing projects, look them up\n if (knownProjects) {\n const primaryProject = knownProjects.find(p => p.id === projectIds[0]);\n if (primaryProject?.routing?.destination) {\n state.routeDecision = {\n projectId: primaryProject.id,\n destination: { \n path: primaryProject.routing.destination, \n structure: 'month' \n },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: termNameFinal, weight: 1.0 }],\n reasoning: `User created term \"${termNameFinal}\" associated with project \"${primaryProject.name}\"`,\n };\n }\n }\n }\n } catch (error) {\n logger.warn('Failed to save new term: %s', error);\n }\n } else if (wizardResult.action === 'ignore' && wizardResult.ignoredTerm) {\n // IGNORE - add term to ignore list so user won't be asked again\n const ignoredTermName = wizardResult.ignoredTerm;\n const ignoredId = ignoredTermName.toLowerCase()\n .replace(/[^a-z0-9]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n \n const newIgnored = {\n id: ignoredId,\n name: ignoredTermName,\n type: 'ignored' as const,\n ignoredAt: new Date().toISOString(),\n };\n \n try {\n await ctx.contextInstance.saveEntity(newIgnored);\n await ctx.contextInstance.reload();\n logger.info('Added to ignore list: %s', ignoredTermName);\n \n contextChanges.push({\n entityType: 'ignored',\n entityId: ignoredId,\n entityName: ignoredTermName,\n action: 'created',\n details: {\n reason: 'User chose to ignore this term',\n },\n });\n } catch (error) {\n logger.warn('Failed to save ignored term: %s', error);\n }\n }\n // 'skip' action - do nothing\n }\n \n // Handle new person wizard response\n if (result.data?.clarificationType === 'new_person' && clarification.additionalInfo) {\n const personWizardResult = clarification.additionalInfo as {\n action: 'create' | 'skip';\n personName?: string;\n organization?: string;\n notes?: string;\n linkedProjectId?: string;\n linkedProjectIndex?: number;\n createdProject?: {\n action: 'create' | 'link' | 'skip';\n projectName?: string;\n destination?: string;\n description?: string;\n };\n };\n \n const knownProjects = result.data?.knownProjects as Array<{\n id: string;\n name: string;\n description?: string;\n classification?: { explicit_phrases?: string[]; context_type?: string };\n routing?: { destination: string; structure?: string; filename_options?: string[] };\n }> | undefined;\n \n if (personWizardResult.action === 'create') {\n let linkedProjectId: string | undefined;\n \n // First, handle any nested project creation\n if (personWizardResult.createdProject?.action === 'create' && personWizardResult.createdProject.projectName) {\n const projectName = personWizardResult.createdProject.projectName;\n const projectId = projectName.toLowerCase().replace(/\\s+/g, '-');\n const projectDestination = personWizardResult.createdProject.destination;\n \n const newProject = {\n id: projectId,\n name: projectName,\n type: 'project' as const,\n description: personWizardResult.createdProject.description || `Project for \"${projectName}\"`,\n classification: {\n context_type: 'work' as const,\n explicit_phrases: [projectName.toLowerCase()],\n },\n routing: {\n // Only include destination if explicitly provided - otherwise uses global default\n ...(projectDestination && { destination: projectDestination }),\n structure: 'month' as const,\n filename_options: ['date', 'time', 'subject'] as Array<'date' | 'time' | 'subject'>,\n },\n active: true,\n };\n \n try {\n await ctx.contextInstance.saveEntity(newProject);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Created new project from person wizard: %s%s', projectName, projectDestination ? ` -> ${projectDestination}` : ' (using default destination)');\n linkedProjectId = projectId;\n \n contextChanges.push({\n entityType: 'project',\n entityId: projectId,\n entityName: projectName,\n action: 'created',\n details: {\n ...(projectDestination && { destination: projectDestination }),\n description: personWizardResult.createdProject.description,\n createdForPerson: personWizardResult.personName,\n },\n });\n \n // Update routing to use the new project (if destination was specified)\n if (projectDestination) {\n state.routeDecision = {\n projectId,\n destination: { path: projectDestination, structure: 'month' },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: projectName, weight: 1.0 }],\n reasoning: `User created project \"${projectName}\" for person \"${personWizardResult.personName}\"`,\n };\n }\n } catch (error) {\n logger.warn('Failed to save new project from person wizard: %s', error);\n }\n } else if (typeof personWizardResult.linkedProjectIndex === 'number' && knownProjects) {\n // User linked to existing project\n if (personWizardResult.linkedProjectIndex < knownProjects.length) {\n const linkedProject = knownProjects[personWizardResult.linkedProjectIndex];\n linkedProjectId = linkedProject.id;\n \n // Update routing to use the linked project\n if (linkedProject.routing?.destination) {\n state.routeDecision = {\n projectId: linkedProject.id,\n destination: { \n path: linkedProject.routing.destination, \n structure: 'month' \n },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: personWizardResult.personName || termName, weight: 1.0 }],\n reasoning: `User linked person \"${personWizardResult.personName}\" to project \"${linkedProject.name}\"`,\n };\n }\n }\n }\n \n // Now save the person\n const personName = personWizardResult.personName || termName;\n const personId = personName.toLowerCase().replace(/\\s+/g, '-');\n \n const newPerson = {\n id: personId,\n name: personName,\n type: 'person' as const,\n organization: personWizardResult.organization,\n notes: personWizardResult.notes,\n projects: linkedProjectId ? [linkedProjectId] : [],\n sounds_like: [termName.toLowerCase()],\n };\n \n try {\n await ctx.contextInstance.saveEntity(newPerson);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Created new person: %s (org: %s, project: %s)', \n personName, \n personWizardResult.organization || 'none',\n linkedProjectId || 'none'\n );\n \n // Update resolved entities with correct name\n state.resolvedEntities.set(termName, personName);\n \n contextChanges.push({\n entityType: 'person',\n entityId: personId,\n entityName: personName,\n action: 'created',\n details: {\n organization: personWizardResult.organization,\n linkedProject: linkedProjectId,\n notes: personWizardResult.notes,\n heardAs: termName,\n },\n });\n } catch (error) {\n logger.warn('Failed to save new person: %s', error);\n }\n }\n // 'skip' action - do nothing\n }\n }\n }\n \n // Update state based on tool results\n if (result.data?.person) {\n state.resolvedEntities.set(result.data.person.name, result.data.suggestion);\n // Track person entity reference\n state.referencedEntities.people.add(result.data.person.id);\n }\n \n // Track term entities\n if (result.data?.term) {\n state.referencedEntities.terms.add(result.data.term.id);\n }\n \n // Track company entities\n if (result.data?.company) {\n state.referencedEntities.companies.add(result.data.company.id);\n }\n \n // Capture routing from route_note tool\n if (result.data?.routingDecision?.destination) {\n const routingDecision = result.data.routingDecision;\n state.routeDecision = {\n projectId: routingDecision.projectId,\n destination: routingDecision.destination,\n confidence: routingDecision.confidence || 1.0,\n signals: routingDecision.signals,\n reasoning: routingDecision.reasoning || 'Determined by route_note tool',\n };\n \n // Track project if routing decision includes it\n if (routingDecision.projectId) {\n state.referencedEntities.projects.add(routingDecision.projectId);\n }\n }\n \n // Capture routing from lookup_project when project has routing config\n if (result.data?.found && result.data?.project?.routing?.destination) {\n const project = result.data.project;\n state.routeDecision = {\n projectId: project.id,\n destination: { \n path: project.routing.destination,\n structure: project.routing.structure || 'month',\n },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: project.name, weight: 1.0 }],\n reasoning: `Matched project \"${project.name}\" with routing to ${project.routing.destination}`,\n };\n logger.debug('Captured routing from project lookup: %s -> %s', \n project.name, project.routing.destination);\n \n // Track project entity reference\n state.referencedEntities.projects.add(project.id);\n }\n \n } catch (error) {\n logger.error('Tool execution failed', { tool: toolCall.name, error });\n toolResults.push({ \n id: toolCall.id, \n name: toolCall.name, \n result: JSON.stringify({ error: String(error) }) \n });\n }\n }\n \n // Add tool results to history\n for (const tr of toolResults) {\n conversationHistory.push({\n role: 'tool',\n tool_call_id: tr.id,\n content: tr.result,\n });\n }\n \n // Build continuation prompt with full context\n const continuationPrompt = `Tool results received. Here's a reminder of your task:\n\nORIGINAL TRANSCRIPT (process this):\n--- BEGIN TRANSCRIPT ---\n${transcriptText}\n--- END TRANSCRIPT ---\n\nCorrections made so far: ${state.resolvedEntities.size > 0 ? Array.from(state.resolvedEntities.entries()).map(([k, v]) => `${k} -> ${v}`).join(', ') : 'none yet'}\n\nContinue analyzing. If you need more information, use the tools. \nWhen you're done with tool calls, output the COMPLETE corrected transcript as Markdown.\nDo NOT summarize - include ALL original content with corrections applied.\n\nCRITICAL REMINDER: Your response must contain ONLY the transcript text. Do NOT include any commentary, explanations, or processing notes - those will leak into the user-facing document.`;\n\n conversationHistory.push({ role: 'user', content: continuationPrompt });\n \n // Continue conversation with full context\n response = await reasoning.complete({\n systemPrompt,\n prompt: continuationPrompt,\n tools: registry.getToolDefinitions(),\n });\n \n // Track token usage\n if (response.usage) {\n totalTokens += response.usage.totalTokens;\n }\n \n conversationHistory.push({ \n role: 'assistant', \n content: response.content,\n tool_calls: response.toolCalls?.map(tc => ({\n id: tc.id,\n name: tc.name,\n arguments: tc.arguments,\n })),\n });\n }\n \n // Extract final corrected text\n if (response.content && response.content.length > 50) {\n // Clean the response to remove any leaked internal processing\n const cleanedContent = cleanResponseContent(response.content);\n \n if (cleanedContent !== response.content) {\n logger.warn('Removed leaked internal processing from response (%d -> %d chars)',\n response.content.length, cleanedContent.length);\n }\n \n state.correctedText = cleanedContent;\n state.confidence = 0.9;\n logger.debug('Final transcript generated: %d characters', cleanedContent.length);\n } else {\n // Model didn't produce content - ask for it explicitly\n logger.debug('Model did not produce transcript, requesting explicitly...');\n \n const finalRequest = `Please output the COMPLETE corrected transcript now.\n\nORIGINAL:\n${transcriptText}\n\nCORRECTIONS TO APPLY:\n${state.resolvedEntities.size > 0 ? Array.from(state.resolvedEntities.entries()).map(([k, v]) => `- \"${k}\" should be \"${v}\"`).join('\\n') : 'None identified'}\n\nOutput the full transcript as clean Markdown. Do NOT summarize.\n\nCRITICAL: Your response must contain ONLY the corrected transcript text - absolutely no commentary, tool information, or explanations.`;\n\n const finalResponse = await reasoning.complete({\n systemPrompt,\n prompt: finalRequest,\n });\n \n // Track token usage\n if (finalResponse.usage) {\n totalTokens += finalResponse.usage.totalTokens;\n }\n \n // Clean the final response as well\n const cleanedFinalContent = cleanResponseContent(finalResponse.content || transcriptText);\n \n if (cleanedFinalContent !== finalResponse.content) {\n logger.warn('Removed leaked internal processing from final response (%d -> %d chars)',\n finalResponse.content?.length || 0, cleanedFinalContent.length);\n }\n \n state.correctedText = cleanedFinalContent;\n state.confidence = 0.8;\n }\n \n } catch (error) {\n logger.error('Agentic processing failed', { error });\n // Fall back to original text\n state.correctedText = transcriptText;\n state.confidence = 0.5;\n }\n \n return {\n enhancedText: state.correctedText,\n state,\n toolsUsed: [...new Set(toolsUsed)],\n iterations,\n totalTokens: totalTokens > 0 ? totalTokens : undefined,\n contextChanges: contextChanges.length > 0 ? contextChanges : undefined,\n };\n };\n \n return { process };\n};\n\n","/**\n * Agentic Transcription System\n * \n * Main entry point for the agentic transcription system. Provides tool-based\n * enhancement of transcripts using reasoning models.\n * \n * The agentic approach means the model queries context via tools rather than\n * receiving all context upfront in the prompt. This allows for:\n * - Smaller prompt sizes\n * - More targeted context retrieval \n * - Better handling of large context sets\n */\n\nimport { ToolContext, TranscriptionState } from './types';\nimport * as Executor from './executor';\nimport * as Registry from './registry';\nimport * as Reasoning from '../reasoning';\n\nexport interface ContextChangeRecord {\n entityType: 'person' | 'project' | 'company' | 'term' | 'ignored';\n entityId: string;\n entityName: string;\n action: 'created' | 'updated';\n details?: Record<string, unknown>;\n}\n\nexport interface AgenticInstance {\n process(transcriptText: string): Promise<{\n enhancedText: string;\n state: TranscriptionState;\n toolsUsed: string[];\n iterations: number;\n totalTokens?: number;\n contextChanges?: ContextChangeRecord[];\n }>;\n getAvailableTools(): string[];\n}\n\n/**\n * Create an agentic executor from a ToolContext\n * This is the primary factory method - always agentic, no flags needed\n */\nexport const create = (\n reasoning: Reasoning.ReasoningInstance,\n toolContext: ToolContext\n): AgenticInstance => {\n const executor = Executor.create(reasoning, toolContext);\n \n return {\n process: (transcriptText: string) => executor.process(transcriptText),\n \n getAvailableTools: () => {\n const registry = Registry.create(toolContext);\n return registry.getTools().map(t => t.name);\n },\n };\n};\n\n// Re-export types\nexport * from './types';\n\n","/**\n * Complete Phase\n * \n * Handles post-processing completion: moving audio files to the processed directory\n * after successful transcription.\n */\n\nimport * as path from 'node:path';\nimport * as Logging from '@/logging';\nimport * as Storage from '@/util/storage';\n\nexport type FilesystemStructure = 'none' | 'year' | 'month' | 'day';\n\nexport interface CompleteConfig {\n processedDirectory: string;\n outputStructure?: FilesystemStructure;\n dryRun?: boolean;\n}\n\nexport interface Instance {\n complete(audioFile: string, hash: string, creationTime: Date, subject?: string): Promise<string>;\n}\n\nexport const create = (config: CompleteConfig): Instance => {\n const logger = Logging.getLogger();\n const storage = Storage.create({ log: logger.debug });\n\n // Build directory path matching output structure (year/month)\n const buildDirectoryPath = (date: Date): string => {\n const structure = config.outputStructure || 'month';\n const year = date.getFullYear().toString();\n const month = (date.getMonth() + 1).toString();\n const day = date.getDate().toString();\n\n switch (structure) {\n case 'none':\n return config.processedDirectory;\n case 'year':\n return path.join(config.processedDirectory, year);\n case 'month':\n return path.join(config.processedDirectory, year, month);\n case 'day':\n return path.join(config.processedDirectory, year, month, day);\n }\n };\n\n // Format date portion of filename based on directory structure\n // Don't repeat info already in the path\n const formatDateForFilename = (date: Date): string => {\n const structure = config.outputStructure || 'month';\n const pad = (n: number) => n.toString().padStart(2, '0');\n const year = date.getFullYear().toString();\n const month = pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n\n switch (structure) {\n case 'day':\n // Path has year/month/day - only time in filename\n return `${hours}${minutes}`;\n case 'month':\n // Path has year/month - day and time in filename\n return `${day}-${hours}${minutes}`;\n case 'year':\n // Path has year - month, day and time in filename\n return `${month}-${day}-${hours}${minutes}`;\n case 'none':\n // No date in path - full date in filename (YYYY-MM-DD-HHmm)\n return `${year}-${month}-${day}-${hours}${minutes}`;\n }\n };\n\n // Strip date prefix and hash suffix from subject if already present\n // This handles cases where subject comes from an already-formatted filename\n const cleanSubjectOfPatterns = (subject: string): string => {\n let cleaned = subject;\n \n // Remove common date-time prefixes (try most specific first):\n // - YYYY-MM-DD-HHmm- (e.g., \"2026-01-14-2330-\")\n // - YYMMDD-HHmm- (e.g., \"260114-2330-\") \n // - MM-DD-HHmm- (e.g., \"01-14-2330-\")\n // - DD-HHmm- (e.g., \"14-2330-\" or \"15-1435-\")\n // - HHmm- (e.g., \"2330-\")\n \n // Pattern 1: YYYY-MM-DD-HHmm- (full ISO-like date with time)\n cleaned = cleaned.replace(/^\\d{4}-\\d{2}-\\d{2}-\\d{4}-/, '');\n \n // Pattern 2: YYMMDD-HHmm- (compact date with time)\n cleaned = cleaned.replace(/^\\d{6}-\\d{4}-/, '');\n \n // Pattern 3: MM-DD-HHmm- (month-day-time)\n cleaned = cleaned.replace(/^\\d{2}-\\d{2}-\\d{4}-/, '');\n \n // Pattern 4: DD-HHmm- (day-time, most common for 'month' structure)\n // This matches patterns like \"15-1435-\" where 15 is day and 1435 is HHmm\n cleaned = cleaned.replace(/^\\d{1,2}-\\d{4}-/, '');\n \n // Pattern 5: Just HHmm- at the start (time only)\n cleaned = cleaned.replace(/^\\d{4}-/, '');\n \n // Remove hash suffix (5-8 hex characters at end, preceded by dash)\n cleaned = cleaned.replace(/-[a-f0-9]{5,8}$/i, '');\n \n // Clean up any leading dashes that might remain\n cleaned = cleaned.replace(/^-+/, '');\n \n return cleaned;\n };\n\n const complete = async (\n audioFile: string, \n hash: string, \n creationTime: Date, \n subject?: string\n ): Promise<string> => {\n logger.debug('Completing file processing for %s', audioFile);\n\n if (config.dryRun) {\n logger.info('Dry run: would move %s to processed directory', audioFile);\n return audioFile;\n }\n\n if (!config.processedDirectory) {\n logger.debug('No processed directory configured, skipping file move');\n return audioFile;\n }\n\n // Build the target directory path with year/month structure\n const targetDir = buildDirectoryPath(creationTime);\n\n // Create the target directory if it doesn't exist\n if (!await storage.exists(targetDir)) {\n logger.debug('Creating processed directory %s', targetDir);\n await storage.createDirectory(targetDir);\n }\n\n // Get the file extension\n const fileExt = path.extname(audioFile);\n\n // Format date for filename (adjusted based on directory structure)\n const dateStr = formatDateForFilename(creationTime);\n\n // Create new filename: <date>-<subject>-<hash>\n // Hash is at the end for easier correlation with output files\n // Clean subject by removing special characters and spaces\n // Also strip any existing date/hash patterns from the subject\n const shortHash = hash.substring(0, 6);\n let newFilename: string;\n if (subject) {\n // First strip any existing date prefixes and hash suffixes\n const strippedSubject = cleanSubjectOfPatterns(subject);\n const cleanSubject = strippedSubject\n .replace(/[^a-zA-Z0-9]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase()\n .substring(0, 50);\n \n // Only include subject if there's something left after cleaning\n if (cleanSubject) {\n newFilename = `${dateStr}-${cleanSubject}-${shortHash}${fileExt}`;\n } else {\n newFilename = `${dateStr}-${shortHash}${fileExt}`;\n }\n } else {\n newFilename = `${dateStr}-${shortHash}${fileExt}`;\n }\n \n const newFilePath = path.join(targetDir, newFilename);\n\n try {\n // Read the original file\n const fileContent = await storage.readFile(audioFile, 'binary');\n\n // Write to the new location\n logger.debug('Moving file from %s to %s', audioFile, newFilePath);\n await storage.writeFile(newFilePath, fileContent, 'binary');\n\n // Remove the original file\n await storage.deleteFile(audioFile);\n\n logger.info('Moved to processed: %s', newFilePath);\n return newFilePath;\n } catch (error) {\n logger.error('Failed to move file to processed directory: %s', error);\n // Don't fail the whole process, just log the error\n return audioFile;\n }\n };\n\n return {\n complete,\n };\n};\n\n","/**\n * Pipeline Orchestrator\n *\n * Orchestrates the intelligent transcription pipeline, coordinating\n * all the modules: context, routing, transcription, reasoning,\n * agentic tools, interactive mode, output management, and reflection.\n * \n * THIS IS THE MAIN PROCESSING FLOW - NOT DEAD CODE!\n */\n\nimport { PipelineConfig, PipelineInput, PipelineResult, PipelineState } from './types';\nimport * as Context from '../context';\nimport * as Routing from '../routing';\nimport * as Interactive from '../interactive';\nimport * as Output from '../output';\nimport * as Reflection from '../reflection';\nimport * as Transcription from '../transcription';\nimport * as Reasoning from '../reasoning';\nimport * as Agentic from '../agentic';\nimport * as CompletePhase from '../phases/complete';\nimport * as Logging from '../logging';\nimport * as Metadata from '../util/metadata';\n\nexport interface OrchestratorInstance {\n process(input: PipelineInput): Promise<PipelineResult>;\n}\n\nexport interface OrchestratorConfig extends PipelineConfig {\n outputDirectory: string;\n outputStructure: string;\n outputFilenameOptions: string[];\n maxAudioSize: number;\n tempDirectory: string;\n}\n\nexport const create = async (config: OrchestratorConfig): Promise<OrchestratorInstance> => {\n const logger = Logging.getLogger();\n const currentWorkingDir = globalThis.process.cwd();\n \n logger.debug('Initializing intelligent transcription pipeline...');\n \n // Initialize context system (async)\n const context = await Context.create({\n startingDir: config.contextDirectory || currentWorkingDir,\n });\n logger.debug('Context system initialized - ready to query entities via tools');\n \n // Default routing configuration (used as fallback for projects without custom destination)\n const defaultPath = config.outputDirectory || '~/notes';\n const defaultStructure = (config.outputStructure || 'month') as Routing.FilesystemStructure;\n const defaultFilenameOptions = (config.outputFilenameOptions || ['date', 'time', 'subject']) as Routing.FilenameOption[];\n\n // Convert context projects to routing format\n // Projects without a destination inherit from the global default\n const contextProjects = context.getAllProjects();\n const routingProjects: Routing.ProjectRoute[] = contextProjects\n .filter(project => project.active !== false)\n .map(project => ({\n projectId: project.id,\n destination: {\n path: project.routing?.destination || defaultPath,\n structure: project.routing?.structure || defaultStructure,\n filename_options: project.routing?.filename_options || defaultFilenameOptions,\n createDirectories: true,\n },\n classification: project.classification,\n active: project.active,\n auto_tags: project.routing?.auto_tags,\n }));\n \n logger.debug('Loaded %d projects from context for routing', routingProjects.length);\n \n // Initialize routing with config-based defaults\n const routingConfig: Routing.RoutingConfig = {\n default: {\n path: defaultPath,\n structure: defaultStructure,\n filename_options: defaultFilenameOptions,\n createDirectories: true,\n },\n projects: routingProjects,\n conflict_resolution: 'primary',\n };\n \n const routing = Routing.create(routingConfig, context);\n logger.debug('Routing system initialized');\n \n const interactive = Interactive.create(\n { enabled: config.interactive, defaultToSuggestion: true, silent: config.silent },\n context\n );\n \n const output = Output.create({\n intermediateDir: config.intermediateDir || './output/protokoll',\n keepIntermediates: config.keepIntermediates ?? true,\n timestampFormat: 'YYMMDD-HHmm',\n });\n logger.debug('Output manager initialized');\n \n const reflection = config.selfReflection \n ? Reflection.create({\n enabled: true,\n format: 'markdown',\n includeConversation: false,\n includeOutput: true,\n })\n : null;\n if (reflection) {\n logger.debug('Self-reflection system enabled');\n }\n \n // Initialize transcription service\n const transcription = Transcription.create({\n defaultModel: config.transcriptionModel as Transcription.TranscriptionModel,\n });\n logger.debug('Transcription service initialized with model: %s', config.transcriptionModel);\n \n // Initialize reasoning for agentic processing\n const reasoning = Reasoning.create({ \n model: config.model,\n reasoningLevel: config.reasoningLevel,\n });\n logger.debug('Reasoning system initialized with model: %s, reasoning level: %s', config.model, config.reasoningLevel || 'medium');\n\n // Initialize complete phase for moving files to processed directory\n // Pass outputStructure so processed files use the same directory structure as output\n const complete = config.processedDirectory \n ? CompletePhase.create({\n processedDirectory: config.processedDirectory,\n outputStructure: config.outputStructure as CompletePhase.FilesystemStructure,\n dryRun: config.dryRun,\n })\n : null;\n if (complete) {\n logger.debug('Complete phase initialized with processed directory: %s', config.processedDirectory);\n }\n \n // Helper to extract a human-readable title from the output path\n const extractTitleFromPath = (outputPath: string): string | undefined => {\n const filename = outputPath.split('/').pop()?.replace('.md', '');\n if (!filename) return undefined;\n \n // Remove date prefix (e.g., \"27-0716-\" from \"27-0716-meeting-notes\")\n const withoutDate = filename.replace(/^\\d{2}-\\d{4}-/, '');\n if (!withoutDate) return undefined;\n \n // Convert kebab-case to Title Case\n return withoutDate\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n };\n\n const processInput = async (input: PipelineInput): Promise<PipelineResult> => {\n const startTime = Date.now();\n \n // Format progress prefix for log messages\n const progressPrefix = input.progress \n ? `[${input.progress.current}/${input.progress.total}]` \n : '';\n const log = (level: 'info' | 'debug', message: string, ...args: unknown[]) => {\n const prefixedMessage = progressPrefix ? `${progressPrefix} ${message}` : message;\n if (level === 'info') {\n logger.info(prefixedMessage, ...args);\n } else {\n logger.debug(prefixedMessage, ...args);\n }\n };\n \n log('info', 'Processing: %s (hash: %s)', input.audioFile, input.hash);\n \n // Initialize state\n const state: PipelineState = {\n input,\n startTime: new Date(),\n };\n \n // Start reflection collection if enabled\n if (reflection) {\n reflection.collector.start();\n }\n \n // Start interactive session if enabled\n if (config.interactive) {\n interactive.startSession();\n log('debug', 'Interactive session started');\n }\n \n try {\n // Step 1: Check onboarding needs\n log('debug', 'Checking onboarding state...');\n const onboardingState = interactive.checkNeedsOnboarding();\n if (onboardingState.needsOnboarding) {\n log('debug', 'First-run detected - onboarding may be triggered');\n }\n \n // Step 2: Raw transcription using Transcription module\n log('info', 'Transcribing audio...');\n const whisperStart = Date.now();\n \n const transcriptionResult = await transcription.transcribe(input.audioFile, {\n model: config.transcriptionModel as Transcription.TranscriptionModel,\n });\n state.rawTranscript = transcriptionResult.text;\n \n const whisperDuration = Date.now() - whisperStart;\n log('info', 'Transcription: %d chars in %.1fs', \n state.rawTranscript.length, whisperDuration / 1000);\n \n if (reflection) {\n reflection.collector.recordWhisper(whisperDuration);\n }\n \n // Step 3: Route detection\n log('debug', 'Determining routing destination...');\n const routingContext: Routing.RoutingContext = {\n transcriptText: state.rawTranscript || '',\n audioDate: input.creation,\n sourceFile: input.audioFile,\n hash: input.hash,\n };\n \n const routeResult = routing.route(routingContext);\n \n log('debug', 'Routing decision: project=%s, confidence=%.2f', \n routeResult.projectId || 'default', routeResult.confidence);\n \n // Record routing decision in reflection\n if (reflection) {\n reflection.collector.recordRoutingDecision({\n projectId: routeResult.projectId,\n destination: routeResult.destination.path,\n confidence: routeResult.confidence,\n reasoning: routeResult.reasoning,\n signals: routeResult.signals.map(s => ({\n type: s.type,\n value: s.value,\n weight: s.weight,\n })),\n alternativesConsidered: routeResult.alternateMatches?.map(alt => ({\n projectId: alt.projectId,\n confidence: alt.confidence,\n whyNotChosen: `Lower confidence (${(alt.confidence * 100).toFixed(1)}%)`,\n })),\n });\n }\n \n // Build output path\n const outputPath = routing.buildOutputPath(routeResult, routingContext);\n log('debug', 'Output path: %s', outputPath);\n \n // Step 4: Create output paths using Output module\n log('debug', 'Setting up output directories...');\n const paths = output.createOutputPaths(\n input.audioFile,\n outputPath,\n input.hash,\n input.creation\n );\n \n await output.ensureDirectories(paths);\n \n // Write raw transcript to intermediate (for debugging)\n await output.writeIntermediate(paths, 'transcript', {\n text: state.rawTranscript,\n model: config.transcriptionModel,\n duration: whisperDuration,\n });\n \n // Step 5: Agentic enhancement using real executor\n log('info', 'Enhancing with %s...', config.model);\n \n const agenticStart = Date.now();\n const toolContext: Agentic.ToolContext = {\n transcriptText: state.rawTranscript || '',\n audioDate: input.creation,\n sourceFile: input.audioFile,\n contextInstance: context,\n routingInstance: routing,\n interactiveMode: config.interactive,\n // Always pass interactive handler - it will handle enabled/disabled internally\n interactiveInstance: interactive,\n };\n \n const executor = Agentic.create(reasoning, toolContext);\n const agenticResult = await executor.process(state.rawTranscript || '');\n \n state.enhancedText = agenticResult.enhancedText;\n const toolsUsed = agenticResult.toolsUsed;\n const agenticDuration = Date.now() - agenticStart;\n \n // Record tool calls in reflection\n if (reflection) {\n for (const tool of toolsUsed) {\n reflection.collector.recordToolCall(tool, agenticDuration / toolsUsed.length, true);\n }\n reflection.collector.recordCorrection(state.rawTranscript || '', state.enhancedText);\n // Record token usage from agentic result\n if (agenticResult.totalTokens) {\n reflection.collector.recordModelResponse(config.model, agenticResult.totalTokens);\n }\n // Record context changes (new projects, entities created)\n if (agenticResult.contextChanges) {\n for (const change of agenticResult.contextChanges) {\n reflection.collector.recordContextChange(change);\n }\n }\n }\n \n // Write agentic session to intermediate\n await output.writeIntermediate(paths, 'session', {\n iterations: agenticResult.iterations,\n toolsUsed: agenticResult.toolsUsed,\n state: agenticResult.state,\n });\n \n // Step 5b: Check if agentic processing found a different route\n // (e.g., via lookup_project tool finding a project with custom destination)\n if (agenticResult.state.routeDecision?.destination?.path) {\n const agenticRoute = agenticResult.state.routeDecision;\n log('debug', 'Agentic processing found route: %s -> %s', \n agenticRoute.projectId || 'unknown', \n agenticRoute.destination.path\n );\n \n // Update routeResult with the agentic decision\n routeResult.projectId = agenticRoute.projectId || routeResult.projectId;\n routeResult.destination = {\n ...routeResult.destination,\n path: agenticRoute.destination.path,\n structure: agenticRoute.destination.structure || routeResult.destination.structure,\n };\n routeResult.confidence = agenticRoute.confidence || routeResult.confidence;\n routeResult.reasoning = agenticRoute.reasoning || routeResult.reasoning;\n if (agenticRoute.signals) {\n routeResult.signals = agenticRoute.signals;\n }\n \n // Rebuild output path with the new destination\n const newOutputPath = routing.buildOutputPath(routeResult, routingContext);\n log('debug', 'Updated output path: %s -> %s', outputPath, newOutputPath);\n \n // Recreate output paths with new destination\n const newPaths = output.createOutputPaths(\n input.audioFile,\n newOutputPath,\n input.hash,\n input.creation\n );\n await output.ensureDirectories(newPaths);\n \n // Update paths reference (reassign properties since paths is const)\n Object.assign(paths, newPaths);\n }\n\n // Step 5c: Write raw transcript to .transcript/ directory alongside final output\n // This is done AFTER the route is finalized so it goes to the correct location\n // Enables compare and reanalyze workflows\n log('debug', 'Writing raw transcript to .transcript/ directory...');\n await output.writeRawTranscript(paths, {\n text: state.rawTranscript,\n model: config.transcriptionModel,\n duration: whisperDuration,\n audioFile: input.audioFile,\n audioHash: input.hash,\n transcribedAt: new Date().toISOString(),\n });\n\n // Step 6: Write final output using Output module with metadata\n log('debug', 'Writing final transcript...');\n if (state.enhancedText) {\n // Build entity metadata from referenced entities\n const buildEntityReferences = (): Metadata.TranscriptMetadata['entities'] => {\n const refs = agenticResult.state.referencedEntities;\n if (!refs) return undefined;\n \n const entities: NonNullable<Metadata.TranscriptMetadata['entities']> = {\n people: [],\n projects: [],\n terms: [],\n companies: [],\n };\n \n // Convert sets of IDs to EntityReference arrays\n for (const personId of refs.people) {\n const person = context.getPerson(personId);\n if (person) {\n entities.people!.push({ id: person.id, name: person.name, type: 'person' });\n }\n }\n \n for (const projectId of refs.projects) {\n const project = context.getProject(projectId);\n if (project) {\n entities.projects!.push({ id: project.id, name: project.name, type: 'project' });\n }\n }\n \n for (const termId of refs.terms) {\n const term = context.getTerm(termId);\n if (term) {\n entities.terms!.push({ id: term.id, name: term.name, type: 'term' });\n }\n }\n \n for (const companyId of refs.companies) {\n const company = context.getCompany(companyId);\n if (company) {\n entities.companies!.push({ id: company.id, name: company.name, type: 'company' });\n }\n }\n \n // Only return if we found any entities\n const hasEntities = \n entities.people!.length > 0 ||\n entities.projects!.length > 0 ||\n entities.terms!.length > 0 ||\n entities.companies!.length > 0;\n \n return hasEntities ? entities : undefined;\n };\n \n // Build metadata from routing decision and input\n const transcriptMetadata: Metadata.TranscriptMetadata = {\n title: extractTitleFromPath(paths.final),\n projectId: routeResult.projectId || undefined,\n project: routeResult.projectId || undefined,\n date: input.creation,\n routing: Metadata.createRoutingMetadata(routeResult),\n tags: Metadata.extractTagsFromSignals(routeResult.signals),\n confidence: routeResult.confidence,\n entities: buildEntityReferences(),\n };\n \n await output.writeTranscript(paths, state.enhancedText, transcriptMetadata);\n }\n \n // Step 7: Generate reflection report\n log('debug', 'Generating reflection report...');\n let reflectionReport: Reflection.ReflectionReport | undefined;\n if (reflection) {\n reflectionReport = reflection.generate(\n input.audioFile,\n paths.final,\n undefined,\n state.enhancedText\n );\n \n if (paths.intermediate.reflection) {\n await reflection.save(reflectionReport, paths.intermediate.reflection);\n }\n }\n \n // Step 8: End interactive session\n log('debug', 'Finalizing session...');\n let session: Interactive.InteractiveSession | undefined;\n if (config.interactive) {\n session = interactive.endSession();\n log('debug', 'Interactive session ended: %d clarifications', session.responses.length);\n \n // Save session if path available\n if (paths.intermediate.session) {\n await output.writeIntermediate(paths, 'session', session);\n }\n }\n \n // Step 9: Cleanup if needed\n if (!config.keepIntermediates && !config.debug) {\n await output.cleanIntermediates(paths);\n }\n\n // Step 10: Move audio file to processed directory\n let processedAudioPath: string | undefined;\n if (complete) {\n // Extract subject from output path for naming\n const subject = paths.final.split('/').pop()?.replace('.md', '') || undefined;\n processedAudioPath = await complete.complete(\n input.audioFile, \n input.hash, \n input.creation,\n subject\n );\n }\n \n const processingTime = Date.now() - startTime;\n \n // Compact summary output\n log('info', 'Enhancement: %d iterations, %d tools, %.1fs', \n agenticResult.iterations, toolsUsed.length, agenticDuration / 1000);\n if (agenticResult.totalTokens) {\n log('info', 'Tokens: %d total', agenticResult.totalTokens);\n }\n log('info', 'Output: %s (%.1fs total)', paths.final, processingTime / 1000);\n \n return {\n outputPath: paths.final,\n enhancedText: state.enhancedText || '',\n rawTranscript: state.rawTranscript || '',\n routedProject: routeResult.projectId,\n routingConfidence: routeResult.confidence,\n processingTime,\n toolsUsed,\n correctionsApplied: agenticResult.state.resolvedEntities.size,\n processedAudioPath,\n reflection: reflectionReport,\n session,\n intermediatePaths: paths,\n };\n \n } catch (error) {\n logger.error('Pipeline error', { error });\n throw error;\n }\n };\n \n return { process: processInput };\n};\n","/**\n * Pipeline Integration\n *\n * Main entry point for the intelligent transcription pipeline.\n * Brings together all modules into a unified processing flow.\n * \n * THIS IS THE MAIN ENTRY POINT - USE Pipeline.create() IN protokoll.ts\n */\n\nimport { PipelineInput, PipelineResult } from './types';\nimport * as Orchestrator from './orchestrator';\n\nexport interface PipelineInstance {\n process(input: PipelineInput): Promise<PipelineResult>;\n}\n\nexport type { OrchestratorConfig } from './orchestrator';\n\nexport const create = async (config: Orchestrator.OrchestratorConfig): Promise<PipelineInstance> => {\n return Orchestrator.create(config);\n};\n\nexport const DEFAULT_PIPELINE_CONFIG: Partial<Orchestrator.OrchestratorConfig> = {\n model: 'gpt-5.2',\n transcriptionModel: 'whisper-1',\n interactive: false,\n selfReflection: true,\n debug: false,\n intermediateDir: './output/protokoll',\n keepIntermediates: true,\n outputDirectory: './output',\n outputStructure: 'month',\n outputFilenameOptions: ['date', 'time', 'subject'],\n maxAudioSize: 25 * 1024 * 1024,\n tempDirectory: '/tmp',\n};\n\n// Re-export types\nexport * from './types';\n\n","/**\n * Project Assist\n * \n * LLM-assisted project metadata generation for smart project creation.\n * \n * Two distinct generation functions:\n * - generateSoundsLike(): Phonetic variants of project NAME (for transcription correction)\n * - generateTriggerPhrases(): Content-matching phrases (for classification/routing)\n */\n\nimport { getLogger } from '../logging';\nimport * as OpenAI from '../util/openai';\nimport { SmartAssistanceConfig } from '../context/types';\nimport * as ContentFetcher from './content-fetcher';\n\nexport interface ProjectSuggestions {\n name?: string;\n soundsLike: string[]; // Phonetic variants of project name\n triggerPhrases: string[]; // Content-matching phrases\n topics?: string[];\n description?: string;\n}\n\nexport interface ProjectAssistInstance {\n generateSoundsLike(name: string): Promise<string[]>;\n generateTriggerPhrases(name: string): Promise<string[]>;\n analyzeSource(source: string, existingName?: string): Promise<ProjectSuggestions>;\n isAvailable(): boolean;\n}\n\ninterface ContentAnalysisResponse {\n name: string | null;\n topics: string[];\n description: string;\n}\n\nexport const create = (config: SmartAssistanceConfig): ProjectAssistInstance => {\n const logger = getLogger();\n const fetcher = ContentFetcher.create();\n \n const isAvailable = (): boolean => {\n return !!process.env.OPENAI_API_KEY && config.enabled;\n };\n\n const generateSoundsLike = async (name: string): Promise<string[]> => {\n if (!isAvailable()) {\n logger.debug('Smart assistance not available, skipping sounds_like generation');\n return [];\n }\n\n logger.debug('Generating phonetic variants (sounds_like) for: %s', name);\n\n const prompt = `The project name \"${name}\" will be spoken in audio recordings and transcribed by Whisper speech-to-text.\n\nGenerate phonetic variations that Whisper might produce when mishearing this project name. Include:\n- Common phonetic mishearings\n- How the name sounds in different accents\n- Alternate spellings a speech-to-text system might produce\n- Common transcription errors (dropped letters, substitutions)\n- Phonetically similar words\n\nThis is for correcting the PROJECT NAME when it's misheard, NOT for matching content.\n\nOutput ONLY a comma-separated list with no explanation, no quotes, no extra text.\nDo NOT include the original name in the list.\n\nExample for \"Protokoll\": protocol,pro to call,proto call,proto col,protocolle\nExample for \"Kubernetes\": cube a net ease,coober nettys,cube er netes,k8s\nExample for \"Grunnverk\": ground work,grundverk,grunnwerk,grunverk,groon verk`;\n\n try {\n const response = await OpenAI.createCompletion(\n [{ role: 'user', content: prompt }],\n { \n model: config.phoneticModel,\n reasoningLevel: 'low',\n maxTokens: 4000,\n reason: `phonetic variants for \"${name}\"`,\n }\n );\n\n // Parse comma-separated response\n const variants: string[] = response\n .split(',')\n .map((p: string) => p.trim().toLowerCase())\n .filter((p: string) => p.length > 0 && p.toLowerCase() !== name.toLowerCase());\n\n // Remove duplicates\n const uniqueVariants: string[] = [...new Set(variants)];\n\n logger.debug('Generated %d phonetic variants', uniqueVariants.length);\n return uniqueVariants;\n\n } catch (error: any) {\n logger.error('Failed to generate phonetic variants: %s', error.message);\n return [];\n }\n };\n\n const generateTriggerPhrases = async (name: string): Promise<string[]> => {\n if (!isAvailable()) {\n logger.debug('Smart assistance not available, skipping trigger phrase generation');\n return [];\n }\n\n logger.debug('Generating trigger phrases (content matching) for: %s', name);\n\n const prompt = `Generate trigger phrases for a project named \"${name}\".\n\nTrigger phrases are used to identify when audio content is ABOUT this project. These are phrases someone might say that indicate they're discussing this project.\n\nGenerate phrases that would appear in conversation about this project:\n- \"working on ${name.toLowerCase()}\"\n- \"${name.toLowerCase()} meeting\"\n- \"${name.toLowerCase()} project\"\n- Other contextual phrases that indicate the content is about this project\n\nDo NOT include phonetic variations of the name - those go in a separate field.\nFocus on CONTEXTUAL phrases that indicate content belongs to this project.\n\nOutput ONLY a comma-separated list with no explanation, no quotes, no extra text.\nInclude the project name in lowercase as the first item.\n\nExample for \"Protokoll\": protokoll,working on protokoll,protokoll project,protokoll meeting,discussing protokoll\nExample for \"Quarterly Planning\": quarterly planning,quarterly planning meeting,q1 planning,roadmap review`;\n\n try {\n const response = await OpenAI.createCompletion(\n [{ role: 'user', content: prompt }],\n { \n model: config.analysisModel,\n reasoningLevel: 'low',\n maxTokens: 4000,\n reason: `trigger phrases for \"${name}\"`,\n }\n );\n\n // Parse comma-separated response\n const phrases: string[] = response\n .split(',')\n .map((p: string) => p.trim().toLowerCase())\n .filter((p: string) => p.length > 0);\n\n // Ensure original name is included as first item\n if (!phrases.includes(name.toLowerCase())) {\n phrases.unshift(name.toLowerCase());\n }\n\n // Remove duplicates\n const uniquePhrases: string[] = [...new Set(phrases)];\n\n logger.debug('Generated %d trigger phrases', uniquePhrases.length);\n return uniquePhrases;\n\n } catch (error: any) {\n logger.error('Failed to generate trigger phrases: %s', error.message);\n // Return just the original name as fallback\n return [name.toLowerCase()];\n }\n };\n\n const analyzeSource = async (source: string, existingName?: string): Promise<ProjectSuggestions> => {\n if (!isAvailable()) {\n logger.debug('Smart assistance not available, skipping content analysis');\n return { soundsLike: [], triggerPhrases: [] };\n }\n\n // Fetch content from source (file path, URL, or directory)\n logger.debug('Fetching content from source: %s', source);\n const fetchResult = await fetcher.fetch(source);\n \n if (!fetchResult.success || !fetchResult.content) {\n logger.error('Failed to fetch content: %s', fetchResult.error);\n return { soundsLike: [], triggerPhrases: [] };\n }\n\n const content = fetchResult.content;\n logger.info('Fetched %d chars from %s', content.length, fetchResult.sourceName);\n logger.debug('Analyzing content with AI...');\n\n const nameInstruction = existingName \n ? `The project name is already known: \"${existingName}\". Set \"name\" to null in your response.`\n : `Extract or suggest a concise project name from the content. If the name is not obvious, suggest one based on the project's purpose.`;\n\n const prompt = `Analyze this project documentation and extract structured information.\n\n${nameInstruction}\n\nExtract the following:\n1. **topics**: A list of single-word or hyphenated keywords that describe what this project is about. Focus on technologies, concepts, and domains. Aim for 10-25 relevant keywords.\n2. **description**: A single paragraph (3-5 sentences) that provides context about what this project does, its purpose, and main features.\n\nDocumentation content:\n---\n${content}\n---\n\nRespond ONLY with valid JSON in this exact format:\n{\n \"name\": \"ProjectName or null\",\n \"topics\": [\"keyword1\", \"keyword2\", \"keyword3\"],\n \"description\": \"A concise paragraph describing the project...\"\n}`;\n\n try {\n const response = await OpenAI.createCompletion(\n [{ role: 'user', content: prompt }],\n { \n model: config.analysisModel,\n reasoningLevel: 'low',\n maxTokens: 3000,\n reason: 'content analysis',\n }\n );\n\n // Parse JSON response\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('No JSON found in response');\n }\n\n const parsed: ContentAnalysisResponse = JSON.parse(jsonMatch[0]);\n\n // Generate both sounds_like AND trigger phrases for the name\n const projectName = existingName || parsed.name || undefined;\n let soundsLike: string[] = [];\n let triggerPhrases: string[] = [];\n \n if (projectName) {\n // Generate in parallel for efficiency\n logger.debug('Generating phonetic and trigger phrases for: %s', projectName);\n [soundsLike, triggerPhrases] = await Promise.all([\n generateSoundsLike(projectName),\n generateTriggerPhrases(projectName),\n ]);\n }\n\n return {\n name: parsed.name || undefined,\n topics: parsed.topics || [],\n description: parsed.description || undefined,\n soundsLike,\n triggerPhrases,\n };\n\n } catch (error: any) {\n logger.error('Failed to analyze content: %s', error.message);\n \n // Return partial result with sounds_like and trigger phrases if we have a name\n if (existingName) {\n logger.debug('Generating phonetic and trigger phrases for existing name: %s', existingName);\n const [soundsLike, triggerPhrases] = await Promise.all([\n generateSoundsLike(existingName),\n generateTriggerPhrases(existingName),\n ]);\n return { soundsLike, triggerPhrases };\n }\n \n return { soundsLike: [], triggerPhrases: [] };\n }\n };\n\n return {\n generateSoundsLike,\n generateTriggerPhrases,\n analyzeSource,\n isAvailable,\n };\n};\n\n/**\n * Helper for showing progress during async operations\n */\nexport const withProgress = async <T>(\n message: string,\n operation: () => Promise<T>,\n print: (text: string) => void\n): Promise<T> => {\n print(`[${message}...]`);\n try {\n const result = await operation();\n return result;\n } finally {\n // Clear the progress message line (optional)\n }\n};\n","/**\n * Action CLI\n * \n * Provides commands for performing actions on existing transcripts:\n * - combine: Merge multiple transcripts into a single document\n * - (future: split, archive, etc.)\n * \n * The combine action preserves the timestamp of the first transcript\n * and can optionally change the project (with routing-aware relocation).\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'fs/promises';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as Context from '../context';\nimport * as Routing from '../routing';\nimport { Project } from '../context/types';\n\n// Helper to print to stdout\nconst print = (text: string) => process.stdout.write(text + '\\n');\n\n/**\n * Parsed transcript structure\n */\nexport interface ParsedTranscript {\n filePath: string;\n title?: string;\n metadata: TranscriptMetadata;\n content: string;\n rawText: string;\n}\n\nexport interface TranscriptMetadata {\n date?: string;\n time?: string;\n project?: string;\n projectId?: string;\n destination?: string;\n confidence?: string;\n signals?: string[];\n reasoning?: string;\n tags?: string[];\n duration?: string;\n}\n\n/**\n * Parse a transcript file into its components\n */\nexport const parseTranscript = async (filePath: string): Promise<ParsedTranscript> => {\n const rawText = await fs.readFile(filePath, 'utf-8');\n const lines = rawText.split('\\n');\n \n const result: ParsedTranscript = {\n filePath,\n metadata: {},\n content: '',\n rawText,\n };\n \n let inMetadata = false;\n let inRouting = false;\n let contentStartIndex = 0;\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n \n // Title detection (first # heading)\n if (!result.title && trimmed.startsWith('# ') && !trimmed.startsWith('## ')) {\n result.title = trimmed.slice(2).trim();\n continue;\n }\n \n // Metadata section start\n if (trimmed === '## Metadata') {\n inMetadata = true;\n continue;\n }\n \n // Routing subsection\n if (trimmed === '### Routing') {\n inRouting = true;\n continue;\n }\n \n // End of metadata section (horizontal rule)\n if (trimmed === '---' && inMetadata) {\n contentStartIndex = i + 1;\n inMetadata = false;\n inRouting = false;\n continue;\n }\n \n // Parse metadata fields\n if (inMetadata && trimmed.startsWith('**')) {\n const match = trimmed.match(/^\\*\\*([^*]+)\\*\\*:\\s*(.*)$/);\n if (match) {\n const [, key, value] = match;\n const normalizedKey = key.toLowerCase().replace(/\\s+/g, '');\n \n switch (normalizedKey) {\n case 'date':\n result.metadata.date = value;\n break;\n case 'time':\n result.metadata.time = value;\n break;\n case 'project':\n result.metadata.project = value;\n break;\n case 'projectid':\n // Remove backticks from project ID\n result.metadata.projectId = value.replace(/`/g, '');\n break;\n case 'destination':\n result.metadata.destination = value;\n break;\n case 'confidence':\n result.metadata.confidence = value;\n break;\n case 'reasoning':\n result.metadata.reasoning = value;\n break;\n case 'tags':\n // Parse tags from backtick-wrapped format\n result.metadata.tags = value.match(/`([^`]+)`/g)?.map(t => t.replace(/`/g, '')) || [];\n break;\n case 'duration':\n result.metadata.duration = value;\n break;\n }\n }\n }\n \n // Parse classification signals (list items under routing)\n if (inRouting && trimmed.startsWith('- ') && !trimmed.startsWith('**')) {\n if (!result.metadata.signals) {\n result.metadata.signals = [];\n }\n result.metadata.signals.push(trimmed.slice(2));\n }\n }\n \n // Extract content after metadata\n if (contentStartIndex > 0) {\n // Skip empty lines after ---\n while (contentStartIndex < lines.length && lines[contentStartIndex].trim() === '') {\n contentStartIndex++;\n }\n result.content = lines.slice(contentStartIndex).join('\\n').trim();\n } else {\n // No metadata section found, entire file is content\n result.content = rawText.trim();\n }\n \n return result;\n};\n\n/**\n * Extract the timestamp from a transcript filename\n * Expected format: DD-HHMM-subject.md (e.g., 15-1412-ne-4th-st-0.md)\n */\nexport const extractTimestampFromFilename = (filePath: string): { day: number; hour: number; minute: number } | null => {\n const basename = path.basename(filePath, '.md');\n const match = basename.match(/^(\\d{1,2})-(\\d{2})(\\d{2})/);\n \n if (match) {\n return {\n day: parseInt(match[1], 10),\n hour: parseInt(match[2], 10),\n minute: parseInt(match[3], 10),\n };\n }\n \n return null;\n};\n\n/**\n * Format metadata as Markdown heading section (matching util/metadata.ts format)\n */\nexport const formatMetadataMarkdown = (\n title: string,\n metadata: TranscriptMetadata,\n project?: Project\n): string => {\n const lines: string[] = [];\n \n // Title section\n lines.push(`# ${title}`);\n lines.push('');\n \n // Metadata frontmatter as readable markdown\n lines.push('## Metadata');\n lines.push('');\n \n // Date and Time\n if (metadata.date) {\n lines.push(`**Date**: ${metadata.date}`);\n }\n if (metadata.time) {\n lines.push(`**Time**: ${metadata.time}`);\n }\n \n lines.push('');\n \n // Project\n if (project) {\n lines.push(`**Project**: ${project.name}`);\n lines.push(`**Project ID**: \\`${project.id}\\``);\n lines.push('');\n } else if (metadata.project) {\n lines.push(`**Project**: ${metadata.project}`);\n if (metadata.projectId) {\n lines.push(`**Project ID**: \\`${metadata.projectId}\\``);\n }\n lines.push('');\n }\n \n // Routing Information\n if (metadata.destination) {\n lines.push('### Routing');\n lines.push('');\n lines.push(`**Destination**: ${metadata.destination}`);\n if (metadata.confidence) {\n lines.push(`**Confidence**: ${metadata.confidence}`);\n }\n lines.push('');\n \n if (metadata.signals && metadata.signals.length > 0) {\n lines.push('**Classification Signals**:');\n for (const signal of metadata.signals) {\n lines.push(`- ${signal}`);\n }\n lines.push('');\n }\n \n if (metadata.reasoning) {\n lines.push(`**Reasoning**: ${metadata.reasoning}`);\n lines.push('');\n }\n }\n \n // Tags\n if (metadata.tags && metadata.tags.length > 0) {\n lines.push('**Tags**: ' + metadata.tags.map(tag => `\\`${tag}\\``).join(', '));\n lines.push('');\n }\n \n // Duration\n if (metadata.duration) {\n lines.push(`**Duration**: ${metadata.duration}`);\n lines.push('');\n }\n \n // Separator\n lines.push('---');\n lines.push('');\n \n return lines.join('\\n');\n};\n\n/**\n * Slugify a title for use in filenames\n */\nexport const slugifyTitle = (title: string): string => {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with dash\n .replace(/--+/g, '-') // Collapse multiple dashes\n .replace(/^-|-$/g, '') // Remove leading/trailing dashes\n .slice(0, 50); // Limit length\n};\n\n/**\n * Combine multiple transcripts into a single document\n */\nexport const combineTranscripts = async (\n filePaths: string[],\n options: {\n projectId?: string;\n title?: string;\n dryRun?: boolean;\n verbose?: boolean;\n } = {}\n): Promise<{ outputPath: string; content: string }> => {\n if (filePaths.length === 0) {\n throw new Error('No transcript files provided');\n }\n \n // Parse all transcripts\n const transcripts: ParsedTranscript[] = [];\n for (const filePath of filePaths) {\n try {\n const parsed = await parseTranscript(filePath);\n transcripts.push(parsed);\n } catch (error) {\n throw new Error(`Failed to parse transcript: ${filePath} - ${error}`);\n }\n }\n \n // Sort by filename (which should be chronological due to timestamp prefix)\n transcripts.sort((a, b) => {\n const aName = path.basename(a.filePath);\n const bName = path.basename(b.filePath);\n return aName.localeCompare(bName);\n });\n \n // Use the first transcript's metadata as the base\n const firstTranscript = transcripts[0];\n const baseMetadata = { ...firstTranscript.metadata };\n \n // Load context to get project information if needed\n const context = await Context.create();\n let targetProject: Project | undefined;\n \n if (options.projectId) {\n targetProject = context.getProject(options.projectId);\n if (!targetProject) {\n throw new Error(`Project not found: ${options.projectId}`);\n }\n \n // Update metadata with new project\n baseMetadata.project = targetProject.name;\n baseMetadata.projectId = targetProject.id;\n \n // Update destination if project has routing configured\n if (targetProject.routing?.destination) {\n baseMetadata.destination = expandPath(targetProject.routing.destination);\n }\n }\n \n // Calculate combined duration if available\n let totalSeconds = 0;\n let hasDuration = false;\n for (const t of transcripts) {\n if (t.metadata.duration) {\n hasDuration = true;\n totalSeconds += parseDuration(t.metadata.duration);\n }\n }\n if (hasDuration && totalSeconds > 0) {\n baseMetadata.duration = formatDuration(totalSeconds);\n }\n \n // Combine tags from all transcripts (deduplicated)\n const allTags = new Set<string>();\n for (const t of transcripts) {\n if (t.metadata.tags) {\n for (const tag of t.metadata.tags) {\n allTags.add(tag);\n }\n }\n }\n if (allTags.size > 0) {\n baseMetadata.tags = Array.from(allTags).sort();\n }\n \n // Build combined title - use custom title if provided\n const combinedTitle = options.title \n ? options.title\n : (firstTranscript.title \n ? `${firstTranscript.title} (Combined)`\n : 'Combined Transcript');\n \n // Build combined content with section markers\n const contentParts: string[] = [];\n \n for (let i = 0; i < transcripts.length; i++) {\n const t = transcripts[i];\n const sectionTitle = t.title || `Part ${i + 1}`;\n const sourceFile = path.basename(t.filePath);\n \n contentParts.push(`## ${sectionTitle}`);\n contentParts.push(`*Source: ${sourceFile}*`);\n contentParts.push('');\n contentParts.push(t.content);\n contentParts.push('');\n }\n \n // Build final document\n const metadataSection = formatMetadataMarkdown(combinedTitle, baseMetadata, targetProject);\n const finalContent = metadataSection + contentParts.join('\\n');\n \n // Determine output path\n let outputPath: string;\n \n if (targetProject?.routing?.destination) {\n // Build path using project routing configuration\n const routingConfig = buildRoutingConfig(context, targetProject);\n const routing = Routing.create(routingConfig, context);\n \n // Extract date from first transcript for routing\n const audioDate = extractDateFromMetadata(baseMetadata, firstTranscript.filePath);\n \n const routingContext: Routing.RoutingContext = {\n transcriptText: finalContent,\n audioDate,\n sourceFile: firstTranscript.filePath,\n };\n \n const decision = routing.route(routingContext);\n outputPath = routing.buildOutputPath(decision, routingContext);\n } else {\n // Use the directory of the first transcript with a new filename\n const firstDir = path.dirname(firstTranscript.filePath);\n const timestamp = extractTimestampFromFilename(firstTranscript.filePath);\n \n // Use slugified custom title if provided, otherwise \"combined\"\n const filenameSuffix = options.title \n ? slugifyTitle(options.title)\n : 'combined';\n \n if (timestamp) {\n const day = timestamp.day.toString().padStart(2, '0');\n const hour = timestamp.hour.toString().padStart(2, '0');\n const minute = timestamp.minute.toString().padStart(2, '0');\n outputPath = path.join(firstDir, `${day}-${hour}${minute}-${filenameSuffix}.md`);\n } else {\n outputPath = path.join(firstDir, `${filenameSuffix}.md`);\n }\n }\n \n return { outputPath, content: finalContent };\n};\n\n/**\n * Build a routing config from context and project\n */\nconst buildRoutingConfig = (\n context: Context.ContextInstance,\n _targetProject: Project\n): Routing.RoutingConfig => {\n const config = context.getConfig();\n const defaultPath = expandPath((config.outputDirectory as string) || '~/notes');\n \n // Build project routes from all projects\n const projects: Routing.ProjectRoute[] = context.getAllProjects()\n .filter(p => p.active !== false)\n .map(p => ({\n projectId: p.id,\n destination: {\n path: expandPath(p.routing?.destination || defaultPath),\n structure: p.routing?.structure || 'month',\n filename_options: p.routing?.filename_options || ['date', 'time', 'subject'],\n },\n classification: p.classification,\n auto_tags: p.routing?.auto_tags,\n }));\n \n return {\n default: {\n path: defaultPath,\n structure: (config.outputStructure as Routing.FilesystemStructure) || 'month',\n filename_options: (config.outputFilenameOptions as Routing.FilenameOption[]) || ['date', 'time', 'subject'],\n },\n projects,\n conflict_resolution: 'primary',\n };\n};\n\n/**\n * Extract date from metadata or filename\n */\nconst extractDateFromMetadata = (metadata: TranscriptMetadata, filePath: string): Date => {\n // Try to parse from metadata date string\n if (metadata.date) {\n const parsed = new Date(metadata.date);\n if (!isNaN(parsed.getTime())) {\n // Add time if available\n if (metadata.time) {\n const timeMatch = metadata.time.match(/(\\d{1,2}):(\\d{2})\\s*(AM|PM)?/i);\n if (timeMatch) {\n let hours = parseInt(timeMatch[1], 10);\n const minutes = parseInt(timeMatch[2], 10);\n const ampm = timeMatch[3]?.toUpperCase();\n \n if (ampm === 'PM' && hours < 12) hours += 12;\n if (ampm === 'AM' && hours === 12) hours = 0;\n \n parsed.setHours(hours, minutes);\n }\n }\n return parsed;\n }\n }\n \n // Fall back to extracting from directory structure and filename\n // Expected path: .../2026/1/15-1412-subject.md\n const parts = filePath.split(path.sep);\n \n // Look for year/month in path\n let year = new Date().getFullYear();\n let month = new Date().getMonth();\n \n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n const num = parseInt(part, 10);\n if (num >= 2000 && num <= 2100) {\n year = num;\n // Next part might be month\n if (i + 1 < parts.length - 1) {\n const nextNum = parseInt(parts[i + 1], 10);\n if (nextNum >= 1 && nextNum <= 12) {\n month = nextNum - 1; // 0-indexed\n }\n }\n }\n }\n \n // Extract day and time from filename\n const timestamp = extractTimestampFromFilename(filePath);\n const day = timestamp?.day || 1;\n const hour = timestamp?.hour || 0;\n const minute = timestamp?.minute || 0;\n \n return new Date(year, month, day, hour, minute);\n};\n\n/**\n * Parse duration string to seconds\n */\nconst parseDuration = (duration: string): number => {\n let seconds = 0;\n \n const minuteMatch = duration.match(/(\\d+)m/);\n const secondMatch = duration.match(/(\\d+)s/);\n \n if (minuteMatch) {\n seconds += parseInt(minuteMatch[1], 10) * 60;\n }\n if (secondMatch) {\n seconds += parseInt(secondMatch[1], 10);\n }\n \n return seconds;\n};\n\n/**\n * Format seconds as duration string\n */\nconst formatDuration = (seconds: number): string => {\n const minutes = Math.floor(seconds / 60);\n const secs = Math.round(seconds % 60);\n \n if (minutes === 0) {\n return `${secs}s`;\n }\n if (secs === 0) {\n return `${minutes}m`;\n }\n return `${minutes}m ${secs}s`;\n};\n\n/**\n * Expand ~ to home directory\n */\nconst expandPath = (p: string): string => {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n};\n\n/**\n * Parse file paths from the combine argument\n * Supports newline-separated paths (from command line) or array\n */\nexport const parseFilePaths = (input: string): string[] => {\n // Split by newlines and filter empty lines\n return input\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0);\n};\n\n/**\n * Edit a single transcript - update title and/or project\n */\nexport const editTranscript = async (\n filePath: string,\n options: {\n title?: string;\n projectId?: string;\n dryRun?: boolean;\n verbose?: boolean;\n }\n): Promise<{ outputPath: string; content: string }> => {\n // Parse the existing transcript\n const transcript = await parseTranscript(filePath);\n \n // Load context if we need project info\n const context = await Context.create();\n let targetProject: Project | undefined;\n \n if (options.projectId) {\n targetProject = context.getProject(options.projectId);\n if (!targetProject) {\n throw new Error(`Project not found: ${options.projectId}`);\n }\n }\n \n // Use new title if provided, otherwise keep existing\n const newTitle = options.title || transcript.title || 'Untitled';\n \n // Update metadata\n const updatedMetadata = { ...transcript.metadata };\n \n if (targetProject) {\n updatedMetadata.project = targetProject.name;\n updatedMetadata.projectId = targetProject.id;\n if (targetProject.routing?.destination) {\n updatedMetadata.destination = expandPath(targetProject.routing.destination);\n }\n }\n \n // Build the updated document\n const metadataSection = formatMetadataMarkdown(newTitle, updatedMetadata, targetProject);\n const finalContent = metadataSection + transcript.content;\n \n // Determine output path\n let outputPath: string;\n \n if (targetProject?.routing?.destination) {\n // Build path using project routing configuration\n const routingConfig = buildRoutingConfig(context, targetProject);\n const routing = Routing.create(routingConfig, context);\n \n const audioDate = extractDateFromMetadata(updatedMetadata, filePath);\n \n const routingContext: Routing.RoutingContext = {\n transcriptText: finalContent,\n audioDate,\n sourceFile: filePath,\n };\n \n const decision = routing.route(routingContext);\n \n // If we have a custom title, override the filename with slugified title\n if (options.title) {\n const basePath = path.dirname(routing.buildOutputPath(decision, routingContext));\n const timestamp = extractTimestampFromFilename(filePath);\n const sluggedTitle = slugifyTitle(options.title);\n \n if (timestamp) {\n const day = timestamp.day.toString().padStart(2, '0');\n const hour = timestamp.hour.toString().padStart(2, '0');\n const minute = timestamp.minute.toString().padStart(2, '0');\n outputPath = path.join(basePath, `${day}-${hour}${minute}-${sluggedTitle}.md`);\n } else {\n outputPath = path.join(basePath, `${sluggedTitle}.md`);\n }\n } else {\n outputPath = routing.buildOutputPath(decision, routingContext);\n }\n } else {\n // Keep in same directory, potentially with new filename\n const dir = path.dirname(filePath);\n const timestamp = extractTimestampFromFilename(filePath);\n \n if (options.title) {\n const sluggedTitle = slugifyTitle(options.title);\n if (timestamp) {\n const day = timestamp.day.toString().padStart(2, '0');\n const hour = timestamp.hour.toString().padStart(2, '0');\n const minute = timestamp.minute.toString().padStart(2, '0');\n outputPath = path.join(dir, `${day}-${hour}${minute}-${sluggedTitle}.md`);\n } else {\n outputPath = path.join(dir, `${sluggedTitle}.md`);\n }\n } else {\n // Keep original filename\n outputPath = filePath;\n }\n }\n \n return { outputPath, content: finalContent };\n};\n\n/**\n * Execute the action command\n */\nconst executeAction = async (\n file: string | undefined,\n options: { \n project?: string; \n title?: string; \n combine?: string;\n dryRun?: boolean; \n verbose?: boolean;\n }\n) => {\n // Determine mode: combine or edit\n if (options.combine) {\n // Combine mode\n const filePaths = parseFilePaths(options.combine);\n \n if (filePaths.length === 0) {\n print('Error: No transcript files provided for --combine.');\n process.exit(1);\n }\n \n if (filePaths.length === 1) {\n print('Error: At least 2 transcript files are required for --combine.');\n process.exit(1);\n }\n \n // Validate all files exist\n for (const filePath of filePaths) {\n try {\n await fs.access(filePath);\n } catch {\n print(`Error: File not found: ${filePath}`);\n process.exit(1);\n }\n }\n \n if (options.verbose) {\n print(`\\n[Combining ${filePaths.length} transcripts]`);\n for (const fp of filePaths) {\n print(` - ${fp}`);\n }\n if (options.project) {\n print(`\\nTarget project: ${options.project}`);\n }\n if (options.title) {\n print(`\\nCustom title: ${options.title}`);\n }\n print('');\n }\n \n try {\n const result = await combineTranscripts(filePaths, {\n projectId: options.project,\n title: options.title,\n dryRun: options.dryRun,\n verbose: options.verbose,\n });\n \n if (options.dryRun) {\n print('[Dry Run] Would create combined transcript:');\n print(` Output: ${result.outputPath}`);\n print(` Size: ${result.content.length} characters`);\n print('');\n print('[Dry Run] Would delete source files:');\n for (const fp of filePaths) {\n print(` - ${fp}`);\n }\n if (options.verbose) {\n print('\\n--- Preview (first 500 chars) ---');\n print(result.content.slice(0, 500));\n print('...');\n }\n } else {\n // Ensure output directory exists\n await fs.mkdir(path.dirname(result.outputPath), { recursive: true });\n \n // Write the combined transcript\n await fs.writeFile(result.outputPath, result.content, 'utf-8');\n print(`Combined transcript created: ${result.outputPath}`);\n \n // Automatically delete source files when combining\n if (options.verbose) {\n print('\\nDeleting source files...');\n }\n for (const fp of filePaths) {\n try {\n await fs.unlink(fp);\n if (options.verbose) {\n print(` Deleted: ${fp}`);\n }\n } catch (error) {\n print(` Warning: Could not delete ${fp}: ${error}`);\n }\n }\n print(`Deleted ${filePaths.length} source files.`);\n }\n } catch (error) {\n print(`Error: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n } else if (file) {\n // Edit mode - single file\n if (!options.title && !options.project) {\n print('Error: Must specify --title and/or --project when editing a single file.');\n process.exit(1);\n }\n \n // Validate file exists\n try {\n await fs.access(file);\n } catch {\n print(`Error: File not found: ${file}`);\n process.exit(1);\n }\n \n if (options.verbose) {\n print(`\\n[Editing transcript]`);\n print(` File: ${file}`);\n if (options.title) {\n print(` New title: ${options.title}`);\n }\n if (options.project) {\n print(` New project: ${options.project}`);\n }\n print('');\n }\n \n try {\n const result = await editTranscript(file, {\n title: options.title,\n projectId: options.project,\n dryRun: options.dryRun,\n verbose: options.verbose,\n });\n \n const isRename = result.outputPath !== file;\n \n if (options.dryRun) {\n print('[Dry Run] Would update transcript:');\n if (isRename) {\n print(` From: ${file}`);\n print(` To: ${result.outputPath}`);\n } else {\n print(` File: ${result.outputPath}`);\n }\n print(` Size: ${result.content.length} characters`);\n if (options.verbose) {\n print('\\n--- Preview (first 500 chars) ---');\n print(result.content.slice(0, 500));\n print('...');\n }\n } else {\n // Ensure output directory exists\n await fs.mkdir(path.dirname(result.outputPath), { recursive: true });\n \n // Write the updated transcript\n await fs.writeFile(result.outputPath, result.content, 'utf-8');\n \n // Delete original if renamed\n if (isRename) {\n await fs.unlink(file);\n print(`Transcript updated and renamed:`);\n print(` From: ${file}`);\n print(` To: ${result.outputPath}`);\n } else {\n print(`Transcript updated: ${result.outputPath}`);\n }\n }\n } catch (error) {\n print(`Error: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n } else {\n print('Error: Must specify either a file to edit or --combine with files to combine.');\n print('');\n print('Usage:');\n print(' protokoll action --title \"New Title\" /path/to/file.md');\n print(' protokoll action --combine \"/path/to/file1.md\\\\n/path/to/file2.md\"');\n process.exit(1);\n }\n};\n\n/**\n * Register the action command\n */\nexport const registerActionCommands = (program: Command): void => {\n const actionCmd = new Command('action')\n .description('Edit a single transcript or combine multiple transcripts')\n .argument('[file]', 'Transcript file to edit (when not using --combine)')\n .option('-t, --title <title>', 'Set a custom title (also affects filename)')\n .option('-p, --project <projectId>', 'Change to a different project (updates metadata and routing)')\n .option('-c, --combine <files>', 'Combine multiple files (newline-separated list)')\n .option('--dry-run', 'Show what would happen without making changes')\n .option('-v, --verbose', 'Show detailed output')\n .action(executeAction);\n \n program.addCommand(actionCmd);\n};\n","/**\n * Feedback CLI\n * \n * Provides an intelligent feedback system that uses an agentic model to:\n * - Understand natural language feedback about transcripts\n * - Correct spelling/term issues in transcripts\n * - Add terms, people, or companies to context\n * - Change project assignments and move files\n * - Help users understand what feedback they can provide\n * \n * Usage:\n * protokoll feedback /path/to/transcript.md\n * protokoll feedback --help-me\n */\n\nimport { Command } from 'commander';\nimport * as readline from 'readline';\nimport * as fs from 'fs/promises';\nimport * as path from 'node:path';\nimport * as Context from '../context';\nimport * as Reasoning from '../reasoning';\nimport * as Logging from '../logging';\nimport { slugifyTitle, extractTimestampFromFilename } from './action';\nimport { DEFAULT_MODEL } from '../constants';\n\n// CLI output helper\nconst print = (text: string) => process.stdout.write(text + '\\n');\n\n/**\n * Tool definitions for the agentic feedback processor\n */\nexport interface FeedbackTool {\n name: string;\n description: string;\n parameters: Record<string, {\n type: string;\n description: string;\n required?: boolean;\n enum?: string[];\n items?: { type: string };\n }>;\n}\n\nexport const FEEDBACK_TOOLS: FeedbackTool[] = [\n {\n name: 'correct_text',\n description: 'Replace text in the transcript. Use this to fix misspellings, wrong terms, or incorrect names.',\n parameters: {\n find: { type: 'string', description: 'The text to find in the transcript', required: true },\n replace: { type: 'string', description: 'The text to replace it with', required: true },\n replace_all: { type: 'boolean', description: 'Replace all occurrences (default: true)' },\n },\n },\n {\n name: 'add_term',\n description: 'Add a new term to the context so it will be recognized in future transcripts. Use this when you learn about abbreviations, acronyms, or technical terms.',\n parameters: {\n term: { type: 'string', description: 'The correct term/abbreviation', required: true },\n definition: { type: 'string', description: 'What the term means', required: true },\n sounds_like: { type: 'array', items: { type: 'string' }, description: 'Phonetic variations that might be transcribed incorrectly (e.g., [\"W C M P\", \"double u see em pee\"])' },\n context: { type: 'string', description: 'Additional context about when this term is used' },\n },\n },\n {\n name: 'add_person',\n description: 'Add a new person to the context for future name recognition. Use this when you learn about people whose names were transcribed incorrectly.',\n parameters: {\n name: { type: 'string', description: 'The correct full name', required: true },\n sounds_like: { type: 'array', items: { type: 'string' }, description: 'Phonetic variations (e.g., [\"San Jay\", \"Sanjai\", \"Sanjey\"])', required: true },\n role: { type: 'string', description: 'Their role or title' },\n company: { type: 'string', description: 'Company they work for' },\n context: { type: 'string', description: 'Additional context about this person' },\n },\n },\n {\n name: 'change_project',\n description: 'Change the project assignment of this transcript. This updates metadata and may move the file to a new location based on project routing.',\n parameters: {\n project_id: { type: 'string', description: 'The project ID to assign', required: true },\n },\n },\n {\n name: 'change_title',\n description: 'Change the title of this transcript. This updates the document heading and renames the file.',\n parameters: {\n new_title: { type: 'string', description: 'The new title for the transcript', required: true },\n },\n },\n {\n name: 'provide_help',\n description: 'Provide helpful information to the user about what kinds of feedback they can give.',\n parameters: {\n topic: { type: 'string', description: 'The topic to help with', enum: ['terms', 'people', 'projects', 'corrections', 'general'] },\n },\n },\n {\n name: 'complete',\n description: 'Call this when you have finished processing all the feedback and applied all necessary changes.',\n parameters: {\n summary: { type: 'string', description: 'A summary of what was done', required: true },\n },\n },\n];\n\n/**\n * Result of a tool execution\n */\nexport interface ToolResult {\n success: boolean;\n message: string;\n data?: Record<string, unknown>;\n}\n\n/**\n * Feedback processing context\n */\nexport interface FeedbackContext {\n transcriptPath: string;\n transcriptContent: string;\n originalContent: string;\n context: Context.ContextInstance;\n changes: FeedbackChange[];\n verbose: boolean;\n dryRun: boolean;\n}\n\nexport interface FeedbackChange {\n type: 'text_correction' | 'term_added' | 'person_added' | 'project_changed' | 'title_changed';\n description: string;\n details: Record<string, unknown>;\n}\n\n/**\n * Create a readline interface for user input\n */\nconst createReadlineInterface = () => {\n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n};\n\n/**\n * Ask a question and get user input\n */\nconst askQuestion = (rl: readline.Interface, question: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n};\n\n/**\n * Execute a feedback tool\n */\nexport const executeTool = async (\n toolName: string,\n args: Record<string, unknown>,\n feedbackCtx: FeedbackContext\n): Promise<ToolResult> => {\n const logger = Logging.getLogger();\n \n switch (toolName) {\n case 'correct_text': {\n const find = String(args.find);\n const replace = String(args.replace);\n const replaceAll = args.replace_all !== false;\n \n if (!feedbackCtx.transcriptContent.includes(find)) {\n return {\n success: false,\n message: `Text \"${find}\" not found in transcript.`,\n };\n }\n \n const occurrences = feedbackCtx.transcriptContent.split(find).length - 1;\n \n if (replaceAll) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.split(find).join(replace);\n } else {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(find, replace);\n }\n \n const changeCount = replaceAll ? occurrences : 1;\n \n feedbackCtx.changes.push({\n type: 'text_correction',\n description: `Replaced \"${find}\" with \"${replace}\" (${changeCount} occurrence${changeCount > 1 ? 's' : ''})`,\n details: { find, replace, count: changeCount },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Replaced \"${find}\" → \"${replace}\" (${changeCount}x)`);\n }\n \n return {\n success: true,\n message: `Replaced ${changeCount} occurrence(s) of \"${find}\" with \"${replace}\".`,\n };\n }\n \n case 'add_term': {\n const term = String(args.term);\n const definition = String(args.definition);\n const soundsLike = args.sounds_like as string[] | undefined;\n const termContext = args.context as string | undefined;\n \n // Generate ID from term\n const id = term.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n \n // Check if term already exists\n const existing = feedbackCtx.context.getTerm(id);\n if (existing) {\n return {\n success: false,\n message: `Term \"${term}\" already exists in context.`,\n };\n }\n \n const newTerm: Context.Term = {\n id,\n name: term,\n type: 'term',\n expansion: definition,\n sounds_like: soundsLike,\n domain: termContext,\n };\n \n if (!feedbackCtx.dryRun) {\n await feedbackCtx.context.saveEntity(newTerm);\n }\n \n feedbackCtx.changes.push({\n type: 'term_added',\n description: `Added term \"${term}\" to context`,\n details: { term, definition, sounds_like: soundsLike },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Added term: ${term} = \"${definition}\"`);\n if (soundsLike?.length) {\n print(` sounds_like: ${soundsLike.join(', ')}`);\n }\n }\n \n return {\n success: true,\n message: `Added term \"${term}\" to context. It will be recognized in future transcripts.`,\n data: { id, term, definition },\n };\n }\n \n case 'add_person': {\n const name = String(args.name);\n const soundsLike = args.sounds_like as string[];\n const role = args.role as string | undefined;\n const company = args.company as string | undefined;\n const personContext = args.context as string | undefined;\n \n // Generate ID from name\n const id = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n \n // Check if person already exists\n const existing = feedbackCtx.context.getPerson(id);\n if (existing) {\n return {\n success: false,\n message: `Person \"${name}\" already exists in context.`,\n };\n }\n \n const newPerson: Context.Person = {\n id,\n name,\n type: 'person',\n sounds_like: soundsLike,\n role,\n company,\n context: personContext,\n };\n \n if (!feedbackCtx.dryRun) {\n await feedbackCtx.context.saveEntity(newPerson);\n }\n \n feedbackCtx.changes.push({\n type: 'person_added',\n description: `Added person \"${name}\" to context`,\n details: { name, sounds_like: soundsLike, role, company },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Added person: ${name}`);\n print(` sounds_like: ${soundsLike.join(', ')}`);\n if (role) print(` role: ${role}`);\n if (company) print(` company: ${company}`);\n }\n \n return {\n success: true,\n message: `Added person \"${name}\" to context. Their name will be recognized in future transcripts.`,\n data: { id, name, sounds_like: soundsLike },\n };\n }\n \n case 'change_project': {\n const projectId = String(args.project_id);\n \n // Find the project\n const project = feedbackCtx.context.getProject(projectId);\n if (!project) {\n // List available projects\n const available = feedbackCtx.context.getAllProjects().map(p => p.id);\n return {\n success: false,\n message: `Project \"${projectId}\" not found. Available projects: ${available.join(', ')}`,\n };\n }\n \n // Update metadata in transcript\n const metadataRegex = /\\*\\*Project\\*\\*: .+/;\n const projectIdRegex = /\\*\\*Project ID\\*\\*: `.+`/;\n \n if (metadataRegex.test(feedbackCtx.transcriptContent)) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(\n metadataRegex,\n `**Project**: ${project.name}`\n );\n }\n \n if (projectIdRegex.test(feedbackCtx.transcriptContent)) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(\n projectIdRegex,\n `**Project ID**: \\`${project.id}\\``\n );\n }\n \n feedbackCtx.changes.push({\n type: 'project_changed',\n description: `Changed project to \"${project.name}\" (${project.id})`,\n details: { project_id: projectId, project_name: project.name, routing: project.routing },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Changed project to: ${project.name} (${project.id})`);\n if (project.routing?.destination) {\n print(` New destination: ${project.routing.destination}`);\n }\n }\n \n return {\n success: true,\n message: `Changed project to \"${project.name}\". The transcript metadata has been updated.`,\n data: { project_id: projectId, destination: project.routing?.destination },\n };\n }\n \n case 'change_title': {\n const newTitle = String(args.new_title);\n \n // Update title in transcript (first # heading)\n const titleRegex = /^# .+$/m;\n if (titleRegex.test(feedbackCtx.transcriptContent)) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(\n titleRegex,\n `# ${newTitle}`\n );\n }\n \n feedbackCtx.changes.push({\n type: 'title_changed',\n description: `Changed title to \"${newTitle}\"`,\n details: { new_title: newTitle, slug: slugifyTitle(newTitle) },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Changed title to: ${newTitle}`);\n }\n \n return {\n success: true,\n message: `Changed title to \"${newTitle}\". The file will be renamed accordingly.`,\n data: { new_title: newTitle },\n };\n }\n \n case 'provide_help': {\n const topic = String(args.topic || 'general');\n let helpText = '';\n \n switch (topic) {\n case 'terms':\n helpText = `\n**Term Corrections**\n\nYou can teach me about abbreviations, acronyms, and technical terms:\n\n- \"Everywhere it says WCMP, that should be WCNP - Walmart's Native Cloud Platform\"\n- \"YB should be spelled Wibey\"\n- \"API should be written as A.P.I. in this context\"\n\nI'll:\n1. Fix the term in this transcript\n2. Add it to my vocabulary for future transcripts\n`;\n break;\n \n case 'people':\n helpText = `\n**Name Corrections**\n\nYou can teach me about people whose names were transcribed incorrectly:\n\n- \"San Jay Grouper is actually Sanjay Gupta\"\n- \"Priya was transcribed as 'pre a' - please fix\"\n- \"Marie should be spelled Mari (without the e)\"\n\nI'll:\n1. Fix the name everywhere in this transcript\n2. Remember how the name sounds for future transcripts\n`;\n break;\n \n case 'projects':\n helpText = `\n**Project Assignment**\n\nYou can tell me if a transcript belongs to a different project:\n\n- \"This should be in the Quantum Readiness project\"\n- \"Move this to the client-alpha project\"\n- \"This was misclassified - it's a personal note, not work\"\n\nI'll:\n1. Update the project metadata\n2. Move the file to the project's configured location\n`;\n break;\n \n case 'corrections':\n helpText = `\n**General Corrections**\n\nYou can ask me to fix any text in the transcript:\n\n- \"Change 'gonna' to 'going to' everywhere\"\n- \"The date mentioned should be January 15th, not January 5th\"\n- \"Remove the paragraph about lunch - that was a tangent\"\n\nI'll make the corrections while preserving the rest of the transcript.\n`;\n break;\n \n default:\n helpText = `\n**What I Can Help With**\n\nI can process your feedback to:\n\n1. **Fix Terms & Abbreviations**: \"WCMP should be WCNP\"\n2. **Correct Names**: \"San Jay Grouper is Sanjay Gupta\"\n3. **Change Projects**: \"This belongs in the Quantum project\"\n4. **Update Title**: \"Change the title to 'Q1 Planning Session'\"\n5. **General Corrections**: \"Replace X with Y everywhere\"\n\nJust describe what's wrong in natural language, and I'll figure out what to do!\n\nAsk about specific topics:\n- \"How do I correct terms?\"\n- \"How do I fix names?\"\n- \"How do I change the project?\"\n`;\n }\n \n print(helpText);\n \n return {\n success: true,\n message: helpText,\n };\n }\n \n case 'complete': {\n const summary = String(args.summary);\n return {\n success: true,\n message: summary,\n data: { complete: true },\n };\n }\n \n default:\n logger.warn('Unknown tool: %s', toolName);\n return {\n success: false,\n message: `Unknown tool: ${toolName}`,\n };\n }\n};\n\n/**\n * Build the system prompt for the feedback agent\n */\nexport const buildFeedbackSystemPrompt = (\n transcriptPreview: string,\n availableProjects: string[]\n): string => {\n const toolDescriptions = FEEDBACK_TOOLS.map(t => \n `- ${t.name}: ${t.description}`\n ).join('\\n');\n \n return `You are an intelligent feedback processor for a transcription system. Your job is to understand user feedback about transcripts and take appropriate actions.\n\n## Current Transcript Preview\n${transcriptPreview.substring(0, 1000)}${transcriptPreview.length > 1000 ? '...' : ''}\n\n## Available Projects\n${availableProjects.length > 0 ? availableProjects.join(', ') : '(no projects configured)'}\n\n## Available Tools\n${toolDescriptions}\n\n## How to Process Feedback\n\n1. **Understand the feedback**: What is the user asking for?\n2. **Identify actions**: What tools do you need to use?\n3. **Execute in order**: \n - First, make text corrections (correct_text)\n - Then, add context entities (add_term, add_person)\n - Finally, change metadata if needed (change_project, change_title)\n4. **Summarize**: Call 'complete' with a summary when done\n\n## Important Rules\n\n- If the user asks for help or seems unsure, use provide_help first\n- For name corrections: BOTH fix the text AND add the person to context\n- For term corrections: BOTH fix the text AND add the term to context\n- When fixing names/terms, use correct_text with replace_all=true\n- Be thorough - if \"San Jay Grouper\" should be \"Sanjay Gupta\", also consider variations like \"San jay\", \"Sanjay Grouper\", etc.\n- Always call 'complete' when finished, with a summary of what you did\n\n## Example Interactions\n\nUser: \"YB should be Wibey\"\n→ Use correct_text to replace \"YB\" with \"Wibey\"\n→ Use add_term to add \"Wibey\" with sounds_like [\"YB\", \"Y B\"]\n→ Use complete to summarize\n\nUser: \"San Jay Grouper is actually Sanjay Gupta\"\n→ Use correct_text to replace \"San Jay Grouper\" with \"Sanjay Gupta\"\n→ Use correct_text to replace any other variations like \"San jay Grouper\"\n→ Use add_person to add \"Sanjay Gupta\" with sounds_like [\"San Jay Grouper\", \"Sanjay Grouper\"]\n→ Use complete to summarize\n\nUser: \"This should be in the Quantum Readiness project\"\n→ Use change_project with project_id matching \"Quantum Readiness\" or similar\n→ Use complete to summarize\n\nRespond with tool calls to process the feedback.`;\n};\n\n/**\n * Process feedback using the agentic model\n */\nexport const processFeedback = async (\n feedback: string,\n feedbackCtx: FeedbackContext,\n reasoning: Reasoning.ReasoningInstance\n): Promise<void> => {\n const logger = Logging.getLogger();\n \n // Get available projects\n const projects = feedbackCtx.context.getAllProjects().map(p => `${p.id} (${p.name})`);\n \n // Build the prompt\n const systemPrompt = buildFeedbackSystemPrompt(\n feedbackCtx.transcriptContent,\n projects\n );\n \n // Convert tools to OpenAI format\n const tools = FEEDBACK_TOOLS.map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n Object.entries(t.parameters).map(([key, param]) => [\n key,\n {\n type: param.type,\n description: param.description,\n ...(param.enum ? { enum: param.enum } : {}),\n ...(param.items ? { items: param.items } : {}),\n },\n ])\n ),\n required: Object.entries(t.parameters)\n .filter(([_, p]) => p.required)\n .map(([key]) => key),\n },\n },\n }));\n \n // Process with reasoning model\n let iterations = 0;\n const maxIterations = 10;\n const conversationHistory: Array<{\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{ id: string; function: { name: string; arguments: string } }>;\n }> = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: feedback },\n ];\n \n while (iterations < maxIterations) {\n iterations++;\n \n logger.debug('Feedback processing iteration %d', iterations);\n \n try {\n const response = await reasoning.completeWithTools({\n messages: conversationHistory,\n tools,\n });\n \n // Check for tool calls\n if (response.tool_calls && response.tool_calls.length > 0) {\n // Add assistant message with tool calls\n conversationHistory.push({\n role: 'assistant',\n content: response.content || '',\n tool_calls: response.tool_calls.map(tc => ({\n id: tc.id,\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n })),\n });\n \n // Execute each tool call\n for (const toolCall of response.tool_calls) {\n const toolName = toolCall.function.name;\n let args: Record<string, unknown>;\n \n try {\n args = JSON.parse(toolCall.function.arguments);\n } catch {\n args = {};\n }\n \n if (feedbackCtx.verbose) {\n print(`\\n[Executing: ${toolName}]`);\n }\n \n const result = await executeTool(toolName, args, feedbackCtx);\n \n // Add tool result to conversation\n conversationHistory.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: toolCall.id,\n });\n \n // Check if complete\n if (toolName === 'complete') {\n if (feedbackCtx.verbose) {\n print(`\\n${result.message}`);\n }\n return;\n }\n }\n } else {\n // No tool calls - model is done or confused\n if (response.content) {\n print(`\\n${response.content}`);\n }\n return;\n }\n } catch (error) {\n logger.error('Error during feedback processing', { error });\n throw error;\n }\n }\n \n logger.warn('Feedback processing reached max iterations');\n};\n\n/**\n * Apply changes and save the transcript\n */\nexport const applyChanges = async (\n feedbackCtx: FeedbackContext\n): Promise<{ newPath: string; moved: boolean }> => {\n const logger = Logging.getLogger();\n \n let newPath = feedbackCtx.transcriptPath;\n let moved = false;\n \n // Check if we need to rename the file (title changed)\n const titleChange = feedbackCtx.changes.find(c => c.type === 'title_changed');\n if (titleChange) {\n const slug = titleChange.details.slug as string;\n const timestamp = extractTimestampFromFilename(feedbackCtx.transcriptPath);\n const dir = path.dirname(feedbackCtx.transcriptPath);\n \n if (timestamp) {\n const timeStr = `${timestamp.hour.toString().padStart(2, '0')}${timestamp.minute.toString().padStart(2, '0')}`;\n newPath = path.join(dir, `${timestamp.day}-${timeStr}-${slug}.md`);\n } else {\n newPath = path.join(dir, `${slug}.md`);\n }\n }\n \n // Check if we need to move the file (project changed)\n const projectChange = feedbackCtx.changes.find(c => c.type === 'project_changed');\n if (projectChange && projectChange.details.routing) {\n const routing = projectChange.details.routing as { destination?: string; structure?: string };\n if (routing.destination) {\n // Expand ~ to home directory\n let dest = routing.destination;\n if (dest.startsWith('~')) {\n dest = path.join(process.env.HOME || '', dest.slice(1));\n }\n \n // Get date from transcript metadata or use current date\n const now = new Date();\n const year = now.getFullYear().toString();\n const month = (now.getMonth() + 1).toString().padStart(2, '0');\n \n // Build path based on structure\n let structuredPath = dest;\n const structure = routing.structure || 'month';\n if (structure === 'year') {\n structuredPath = path.join(dest, year);\n } else if (structure === 'month') {\n structuredPath = path.join(dest, year, month);\n } else if (structure === 'day') {\n const day = now.getDate().toString().padStart(2, '0');\n structuredPath = path.join(dest, year, month, day);\n }\n \n // Update path\n const filename = path.basename(newPath);\n newPath = path.join(structuredPath, filename);\n moved = true;\n }\n }\n \n // Ensure directory exists\n await fs.mkdir(path.dirname(newPath), { recursive: true });\n \n // Write the updated content\n if (!feedbackCtx.dryRun) {\n await fs.writeFile(newPath, feedbackCtx.transcriptContent, 'utf-8');\n \n // Delete original if moved/renamed\n if (newPath !== feedbackCtx.transcriptPath) {\n await fs.unlink(feedbackCtx.transcriptPath);\n }\n }\n \n logger.info('Applied %d changes to transcript', feedbackCtx.changes.length);\n \n return { newPath, moved };\n};\n\n/**\n * Run the feedback command\n */\nexport const runFeedback = async (\n transcriptPath: string,\n options: {\n feedback?: string;\n model?: string;\n dryRun?: boolean;\n verbose?: boolean;\n }\n): Promise<void> => {\n // Verify file exists\n try {\n await fs.access(transcriptPath);\n } catch {\n print(`Error: File not found: ${transcriptPath}`);\n process.exit(1);\n }\n \n // Read transcript\n const transcriptContent = await fs.readFile(transcriptPath, 'utf-8');\n \n // Initialize context\n const context = await Context.create();\n \n // Initialize reasoning\n const reasoning = Reasoning.create({ model: options.model || DEFAULT_MODEL });\n \n // Create feedback context\n const feedbackCtx: FeedbackContext = {\n transcriptPath,\n transcriptContent,\n originalContent: transcriptContent,\n context,\n changes: [],\n verbose: options.verbose || false,\n dryRun: options.dryRun || false,\n };\n \n // Get feedback from user if not provided\n let feedback = options.feedback;\n if (!feedback) {\n const rl = createReadlineInterface();\n \n print('\\n' + '─'.repeat(60));\n print(`[Feedback for: ${path.basename(transcriptPath)}]`);\n print('─'.repeat(60));\n print('\\nDescribe what needs to be corrected in natural language.');\n print('Examples:');\n print(' - \"YB should be Wibey\"');\n print(' - \"San Jay Grouper is actually Sanjay Gupta\"');\n print(' - \"This should be in the Quantum Readiness project\"');\n print(' - \"What feedback can I give?\" (for help)\\n');\n \n feedback = await askQuestion(rl, 'What is your feedback? ');\n rl.close();\n \n if (!feedback) {\n print('No feedback provided.');\n return;\n }\n }\n \n if (options.verbose) {\n print('\\n[Processing feedback...]');\n }\n \n // Process feedback with agentic model\n await processFeedback(feedback, feedbackCtx, reasoning);\n \n // Apply changes\n if (feedbackCtx.changes.length > 0) {\n if (options.dryRun) {\n print('\\n[Dry Run] Would apply the following changes:');\n for (const change of feedbackCtx.changes) {\n print(` - ${change.description}`);\n }\n } else {\n const { newPath, moved } = await applyChanges(feedbackCtx);\n \n print('\\n' + '─'.repeat(60));\n print('[Changes Applied]');\n print('─'.repeat(60));\n \n for (const change of feedbackCtx.changes) {\n print(` ✓ ${change.description}`);\n }\n \n if (newPath !== feedbackCtx.transcriptPath) {\n if (moved) {\n print(`\\nFile moved to: ${newPath}`);\n } else {\n print(`\\nFile renamed to: ${path.basename(newPath)}`);\n }\n } else {\n print(`\\nFile updated: ${transcriptPath}`);\n }\n }\n } else {\n print('\\nNo changes were made.');\n }\n};\n\n/**\n * Register the feedback command\n */\nexport const registerFeedbackCommands = (program: Command): void => {\n const feedbackCmd = new Command('feedback')\n .description('Provide natural language feedback to correct transcripts and improve context')\n .argument('[file]', 'Transcript file to provide feedback on')\n .option('-f, --feedback <text>', 'Feedback text (if not provided, will prompt interactively)')\n .option('-m, --model <model>', 'Reasoning model to use', DEFAULT_MODEL)\n .option('--dry-run', 'Show what would happen without making changes')\n .option('-v, --verbose', 'Show detailed output')\n .option('--help-me', 'Show examples of feedback you can provide')\n .action(async (file: string | undefined, options: {\n feedback?: string;\n model?: string;\n dryRun?: boolean;\n verbose?: boolean;\n helpMe?: boolean;\n }) => {\n if (options.helpMe) {\n print(`\n╔════════════════════════════════════════════════════════════╗\n║ PROTOKOLL FEEDBACK - EXAMPLES ║\n╠════════════════════════════════════════════════════════════╣\n║ ║\n║ CORRECTING TERMS & ABBREVIATIONS ║\n║ ───────────────────────────────── ║\n║ \"Everywhere it says WCMP, that should be WCNP\" ║\n║ \"YB should be spelled Wibey\" ║\n║ \"API should be written as A-P-I\" ║\n║ ║\n║ FIXING NAMES ║\n║ ──────────── ║\n║ \"San Jay Grouper is actually Sanjay Gupta\" ║\n║ \"Priya was transcribed as 'pre a' - please fix\" ║\n║ \"Marie should be spelled Mari\" ║\n║ ║\n║ CHANGING PROJECT ASSIGNMENT ║\n║ ─────────────────────────── ║\n║ \"This should be in the Quantum Readiness project\" ║\n║ \"Move this to client-alpha\" ║\n║ \"This was misclassified - should be personal\" ║\n║ ║\n║ GENERAL CORRECTIONS ║\n║ ─────────────────── ║\n║ \"Change the title to 'Q1 Planning Session'\" ║\n║ \"Replace 'gonna' with 'going to' everywhere\" ║\n║ ║\n╚════════════════════════════════════════════════════════════╝\n\nUsage:\n protokoll feedback /path/to/transcript.md\n protokoll feedback /path/to/transcript.md -f \"YB should be Wibey\"\n protokoll feedback /path/to/transcript.md --dry-run -v\n`);\n return;\n }\n \n if (!file) {\n print('Error: A transcript file is required.');\n print('Usage: protokoll feedback /path/to/transcript.md');\n print('Run \"protokoll feedback --help-me\" for examples.');\n process.exit(1);\n }\n \n await runFeedback(file, options);\n });\n \n program.addCommand(feedbackCmd);\n};\n","/**\n * Transcript CLI Commands\n * \n * Commands for working with transcripts, including comparing against\n * raw Whisper output and reanalyzing.\n */\n\n/* eslint-disable no-console */\nimport { Command } from 'commander';\nimport * as fs from 'fs/promises';\nimport * as path from 'node:path';\nimport { glob } from 'glob';\nimport { RawTranscriptData } from '../output/types';\nimport * as Metadata from '../util/metadata';\n\n/**\n * Get the raw transcript path for a given final transcript path\n */\nexport const getRawTranscriptPath = (finalPath: string): string => {\n const dir = path.dirname(finalPath);\n const basename = path.basename(finalPath, path.extname(finalPath));\n return path.join(dir, '.transcript', `${basename}.json`);\n};\n\n/**\n * Read raw transcript data from the .transcript/ directory\n */\nexport const readRawTranscript = async (finalPath: string): Promise<RawTranscriptData | null> => {\n const rawPath = getRawTranscriptPath(finalPath);\n try {\n const content = await fs.readFile(rawPath, 'utf-8');\n return JSON.parse(content) as RawTranscriptData;\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n};\n\n/**\n * Read final transcript content\n */\nexport const readFinalTranscript = async (finalPath: string): Promise<string | null> => {\n try {\n return await fs.readFile(finalPath, 'utf-8');\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n};\n\n/**\n * Format a side-by-side comparison of raw and enhanced transcripts\n */\nexport const formatComparison = (raw: string, enhanced: string, width: number = 80): string => {\n const halfWidth = Math.floor(width / 2) - 2;\n const lines: string[] = [];\n \n // Header\n lines.push('╔' + '═'.repeat(halfWidth) + '╦' + '═'.repeat(halfWidth) + '╗');\n lines.push('║' + ' RAW WHISPER OUTPUT'.padEnd(halfWidth) + '║' + ' ENHANCED TRANSCRIPT'.padEnd(halfWidth) + '║');\n lines.push('╠' + '═'.repeat(halfWidth) + '╬' + '═'.repeat(halfWidth) + '╣');\n \n // Split into paragraphs and display\n const rawParagraphs = raw.split('\\n\\n');\n const enhancedParagraphs = enhanced.split('\\n\\n');\n const maxParagraphs = Math.max(rawParagraphs.length, enhancedParagraphs.length);\n \n for (let i = 0; i < maxParagraphs; i++) {\n const rawPara = rawParagraphs[i] || '';\n const enhancedPara = enhancedParagraphs[i] || '';\n \n // Word wrap each paragraph\n const rawLines = wrapText(rawPara, halfWidth - 1);\n const enhancedLines = wrapText(enhancedPara, halfWidth - 1);\n const maxLines = Math.max(rawLines.length, enhancedLines.length);\n \n for (let j = 0; j < maxLines; j++) {\n const rawLine = (rawLines[j] || '').padEnd(halfWidth);\n const enhancedLine = (enhancedLines[j] || '').padEnd(halfWidth);\n lines.push('║' + rawLine + '║' + enhancedLine + '║');\n }\n \n // Add separator between paragraphs\n if (i < maxParagraphs - 1) {\n lines.push('║' + '─'.repeat(halfWidth) + '║' + '─'.repeat(halfWidth) + '║');\n }\n }\n \n lines.push('╚' + '═'.repeat(halfWidth) + '╩' + '═'.repeat(halfWidth) + '╝');\n \n return lines.join('\\n');\n};\n\n/**\n * Word wrap text to a maximum width\n */\nexport const wrapText = (text: string, maxWidth: number): string[] => {\n const words = text.replace(/\\n/g, ' ').split(' ');\n const lines: string[] = [];\n let currentLine = '';\n \n for (const word of words) {\n if (!word) continue;\n if (currentLine.length + word.length + 1 <= maxWidth) {\n currentLine += (currentLine ? ' ' : '') + word;\n } else {\n if (currentLine) lines.push(currentLine);\n currentLine = word.length > maxWidth ? word.slice(0, maxWidth) : word;\n }\n }\n if (currentLine) lines.push(currentLine);\n \n return lines.length > 0 ? lines : [''];\n};\n\n/**\n * Compare command - show raw vs enhanced side-by-side\n */\nexport const compareCommand = async (transcriptPath: string, options: { raw?: boolean; enhanced?: boolean; diff?: boolean }): Promise<void> => {\n // Resolve the path\n const absolutePath = path.isAbsolute(transcriptPath) \n ? transcriptPath \n : path.resolve(process.cwd(), transcriptPath);\n \n // Read both transcripts\n const rawData = await readRawTranscript(absolutePath);\n const finalContent = await readFinalTranscript(absolutePath);\n \n if (!rawData) {\n console.error(`No raw transcript found for: ${transcriptPath}`);\n console.error(`Expected at: ${getRawTranscriptPath(absolutePath)}`);\n console.error('\\nThe raw transcript may not have been saved during transcription.');\n process.exit(1);\n return;\n }\n \n if (!finalContent) {\n console.error(`Final transcript not found: ${transcriptPath}`);\n process.exit(1);\n return;\n }\n \n // Show metadata about the raw transcript\n console.log('\\n📋 Raw Transcript Info:');\n console.log(` Model: ${rawData.model}`);\n console.log(` Duration: ${(rawData.duration / 1000).toFixed(1)}s`);\n console.log(` Audio: ${rawData.audioFile}`);\n console.log(` Transcribed: ${new Date(rawData.transcribedAt).toLocaleString()}`);\n console.log(` Characters: ${rawData.text.length} (raw) → ${finalContent.length} (enhanced)`);\n console.log('');\n \n if (options.raw) {\n // Show only raw transcript\n console.log('═══════════════════════════════════════════════════════════════');\n console.log('RAW WHISPER OUTPUT');\n console.log('═══════════════════════════════════════════════════════════════');\n console.log(rawData.text);\n } else if (options.enhanced) {\n // Show only enhanced transcript \n console.log('═══════════════════════════════════════════════════════════════');\n console.log('ENHANCED TRANSCRIPT');\n console.log('═══════════════════════════════════════════════════════════════');\n console.log(finalContent);\n } else {\n // Show side-by-side comparison\n const termWidth = process.stdout.columns || 160;\n const comparison = formatComparison(rawData.text, finalContent, Math.min(termWidth, 160));\n console.log(comparison);\n }\n};\n\n/**\n * Info command - show info about raw transcript\n */\nexport const infoCommand = async (transcriptPath: string): Promise<void> => {\n const absolutePath = path.isAbsolute(transcriptPath) \n ? transcriptPath \n : path.resolve(process.cwd(), transcriptPath);\n \n const rawData = await readRawTranscript(absolutePath);\n \n if (!rawData) {\n console.error(`No raw transcript found for: ${transcriptPath}`);\n console.error(`Expected at: ${getRawTranscriptPath(absolutePath)}`);\n process.exit(1);\n return;\n }\n \n console.log('\\n📋 Raw Transcript Information:');\n console.log('═══════════════════════════════════════════════════════════════');\n console.log(` 📁 Final transcript: ${absolutePath}`);\n console.log(` 📁 Raw transcript: ${getRawTranscriptPath(absolutePath)}`);\n console.log('');\n console.log(` 🎤 Audio file: ${rawData.audioFile}`);\n console.log(` 🔑 Audio hash: ${rawData.audioHash}`);\n console.log(` 🤖 Model: ${rawData.model}`);\n console.log(` ⏱️ Duration: ${(rawData.duration / 1000).toFixed(1)} seconds`);\n console.log(` 📅 Transcribed: ${new Date(rawData.transcribedAt).toLocaleString()}`);\n console.log('');\n console.log(` 📝 Raw text length: ${rawData.text.length} characters`);\n console.log(` 📝 Raw word count: ~${rawData.text.split(/\\s+/).length} words`);\n console.log('═══════════════════════════════════════════════════════════════\\n');\n};\n\n/**\n * Extract title from markdown content\n */\nexport const extractTitle = (content: string): string => {\n // Look for first # heading\n const match = content.match(/^#\\s+(.+)$/m);\n if (match) {\n return match[1].trim();\n }\n \n // Fall back to first line\n const firstLine = content.split('\\n')[0];\n return firstLine ? firstLine.trim().substring(0, 100) : 'Untitled';\n};\n\n/**\n * Extract date and time from filename\n * Supports formats like: 2026-01-18_Meeting_Notes.md or 2026-01-18-1430_Notes.md\n */\nexport const extractDateTimeFromFilename = (filename: string): { date: string; time?: string } | null => {\n // Try YYYY-MM-DD-HHMM pattern\n const withTimeMatch = filename.match(/(\\d{4}-\\d{2}-\\d{2})-(\\d{4})/);\n if (withTimeMatch) {\n const [, date, time] = withTimeMatch;\n const hours = time.substring(0, 2);\n const minutes = time.substring(2, 4);\n return { date, time: `${hours}:${minutes}` };\n }\n \n // Try YYYY-MM-DD pattern\n const dateMatch = filename.match(/(\\d{4}-\\d{2}-\\d{2})/);\n if (dateMatch) {\n return { date: dateMatch[1] };\n }\n \n return null;\n};\n\nexport interface TranscriptListItem {\n path: string;\n filename: string;\n date: string;\n time?: string;\n title: string;\n hasRawTranscript: boolean;\n createdAt: Date;\n entities?: {\n people?: Array<{ id: string; name: string }>;\n projects?: Array<{ id: string; name: string }>;\n terms?: Array<{ id: string; name: string }>;\n companies?: Array<{ id: string; name: string }>;\n };\n}\n\nexport interface ListTranscriptsOptions {\n directory: string;\n limit?: number;\n offset?: number;\n sortBy?: 'date' | 'filename' | 'title';\n startDate?: string;\n endDate?: string;\n search?: string;\n}\n\nexport interface ListTranscriptsResult {\n transcripts: TranscriptListItem[];\n total: number;\n hasMore: boolean;\n limit: number;\n offset: number;\n}\n\n/**\n * List transcripts with pagination, filtering, and search\n */\nexport const listTranscripts = async (options: ListTranscriptsOptions): Promise<ListTranscriptsResult> => {\n const {\n directory,\n limit = 50,\n offset = 0,\n sortBy = 'date',\n startDate,\n endDate,\n search,\n } = options;\n \n const absoluteDir = path.isAbsolute(directory) \n ? directory \n : path.resolve(process.cwd(), directory);\n \n // Find all .md files recursively\n const pattern = path.join(absoluteDir, '**/*.md');\n const files = await glob(pattern, { \n ignore: ['**/node_modules/**', '**/.git/**', '**/.transcript/**'],\n });\n \n // Build transcript list\n const transcripts: TranscriptListItem[] = [];\n \n for (const filePath of files) {\n const filename = path.basename(filePath);\n const dateTime = extractDateTimeFromFilename(filename);\n \n // Apply date filtering\n if (startDate && dateTime && dateTime.date < startDate) continue;\n if (endDate && dateTime && dateTime.date > endDate) continue;\n \n // Verify it's actually a file (not a directory)\n let stats;\n try {\n stats = await fs.stat(filePath);\n if (!stats.isFile()) {\n continue; // Skip directories and other non-files\n }\n } catch {\n continue; // Skip if we can't stat it\n }\n \n // Read content for title extraction and search\n let content: string;\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n // Skip files we can't read (permissions, encoding issues, etc.)\n continue;\n }\n \n // Apply search filtering\n if (search) {\n const searchLower = search.toLowerCase();\n if (!content.toLowerCase().includes(searchLower) && \n !filename.toLowerCase().includes(searchLower)) {\n continue;\n }\n }\n \n const title = extractTitle(content);\n const rawData = await readRawTranscript(filePath);\n \n // Parse entity metadata from transcript\n const entities = Metadata.parseEntityMetadata(content);\n \n transcripts.push({\n path: filePath,\n filename,\n date: dateTime?.date || stats.birthtime.toISOString().split('T')[0],\n time: dateTime?.time,\n title,\n hasRawTranscript: !!rawData,\n createdAt: stats.birthtime,\n entities: entities ? {\n people: entities.people?.map(e => ({ id: e.id, name: e.name })),\n projects: entities.projects?.map(e => ({ id: e.id, name: e.name })),\n terms: entities.terms?.map(e => ({ id: e.id, name: e.name })),\n companies: entities.companies?.map(e => ({ id: e.id, name: e.name })),\n } : undefined,\n });\n }\n \n // Sort\n transcripts.sort((a, b) => {\n switch (sortBy) {\n case 'date': {\n // Sort by date descending (newest first), then by time if available\n const dateCompare = b.date.localeCompare(a.date);\n if (dateCompare !== 0) return dateCompare;\n if (a.time && b.time) return b.time.localeCompare(a.time);\n return b.createdAt.getTime() - a.createdAt.getTime();\n }\n case 'filename':\n return a.filename.localeCompare(b.filename);\n case 'title':\n return a.title.localeCompare(b.title);\n default:\n return 0;\n }\n });\n \n // Apply pagination\n const total = transcripts.length;\n const paginatedTranscripts = transcripts.slice(offset, offset + limit);\n const hasMore = offset + limit < total;\n \n return {\n transcripts: paginatedTranscripts,\n total,\n hasMore,\n limit,\n offset,\n };\n};\n\n/**\n * List command - list all transcripts with pagination and filtering\n */\nexport const listCommand = async (\n directory: string,\n options?: {\n limit?: number;\n offset?: number;\n sortBy?: 'date' | 'filename' | 'title';\n startDate?: string;\n endDate?: string;\n search?: string;\n }\n): Promise<void> => {\n const result = await listTranscripts({\n directory,\n ...options,\n });\n \n console.log(`\\n📂 Transcripts in: ${directory}`);\n if (options?.search) {\n console.log(`🔍 Search: \"${options.search}\"`);\n }\n if (options?.startDate || options?.endDate) {\n console.log(`📅 Date range: ${options?.startDate || 'any'} to ${options?.endDate || 'any'}`);\n }\n console.log(`📊 Showing ${result.offset + 1}-${result.offset + result.transcripts.length} of ${result.total} total\\n`);\n \n if (result.transcripts.length === 0) {\n console.log(' No transcripts found.\\n');\n return;\n }\n \n for (const transcript of result.transcripts) {\n const timeStr = transcript.time ? ` ${transcript.time}` : '';\n const hasRaw = transcript.hasRawTranscript ? '✅' : ' ';\n console.log(`${hasRaw} ${transcript.date}${timeStr} - ${transcript.title}`);\n console.log(` ${transcript.filename}`);\n }\n \n console.log('');\n if (result.hasMore) {\n const nextOffset = result.offset + result.limit;\n console.log(`💡 More results available. Use --offset ${nextOffset} to see the next page.\\n`);\n }\n};\n\n/**\n * Register transcript commands with the CLI\n */\nexport const registerTranscriptCommands = (program: Command): void => {\n const transcript = program\n .command('transcript')\n .description('Work with transcripts and raw Whisper output');\n \n transcript\n .command('compare <file>')\n .description('Compare enhanced transcript with raw Whisper output')\n .option('--raw', 'Show only the raw Whisper output')\n .option('--enhanced', 'Show only the enhanced transcript')\n .option('--diff', 'Show a unified diff (requires diff command)')\n .action(compareCommand);\n \n transcript\n .command('info <file>')\n .description('Show information about a transcript\\'s raw source')\n .action(infoCommand);\n \n transcript\n .command('list <directory>')\n .description('List transcripts with pagination, filtering, and search')\n .option('--limit <number>', 'Maximum number of results to return', '50')\n .option('--offset <number>', 'Number of results to skip for pagination', '0')\n .option('--sort-by <field>', 'Sort by: date (default), filename, or title', 'date')\n .option('--start-date <YYYY-MM-DD>', 'Filter transcripts from this date onwards')\n .option('--end-date <YYYY-MM-DD>', 'Filter transcripts up to this date')\n .option('--search <text>', 'Search for transcripts containing this text')\n .action((directory, options) => {\n listCommand(directory, {\n limit: parseInt(options.limit),\n offset: parseInt(options.offset),\n sortBy: options.sortBy,\n startDate: options.startDate,\n endDate: options.endDate,\n search: options.search,\n });\n });\n};\n"],"names":["os","level","create","path","fs","Storage.create","Discovery.loadHierarchicalConfig","expandPath","Classifier.create","Router.create","Logging.getLogger","createReadlineInterface","askQuestion","OpenAI.createCompletion","ContentFetcher.create","Sound.create","response","Handler.create","Onboarding.create","formatMetadataMarkdown","Metadata.formatMetadataMarkdown","Metadata.formatEntityMetadataMarkdown","Manager.create","Collector.create","Reporter.create","Media.create","OpenAI","Service.create","Client.create","Strategy.createStrategy","Strategy.getRecommendedStrategy","allProjects","LookupPerson.create","LookupProject.create","VerifySpelling.create","RouteNote.create","StoreContext.create","Registry.create","Executor.create","Context.create","Routing.create","Interactive.create","Output.create","Reflection.create","Transcription.create","Reasoning.create","CompletePhase.create","Agentic.create","Metadata.createRoutingMetadata","Metadata.extractTagsFromSignals","Orchestrator.create","print","Metadata.parseEntityMetadata"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transcript.js","sources":["../src/constants.ts","../src/logging.ts","../src/util/storage.ts","../src/overcontext/config.ts","../src/overcontext/adapter.ts","../src/overcontext/discovery.ts","../src/overcontext/helpers.ts","../src/context/index.ts","../src/routing/router.ts","../src/routing/classifier.ts","../src/routing/index.ts","../src/util/sound.ts","../src/cli/content-fetcher.ts","../src/util/openai.ts","../src/interactive/handler.ts","../src/interactive/onboarding.ts","../src/interactive/index.ts","../src/util/metadata.ts","../src/output/manager.ts","../src/output/index.ts","../src/reflection/collector.ts","../src/reflection/reporter.ts","../src/reflection/index.ts","../src/util/media.ts","../src/transcription/types.ts","../src/transcription/service.ts","../src/transcription/index.ts","../src/reasoning/client.ts","../src/reasoning/strategy.ts","../src/reasoning/index.ts","../src/agentic/tools/lookup-person.ts","../src/agentic/tools/lookup-project.ts","../src/agentic/tools/verify-spelling.ts","../src/agentic/tools/route-note.ts","../src/agentic/tools/store-context.ts","../src/agentic/registry.ts","../src/agentic/executor.ts","../src/agentic/types.ts","../src/agentic/index.ts","../src/phases/complete.ts","../src/pipeline/orchestrator.ts","../src/pipeline/index.ts","../src/cli/project-assist.ts","../src/cli/action.ts","../src/cli/feedback.ts","../src/cli/transcript.ts"],"sourcesContent":["import os from 'node:os';\nimport { FilenameOption } from '@theunwalked/dreadcabinet';\nimport { FilesystemStructure } from '@theunwalked/dreadcabinet';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'protokoll';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_TIMEZONE = 'Etc/UTC';\nexport const DATE_FORMAT_MONTH_DAY = 'M-D';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-M';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-M-D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/M/D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-M-D-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-M-D-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-M-D-HHmmss.SSS';\nexport const DATE_FORMAT_MONTH = 'M';\nexport const DATE_FORMAT_DAY = 'D';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_CONTENT_TYPES = ['diff'];\nexport const DEFAULT_RECURSIVE = false;\nexport const DEFAULT_INPUT_DIRECTORY = './';\nexport const DEFAULT_OUTPUT_DIRECTORY = './';\n\nexport const DEFAULT_AUDIO_EXTENSIONS = ['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm', 'qta'];\n\nexport const ALLOWED_CONTENT_TYPES = ['log', 'diff'];\nexport const ALLOWED_AUDIO_EXTENSIONS = ['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm', 'qta'];\n\nexport const DEFAULT_OUTPUT_STRUCTURE = 'month' as FilesystemStructure;\nexport const DEFAULT_OUTPUT_FILENAME_OPTIONS = ['date', 'time', 'subject'] as FilenameOption[];\n\nexport const ALLOWED_OUTPUT_STRUCTURES = ['none', 'year', 'month', 'day'] as FilesystemStructure[];\nexport const ALLOWED_OUTPUT_FILENAME_OPTIONS = ['date', 'time', 'subject'] as FilenameOption[];\n\nexport const DEFAULT_CONFIG_DIR = `./.${PROGRAM_NAME}`;\nexport const DEFAULT_PROCESSED_DIR = './processed';\n\n// Context System Constants\nexport const DEFAULT_CONTEXT_DIR_NAME = '.protokoll';\nexport const DEFAULT_CONTEXT_CONFIG_FILE_NAME = 'config.yaml';\nexport const DEFAULT_MAX_DISCOVERY_LEVELS = 10;\n\nexport const CONTEXT_SUBDIRECTORIES = {\n people: 'people',\n projects: 'projects',\n companies: 'companies',\n terms: 'terms',\n} as const;\n\nexport const DEFAULT_PERSONAS_DIR = `/personas`;\n\nexport const DEFAULT_PERSONA_TRANSCRIBER_FILE = `${DEFAULT_PERSONAS_DIR}/transcriber.md`;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `/instructions`;\n\nexport const DEFAULT_INSTRUCTIONS_TRANSCRIBE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/transcribe.md`;\n\n// Note: We no longer maintain a static allowlist of models\n// This allows for dynamic model discovery and future model additions\n// Users can specify any model supported by their OpenAI API\n\nexport const DEFAULT_TRANSCRIPTION_MODEL = 'whisper-1';\nexport const DEFAULT_MODEL = 'gpt-5.2';\nexport const DEFAULT_REASONING_LEVEL = 'medium';\n\n// Smart Assistance Constants\nexport const DEFAULT_PHONETIC_MODEL = 'gpt-5-nano';\nexport const DEFAULT_ANALYSIS_MODEL = 'gpt-5-mini';\nexport const DEFAULT_SMART_ASSISTANCE = true;\n\n// Project-specific smart assistance\nexport const DEFAULT_SOUNDS_LIKE_ON_ADD = true; // Generate phonetic variants\nexport const DEFAULT_TRIGGER_PHRASES_ON_ADD = true; // Generate content-matching phrases\nexport const DEFAULT_PROMPT_FOR_SOURCE = true;\n\n// Term-specific smart assistance\nexport const DEFAULT_TERMS_ENABLED = true;\nexport const DEFAULT_TERM_SOUNDS_LIKE_ON_ADD = true;\nexport const DEFAULT_TERM_DESCRIPTION_ON_ADD = true;\nexport const DEFAULT_TERM_TOPICS_ON_ADD = true;\nexport const DEFAULT_TERM_PROJECT_SUGGESTIONS = true;\n\n// Content limits\nexport const MAX_CONTENT_LENGTH = 15000; // Max characters to send to LLM\nexport const MAX_TERM_CONTEXT_LENGTH = 10000; // Max characters for term context\nexport const ASSIST_TIMEOUT_MS = 30000; // 30 second timeout for LLM calls\nexport const TERM_ASSIST_TIMEOUT_MS = 20000; // 20 second timeout for term LLM calls\n\nexport const DEFAULT_OVERRIDES = false;\nexport const DEFAULT_MAX_AUDIO_SIZE = 26214400; // 25MB in bytes\nexport const DEFAULT_TEMP_DIRECTORY = os.tmpdir(); // Use OS default temp directory\nexport const DEFAULT_INTERACTIVE = true; // Interactive prompts enabled by default\nexport const DEFAULT_SELF_REFLECTION = true;\nexport const DEFAULT_SILENT = false; // Sound notifications enabled by default\n\n// Output Management Constants\nexport const DEFAULT_INTERMEDIATE_DIRECTORY = './output/protokoll';\nexport const DEFAULT_KEEP_INTERMEDIATES = true;\nexport const OUTPUT_FILE_TYPES = [\n 'transcript',\n 'context',\n 'request',\n 'response',\n 'reflection',\n 'session',\n] as const;\n\n// Define Protokoll-specific defaults\nexport const PROTOKOLL_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n diff: DEFAULT_DIFF,\n log: DEFAULT_LOG,\n transcriptionModel: DEFAULT_TRANSCRIPTION_MODEL,\n model: DEFAULT_MODEL,\n reasoningLevel: DEFAULT_REASONING_LEVEL,\n contentTypes: DEFAULT_CONTENT_TYPES,\n overrides: DEFAULT_OVERRIDES,\n maxAudioSize: DEFAULT_MAX_AUDIO_SIZE,\n tempDirectory: DEFAULT_TEMP_DIRECTORY || os.tmpdir(),\n configDirectory: DEFAULT_CONFIG_DIR,\n interactive: DEFAULT_INTERACTIVE,\n selfReflection: DEFAULT_SELF_REFLECTION,\n silent: DEFAULT_SILENT,\n};\n","import winston from 'winston';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, PROGRAM_NAME } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\nconst createLogger = (level: string = 'info') => {\n\n let format = winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.json()\n );\n\n let transports = [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${level}: ${message}${metaStr}`;\n })\n )\n })\n ];\n\n if (level === 'info') {\n format = winston.format.combine(\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n );\n\n transports = [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message }) => {\n return `${level}: ${message}`;\n })\n )\n })\n ];\n }\n\n return winston.createLogger({\n level,\n format,\n defaultMeta: { service: PROGRAM_NAME },\n transports,\n });\n};\n\nlet logger = createLogger();\n\nexport const setLogLevel = (level: string) => {\n logger = createLogger(level);\n};\n\nexport const getLogger = () => logger; ","// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\n/**\n * This module exists to isolate filesystem operations from the rest of the codebase.\n * This makes testing easier by avoiding direct fs mocking in jest configuration.\n * \n * Additionally, abstracting storage operations allows for future flexibility - \n * this export utility may need to work with storage systems other than the local filesystem\n * (e.g. S3, Google Cloud Storage, etc).\n */\n\nexport interface Utility {\n exists: (path: string) => Promise<boolean>;\n isDirectory: (path: string) => Promise<boolean>;\n isFile: (path: string) => Promise<boolean>;\n isReadable: (path: string) => Promise<boolean>;\n isWritable: (path: string) => Promise<boolean>;\n isFileReadable: (path: string) => Promise<boolean>;\n isDirectoryWritable: (path: string) => Promise<boolean>;\n isDirectoryReadable: (path: string) => Promise<boolean>;\n createDirectory: (path: string) => Promise<void>;\n readFile: (path: string, encoding: string) => Promise<string>;\n readStream: (path: string) => Promise<fs.ReadStream>;\n writeFile: (path: string, data: string | Buffer, encoding: string) => Promise<void>;\n forEachFileIn: (directory: string, callback: (path: string) => Promise<void>, options?: { pattern: string }) => Promise<void>;\n hashFile: (path: string, length: number) => Promise<string>;\n listFiles: (directory: string) => Promise<string[]>;\n deleteFile: (path: string) => Promise<void>;\n getFileSize: (path: string) => Promise<number>;\n}\n\nexport const create = (params: { log?: (message: string, ...args: any[]) => void }): Utility => {\n\n // eslint-disable-next-line no-console\n const log = params.log || console.log;\n\n const exists = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.stat(path);\n return true;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error: any) {\n return false;\n }\n }\n\n const isDirectory = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isDirectory()) {\n log(`${path} is not a directory`);\n return false;\n }\n return true;\n }\n\n const isFile = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isFile()) {\n log(`${path} is not a file`);\n return false;\n }\n return true;\n }\n\n const isReadable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.R_OK);\n } catch (error: any) {\n log(`${path} is not readable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isWritable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.W_OK);\n } catch (error: any) {\n log(`${path} is not writable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isFileReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isFile(path) && await isReadable(path);\n }\n\n const isDirectoryWritable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isWritable(path);\n }\n\n const isDirectoryReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isReadable(path);\n }\n\n const createDirectory = async (path: string): Promise<void> => {\n try {\n await fs.promises.mkdir(path, { recursive: true });\n } catch (mkdirError: any) {\n throw new Error(`Failed to create output directory ${path}: ${mkdirError.message} ${mkdirError.stack}`);\n }\n }\n\n const readFile = async (path: string, encoding: string): Promise<string> => {\n return await fs.promises.readFile(path, { encoding: encoding as BufferEncoding });\n }\n\n const writeFile = async (path: string, data: string | Buffer, encoding: string): Promise<void> => {\n await fs.promises.writeFile(path, data, { encoding: encoding as BufferEncoding });\n }\n\n const forEachFileIn = async (directory: string, callback: (file: string) => Promise<void>, options: { pattern: string | string[] } = { pattern: '*.*' }): Promise<void> => {\n try {\n const files = await glob(options.pattern, { cwd: directory, nodir: true });\n for (const file of files) {\n await callback(path.join(directory, file));\n }\n } catch (err: any) {\n throw new Error(`Failed to glob pattern ${options.pattern} in ${directory}: ${err.message}`);\n }\n }\n\n const readStream = async (path: string): Promise<fs.ReadStream> => {\n return fs.createReadStream(path);\n }\n\n const hashFile = async (path: string, length: number): Promise<string> => {\n const file = await readFile(path, 'utf8');\n return crypto.createHash('sha256').update(file).digest('hex').slice(0, length);\n }\n\n const listFiles = async (directory: string): Promise<string[]> => {\n return await fs.promises.readdir(directory);\n }\n\n const deleteFile = async (path: string): Promise<void> => {\n await fs.promises.unlink(path);\n }\n\n const getFileSize = async (path: string): Promise<number> => {\n const stats = await fs.promises.stat(path);\n return stats.size;\n }\n\n return {\n exists,\n isDirectory,\n isFile,\n isReadable,\n isWritable,\n isFileReadable,\n isDirectoryWritable,\n isDirectoryReadable,\n createDirectory,\n readFile,\n readStream,\n writeFile,\n forEachFileIn,\n hashFile,\n listFiles,\n deleteFile,\n getFileSize,\n };\n}","import { \n redaksjonSchemas, \n redaksjonPluralNames,\n} from '@redaksjon/context';\n\n/**\n * Default overcontext configuration for protokoll.\n */\nexport const protokollContextConfig: {\n schemas: typeof redaksjonSchemas;\n pluralNames: typeof redaksjonPluralNames;\n contextDirName: string;\n} = {\n schemas: redaksjonSchemas,\n pluralNames: redaksjonPluralNames,\n contextDirName: '.protokoll/context', // Keep existing path\n};\n\n/**\n * Discovery options for protokoll.\n */\nexport const protokollDiscoveryOptions = {\n contextDirName: '.protokoll/context',\n maxLevels: 10,\n};\n","import { \n discoverOvercontext, \n OvercontextAPI,\n} from '@theunwalked/overcontext';\nimport {\n redaksjonSchemas,\n redaksjonPluralNames,\n Person,\n Project,\n Company,\n Term,\n IgnoredTerm,\n RedaksjonEntity,\n RedaksjonEntityType,\n} from '@redaksjon/context';\nimport { protokollDiscoveryOptions } from './config';\n// eslint-disable-next-line no-restricted-imports\nimport { existsSync, statSync } from 'node:fs';\nimport * as path from 'node:path';\n\n// Re-export types for backwards compatibility\nexport type { Person, Project, Company, Term, IgnoredTerm, RedaksjonEntity };\nexport type EntityType = RedaksjonEntityType;\nexport type Entity = RedaksjonEntity;\n\n/**\n * StorageInstance interface - matches protokoll's current API.\n */\nexport interface StorageInstance {\n load(contextDirs: string[]): Promise<void>;\n save(entity: Entity, targetDir: string): Promise<void>;\n delete(type: EntityType, id: string, targetDir: string): Promise<boolean>;\n get<T extends Entity>(type: EntityType, id: string): T | undefined;\n getAll<T extends Entity>(type: EntityType): T[];\n search(query: string): Entity[];\n findBySoundsLike(phonetic: string): Entity | undefined;\n clear(): void;\n getEntityFilePath(type: EntityType, id: string, contextDirs: string[]): string | undefined;\n}\n\n/**\n * Create a storage instance backed by overcontext.\n * Maintains API compatibility with protokoll's existing storage.\n */\n// Map entity types to their directory names\nconst TYPE_TO_DIRECTORY: Record<EntityType, string> = {\n person: 'people',\n project: 'projects',\n company: 'companies',\n term: 'terms',\n ignored: 'ignored',\n};\n\nexport const create = (): StorageInstance => {\n // In-memory cache for sync access (matching original behavior)\n const cache = new Map<EntityType, Map<string, Entity>>();\n let api: OvercontextAPI<typeof redaksjonSchemas> | undefined;\n let loadedContextDirs: string[] = [];\n \n const initCache = () => {\n cache.set('person', new Map());\n cache.set('project', new Map());\n cache.set('company', new Map());\n cache.set('term', new Map());\n cache.set('ignored', new Map());\n };\n \n initCache();\n \n return {\n async load(contextDirs: string[]): Promise<void> {\n initCache();\n loadedContextDirs = contextDirs;\n \n // If no context directories, leave API undefined (empty context)\n if (contextDirs.length === 0) {\n api = undefined;\n return;\n }\n \n try {\n // contextDirs are paths like /path/to/.protokoll/context\n // We need to start discovery from the parent of .protokoll\n // Take the last (most specific) context dir and go up two levels\n const lastContextDir = contextDirs[contextDirs.length - 1];\n const protokollDir = lastContextDir.replace(/\\/context$/, '');\n const startDir = protokollDir.replace(/\\/\\.protokoll$/, '');\n \n // Create overcontext API with hierarchical discovery\n api = await discoverOvercontext({\n schemas: redaksjonSchemas,\n pluralNames: redaksjonPluralNames,\n startDir,\n ...protokollDiscoveryOptions,\n });\n \n // Load all entities into cache\n for (const type of ['person', 'project', 'company', 'term', 'ignored'] as EntityType[]) {\n const entities = await api.getAll(type);\n for (const entity of entities) {\n cache.get(type)?.set(entity.id, entity as Entity);\n }\n }\n } catch (error) {\n // If no context directory found, leave API undefined (empty context)\n if (error instanceof Error && error.message.includes('No context directory found')) {\n api = undefined;\n } else {\n throw error;\n }\n }\n },\n \n async save(entity: Entity, _targetDir: string): Promise<void> {\n // If no API (empty context), just update cache (in-memory only)\n if (!api) {\n // Check if entity already exists (for duplicate detection)\n const existing = cache.get(entity.type)?.get(entity.id);\n if (existing) {\n throw new Error(`Entity with id \"${entity.id}\" already exists`);\n }\n cache.get(entity.type)?.set(entity.id, entity);\n return;\n }\n \n // Save via overcontext\n const saved = await api.upsert(entity.type, entity);\n \n // Update cache\n cache.get(entity.type)?.set(saved.id, saved as Entity);\n },\n \n async delete(type: EntityType, id: string, _targetDir: string): Promise<boolean> {\n if (!api) return false;\n \n const deleted = await api.delete(type, id);\n if (deleted) {\n cache.get(type)?.delete(id);\n }\n return deleted;\n },\n \n get<T extends Entity>(type: EntityType, id: string): T | undefined {\n return cache.get(type)?.get(id) as T | undefined;\n },\n \n getAll<T extends Entity>(type: EntityType): T[] {\n return Array.from(cache.get(type)?.values() ?? []) as T[];\n },\n \n search(query: string): Entity[] {\n const normalizedQuery = query.toLowerCase();\n const results: Entity[] = [];\n const seen = new Set<string>();\n \n for (const entityMap of cache.values()) {\n for (const entity of entityMap.values()) {\n if (seen.has(entity.id)) continue;\n \n // Check name\n if (entity.name.toLowerCase().includes(normalizedQuery)) {\n results.push(entity);\n seen.add(entity.id);\n continue;\n }\n \n // Check sounds_like\n const sounds = (entity as Entity & { sounds_like?: string[] }).sounds_like;\n if (sounds?.some(s => s.toLowerCase().includes(normalizedQuery))) {\n results.push(entity);\n seen.add(entity.id);\n }\n }\n }\n \n return results;\n },\n \n findBySoundsLike(phonetic: string): Entity | undefined {\n const normalized = phonetic.toLowerCase().trim();\n \n for (const entityMap of cache.values()) {\n for (const entity of entityMap.values()) {\n const sounds = (entity as Entity & { sounds_like?: string[] }).sounds_like;\n if (sounds?.some(s => s.toLowerCase() === normalized)) {\n return entity;\n }\n }\n }\n \n return undefined;\n },\n \n clear(): void {\n initCache();\n api = undefined;\n },\n \n getEntityFilePath(type: EntityType, id: string, contextDirs: string[]): string | undefined {\n const dirName = TYPE_TO_DIRECTORY[type];\n const dirsToSearch = contextDirs.length > 0 ? contextDirs : loadedContextDirs;\n \n // Search in reverse order (closest first) to find where the entity is defined\n for (const contextDir of [...dirsToSearch].reverse()) {\n const possiblePaths = [\n path.join(contextDir, dirName, `${id}.yaml`),\n path.join(contextDir, dirName, `${id}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n // Use sync access check - this is only for CLI, not hot path\n if (existsSync(filePath)) {\n const stat = statSync(filePath);\n if (stat.isFile()) {\n return filePath;\n }\n }\n }\n }\n \n return undefined;\n },\n };\n};\n","import {\n discoverContextRoot,\n} from '@theunwalked/overcontext';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as yaml from 'js-yaml';\n\n/**\n * Discovered context directory (backwards compatible).\n */\nexport interface DiscoveredContextDir {\n path: string;\n level: number;\n}\n\n/**\n * Hierarchical context result (backwards compatible).\n */\nexport interface HierarchicalContextResult {\n config: Record<string, unknown>;\n discoveredDirs: DiscoveredContextDir[];\n contextDirs: string[];\n}\n\n/**\n * Discovery options (backwards compatible).\n */\nexport interface ContextDiscoveryOptions {\n configDirName: string;\n configFileName: string;\n maxLevels?: number;\n startingDir?: string;\n}\n\n/**\n * Discover configuration directories by walking up the directory tree.\n * Wrapper around overcontext's discovery.\n */\nexport const discoverConfigDirectories = async (\n options: ContextDiscoveryOptions\n): Promise<DiscoveredContextDir[]> => {\n const contextRoot = await discoverContextRoot({\n startDir: options.startingDir || process.cwd(),\n contextDirName: options.configDirName,\n maxLevels: options.maxLevels || 10,\n });\n \n return contextRoot.directories.map(dir => ({\n path: dir.path,\n level: dir.level,\n }));\n};\n\n/**\n * Load and merge hierarchical configuration.\n * Wrapper around overcontext's discovery.\n */\nexport const loadHierarchicalConfig = async (\n options: ContextDiscoveryOptions\n): Promise<HierarchicalContextResult> => {\n const discovered = await discoverConfigDirectories(options);\n \n if (discovered.length === 0) {\n return {\n config: {},\n discoveredDirs: [],\n contextDirs: [],\n };\n }\n \n // Load config files and merge\n const sortedDirs = [...discovered].sort((a, b) => b.level - a.level);\n const configs: Record<string, unknown>[] = [];\n const contextDirs: string[] = [];\n \n for (const dir of sortedDirs) {\n const configPath = path.join(dir.path, options.configFileName);\n \n try {\n const content = await fs.readFile(configPath, 'utf-8');\n const parsed = yaml.load(content);\n if (parsed && typeof parsed === 'object') {\n configs.push(parsed as Record<string, unknown>);\n }\n } catch {\n // No config file\n }\n \n // Add context directory\n const contextDir = path.join(dir.path, 'context');\n try {\n const stat = await fs.stat(contextDir);\n if (stat.isDirectory()) {\n contextDirs.push(contextDir);\n }\n } catch {\n // No context subdirectory\n }\n }\n \n // Merge configs\n const mergedConfig = configs.reduce(\n (acc, curr) => ({ ...acc, ...curr }),\n {} as Record<string, unknown>\n );\n \n return {\n config: mergedConfig,\n discoveredDirs: discovered,\n contextDirs,\n };\n};\n","import { Term, Project } from '@redaksjon/context';\n\n/**\n * Check if a term is associated with a given project.\n */\nexport const isTermAssociatedWithProject = (term: Term, projectId: string): boolean => {\n return term.projects?.includes(projectId) ?? false;\n};\n\n/**\n * Add a project association to a term.\n */\nexport const addProjectToTerm = (term: Term, projectId: string): Term => {\n const projects = term.projects || [];\n if (projects.includes(projectId)) {\n return term;\n }\n return {\n ...term,\n projects: [...projects, projectId],\n updatedAt: new Date(),\n };\n};\n\n/**\n * Remove a project association from a term.\n */\nexport const removeProjectFromTerm = (term: Term, projectId: string): Term => {\n const projects = term.projects || [];\n return {\n ...term,\n projects: projects.filter(id => id !== projectId),\n updatedAt: new Date(),\n };\n};\n\n/**\n * Check if projectA is a parent of projectB.\n */\nexport const isParentProject = (projectA: Project, projectB: Project): boolean => {\n return projectB.relationships?.parent === projectA.id;\n};\n\n/**\n * Check if projectA is a child of projectB.\n */\nexport const isChildProject = (projectA: Project, projectB: Project): boolean => {\n return projectA.relationships?.parent === projectB.id;\n};\n\n/**\n * Check if two projects are siblings.\n */\nexport const areSiblingProjects = (projectA: Project, projectB: Project): boolean => {\n const aSiblings = projectA.relationships?.siblings || [];\n const bSiblings = projectB.relationships?.siblings || [];\n return aSiblings.includes(projectB.id) || bSiblings.includes(projectA.id);\n};\n\n/**\n * Get relationship distance between two projects.\n * Returns: 0 = same, 1 = parent/child, 2 = siblings/cousins, -1 = unrelated\n */\nexport const getProjectRelationshipDistance = (projectA: Project, projectB: Project): number => {\n if (projectA.id === projectB.id) return 0;\n if (isParentProject(projectA, projectB) || isChildProject(projectA, projectB)) return 1;\n if (areSiblingProjects(projectA, projectB)) return 2;\n \n if (projectA.relationships?.parent && projectB.relationships?.parent &&\n projectA.relationships.parent === projectB.relationships.parent) {\n return 2;\n }\n \n return -1;\n};\n","/**\n * Context System\n * \n * Main entry point for the context system. Provides a factory function\n * to create context instances that can discover, load, and manage\n * entity data from hierarchical .protokoll directories.\n * \n * This module now uses overcontext under the hood for storage and discovery.\n */\n\nimport { \n Entity, \n Person, \n Project, \n Company, \n Term,\n IgnoredTerm,\n ContextDiscoveryOptions,\n DiscoveredContextDir,\n HierarchicalContextResult,\n SmartAssistanceConfig,\n} from './types';\nimport * as Overcontext from '../overcontext';\nimport { getProjectRelationshipDistance } from '../overcontext/helpers';\nimport {\n DEFAULT_PHONETIC_MODEL,\n DEFAULT_ANALYSIS_MODEL,\n DEFAULT_SMART_ASSISTANCE,\n DEFAULT_SOUNDS_LIKE_ON_ADD,\n DEFAULT_TRIGGER_PHRASES_ON_ADD,\n DEFAULT_PROMPT_FOR_SOURCE,\n DEFAULT_TERMS_ENABLED,\n DEFAULT_TERM_SOUNDS_LIKE_ON_ADD,\n DEFAULT_TERM_DESCRIPTION_ON_ADD,\n DEFAULT_TERM_TOPICS_ON_ADD,\n DEFAULT_TERM_PROJECT_SUGGESTIONS,\n ASSIST_TIMEOUT_MS\n} from '../constants';\n\nexport interface ContextInstance {\n // Initialization\n load(): Promise<void>;\n reload(): Promise<void>;\n \n // Discovery info\n getDiscoveredDirs(): DiscoveredContextDir[];\n getConfig(): Record<string, unknown>;\n getContextDirs(): string[];\n \n // Smart Assistance config\n getSmartAssistanceConfig(): SmartAssistanceConfig;\n \n // Entity access\n getPerson(id: string): Person | undefined;\n getProject(id: string): Project | undefined;\n getCompany(id: string): Company | undefined;\n getTerm(id: string): Term | undefined;\n getIgnored(id: string): IgnoredTerm | undefined;\n \n getAllPeople(): Person[];\n getAllProjects(): Project[];\n getAllCompanies(): Company[];\n getAllTerms(): Term[];\n getAllIgnored(): IgnoredTerm[];\n \n // Check if a term is ignored\n isIgnored(term: string): boolean;\n \n // Search\n search(query: string): Entity[];\n findBySoundsLike(phonetic: string): Entity | undefined;\n \n // Advanced search with context awareness\n searchWithContext(query: string, contextProjectId?: string): Entity[];\n getRelatedProjects(projectId: string, maxDistance?: number): Project[];\n \n // Modification\n saveEntity(entity: Entity): Promise<void>;\n deleteEntity(entity: Entity): Promise<boolean>;\n getEntityFilePath(entity: Entity): string | undefined;\n \n // Check if context is available\n hasContext(): boolean;\n}\n\nexport interface CreateOptions {\n startingDir?: string;\n configDirName?: string;\n configFileName?: string;\n}\n\n/**\n * Get smart assistance configuration with defaults\n */\nconst getSmartAssistanceConfig = (config: Record<string, unknown>): SmartAssistanceConfig => {\n const smartConfig = config.smartAssistance as Partial<SmartAssistanceConfig> | undefined;\n \n return {\n enabled: smartConfig?.enabled ?? DEFAULT_SMART_ASSISTANCE,\n phoneticModel: smartConfig?.phoneticModel ?? DEFAULT_PHONETIC_MODEL,\n analysisModel: smartConfig?.analysisModel ?? DEFAULT_ANALYSIS_MODEL,\n \n // Project settings\n soundsLikeOnAdd: smartConfig?.soundsLikeOnAdd ?? DEFAULT_SOUNDS_LIKE_ON_ADD,\n triggerPhrasesOnAdd: smartConfig?.triggerPhrasesOnAdd ?? DEFAULT_TRIGGER_PHRASES_ON_ADD,\n promptForSource: smartConfig?.promptForSource ?? DEFAULT_PROMPT_FOR_SOURCE,\n \n // Term settings\n termsEnabled: smartConfig?.termsEnabled ?? DEFAULT_TERMS_ENABLED,\n termSoundsLikeOnAdd: smartConfig?.termSoundsLikeOnAdd ?? DEFAULT_TERM_SOUNDS_LIKE_ON_ADD,\n termDescriptionOnAdd: smartConfig?.termDescriptionOnAdd ?? DEFAULT_TERM_DESCRIPTION_ON_ADD,\n termTopicsOnAdd: smartConfig?.termTopicsOnAdd ?? DEFAULT_TERM_TOPICS_ON_ADD,\n termProjectSuggestions: smartConfig?.termProjectSuggestions ?? DEFAULT_TERM_PROJECT_SUGGESTIONS,\n \n timeout: smartConfig?.timeout ?? ASSIST_TIMEOUT_MS,\n };\n};\n\n/**\n * Create a new context instance using overcontext\n */\nexport const create = async (options: CreateOptions = {}): Promise<ContextInstance> => {\n const discoveryOptions: ContextDiscoveryOptions = {\n configDirName: options.configDirName ?? '.protokoll',\n configFileName: options.configFileName ?? 'config.yaml',\n startingDir: options.startingDir,\n };\n\n const storage = Overcontext.create();\n let discoveryResult: HierarchicalContextResult = {\n config: {},\n discoveredDirs: [],\n contextDirs: [],\n };\n\n const loadContext = async (): Promise<void> => {\n discoveryResult = await Overcontext.loadHierarchicalConfig(discoveryOptions);\n storage.clear();\n await storage.load(discoveryResult.contextDirs);\n };\n\n // Initial load\n await loadContext();\n\n return {\n load: loadContext,\n \n reload: async () => {\n storage.clear();\n await storage.load(discoveryResult.contextDirs);\n },\n \n getDiscoveredDirs: () => discoveryResult.discoveredDirs,\n getConfig: () => discoveryResult.config,\n getContextDirs: () => discoveryResult.contextDirs,\n \n getSmartAssistanceConfig: () => getSmartAssistanceConfig(discoveryResult.config),\n \n getPerson: (id) => storage.get<Person>('person', id),\n getProject: (id) => storage.get<Project>('project', id),\n getCompany: (id) => storage.get<Company>('company', id),\n getTerm: (id) => storage.get<Term>('term', id),\n getIgnored: (id) => storage.get<IgnoredTerm>('ignored', id),\n \n getAllPeople: () => storage.getAll<Person>('person'),\n getAllProjects: () => storage.getAll<Project>('project'),\n getAllCompanies: () => storage.getAll<Company>('company'),\n getAllTerms: () => storage.getAll<Term>('term'),\n getAllIgnored: () => storage.getAll<IgnoredTerm>('ignored'),\n \n isIgnored: (term: string) => {\n const normalizedTerm = term.toLowerCase().replace(/[^a-z0-9]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n const ignoredTerms = storage.getAll<IgnoredTerm>('ignored');\n return ignoredTerms.some(ignored => \n ignored.id === normalizedTerm || \n ignored.name.toLowerCase() === term.toLowerCase()\n );\n },\n \n search: (query) => storage.search(query),\n findBySoundsLike: (phonetic) => storage.findBySoundsLike(phonetic),\n \n searchWithContext: (query, contextProjectId) => {\n const results = storage.search(query);\n \n if (!contextProjectId) {\n return results;\n }\n \n const contextProject = storage.get<Project>('project', contextProjectId);\n if (!contextProject) {\n return results;\n }\n \n const scoredResults = results.map(entity => {\n let score = 0;\n \n if (entity.type === 'project') {\n const distance = getProjectRelationshipDistance(contextProject, entity as Project);\n if (distance >= 0) {\n score += (3 - distance) * 50;\n }\n }\n \n if (entity.type === 'term') {\n const term = entity as Term;\n if (term.projects?.includes(contextProjectId)) {\n score += 100;\n }\n }\n \n return { entity, score };\n });\n \n return scoredResults\n .sort((a, b) => b.score - a.score)\n .map(r => r.entity);\n },\n \n getRelatedProjects: (projectId, maxDistance = 2) => {\n const project = storage.get<Project>('project', projectId);\n if (!project) return [];\n \n const allProjects = storage.getAll<Project>('project');\n const related: Array<{ project: Project; distance: number }> = [];\n \n for (const otherProject of allProjects) {\n if (otherProject.id === projectId) continue;\n \n const distance = getProjectRelationshipDistance(project, otherProject);\n if (distance >= 0 && distance <= maxDistance) {\n related.push({ project: otherProject, distance });\n }\n }\n \n return related\n .sort((a, b) => a.distance - b.distance)\n .map(r => r.project);\n },\n \n saveEntity: async (entity) => {\n const closestDir = discoveryResult.discoveredDirs\n .sort((a, b) => a.level - b.level)[0];\n \n if (!closestDir) {\n throw new Error('No .protokoll directory found. Run with --init-config to create one.');\n }\n \n await storage.save(entity, closestDir.path);\n },\n \n deleteEntity: async (entity) => {\n const filePath = storage.getEntityFilePath(entity.type, entity.id, discoveryResult.contextDirs);\n if (!filePath) {\n return false;\n }\n \n const contextDir = discoveryResult.contextDirs.find(dir => filePath.startsWith(dir));\n if (!contextDir) {\n return false;\n }\n \n return storage.delete(entity.type, entity.id, contextDir);\n },\n \n getEntityFilePath: (entity) => {\n return storage.getEntityFilePath(entity.type, entity.id, discoveryResult.contextDirs);\n },\n \n hasContext: () => discoveryResult.discoveredDirs.length > 0,\n };\n};\n\n// Re-export types (includes helper functions)\nexport * from './types';\n\n// Re-export discovery utilities\nexport { discoverConfigDirectories, loadHierarchicalConfig } from '../overcontext';\n\n// Re-export deepMerge from old discovery for backwards compatibility\nexport { deepMerge } from './discovery';\n","/**\n * Router\n * \n * Handles routing decisions and path building using Dreadcabinet patterns.\n * Takes classification results and builds output paths with appropriate\n * directory structure and filenames.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { \n RoutingContext, \n RouteDecision,\n RoutingConfig,\n FilesystemStructure\n} from './types';\nimport * as Classifier from './classifier';\n\nexport interface RouterInstance {\n route(context: RoutingContext): RouteDecision;\n buildOutputPath(decision: RouteDecision, context: RoutingContext): string;\n}\n\nexport const create = (\n config: RoutingConfig,\n classifier: Classifier.ClassifierInstance\n): RouterInstance => {\n \n const route = (context: RoutingContext): RouteDecision => {\n const results = classifier.classify(context, config.projects);\n \n if (results.length === 0) {\n return {\n projectId: null,\n destination: config.default,\n confidence: 1.0,\n signals: [],\n reasoning: 'No project matches found, using default routing',\n };\n }\n \n const bestMatch = results[0];\n const matchedProject = config.projects.find(p => p.projectId === bestMatch.projectId)!;\n \n // Handle conflict resolution if multiple high-confidence matches\n const highConfidenceMatches = results.filter(r => r.confidence > 0.5);\n \n if (highConfidenceMatches.length > 1 && config.conflict_resolution !== 'primary') {\n // Return best with alternates noted\n return {\n projectId: bestMatch.projectId,\n destination: matchedProject.destination,\n confidence: bestMatch.confidence,\n signals: bestMatch.signals,\n reasoning: bestMatch.reasoning,\n auto_tags: matchedProject.auto_tags,\n alternateMatches: highConfidenceMatches.slice(1),\n };\n }\n \n return {\n projectId: bestMatch.projectId,\n destination: matchedProject.destination,\n confidence: bestMatch.confidence,\n signals: bestMatch.signals,\n reasoning: bestMatch.reasoning,\n auto_tags: matchedProject.auto_tags,\n };\n };\n \n const buildOutputPath = (decision: RouteDecision, context: RoutingContext): string => {\n const { destination } = decision;\n \n // Expand ~ to home directory\n const basePath = expandPath(destination.path);\n \n // Build directory structure using Dreadcabinet patterns\n const directoryPath = buildDirectoryPath(basePath, destination.structure, context.audioDate);\n \n // Build filename using Dreadcabinet patterns\n // Pass structure so filename doesn't repeat info already in path\n const filename = buildFilename(destination.filename_options, context, destination.structure);\n \n return path.join(directoryPath, filename + '.md');\n };\n \n return { route, buildOutputPath };\n};\n\n// Dreadcabinet-style directory building\nfunction buildDirectoryPath(\n basePath: string, \n structure: FilesystemStructure, \n date: Date\n): string {\n const year = date.getFullYear().toString();\n const month = (date.getMonth() + 1).toString();\n const day = date.getDate().toString();\n \n switch (structure) {\n case 'none':\n return basePath;\n case 'year':\n return path.join(basePath, year);\n case 'month':\n return path.join(basePath, year, month);\n case 'day':\n return path.join(basePath, year, month, day);\n }\n}\n\n// Dreadcabinet-style filename building\n// The date portion is adjusted based on what's already in the directory path\nfunction buildFilename(\n options: Array<'date' | 'time' | 'subject'>,\n context: RoutingContext,\n structure: FilesystemStructure\n): string {\n const parts: string[] = [];\n const date = context.audioDate;\n const pad = (n: number) => n.toString().padStart(2, '0');\n \n for (const option of options) {\n switch (option) {\n case 'date': {\n // Adjust date format based on directory structure\n // Don't repeat info already in the path\n const day = pad(date.getDate());\n const month = pad(date.getMonth() + 1);\n const year = date.getFullYear().toString().slice(2);\n \n switch (structure) {\n case 'day':\n // Path has year/month/day - no date needed in filename\n break;\n case 'month':\n // Path has year/month - only day in filename\n parts.push(day);\n break;\n case 'year':\n // Path has year - month+day in filename\n parts.push(`${month}-${day}`);\n break;\n case 'none':\n // No date in path - full date in filename (YYMMDD)\n parts.push(`${year}${month}${day}`);\n break;\n }\n break;\n }\n case 'time': {\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n parts.push(`${hours}${minutes}`);\n break;\n }\n case 'subject': {\n const subject = extractSubject(context.transcriptText, context.sourceFile);\n if (subject) {\n parts.push(subject);\n }\n break;\n }\n }\n }\n \n // Join and clean up any double dashes\n return parts.join('-').replace(/--+/g, '-');\n}\n\nfunction extractSubject(text: string, sourceFile: string): string {\n // Try to extract from first sentence\n const firstSentence = text.split(/[.!?]/)[0]?.trim() ?? '';\n \n // Remove common prefixes\n const cleaned = firstSentence\n .replace(/^(this is a note about|note about|regarding|re:|meeting notes?:?)/i, '')\n .trim();\n \n if (cleaned.length > 3 && cleaned.length < 50) {\n return slugify(cleaned);\n }\n \n // Fall back to source filename\n return path.basename(sourceFile, path.extname(sourceFile))\n .replace(/[^a-zA-Z0-9-]/g, '-')\n .toLowerCase();\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with dash\n .replace(/--+/g, '-') // Collapse multiple dashes\n .replace(/^-|-$/g, '') // Remove leading/trailing dashes\n .slice(0, 40);\n}\n\nfunction expandPath(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\n","/**\n * Intelligent Classifier\n * \n * Multi-signal classification system for routing transcripts to projects.\n * Uses various signals (explicit phrases, associated people/companies, topics)\n * to determine the best project match with confidence scoring.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport { \n ClassificationResult, \n ClassificationSignal, \n ProjectRoute, \n RoutingContext \n} from './types';\nimport * as Context from '../context';\n\nexport interface ClassifierInstance {\n classify(context: RoutingContext, routes: ProjectRoute[]): ClassificationResult[];\n calculateConfidence(signals: ClassificationSignal[]): number;\n}\n\nexport const create = (contextInstance: Context.ContextInstance): ClassifierInstance => {\n \n const classify = (\n routingContext: RoutingContext, \n routes: ProjectRoute[]\n ): ClassificationResult[] => {\n const results: ClassificationResult[] = [];\n const normalizedText = routingContext.transcriptText.toLowerCase();\n \n for (const route of routes) {\n if (route.active === false) continue;\n \n const signals: ClassificationSignal[] = [];\n const classification = route.classification;\n \n // 1. Check explicit phrases (highest weight)\n for (const phrase of classification.explicit_phrases ?? []) {\n if (normalizedText.includes(phrase.toLowerCase())) {\n signals.push({\n type: 'explicit_phrase',\n value: phrase,\n weight: 0.9, // High confidence\n });\n }\n }\n \n // 2. Check associated people\n const peopleInText = routingContext.detectedPeople ?? \n detectPeopleFromContext(normalizedText, contextInstance);\n \n for (const personId of classification.associated_people ?? []) {\n if (peopleInText.includes(personId)) {\n const person = contextInstance.getPerson(personId);\n signals.push({\n type: 'associated_person',\n value: person?.name ?? personId,\n weight: 0.6,\n });\n }\n }\n \n // 3. Check associated companies\n const companiesInText = routingContext.detectedCompanies ?? \n detectCompaniesFromContext(normalizedText, contextInstance);\n \n for (const companyId of classification.associated_companies ?? []) {\n if (companiesInText.includes(companyId)) {\n const company = contextInstance.getCompany(companyId);\n signals.push({\n type: 'associated_company',\n value: company?.name ?? companyId,\n weight: 0.5,\n });\n }\n }\n \n // 4. Check topics\n for (const topic of classification.topics ?? []) {\n if (normalizedText.includes(topic.toLowerCase())) {\n signals.push({\n type: 'topic',\n value: topic,\n weight: 0.3,\n });\n }\n }\n \n // 5. Context type (if we can infer work vs personal)\n // This is a weaker signal but helps with disambiguation\n const inferredContextType = inferContextType(normalizedText);\n if (inferredContextType === classification.context_type) {\n signals.push({\n type: 'context_type',\n value: classification.context_type,\n weight: 0.2,\n });\n }\n \n // Only include if we have at least one signal\n if (signals.length > 0) {\n const confidence = calculateConfidence(signals);\n results.push({\n projectId: route.projectId,\n confidence,\n signals,\n reasoning: buildReasoning(signals),\n });\n }\n }\n \n // Sort by confidence descending\n return results.sort((a, b) => b.confidence - a.confidence);\n };\n \n const calculateConfidence = (signals: ClassificationSignal[]): number => {\n if (signals.length === 0) return 0;\n \n // Weighted average with diminishing returns for multiple signals\n let totalWeight = 0;\n let weightedSum = 0;\n \n for (let i = 0; i < signals.length; i++) {\n const signal = signals[i];\n // Later signals contribute less (diminishing returns)\n const positionFactor = 1 / (1 + i * 0.3);\n const effectiveWeight = signal.weight * positionFactor;\n \n weightedSum += effectiveWeight;\n totalWeight += positionFactor;\n }\n \n // Normalize and cap at 0.99\n return Math.min(weightedSum / Math.max(totalWeight, 1), 0.99);\n };\n \n const buildReasoning = (signals: ClassificationSignal[]): string => {\n const parts = signals.map(s => {\n switch (s.type) {\n case 'explicit_phrase': return `explicit phrase: \"${s.value}\"`;\n case 'associated_person': return `mentioned ${s.value} (associated)`;\n case 'associated_company': return `mentioned ${s.value} (associated company)`;\n case 'topic': return `topic: ${s.value}`;\n case 'context_type': return `context: ${s.value}`;\n }\n });\n return parts.join(', ');\n };\n \n return { classify, calculateConfidence };\n};\n\n// Helper functions\nfunction detectPeopleFromContext(\n text: string, \n context: Context.ContextInstance\n): string[] {\n const found: string[] = [];\n \n for (const person of context.getAllPeople()) {\n const nameNormalized = person.name.toLowerCase();\n if (text.includes(nameNormalized)) {\n found.push(person.id);\n continue;\n }\n \n // Check phonetic variants (sounds_like)\n for (const variant of person.sounds_like ?? []) {\n if (text.includes(variant.toLowerCase())) {\n found.push(person.id);\n break;\n }\n }\n }\n \n return found;\n}\n\nfunction detectCompaniesFromContext(\n text: string, \n context: Context.ContextInstance\n): string[] {\n const found: string[] = [];\n \n for (const company of context.getAllCompanies()) {\n const nameNormalized = company.name.toLowerCase();\n if (text.includes(nameNormalized)) {\n found.push(company.id);\n continue;\n }\n \n // Check full name\n if (company.fullName && text.includes(company.fullName.toLowerCase())) {\n found.push(company.id);\n continue;\n }\n \n // Check phonetic variants (sounds_like)\n for (const variant of company.sounds_like ?? []) {\n if (text.includes(variant.toLowerCase())) {\n found.push(company.id);\n break;\n }\n }\n }\n \n return found;\n}\n\nfunction inferContextType(text: string): 'work' | 'personal' | 'mixed' {\n const workIndicators = ['meeting', 'project', 'deadline', 'team', 'client', 'report'];\n const personalIndicators = ['family', 'weekend', 'vacation', 'hobby', 'friend'];\n \n let workScore = 0;\n let personalScore = 0;\n \n for (const word of workIndicators) {\n if (text.includes(word)) workScore++;\n }\n \n for (const word of personalIndicators) {\n if (text.includes(word)) personalScore++;\n }\n \n if (workScore > personalScore + 1) return 'work';\n if (personalScore > workScore + 1) return 'personal';\n return 'mixed';\n}\n\n","/**\n * Routing System\n * \n * Main entry point for the routing system. Provides a factory function\n * to create routing instances that can classify transcripts and determine\n * output destinations using Dreadcabinet patterns.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport { RoutingConfig, RouteDecision, RoutingContext, RouteDestination, ProjectRoute } from './types';\nimport * as Router from './router';\nimport * as Classifier from './classifier';\nimport * as Context from '../context';\n\nexport interface RoutingInstance {\n route(context: RoutingContext): RouteDecision;\n buildOutputPath(decision: RouteDecision, context: RoutingContext): string;\n addProject(project: ProjectRoute): void;\n updateDefaultRoute(destination: RouteDestination): void;\n getConfig(): RoutingConfig;\n}\n\nexport const create = (\n config: RoutingConfig,\n context: Context.ContextInstance\n): RoutingInstance => {\n const classifier = Classifier.create(context);\n const router = Router.create(config, classifier);\n \n // Mutable config for self-update feature\n const currentConfig = { ...config };\n \n return {\n route: (ctx) => router.route(ctx),\n buildOutputPath: (decision, ctx) => router.buildOutputPath(decision, ctx),\n \n addProject: (project) => {\n currentConfig.projects.push(project);\n },\n \n updateDefaultRoute: (destination) => {\n currentConfig.default = destination;\n },\n \n getConfig: () => ({ ...currentConfig }),\n };\n};\n\n// Re-export types\nexport * from './types';\n\n","/**\n * Sound Notification Utility\n * \n * Plays system sounds to notify the user when interactive input is needed.\n * Similar to Cursor's notification behavior.\n * \n * Platform support:\n * - macOS: Uses afplay with system sounds (Glass.aiff)\n * - Windows: Uses PowerShell to play system notification sound\n * - Linux/Other: Falls back to terminal bell\n */\n\nimport { spawn } from 'child_process';\nimport * as Logging from '../logging';\n\nexport interface SoundConfig {\n /** Whether sounds are disabled (silent mode) */\n silent: boolean;\n}\n\nexport interface SoundInstance {\n /** Play a notification sound to get user's attention */\n playNotification(): Promise<void>;\n /** Check if sounds are enabled */\n isEnabled(): boolean;\n}\n\n// macOS system sounds that work well for notifications\nconst MACOS_NOTIFICATION_SOUNDS = [\n '/System/Library/Sounds/Glass.aiff',\n '/System/Library/Sounds/Ping.aiff', \n '/System/Library/Sounds/Pop.aiff',\n '/System/Library/Sounds/Tink.aiff',\n];\n\n// Default sound to use (Glass is similar to Cursor's notification)\nconst DEFAULT_MACOS_SOUND = MACOS_NOTIFICATION_SOUNDS[0];\n\n/**\n * Play a sound file using afplay (macOS)\n */\nconst playWithAfplay = (soundPath: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const afplay = spawn('afplay', [soundPath], {\n stdio: 'ignore',\n detached: true,\n });\n\n afplay.on('error', () => {\n resolve(false);\n });\n\n afplay.on('close', (code) => {\n resolve(code === 0);\n });\n\n // Don't wait for the sound to finish - just fire and forget\n afplay.unref();\n \n // Consider it successful if spawn didn't throw\n setTimeout(() => resolve(true), 50);\n });\n};\n\n/**\n * Play Windows system notification sound using PowerShell\n * Uses SystemSounds.Asterisk which is a pleasant notification tone\n */\nconst playWithPowerShell = (): Promise<boolean> => {\n return new Promise((resolve) => {\n // Use PowerShell to access .NET System.Media.SystemSounds\n // Asterisk is a pleasant notification sound, similar to macOS Glass\n const ps = spawn('powershell', [\n '-NoProfile',\n '-NonInteractive', \n '-Command',\n '[System.Media.SystemSounds]::Asterisk.Play()'\n ], {\n stdio: 'ignore',\n detached: true,\n // On Windows, use shell to ensure PowerShell is found\n shell: true,\n });\n\n ps.on('error', () => {\n resolve(false);\n });\n\n ps.on('close', (code) => {\n resolve(code === 0);\n });\n\n ps.unref();\n \n // Consider it successful if spawn didn't throw\n setTimeout(() => resolve(true), 50);\n });\n};\n\n/**\n * Play terminal bell as fallback for Linux and other platforms\n */\nconst playTerminalBell = (): void => {\n // Write ASCII bell character to stdout\n process.stdout.write('\\x07');\n};\n\nexport const create = (config: SoundConfig): SoundInstance => {\n const logger = Logging.getLogger();\n \n const playNotification = async (): Promise<void> => {\n if (config.silent) {\n logger.debug('Sound notification skipped (silent mode)');\n return;\n }\n\n try {\n // macOS: use afplay with system sounds\n if (process.platform === 'darwin') {\n const success = await playWithAfplay(DEFAULT_MACOS_SOUND);\n if (success) {\n logger.debug('Played notification sound: %s', DEFAULT_MACOS_SOUND);\n return;\n }\n }\n \n // Windows: use PowerShell to play system sound\n if (process.platform === 'win32') {\n const success = await playWithPowerShell();\n if (success) {\n logger.debug('Played Windows notification sound via PowerShell');\n return;\n }\n }\n \n // Linux and others: fall back to terminal bell\n playTerminalBell();\n logger.debug('Played terminal bell notification');\n } catch (error) {\n // Sound failures should never interrupt the workflow\n logger.debug('Failed to play notification sound: %s', error);\n // Try terminal bell as last resort\n try {\n playTerminalBell();\n } catch {\n // Silently ignore - sound is not critical\n }\n }\n };\n\n const isEnabled = (): boolean => !config.silent;\n\n return {\n playNotification,\n isEnabled,\n };\n};\n\n","/**\n * Content Fetcher\n * \n * Fetches content from URLs and local files for LLM analysis.\n * Handles GitHub URLs specially to get raw README content.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { MAX_CONTENT_LENGTH } from '../constants';\nimport { getLogger } from '../logging';\nimport { htmlToText } from 'html-to-text';\n\nexport interface FetchResult {\n success: boolean;\n content?: string;\n sourceType: 'url' | 'file' | 'directory' | 'github';\n sourceName: string;\n error?: string;\n}\n\nexport interface ContentFetcherInstance {\n fetch(source: string): Promise<FetchResult>;\n isUrl(source: string): boolean;\n isGitHubUrl(source: string): boolean;\n}\n\nexport const create = (): ContentFetcherInstance => {\n const logger = getLogger();\n\n const isUrl = (source: string): boolean => {\n return source.startsWith('http://') || source.startsWith('https://');\n };\n\n const isGitHubUrl = (source: string): boolean => {\n try {\n const parsed = new URL(source);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return false;\n }\n\n const hostname = parsed.hostname.toLowerCase();\n const allowedGitHubHosts = new Set([\n 'github.com',\n 'raw.githubusercontent.com',\n ]);\n\n return allowedGitHubHosts.has(hostname);\n } catch {\n // If the URL cannot be parsed, it is not a valid GitHub URL\n return false;\n }\n };\n\n // Simple HTML tag stripper\n const stripHtml = (html: string): string => {\n // Use a well-tested library to convert HTML to plain text,\n // which removes tags, scripts, and styles safely.\n let text = htmlToText(html, {\n wordwrap: false,\n preserveNewlines: false,\n // Keep links and other markup as simple text when possible.\n selectors: [\n { selector: 'script', format: 'skip' },\n { selector: 'style', format: 'skip' },\n { selector: 'h1', options: { uppercase: false } },\n { selector: 'h2', options: { uppercase: false } },\n { selector: 'h3', options: { uppercase: false } },\n { selector: 'h4', options: { uppercase: false } },\n { selector: 'h5', options: { uppercase: false } },\n { selector: 'h6', options: { uppercase: false } }\n ]\n });\n\n // Normalize whitespace\n text = text.replace(/\\s+/g, ' ').trim();\n\n return text;\n };\n\n const fetchUrl = async (url: string): Promise<FetchResult> => {\n logger.debug('Fetching URL: %s', url);\n\n try {\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'protokoll/1.0',\n 'Accept': 'text/html,text/plain,text/markdown,application/json',\n },\n signal: AbortSignal.timeout(10000), // 10 second timeout\n });\n\n if (!response.ok) {\n return {\n success: false,\n sourceType: 'url',\n sourceName: url,\n error: `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const contentType = response.headers.get('content-type') || '';\n let content = await response.text();\n\n // Strip HTML tags for basic text extraction\n if (contentType.includes('text/html')) {\n content = stripHtml(content);\n }\n\n // Truncate to max length\n if (content.length > MAX_CONTENT_LENGTH) {\n content = content.substring(0, MAX_CONTENT_LENGTH) + '\\n\\n[Content truncated...]';\n }\n\n return {\n success: true,\n content,\n sourceType: 'url',\n sourceName: new URL(url).hostname,\n };\n } catch (error: any) {\n return {\n success: false,\n sourceType: 'url',\n sourceName: url,\n error: error.message,\n };\n }\n };\n\n const fetchGitHubReadme = async (url: string): Promise<FetchResult> => {\n logger.debug('Fetching GitHub repository: %s', url);\n\n try {\n // Parse GitHub URL: https://github.com/owner/repo\n const match = url.match(/github\\.com\\/([^/]+)\\/([^/]+)/);\n if (!match) {\n // Fall back to regular URL fetch\n return await fetchUrl(url);\n }\n\n const [, owner, repo] = match;\n const repoName = repo.replace(/\\.git$/, '');\n \n // Try to fetch raw README.md from main branch\n const readmeUrls = [\n `https://raw.githubusercontent.com/${owner}/${repoName}/main/README.md`,\n `https://raw.githubusercontent.com/${owner}/${repoName}/master/README.md`,\n `https://raw.githubusercontent.com/${owner}/${repoName}/main/readme.md`,\n `https://raw.githubusercontent.com/${owner}/${repoName}/master/readme.md`,\n ];\n\n for (const readmeUrl of readmeUrls) {\n try {\n const response = await fetch(readmeUrl, {\n headers: { 'User-Agent': 'protokoll/1.0' },\n signal: AbortSignal.timeout(10000),\n });\n\n if (response.ok) {\n let content = await response.text();\n \n if (content.length > MAX_CONTENT_LENGTH) {\n content = content.substring(0, MAX_CONTENT_LENGTH) + '\\n\\n[Content truncated...]';\n }\n\n return {\n success: true,\n content,\n sourceType: 'github',\n sourceName: `${owner}/${repoName}`,\n };\n }\n } catch {\n // Try next URL\n }\n }\n\n // Fall back to regular URL fetch if README not found\n return await fetchUrl(url);\n } catch (error: any) {\n return {\n success: false,\n sourceType: 'github',\n sourceName: url,\n error: error.message,\n };\n }\n };\n\n const fetchFile = async (filePath: string): Promise<FetchResult> => {\n logger.debug('Reading file: %s', filePath);\n\n try {\n const ext = path.extname(filePath).toLowerCase();\n const supportedExtensions = ['.md', '.txt', '.yaml', '.yml', '.json', '.rst', '.adoc'];\n\n if (!supportedExtensions.includes(ext)) {\n return {\n success: false,\n sourceType: 'file',\n sourceName: path.basename(filePath),\n error: `Unsupported file type: ${ext}. Supported: ${supportedExtensions.join(', ')}`,\n };\n }\n\n let content = await fs.readFile(filePath, 'utf-8');\n\n if (content.length > MAX_CONTENT_LENGTH) {\n content = content.substring(0, MAX_CONTENT_LENGTH) + '\\n\\n[Content truncated...]';\n }\n\n return {\n success: true,\n content,\n sourceType: 'file',\n sourceName: path.basename(filePath),\n };\n } catch (error: any) {\n return {\n success: false,\n sourceType: 'file',\n sourceName: path.basename(filePath),\n error: error.message,\n };\n }\n };\n\n const fetchDirectory = async (dirPath: string): Promise<FetchResult> => {\n logger.debug('Reading directory: %s', dirPath);\n\n try {\n const files = await fs.readdir(dirPath);\n \n // Priority order for finding content\n const priorityFiles = [\n 'README.md',\n 'readme.md',\n 'README.txt',\n 'readme.txt',\n 'package.json',\n 'README.rst',\n 'README.adoc',\n ];\n\n for (const priorityFile of priorityFiles) {\n if (files.includes(priorityFile)) {\n const filePath = path.join(dirPath, priorityFile);\n const result = await fetchFile(filePath);\n \n if (result.success) {\n return {\n ...result,\n sourceType: 'directory',\n sourceName: `${path.basename(dirPath)}/${priorityFile}`,\n };\n }\n }\n }\n\n // If no priority file found, try first .md file\n const mdFile = files.find(f => f.endsWith('.md'));\n if (mdFile) {\n const result = await fetchFile(path.join(dirPath, mdFile));\n if (result.success) {\n return {\n ...result,\n sourceType: 'directory',\n sourceName: `${path.basename(dirPath)}/${mdFile}`,\n };\n }\n }\n\n return {\n success: false,\n sourceType: 'directory',\n sourceName: path.basename(dirPath),\n error: 'No readable documentation files found in directory',\n };\n } catch (error: any) {\n return {\n success: false,\n sourceType: 'directory',\n sourceName: path.basename(dirPath),\n error: error.message,\n };\n }\n };\n\n const fetchContent = async (source: string): Promise<FetchResult> => {\n logger.debug('Fetching content from: %s', source);\n\n try {\n if (isUrl(source)) {\n if (isGitHubUrl(source)) {\n return await fetchGitHubReadme(source);\n }\n return await fetchUrl(source);\n }\n\n // Local path\n const resolvedPath = path.resolve(source);\n const stat = await fs.stat(resolvedPath);\n\n if (stat.isDirectory()) {\n return await fetchDirectory(resolvedPath);\n } else {\n return await fetchFile(resolvedPath);\n }\n } catch (error: any) {\n logger.error('Failed to fetch content: %s', error.message);\n return {\n success: false,\n sourceType: isUrl(source) ? 'url' : 'file',\n sourceName: source,\n error: error.message,\n };\n }\n };\n\n return { \n fetch: fetchContent, \n isUrl, \n isGitHubUrl \n };\n};\n","import { OpenAI } from 'openai';\nimport { ChatCompletionCreateParamsNonStreaming, ChatCompletionMessageParam } from 'openai/resources/chat/completions';\nimport * as Storage from '@/util/storage';\nimport { getLogger } from '@/logging';\nimport { DEFAULT_MODEL, DEFAULT_TRANSCRIPTION_MODEL } from '@/constants';\n\nexport interface Transcription {\n text: string;\n}\n\nexport class OpenAIError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OpenAIError';\n }\n}\n\n\nexport async function createCompletion(messages: ChatCompletionMessageParam[], options: { responseFormat?: any, model?: string, reasoningLevel?: 'none' | 'low' | 'medium' | 'high', maxTokens?: number, debug?: boolean, debugFile?: string, reason?: string } = {}): Promise<string | any> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n try {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new OpenAIError('OPENAI_API_KEY environment variable is not set');\n }\n\n const openai = new OpenAI({\n apiKey: apiKey,\n });\n\n const model = options.model || DEFAULT_MODEL;\n \n // Check if model supports reasoning_effort\n const supportsReasoning = model.includes('gpt-5') || \n model.includes('o1') || model.includes('o3');\n const isReasoningCall = supportsReasoning && options.reasoningLevel && options.reasoningLevel !== 'none';\n \n logger.debug('Sending prompt to OpenAI: %j', messages);\n\n const startTime = Date.now();\n \n const requestParams: Record<string, unknown> = {\n model,\n messages,\n max_completion_tokens: options.maxTokens || 10000,\n response_format: options.responseFormat,\n };\n \n if (isReasoningCall) {\n requestParams.reasoning_effort = options.reasoningLevel;\n logger.debug('Using reasoning_effort: %s', options.reasoningLevel);\n }\n \n const completion = await openai.chat.completions.create(\n requestParams as unknown as ChatCompletionCreateParamsNonStreaming\n );\n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n\n // Log token usage with reason if provided\n const usage = completion.usage;\n const reasonSuffix = options.reason ? ` - ${options.reason}` : '';\n if (usage) {\n logger.info('%s (%ss, %d→%d tokens)%s', \n model, duration, usage.prompt_tokens, usage.completion_tokens, reasonSuffix);\n } else {\n logger.info('%s (%ss)%s', model, duration, reasonSuffix);\n }\n\n if (options.debug && options.debugFile) {\n await storage.writeFile(options.debugFile, JSON.stringify(completion, null, 2), 'utf8');\n logger.debug('Wrote debug file to %s', options.debugFile);\n }\n\n const response = completion.choices[0]?.message?.content?.trim();\n if (!response) {\n // Log the full completion object to help debug\n logger.error('Empty response from OpenAI. Full completion object: %j', completion);\n throw new OpenAIError('No response received from OpenAI');\n }\n\n logger.debug('Received response from OpenAI: %s', response);\n if (options.responseFormat) {\n return JSON.parse(response);\n } else {\n return response;\n }\n\n } catch (error: any) {\n logger.error('Error calling OpenAI API: %s %s', error.message, error.stack);\n throw new OpenAIError(`Failed to create completion: ${error.message}`);\n }\n}\n\nexport async function transcribeAudio(filePath: string, options: { model?: string, debug?: boolean, debugFile?: string } = {}): Promise<Transcription> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n try {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new OpenAIError('OPENAI_API_KEY environment variable is not set');\n }\n\n const openai = new OpenAI({\n apiKey: apiKey,\n });\n\n const model = options.model || DEFAULT_TRANSCRIPTION_MODEL;\n const fileName = filePath.split('/').pop() || filePath;\n logger.debug('Transcribing: %s (full path: %s)', fileName, filePath);\n\n const startTime = Date.now();\n const audioStream = await storage.readStream(filePath);\n const transcription = await openai.audio.transcriptions.create({\n model,\n file: audioStream,\n response_format: \"json\",\n });\n \n if (!transcription) {\n throw new OpenAIError('No transcription received from OpenAI');\n }\n \n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n logger.info('%s (%ss, %d chars)', model, duration, transcription.text?.length || 0);\n\n if (options.debug && options.debugFile) {\n await storage.writeFile(options.debugFile, JSON.stringify(transcription, null, 2), 'utf8');\n logger.debug('Wrote debug file to %s', options.debugFile);\n }\n\n logger.debug('Received transcription from OpenAI: %s', transcription);\n return transcription;\n\n } catch (error: any) {\n logger.error('Error transcribing audio file: %s %s', error.message, error.stack);\n throw new OpenAIError(`Failed to transcribe audio: ${error.message}`);\n }\n}\n","/**\n * Interactive Handler\n * \n * Manages interactive sessions and clarification requests.\n * Uses readline for actual user prompting.\n * Plays notification sounds when user input is needed (like Cursor).\n */\n\nimport * as readline from 'readline';\nimport { \n InteractiveConfig, \n InteractiveSession, \n ClarificationRequest, \n ClarificationResponse,\n NewProjectWizardResult,\n NewPersonWizardResult,\n} from './types';\nimport * as Logging from '../logging';\nimport * as Sound from '../util/sound';\nimport * as ContentFetcher from '../cli/content-fetcher';\nimport * as OpenAI from '../util/openai';\n\nexport interface HandlerInstance {\n startSession(): void;\n endSession(): InteractiveSession;\n handleClarification(request: ClarificationRequest): Promise<ClarificationResponse>;\n isEnabled(): boolean;\n getSession(): InteractiveSession | null;\n // File tracking\n startFile(filePath: string): void;\n endFile(outputPath?: string, movedTo?: string): void;\n // Entity tracking\n trackTermAdded(termName: string): void;\n trackTermUpdated(termName: string): void;\n trackProjectAdded(projectName: string): void;\n trackProjectUpdated(projectName: string): void;\n trackPersonAdded(personName: string): void;\n trackAlias(alias: string, linkedTo: string): void;\n // Session control\n requestStop(): void;\n shouldStopSession(): boolean;\n // Summary\n printSummary(): void;\n}\n\nconst createReadlineInterface = () => {\n // Ensure stdin is in the correct mode for readline\n // This helps prevent issues with some terminal emulators\n if (process.stdin.setRawMode) {\n try {\n // Ensure we're NOT in raw mode - readline handles this itself\n process.stdin.setRawMode(false);\n } catch {\n // Ignore errors - some environments don't support setRawMode\n }\n }\n \n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true, // Explicitly enable terminal mode for proper echo handling\n });\n};\n\nconst askQuestion = (rl: readline.Interface, question: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n};\n\n// Helper to write to stdout without triggering no-console lint rule\nconst write = (text: string) => process.stdout.write(text + '\\n');\n\n/**\n * Analyze content from URL/file to determine if it's a Project or Term\n * and extract relevant metadata\n */\ninterface ContentAnalysis {\n entityType: 'project' | 'term' | 'unknown';\n name: string;\n description?: string;\n expansion?: string; // For terms that are acronyms\n topics?: string[];\n confidence: 'high' | 'medium' | 'low';\n reasoning: string;\n}\n\nconst analyzeContentForEntity = async (\n content: string,\n sourceName: string,\n originalTerm: string\n): Promise<ContentAnalysis> => {\n const logger = Logging.getLogger();\n \n logger.debug('Analyzing content to determine entity type for: %s', originalTerm);\n \n const prompt = `You are analyzing content to determine if \"${originalTerm}\" refers to a PROJECT or a TERM.\n\nDEFINITIONS:\n- PROJECT: A specific initiative, codebase, client engagement, or ongoing work effort with deliverables\n- TERM: A technology, concept, tool, methodology, or technical term that needs to be understood and referenced\n\nSOURCE: ${sourceName}\nCONTENT:\n---\n${content.substring(0, 8000)}\n---\n\nBased on this content, determine:\n1. Is \"${originalTerm}\" a PROJECT or a TERM?\n2. What is the correct/full name?\n3. What is a brief description (1-2 sentences)?\n4. If it's a TERM and an acronym, what does it stand for?\n5. What are related topics/keywords (5-10 words)?\n6. How confident are you? (high/medium/low)\n\nRespond in JSON format:\n{\n \"entityType\": \"project\" | \"term\",\n \"name\": \"string\",\n \"description\": \"string\",\n \"expansion\": \"string or null\",\n \"topics\": [\"keyword1\", \"keyword2\", ...],\n \"confidence\": \"high\" | \"medium\" | \"low\",\n \"reasoning\": \"Brief explanation of your determination\"\n}`;\n\n try {\n const response = await OpenAI.createCompletion(\n [{ role: 'user', content: prompt }],\n { \n responseFormat: { type: 'json_object' },\n reasoningLevel: 'medium',\n maxTokens: 2000,\n reason: `analyze content for \"${originalTerm}\"`,\n }\n );\n \n const analysis = response as ContentAnalysis;\n logger.debug('Content analysis result: %j', analysis);\n \n return analysis;\n } catch (error: any) {\n logger.error('Failed to analyze content: %s', error.message);\n \n // Return fallback analysis\n return {\n entityType: 'unknown',\n name: originalTerm,\n confidence: 'low',\n reasoning: `Failed to analyze: ${error.message}`,\n };\n }\n};\n\n// Simplified project creation (used when creating project from term/person association)\nconst runCreateProjectFlow = async (\n rl: readline.Interface,\n contextMessage?: string\n): Promise<NewProjectWizardResult> => {\n if (contextMessage) {\n write('');\n write(contextMessage);\n }\n \n // Step 1: Project name (required)\n const projectName = await askQuestion(rl, '\\nProject name: ');\n \n if (!projectName) {\n write('Project name is required. Skipping project creation.');\n return { action: 'skip' };\n }\n \n // Step 2: Destination\n const destination = await askQuestion(rl, '\\nWhere should output be routed to? (Enter for default): ');\n \n // Step 3: Description\n const description = await askQuestion(rl, '\\nCan you tell me something about this project? (Enter to skip): ');\n \n return {\n action: 'create',\n projectName: projectName.trim(),\n destination: destination || undefined,\n description: description || undefined,\n };\n};\n\n/**\n * Calculate string similarity (simple Levenshtein-based)\n * Returns a score from 0 (completely different) to 1 (identical)\n */\nconst calculateSimilarity = (str1: string, str2: string): number => {\n const s1 = str1.toLowerCase();\n const s2 = str2.toLowerCase();\n \n if (s1 === s2) return 1.0;\n \n // Simple character overlap heuristic\n const set1 = new Set(s1.split(''));\n const set2 = new Set(s2.split(''));\n const intersection = new Set([...set1].filter(x => set2.has(x)));\n const union = new Set([...set1, ...set2]);\n \n return intersection.size / union.size;\n};\n\n/**\n * Find similar existing terms\n */\nconst findSimilarTerms = (term: string, existingTerms: string[]): string[] => {\n const similarities = existingTerms.map(existing => ({\n term: existing,\n score: calculateSimilarity(term, existing),\n }));\n \n // Return terms with similarity > 0.6, sorted by score\n return similarities\n .filter(s => s.score > 0.6)\n .sort((a, b) => b.score - a.score)\n .map(s => s.term);\n};\n\n/**\n * New streamlined wizard flow\n */\nconst runNewProjectWizard = async (\n rl: readline.Interface,\n term: string,\n context: string | undefined,\n projectOptions: string[] | undefined\n): Promise<NewProjectWizardResult> => {\n const fetcher = ContentFetcher.create();\n \n write('');\n write('─'.repeat(60));\n write(`[Unknown: \"${term}\"]`);\n if (context) {\n write(context);\n }\n write('─'.repeat(60));\n \n // Quick ignore option\n const ignoreCheck = await askQuestion(rl, '\\nIgnore this? (X to ignore, or Enter to continue): ');\n if (ignoreCheck.toLowerCase() === 'x' || ignoreCheck.toLowerCase() === 'ignore') {\n write(`\\n[Adding \"${term}\" to ignore list]`);\n return { action: 'ignore', ignoredTerm: term };\n }\n \n // TODO: Get existing terms from context to check for similar matches\n // For now, we'll skip this step but the infrastructure is here\n const existingTerms: string[] = []; // Would come from context.getTerms()\n const similarTerms = findSimilarTerms(term, existingTerms);\n \n if (similarTerms.length > 0) {\n write(`\\nFound similar term(s): ${similarTerms.join(', ')}`);\n const useSimilar = await askQuestion(rl, `Is \"${term}\" the same as \"${similarTerms[0]}\"? (Y/N): `);\n \n if (useSimilar.toLowerCase() === 'y' || useSimilar.toLowerCase() === 'yes') {\n return {\n action: 'link',\n linkedTermName: similarTerms[0],\n aliasName: term,\n };\n }\n }\n \n // Step 1: Get source of information\n write('\\n[How should I learn about this?]');\n write('Options:');\n write(' 1. Provide a file path (e.g., ~/docs/project.md)');\n write(' 2. Provide a URL (e.g., https://example.com)');\n write(' 3. Paste text directly');\n write(' 4. Enter details manually');\n \n const sourceChoice = await askQuestion(rl, '\\nEnter 1-4, or paste path/URL directly: ');\n \n let analysis: ContentAnalysis | null = null;\n \n // Check if user pasted a URL or path directly\n if (fetcher.isUrl(sourceChoice) || sourceChoice.includes('/') || sourceChoice.includes('\\\\')) {\n write(`\\nFetching content from: ${sourceChoice}...`);\n const fetchResult = await fetcher.fetch(sourceChoice);\n \n if (fetchResult.success && fetchResult.content) {\n write(`Analyzing content from ${fetchResult.sourceName}...`);\n analysis = await analyzeContentForEntity(fetchResult.content, fetchResult.sourceName, term);\n } else {\n write(`\\nError: ${fetchResult.error}`);\n }\n } else if (sourceChoice === '1') {\n // File path\n const filePath = await askQuestion(rl, '\\nFile path: ');\n write(`\\nReading file: ${filePath}...`);\n const fetchResult = await fetcher.fetch(filePath);\n \n if (fetchResult.success && fetchResult.content) {\n write(`Analyzing content...`);\n analysis = await analyzeContentForEntity(fetchResult.content, fetchResult.sourceName, term);\n } else {\n write(`\\nError: ${fetchResult.error}`);\n }\n } else if (sourceChoice === '2') {\n // URL\n const url = await askQuestion(rl, '\\nURL: ');\n write(`\\nFetching from: ${url}...`);\n const fetchResult = await fetcher.fetch(url);\n \n if (fetchResult.success && fetchResult.content) {\n write(`Analyzing content from ${fetchResult.sourceName}...`);\n analysis = await analyzeContentForEntity(fetchResult.content, fetchResult.sourceName, term);\n } else {\n write(`\\nError: ${fetchResult.error}`);\n }\n } else if (sourceChoice === '3') {\n // Paste text\n write('\\nPaste or type text (end with empty line):');\n const lines: string[] = [];\n let line: string;\n do {\n line = await askQuestion(rl, '');\n if (line) lines.push(line);\n } while (line);\n \n const pastedText = lines.join('\\n');\n if (pastedText) {\n write('\\nAnalyzing pasted text...');\n analysis = await analyzeContentForEntity(pastedText, 'pasted text', term);\n }\n }\n \n // If we have analysis, show results and confirm\n if (analysis && analysis.entityType !== 'unknown') {\n write('\\n─'.repeat(60));\n write('[Analysis Results]');\n write(`Type: ${analysis.entityType.toUpperCase()}`);\n write(`Name: ${analysis.name}`);\n if (analysis.description) {\n write(`Description: ${analysis.description}`);\n }\n if (analysis.expansion) {\n write(`Stands for: ${analysis.expansion}`);\n }\n if (analysis.topics && analysis.topics.length > 0) {\n write(`Topics: ${analysis.topics.join(', ')}`);\n }\n write(`Confidence: ${analysis.confidence}`);\n write('─'.repeat(60));\n \n const confirm = await askQuestion(rl, '\\nUse this? (Y/N, or Enter to accept): ');\n \n if (confirm.toLowerCase() !== 'n' && confirm.toLowerCase() !== 'no') {\n // User accepted the analysis\n if (analysis.entityType === 'project') {\n return {\n action: 'create',\n projectName: analysis.name,\n description: analysis.description,\n };\n } else {\n // It's a term - ask which project(s)\n const selectedProjects = await promptProjectSelection(rl, analysis.name, projectOptions);\n \n return {\n action: 'term',\n termName: analysis.name,\n termExpansion: analysis.expansion,\n termDescription: analysis.description,\n termProjects: selectedProjects,\n };\n }\n }\n }\n \n // Fall back to manual entry\n write('\\n[Manual Entry]');\n const entityType = await askQuestion(rl, 'Is this a Project or a Term? (P/T): ');\n \n if (entityType.toLowerCase() === 'p' || entityType.toLowerCase() === 'project') {\n const projectName = await askQuestion(rl, `Project name [${term}]: `);\n const finalName = projectName || term;\n const description = await askQuestion(rl, 'Description (Enter to skip): ');\n \n return {\n action: 'create',\n projectName: finalName,\n description: description || undefined,\n };\n } else {\n const termName = await askQuestion(rl, `Term name [${term}]: `);\n const finalName = termName || term;\n const expansion = await askQuestion(rl, 'Expansion (if acronym, Enter to skip): ');\n const description = await askQuestion(rl, 'Description (Enter to skip): ');\n \n const selectedProjects = await promptProjectSelection(rl, finalName, projectOptions);\n \n return {\n action: 'term',\n termName: finalName,\n termExpansion: expansion || undefined,\n termDescription: description || undefined,\n termProjects: selectedProjects,\n };\n }\n};\n\n/**\n * Prompt for project selection with clean UI (just names)\n */\nconst promptProjectSelection = async (\n rl: readline.Interface,\n termName: string,\n projectOptions: string[] | undefined\n): Promise<number[] | undefined> => {\n if (!projectOptions || projectOptions.length === 0) {\n return undefined;\n }\n \n write('\\nWhich project(s) is this related to?');\n \n // Extract just the project names (before \" - \")\n const projectNames = projectOptions.map(opt => {\n const match = opt.match(/^([^-]+)/);\n return match ? match[1].trim() : opt;\n });\n \n projectNames.forEach((name, i) => {\n write(` ${i + 1}. ${name}`);\n });\n write(` N. Create new project`);\n \n const selection = await askQuestion(rl, '\\nEnter numbers (comma-separated) or N, or Enter to skip: ');\n \n if (!selection) {\n return undefined;\n }\n \n if (selection.toLowerCase().includes('n')) {\n // TODO: Handle new project creation\n write('[New project creation not yet implemented in this flow]');\n return undefined;\n }\n \n const indices = selection\n .split(',')\n .map(s => parseInt(s.trim(), 10) - 1)\n .filter(idx => !isNaN(idx) && idx >= 0 && idx < projectNames.length);\n \n if (indices.length > 0) {\n write(`Associated with: ${indices.map(i => projectNames[i]).join(', ')}`);\n return indices;\n }\n \n return undefined;\n};\n\nconst runNewPersonWizard = async (\n rl: readline.Interface,\n name: string,\n context: string | undefined,\n projectOptions: string[] | undefined\n): Promise<NewPersonWizardResult> => {\n write('');\n write('─'.repeat(60));\n write(`[Unknown Person Detected]`);\n write(`Name heard: \"${name}\"`);\n write('');\n if (context) {\n // Display context with proper formatting (it now includes file info)\n write(context);\n }\n write('─'.repeat(60));\n \n // Step 1: Confirm name spelling\n const nameCorrection = await askQuestion(rl, `\\nIs the name spelled correctly? (Enter to accept, or type correction): `);\n const finalName = nameCorrection || name;\n \n if (nameCorrection) {\n write(`Name updated to: \"${finalName}\"`);\n }\n \n // Step 2: Ask for organization/company\n const organization = await askQuestion(rl, `\\nWhat organization/company is ${finalName} with? (Enter to skip): `);\n \n // Step 3: Project association\n let linkedProjectIndex: number | undefined;\n let createdProject: NewProjectWizardResult | undefined;\n \n // Show project options with \"N\" for new project\n if (projectOptions && projectOptions.length > 0) {\n write('\\nExisting projects:');\n projectOptions.forEach((opt, i) => {\n write(` ${i + 1}. ${opt}`);\n });\n write(` N. Create a new project`);\n \n const projectSelection = await askQuestion(rl, `\\nWhich project is ${finalName} related to? (Enter number, N for new, or Enter to skip): `);\n \n if (projectSelection.toLowerCase() === 'n') {\n // User wants to create a new project for this person\n write('');\n write(`[Create New Project for ${finalName}]`);\n const contextMsg = organization \n ? `Creating project for ${finalName} (${organization})`\n : `Creating project for ${finalName}`;\n createdProject = await runCreateProjectFlow(rl, contextMsg);\n \n if (createdProject.action === 'create' && createdProject.projectName) {\n write(`\\n[Project \"${createdProject.projectName}\" will be created and linked to ${finalName}]`);\n }\n } else if (projectSelection && /^\\d+$/.test(projectSelection)) {\n const idx = parseInt(projectSelection, 10) - 1;\n if (idx >= 0 && idx < projectOptions.length) {\n linkedProjectIndex = idx;\n write(`Linked to: ${projectOptions[idx]}`);\n }\n }\n } else {\n // No existing projects - offer to create one\n const createNew = await askQuestion(rl, `\\nNo existing projects found. Create a new project for ${finalName}? (Y/N, or Enter to skip): `);\n \n if (createNew.toLowerCase() === 'y' || createNew.toLowerCase() === 'yes') {\n write('');\n write(`[Create New Project for ${finalName}]`);\n const contextMsg = organization \n ? `Creating project for ${finalName} (${organization})`\n : `Creating project for ${finalName}`;\n createdProject = await runCreateProjectFlow(rl, contextMsg);\n \n if (createdProject.action === 'create' && createdProject.projectName) {\n write(`\\n[Project \"${createdProject.projectName}\" will be created and linked to ${finalName}]`);\n }\n }\n }\n \n // Step 4: Ask for notes about the person\n const notes = await askQuestion(rl, `\\nAny notes about ${finalName}? (Enter to skip): `);\n \n // Determine if we should create the person\n const hasInfo = organization || linkedProjectIndex !== undefined || createdProject || notes;\n \n if (!hasInfo) {\n // User skipped everything - confirm if they want to skip entirely\n const confirm = await askQuestion(rl, `\\nNo information provided. Skip saving ${finalName}? (Enter to skip, or any key to save anyway): `);\n if (confirm === '') {\n return { action: 'skip' };\n }\n }\n \n return {\n action: 'create',\n personName: finalName,\n organization: organization || undefined,\n linkedProjectIndex,\n notes: notes || undefined,\n createdProject,\n };\n};\n\nconst formatClarificationPrompt = (request: ClarificationRequest): string => {\n const lines: string[] = [];\n \n lines.push('');\n lines.push('─'.repeat(60));\n \n switch (request.type) {\n case 'name_spelling':\n lines.push(`[Name Spelling Clarification]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Heard: \"${request.term}\"`);\n if (request.suggestion) {\n lines.push(`Suggested correction: \"${request.suggestion}\"`);\n }\n lines.push('');\n lines.push('Enter correct spelling (or press Enter to accept suggestion):');\n break;\n \n case 'new_person':\n lines.push(`[New Person Detected]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Name heard: \"${request.term}\"`);\n lines.push('');\n lines.push('Who is this person? (brief description, or press Enter to skip):');\n break;\n \n case 'new_project':\n // This case is handled by the wizard, but provide fallback prompt\n lines.push(`[Unknown Project/Term]`);\n lines.push(`Term: \"${request.term}\"`);\n if (request.context) {\n lines.push(`${request.context}`);\n }\n lines.push('');\n lines.push('Is this a new project? (Y/N, or Enter to skip):');\n break;\n \n case 'new_company':\n lines.push(`[New Company Detected]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Company name: \"${request.term}\"`);\n lines.push('');\n lines.push('Any notes about this company? (or press Enter to skip):');\n break;\n \n case 'new_term':\n lines.push(`[New Term Found]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Term: \"${request.term}\"`);\n lines.push('');\n lines.push('What does this term mean? (brief description, or press Enter to skip):');\n break;\n \n case 'routing_decision':\n lines.push(`[Routing Decision Required]`);\n lines.push(`Context: ${request.context}`);\n if (request.options && request.options.length > 0) {\n lines.push('Available destinations:');\n request.options.forEach((opt, i) => {\n lines.push(` ${i + 1}. ${opt}`);\n });\n lines.push('');\n lines.push('Enter number or destination path:');\n } else {\n lines.push('');\n lines.push('Where should this note be filed?');\n }\n break;\n \n case 'low_confidence_routing':\n lines.push(`[Confirm Note Routing]`);\n lines.push(`Confidence: ${request.term}`);\n lines.push(`${request.context}`);\n lines.push('');\n lines.push('Is this correct? (Y/Enter to accept, or enter different path):');\n break;\n \n case 'first_run_onboarding':\n lines.push(`[First Run Setup]`);\n lines.push(`${request.context}`);\n lines.push('');\n if (request.options && request.options.length > 0) {\n request.options.forEach((opt, i) => {\n lines.push(` ${i + 1}. ${opt}`);\n });\n lines.push('');\n lines.push('Enter your choice:');\n } else {\n lines.push('Enter your response:');\n }\n break;\n \n case 'general':\n default:\n lines.push(`[Clarification Needed]`);\n lines.push(`${request.context}`);\n if (request.term) {\n lines.push(`Term: \"${request.term}\"`);\n }\n if (request.suggestion) {\n lines.push(`Suggested spelling: \"${request.suggestion}\"`);\n lines.push('');\n lines.push('Press Enter or Y to accept suggestion, or type alternative:');\n } else {\n lines.push('');\n lines.push('Your response:');\n }\n break;\n }\n \n lines.push('─'.repeat(60));\n \n return lines.join('\\n') + '\\n> ';\n};\n\nexport const create = (config: InteractiveConfig): HandlerInstance => {\n const logger = Logging.getLogger();\n const sound = Sound.create({ silent: config.silent ?? false });\n \n let session: InteractiveSession | null = null;\n let rl: readline.Interface | null = null;\n \n const startSession = () => {\n session = {\n requests: [],\n responses: [],\n startedAt: new Date(),\n filesProcessed: [],\n changes: {\n termsAdded: [],\n termsUpdated: [],\n projectsAdded: [],\n projectsUpdated: [],\n peopleAdded: [],\n aliasesAdded: [],\n },\n shouldStop: false,\n };\n \n // Check if we can run interactively:\n // 1. Interactive mode must be enabled (not --batch)\n // 2. stdin must be a TTY (not piped/cron/etc)\n const isTTY = process.stdin.isTTY === true;\n \n if (config.enabled && isTTY) {\n // Only create readline interface if one doesn't already exist\n // This prevents duplicate input handlers when processing multiple files\n if (!rl) {\n rl = createReadlineInterface();\n logger.info('Interactive session started - will prompt for clarifications');\n \n // Setup Ctrl+C handler for graceful summary output\n process.on('SIGINT', () => {\n if (session) {\n write('\\n\\n[Session interrupted by user]\\n');\n printSummary();\n process.exit(0);\n }\n });\n } else {\n logger.debug('Interactive session continued (readline already active)');\n }\n } else if (config.enabled && !isTTY) {\n logger.info('Interactive mode enabled but stdin is not a TTY - running in auto-resolve mode');\n } else {\n logger.debug('Interactive session started (batch mode)');\n }\n };\n \n const endSession = (): InteractiveSession => {\n if (!session) {\n throw new Error('No active session');\n }\n \n session.completedAt = new Date();\n \n // Print summary before closing\n if (config.enabled && session.responses.length > 0) {\n printSummary();\n }\n \n if (rl) {\n // Remove all listeners before closing to prevent any lingering handlers\n // Check if method exists (may not in mocks)\n if (typeof rl.removeAllListeners === 'function') {\n rl.removeAllListeners();\n }\n rl.close();\n rl = null;\n \n // Resume stdin in case it was paused\n if (process.stdin.isPaused && process.stdin.isPaused()) {\n process.stdin.resume();\n }\n }\n \n const completed = session;\n session = null;\n \n logger.info('Interactive session ended', { \n requests: completed.requests.length,\n responses: completed.responses.length,\n });\n \n return completed;\n };\n \n const handleClarification = async (\n request: ClarificationRequest\n ): Promise<ClarificationResponse> => {\n if (session) {\n session.requests.push(request);\n }\n \n // In non-interactive mode, return the suggestion or the original term\n if (!config.enabled || !rl) {\n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: config.defaultToSuggestion && request.suggestion \n ? request.suggestion \n : request.term,\n shouldRemember: false,\n };\n \n if (session) {\n session.responses.push(response);\n }\n \n logger.debug('Clarification auto-resolved (non-interactive)', { \n type: request.type, \n term: request.term,\n response: response.response,\n });\n \n return response;\n }\n \n // Interactive mode - actually prompt the user\n // Play notification sound to get user's attention (like Cursor does)\n await sound.playNotification();\n \n // Special handling for new_project - use wizard\n if (request.type === 'new_project') {\n const wizardResult = await runNewProjectWizard(\n rl,\n request.term,\n request.context,\n request.options\n );\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: wizardResult.action,\n shouldRemember: wizardResult.action !== 'skip',\n additionalInfo: wizardResult as unknown as Record<string, unknown>,\n };\n \n if (session) {\n session.responses.push(response);\n \n // Increment prompt counter for current file\n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n session.filesProcessed[fileIndex].promptsAnswered++;\n }\n }\n \n logger.debug('New project wizard completed', {\n term: request.term,\n action: wizardResult.action,\n additionalInfo: wizardResult,\n });\n \n return response;\n }\n \n // Special handling for new_person - use wizard\n if (request.type === 'new_person') {\n const wizardResult = await runNewPersonWizard(\n rl,\n request.term,\n request.context,\n request.options\n );\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: wizardResult.action,\n shouldRemember: wizardResult.action !== 'skip',\n additionalInfo: wizardResult as unknown as Record<string, unknown>,\n };\n \n if (session) {\n session.responses.push(response);\n \n // Increment prompt counter for current file\n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n session.filesProcessed[fileIndex].promptsAnswered++;\n }\n }\n \n logger.debug('New person wizard completed', {\n term: request.term,\n action: wizardResult.action,\n additionalInfo: wizardResult,\n });\n \n return response;\n }\n \n // Standard single-prompt flow for other types\n // Show file context if available\n let promptWithContext = formatClarificationPrompt(request);\n if (session && session.currentFile) {\n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n const fileProc = session.filesProcessed[fileIndex];\n promptWithContext = `[File: ${fileProc.inputPath}] [Prompts: ${fileProc.promptsAnswered}]\\n` +\n `(Type 'S' to skip remaining prompts for this file)\\n\\n` +\n promptWithContext;\n }\n }\n \n const userInput = await askQuestion(rl, promptWithContext);\n \n // Check for skip rest of file command\n if (userInput.toLowerCase() === 's' || userInput.toLowerCase() === 'skip') {\n write('\\n[Skipping remaining prompts for this file...]');\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: 'skip',\n shouldRemember: false,\n skipRestOfFile: true,\n };\n \n if (session) {\n session.responses.push(response);\n \n // Mark current file as skipped\n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n session.filesProcessed[fileIndex].skipped = true;\n }\n }\n \n logger.info('User requested to skip rest of file');\n return response;\n }\n \n // Process the user's response\n let finalResponse: string;\n let shouldRemember = false;\n \n if (userInput === '' || userInput.toLowerCase() === 'y') {\n // User pressed Enter or typed Y - use suggestion or original\n finalResponse = request.suggestion || request.term;\n } else if (request.options && /^\\d+$/.test(userInput)) {\n // User entered a number - select from options\n const index = parseInt(userInput, 10) - 1;\n if (index >= 0 && index < request.options.length) {\n finalResponse = request.options[index];\n } else {\n finalResponse = userInput;\n }\n } else {\n finalResponse = userInput;\n // If user provided a custom answer, they might want to remember it\n shouldRemember = true;\n }\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: finalResponse,\n shouldRemember,\n };\n \n if (session) {\n session.responses.push(response);\n \n // Increment prompt counter for current file\n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n session.filesProcessed[fileIndex].promptsAnswered++;\n }\n }\n \n logger.debug('Clarification resolved via user input', { \n type: request.type, \n term: request.term,\n response: response.response,\n shouldRemember,\n });\n \n return response;\n };\n \n const isEnabled = () => config.enabled;\n \n const getSession = () => session;\n \n // File tracking methods\n const startFile = (filePath: string) => {\n if (!session) return;\n \n session.currentFile = filePath;\n session.filesProcessed.push({\n inputPath: filePath,\n promptsAnswered: 0,\n skipped: false,\n startedAt: new Date(),\n });\n \n logger.debug('Started processing file: %s', filePath);\n };\n \n const endFile = (outputPath?: string, movedTo?: string) => {\n if (!session || !session.currentFile) return;\n \n const fileIndex = session.filesProcessed.length - 1;\n if (fileIndex >= 0) {\n const fileProc = session.filesProcessed[fileIndex];\n fileProc.completedAt = new Date();\n fileProc.outputPath = outputPath;\n fileProc.movedTo = movedTo;\n \n logger.debug('Completed file: %s (%d prompts)', fileProc.inputPath, fileProc.promptsAnswered);\n }\n \n session.currentFile = undefined;\n };\n \n // Entity tracking methods\n const trackTermAdded = (termName: string) => {\n if (!session) return;\n if (!session.changes.termsAdded.includes(termName)) {\n session.changes.termsAdded.push(termName);\n logger.debug('Tracked term added: %s', termName);\n }\n };\n \n const trackTermUpdated = (termName: string) => {\n if (!session) return;\n if (!session.changes.termsUpdated.includes(termName)) {\n session.changes.termsUpdated.push(termName);\n logger.debug('Tracked term updated: %s', termName);\n }\n };\n \n const trackProjectAdded = (projectName: string) => {\n if (!session) return;\n if (!session.changes.projectsAdded.includes(projectName)) {\n session.changes.projectsAdded.push(projectName);\n logger.debug('Tracked project added: %s', projectName);\n }\n };\n \n const trackProjectUpdated = (projectName: string) => {\n if (!session) return;\n if (!session.changes.projectsUpdated.includes(projectName)) {\n session.changes.projectsUpdated.push(projectName);\n logger.debug('Tracked project updated: %s', projectName);\n }\n };\n \n const trackPersonAdded = (personName: string) => {\n if (!session) return;\n if (!session.changes.peopleAdded.includes(personName)) {\n session.changes.peopleAdded.push(personName);\n logger.debug('Tracked person added: %s', personName);\n }\n };\n \n const trackAlias = (alias: string, linkedTo: string) => {\n if (!session) return;\n session.changes.aliasesAdded.push({ alias, linkedTo });\n logger.debug('Tracked alias: %s -> %s', alias, linkedTo);\n };\n \n // Session control methods\n const requestStop = () => {\n if (!session) return;\n session.shouldStop = true;\n logger.info('Session stop requested by user');\n };\n \n const shouldStopSession = (): boolean => {\n return session?.shouldStop ?? false;\n };\n \n // Summary generation\n const printSummary = () => {\n if (!session) {\n write('\\nNo active session to summarize.');\n return;\n }\n \n const duration = session.completedAt \n ? (session.completedAt.getTime() - session.startedAt.getTime()) / 1000\n : (new Date().getTime() - session.startedAt.getTime()) / 1000;\n \n write('\\n');\n write('═'.repeat(60));\n write(' INTERACTIVE SESSION SUMMARY');\n write('═'.repeat(60));\n write('');\n \n // Session duration\n const minutes = Math.floor(duration / 60);\n const seconds = Math.floor(duration % 60);\n write(`Duration: ${minutes}m ${seconds}s`);\n write(`Total prompts answered: ${session.responses.length}`);\n write('');\n \n // Files processed\n if (session.filesProcessed.length > 0) {\n write('─'.repeat(60));\n write(' FILES PROCESSED');\n write('─'.repeat(60));\n \n session.filesProcessed.forEach((file, idx) => {\n write(`\\n${idx + 1}. ${file.inputPath}`);\n write(` Prompts answered: ${file.promptsAnswered}`);\n if (file.skipped) {\n write(` Status: SKIPPED (user requested)`);\n } else {\n write(` Status: Completed`);\n }\n if (file.outputPath) {\n write(` Transcript: ${file.outputPath}`);\n }\n if (file.movedTo) {\n write(` Audio moved to: ${file.movedTo}`);\n }\n });\n write('');\n }\n \n // Changes made\n const hasChanges = \n session.changes.termsAdded.length > 0 ||\n session.changes.termsUpdated.length > 0 ||\n session.changes.projectsAdded.length > 0 ||\n session.changes.projectsUpdated.length > 0 ||\n session.changes.peopleAdded.length > 0 ||\n session.changes.aliasesAdded.length > 0;\n \n if (hasChanges) {\n write('─'.repeat(60));\n write(' CHANGES MADE');\n write('─'.repeat(60));\n \n if (session.changes.termsAdded.length > 0) {\n write(`\\n✓ Terms added (${session.changes.termsAdded.length}):`);\n session.changes.termsAdded.forEach(term => write(` - ${term}`));\n }\n \n if (session.changes.termsUpdated.length > 0) {\n write(`\\n✓ Terms updated (${session.changes.termsUpdated.length}):`);\n session.changes.termsUpdated.forEach(term => write(` - ${term}`));\n }\n \n if (session.changes.projectsAdded.length > 0) {\n write(`\\n✓ Projects added (${session.changes.projectsAdded.length}):`);\n session.changes.projectsAdded.forEach(proj => write(` - ${proj}`));\n }\n \n if (session.changes.projectsUpdated.length > 0) {\n write(`\\n✓ Projects updated (${session.changes.projectsUpdated.length}):`);\n session.changes.projectsUpdated.forEach(proj => write(` - ${proj}`));\n }\n \n if (session.changes.peopleAdded.length > 0) {\n write(`\\n✓ People added (${session.changes.peopleAdded.length}):`);\n session.changes.peopleAdded.forEach(person => write(` - ${person}`));\n }\n \n if (session.changes.aliasesAdded.length > 0) {\n write(`\\n✓ Aliases created (${session.changes.aliasesAdded.length}):`);\n session.changes.aliasesAdded.forEach(({ alias, linkedTo }) => {\n write(` - \"${alias}\" → \"${linkedTo}\"`);\n });\n }\n \n write('');\n } else {\n write('No changes made during this session.');\n write('');\n }\n \n write('═'.repeat(60));\n write('');\n };\n \n return {\n startSession,\n endSession,\n handleClarification,\n isEnabled,\n getSession,\n startFile,\n endFile,\n trackTermAdded,\n trackTermUpdated,\n trackProjectAdded,\n trackProjectUpdated,\n trackPersonAdded,\n trackAlias,\n requestStop,\n shouldStopSession,\n printSummary,\n };\n};\n","/**\n * Onboarding\n * \n * Handles first-run detection and bootstrap onboarding flow.\n */\n\nimport { OnboardingState, OnboardingResult } from './types';\nimport * as Context from '../context';\nimport * as Logging from '../logging';\n\nexport interface OnboardingInstance {\n checkNeedsOnboarding(): OnboardingState;\n // Note: Full interactive onboarding requires inquirer\n // This provides the state detection and result structure\n}\n\nexport const create = (context: Context.ContextInstance): OnboardingInstance => {\n const logger = Logging.getLogger();\n \n const checkNeedsOnboarding = (): OnboardingState => {\n const projects = context.getAllProjects();\n const config = context.getConfig();\n \n const hasProjects = projects.length > 0;\n const configWithRouting = config as { routing?: { default?: { path?: string } } };\n const hasDefaultDestination = !!configWithRouting?.routing?.default?.path;\n const hasAnyContext = context.hasContext();\n \n const state: OnboardingState = {\n hasProjects,\n hasDefaultDestination,\n hasAnyContext,\n needsOnboarding: !hasAnyContext,\n };\n \n logger.debug('Onboarding state checked', state);\n \n return state;\n };\n \n return { checkNeedsOnboarding };\n};\n\n/**\n * Create a default onboarding result for non-interactive mode\n */\nexport const createDefaultOnboardingResult = (): OnboardingResult => ({\n defaultDestination: '~/notes',\n defaultStructure: 'month',\n projects: [],\n completed: false,\n});\n\n","/**\n * Interactive Mode System\n * \n * Main entry point for the interactive mode system. Provides session management,\n * clarification handling, and onboarding detection.\n */\n\nimport { \n InteractiveConfig, \n InteractiveSession, \n ClarificationRequest, \n ClarificationResponse,\n OnboardingState \n} from './types';\nimport * as Handler from './handler';\nimport * as Onboarding from './onboarding';\nimport * as Context from '../context';\n\nexport interface InteractiveInstance {\n // Session management\n startSession(): void;\n endSession(): InteractiveSession;\n getSession(): InteractiveSession | null;\n \n // Clarification handling\n handleClarification(request: ClarificationRequest): Promise<ClarificationResponse>;\n \n // State\n isEnabled(): boolean;\n \n // Onboarding\n checkNeedsOnboarding(): OnboardingState;\n}\n\nexport const create = (\n config: InteractiveConfig,\n context: Context.ContextInstance\n): InteractiveInstance => {\n const handler = Handler.create(config);\n const onboarding = Onboarding.create(context);\n \n return {\n startSession: handler.startSession,\n endSession: handler.endSession,\n getSession: handler.getSession,\n handleClarification: handler.handleClarification,\n isEnabled: handler.isEnabled,\n checkNeedsOnboarding: onboarding.checkNeedsOnboarding,\n };\n};\n\n// Re-export types\nexport * from './types';\n\n// Re-export utilities\nexport { createDefaultOnboardingResult } from './onboarding';\n\n","import * as Routing from '@/routing';\n\nexport interface EntityReference {\n id: string;\n name: string;\n type: 'person' | 'project' | 'term' | 'company';\n}\n\nexport interface TranscriptMetadata {\n title?: string;\n project?: string;\n projectId?: string;\n routing?: RoutingMetadata;\n tags?: string[];\n date?: Date;\n recordingTime?: string;\n confidence?: number;\n duration?: string;\n \n // Entity references - entities mentioned/used in this transcript\n entities?: {\n people?: EntityReference[];\n projects?: EntityReference[];\n terms?: EntityReference[];\n companies?: EntityReference[];\n };\n}\n\nexport interface RoutingMetadata {\n destination: string;\n confidence: number;\n signals: Routing.ClassificationSignal[];\n reasoning: string;\n}\n\n/**\n * Format metadata as Markdown heading section\n */\nexport const formatMetadataMarkdown = (metadata: TranscriptMetadata): string => {\n const lines: string[] = [];\n \n // Title section\n if (metadata.title) {\n lines.push(`# ${metadata.title}`);\n lines.push('');\n }\n \n // Metadata frontmatter as readable markdown\n lines.push('## Metadata');\n lines.push('');\n \n // Date and Time\n if (metadata.date) {\n const dateStr = metadata.date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n });\n lines.push(`**Date**: ${dateStr}`);\n \n if (metadata.recordingTime) {\n lines.push(`**Time**: ${metadata.recordingTime}`);\n } else {\n const timeStr = metadata.date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n });\n lines.push(`**Time**: ${timeStr}`);\n }\n }\n \n lines.push('');\n \n // Project\n if (metadata.project) {\n lines.push(`**Project**: ${metadata.project}`);\n if (metadata.projectId) {\n lines.push(`**Project ID**: \\`${metadata.projectId}\\``);\n }\n lines.push('');\n }\n \n // Routing Information\n if (metadata.routing) {\n lines.push('### Routing');\n lines.push('');\n lines.push(`**Destination**: ${metadata.routing.destination}`);\n lines.push(`**Confidence**: ${(metadata.routing.confidence * 100).toFixed(1)}%`);\n lines.push('');\n \n if (metadata.routing.signals.length > 0) {\n lines.push('**Classification Signals**:');\n for (const signal of metadata.routing.signals) {\n const signalType = signal.type.replace(/_/g, ' ');\n const weight = (signal.weight * 100).toFixed(0);\n lines.push(`- ${signalType}: \"${signal.value}\" (${weight}% weight)`);\n }\n lines.push('');\n }\n \n if (metadata.routing.reasoning) {\n lines.push(`**Reasoning**: ${metadata.routing.reasoning}`);\n lines.push('');\n }\n }\n \n // Tags\n if (metadata.tags && metadata.tags.length > 0) {\n lines.push('**Tags**: ' + metadata.tags.map(tag => `\\`${tag}\\``).join(', '));\n lines.push('');\n }\n \n // Duration\n if (metadata.duration) {\n lines.push(`**Duration**: ${metadata.duration}`);\n lines.push('');\n }\n \n // Separator\n lines.push('---');\n lines.push('');\n \n return lines.join('\\n');\n};\n\n/**\n * Format entity metadata as Markdown footer section\n * This goes at the END of the transcript for machine readability\n */\nexport const formatEntityMetadataMarkdown = (metadata: TranscriptMetadata): string => {\n if (!metadata.entities) {\n return '';\n }\n \n const lines: string[] = [];\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## Entity References');\n lines.push('');\n lines.push('<!-- Machine-readable entity metadata for indexing and querying -->');\n lines.push('');\n \n // People\n if (metadata.entities.people && metadata.entities.people.length > 0) {\n lines.push('### People');\n lines.push('');\n for (const person of metadata.entities.people) {\n lines.push(`- \\`${person.id}\\`: ${person.name}`);\n }\n lines.push('');\n }\n \n // Projects\n if (metadata.entities.projects && metadata.entities.projects.length > 0) {\n lines.push('### Projects');\n lines.push('');\n for (const project of metadata.entities.projects) {\n lines.push(`- \\`${project.id}\\`: ${project.name}`);\n }\n lines.push('');\n }\n \n // Terms\n if (metadata.entities.terms && metadata.entities.terms.length > 0) {\n lines.push('### Terms');\n lines.push('');\n for (const term of metadata.entities.terms) {\n lines.push(`- \\`${term.id}\\`: ${term.name}`);\n }\n lines.push('');\n }\n \n // Companies\n if (metadata.entities.companies && metadata.entities.companies.length > 0) {\n lines.push('### Companies');\n lines.push('');\n for (const company of metadata.entities.companies) {\n lines.push(`- \\`${company.id}\\`: ${company.name}`);\n }\n lines.push('');\n }\n \n return lines.join('\\n');\n};\n\n/**\n * Parse entity metadata from a transcript\n * Reads the Entity References section if present\n */\nexport const parseEntityMetadata = (content: string): TranscriptMetadata['entities'] | undefined => {\n const entitySection = content.match(/## Entity References\\s*\\n([\\s\\S]*?)(?:\\n##|$)/);\n if (!entitySection) {\n return undefined;\n }\n \n const sectionContent = entitySection[1];\n const entities: NonNullable<TranscriptMetadata['entities']> = {\n people: [],\n projects: [],\n terms: [],\n companies: [],\n };\n \n // Parse each entity type\n const parseEntities = (type: 'People' | 'Projects' | 'Terms' | 'Companies'): EntityReference[] => {\n // Map plural type names to singular entity types\n const typeMap: Record<string, 'person' | 'project' | 'term' | 'company'> = {\n 'People': 'person',\n 'Projects': 'project',\n 'Terms': 'term',\n 'Companies': 'company',\n };\n \n const entityType = typeMap[type];\n \n // Find the section for this type\n const sectionStart = sectionContent.indexOf(`### ${type}`);\n if (sectionStart === -1) return [];\n \n // Find the end (next ### or end of content)\n const afterSection = sectionContent.substring(sectionStart + type.length + 4); // +4 for \"### \"\n const nextSection = afterSection.search(/\\n###/);\n const sectionText = nextSection === -1 ? afterSection : afterSection.substring(0, nextSection);\n \n // Extract items\n const items: EntityReference[] = [];\n const itemRegex = /- `([^`]+)`: (.+?)$/gm;\n let itemMatch;\n \n while ((itemMatch = itemRegex.exec(sectionText)) !== null) {\n items.push({\n id: itemMatch[1],\n name: itemMatch[2].trim(),\n type: entityType,\n });\n }\n \n return items;\n };\n \n entities.people = parseEntities('People');\n entities.projects = parseEntities('Projects');\n entities.terms = parseEntities('Terms');\n entities.companies = parseEntities('Companies');\n \n // Only return if we found any entities\n const hasEntities = \n entities.people.length > 0 ||\n entities.projects.length > 0 ||\n entities.terms.length > 0 ||\n entities.companies.length > 0;\n \n return hasEntities ? entities : undefined;\n};\n\n/**\n * Extract routing metadata from a RouteDecision\n */\nexport const createRoutingMetadata = (decision: Routing.RouteDecision): RoutingMetadata => {\n return {\n destination: decision.destination.path,\n confidence: decision.confidence,\n signals: decision.signals,\n reasoning: decision.reasoning,\n };\n};\n\n/**\n * Format duration in seconds to readable format (e.g., \"2m 30s\")\n */\nexport const formatDuration = (seconds: number): string => {\n const minutes = Math.floor(seconds / 60);\n const secs = Math.round(seconds % 60);\n \n if (minutes === 0) {\n return `${secs}s`;\n }\n \n if (secs === 0) {\n return `${minutes}m`;\n }\n \n return `${minutes}m ${secs}s`;\n};\n\n/**\n * Format time as HH:MM AM/PM\n */\nexport const formatTime = (date: Date): string => {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n });\n};\n\n/**\n * Extract topic from routing signals\n */\nexport const extractTopicFromSignals = (signals: Routing.ClassificationSignal[]): string | undefined => {\n const topicSignal = signals.find(s => s.type === 'topic' || s.type === 'context_type');\n return topicSignal?.value;\n};\n\n/**\n * Extract all tags from routing signals\n * Tags are deduplicated to avoid duplicates from multiple signal sources\n */\nexport const extractTagsFromSignals = (signals: Routing.ClassificationSignal[]): string[] => {\n const tags = signals\n .filter(s => s.type !== 'context_type') // Skip generic context type\n .map(s => s.value)\n .filter((v): v is string => typeof v === 'string');\n \n // Deduplicate tags using Set\n return Array.from(new Set(tags));\n};\n\n\n","/**\n * Output Manager\n *\n * Manages intermediate files and final output destinations.\n * Follows the kodrdriv pattern for debugging and intermediate file management.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'fs/promises';\nimport { OutputConfig, IntermediateFiles, OutputPaths, RawTranscriptData } from './types';\nimport * as Logging from '../logging';\nimport * as Metadata from '../util/metadata';\n\nexport interface ManagerInstance {\n createOutputPaths(\n audioFile: string,\n routedDestination: string,\n hash: string,\n date: Date\n ): OutputPaths;\n \n ensureDirectories(paths: OutputPaths): Promise<void>;\n \n writeIntermediate(\n paths: OutputPaths,\n type: keyof IntermediateFiles,\n content: unknown\n ): Promise<string>;\n \n /**\n * Write the raw Whisper transcript to the .transcript/ directory alongside final output.\n * This enables compare and reanalyze workflows.\n */\n writeRawTranscript(paths: OutputPaths, data: RawTranscriptData): Promise<string>;\n \n writeTranscript(paths: OutputPaths, content: string, metadata?: Metadata.TranscriptMetadata): Promise<string>;\n \n cleanIntermediates(paths: OutputPaths): Promise<void>;\n \n /**\n * Read a previously stored raw transcript from the .transcript/ directory.\n * Returns null if no raw transcript exists.\n */\n readRawTranscript(finalOutputPath: string): Promise<RawTranscriptData | null>;\n}\n\nexport const create = (config: OutputConfig): ManagerInstance => {\n const logger = Logging.getLogger();\n \n const formatTimestamp = (date: Date): string => {\n // Format: YYYY-MM-DD-HHmm (full year, dashes for separation)\n const pad = (n: number) => n.toString().padStart(2, '0');\n const year = date.getFullYear().toString();\n const month = pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n return `${year}-${month}-${day}-${hours}${minutes}`;\n };\n \n const createOutputPaths = (\n _audioFile: string,\n routedDestination: string,\n hash: string,\n date: Date\n ): OutputPaths => {\n const timestamp = formatTimestamp(date);\n const shortHash = hash.slice(0, 6);\n // Hash at the end for easier filename correlation\n const buildFilename = (type: string, ext: string) => `${timestamp}-${type}-${shortHash}${ext}`;\n \n const intermediateDir = config.intermediateDir;\n \n // Generate raw transcript path in .transcript/ directory alongside final output\n // e.g., /notes/2026/1/14-meeting.md -> /notes/2026/1/.transcript/14-meeting.json\n const finalDir = path.dirname(routedDestination);\n const finalBasename = path.basename(routedDestination, path.extname(routedDestination));\n const rawTranscriptPath = path.join(finalDir, '.transcript', `${finalBasename}.json`);\n\n return {\n final: routedDestination,\n rawTranscript: rawTranscriptPath,\n intermediate: {\n transcript: path.join(intermediateDir, buildFilename('transcript', '.json')),\n context: path.join(intermediateDir, buildFilename('context', '.json')),\n request: path.join(intermediateDir, buildFilename('request', '.json')),\n response: path.join(intermediateDir, buildFilename('response', '.json')),\n reflection: path.join(intermediateDir, buildFilename('reflection', '.md')),\n session: path.join(intermediateDir, buildFilename('session', '.json')),\n },\n };\n };\n \n const ensureDirectories = async (paths: OutputPaths): Promise<void> => {\n // Ensure intermediate directory\n await fs.mkdir(path.dirname(paths.intermediate.transcript), { recursive: true });\n \n // Ensure final directory\n await fs.mkdir(path.dirname(paths.final), { recursive: true });\n \n // Ensure .transcript directory alongside final output\n await fs.mkdir(path.dirname(paths.rawTranscript), { recursive: true });\n \n logger.debug('Ensured output directories', {\n intermediate: path.dirname(paths.intermediate.transcript),\n final: path.dirname(paths.final),\n rawTranscript: path.dirname(paths.rawTranscript),\n });\n };\n \n const writeIntermediate = async (\n paths: OutputPaths,\n type: keyof IntermediateFiles,\n content: unknown\n ): Promise<string> => {\n const filePath = paths.intermediate[type];\n if (!filePath) {\n throw new Error(`Invalid intermediate type: ${type}`);\n }\n \n const contentStr = typeof content === 'string' \n ? content \n : JSON.stringify(content, null, 2);\n \n await fs.writeFile(filePath, contentStr, 'utf-8');\n logger.debug('Wrote intermediate file', { type, path: filePath });\n \n return filePath;\n };\n \n const writeTranscript = async (\n paths: OutputPaths,\n content: string,\n metadata?: Metadata.TranscriptMetadata\n ): Promise<string> => {\n let finalContent = content;\n \n if (metadata) {\n // Prepend header metadata\n const metadataSection = Metadata.formatMetadataMarkdown(metadata);\n finalContent = metadataSection + content;\n \n // Append entity metadata at the end\n const entitySection = Metadata.formatEntityMetadataMarkdown(metadata);\n if (entitySection) {\n finalContent = finalContent + entitySection;\n }\n }\n \n await fs.writeFile(paths.final, finalContent, 'utf-8');\n logger.info('Wrote final transcript', { path: paths.final });\n return paths.final;\n };\n \n const cleanIntermediates = async (paths: OutputPaths): Promise<void> => {\n if (config.keepIntermediates) {\n logger.debug('Keeping intermediate files');\n return;\n }\n \n for (const [type, filePath] of Object.entries(paths.intermediate)) {\n if (filePath) {\n try {\n await fs.unlink(filePath);\n logger.debug('Removed intermediate file', { type, path: filePath });\n } catch {\n // File might not exist, that's OK\n }\n }\n }\n };\n \n /**\n * Write the raw Whisper transcript to the .transcript/ directory.\n * This preserves the original transcription for compare/reanalyze workflows.\n */\n const writeRawTranscript = async (\n paths: OutputPaths,\n data: RawTranscriptData\n ): Promise<string> => {\n const filePath = paths.rawTranscript;\n \n await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');\n logger.debug('Wrote raw transcript to .transcript/', { path: filePath });\n \n return filePath;\n };\n \n /**\n * Read a previously stored raw transcript from the .transcript/ directory.\n * Calculates the path based on the final output path.\n * Returns null if no raw transcript exists.\n */\n const readRawTranscript = async (finalOutputPath: string): Promise<RawTranscriptData | null> => {\n const finalDir = path.dirname(finalOutputPath);\n const finalBasename = path.basename(finalOutputPath, path.extname(finalOutputPath));\n const rawTranscriptPath = path.join(finalDir, '.transcript', `${finalBasename}.json`);\n \n try {\n const content = await fs.readFile(rawTranscriptPath, 'utf-8');\n return JSON.parse(content) as RawTranscriptData;\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n logger.debug('No raw transcript found', { path: rawTranscriptPath });\n return null;\n }\n throw error;\n }\n };\n \n return {\n createOutputPaths,\n ensureDirectories,\n writeIntermediate,\n writeRawTranscript,\n writeTranscript,\n readRawTranscript,\n cleanIntermediates,\n };\n};\n\n","/**\n * Output Management System\n *\n * Main entry point for the output management system. Handles intermediate\n * files and final output destinations.\n */\n\nimport { OutputConfig, OutputPaths, IntermediateFiles, RawTranscriptData } from './types';\nimport * as Manager from './manager';\nimport * as Metadata from '../util/metadata';\n\nexport interface OutputInstance {\n createOutputPaths(\n audioFile: string,\n routedDestination: string,\n hash: string,\n date: Date\n ): OutputPaths;\n ensureDirectories(paths: OutputPaths): Promise<void>;\n writeIntermediate(\n paths: OutputPaths,\n type: keyof IntermediateFiles,\n content: unknown\n ): Promise<string>;\n /**\n * Write the raw Whisper transcript to the .transcript/ directory alongside final output.\n * This enables compare and reanalyze workflows.\n */\n writeRawTranscript(paths: OutputPaths, data: RawTranscriptData): Promise<string>;\n writeTranscript(paths: OutputPaths, content: string, metadata?: Metadata.TranscriptMetadata): Promise<string>;\n /**\n * Read a previously stored raw transcript from the .transcript/ directory.\n * Returns null if no raw transcript exists.\n */\n readRawTranscript(finalOutputPath: string): Promise<RawTranscriptData | null>;\n cleanIntermediates(paths: OutputPaths): Promise<void>;\n}\n\nexport const create = (config: OutputConfig): OutputInstance => {\n return Manager.create(config);\n};\n\nexport const DEFAULT_OUTPUT_CONFIG: OutputConfig = {\n intermediateDir: './output/protokoll',\n keepIntermediates: true,\n timestampFormat: 'YYMMDD-HHmm',\n};\n\n// Re-export types\nexport * from './types';\n\n","/**\n * Metrics Collector\n *\n * Collects metrics during transcription for self-reflection reporting.\n */\n\nimport { TranscriptionMetrics, ToolEffectiveness, ContextChange, RoutingDecisionRecord } from './types';\nimport * as Logging from '../logging';\n\nexport interface CollectorInstance {\n start(): void;\n recordWhisper(duration: number): void;\n recordToolCall(name: string, duration: number, success: boolean): void;\n recordCorrection(original: string, corrected: string): void;\n recordUnknownEntity(entity: string): void;\n recordResolvedEntity(entity: string, resolved: string): void;\n recordModelResponse(model: string, tokens: number): void;\n recordContextChange(change: ContextChange): void;\n recordRoutingDecision(decision: RoutingDecisionRecord): void;\n getMetrics(): TranscriptionMetrics;\n getToolEffectiveness(): ToolEffectiveness[];\n getContextChanges(): ContextChange[];\n getRoutingDecision(): RoutingDecisionRecord | undefined;\n}\n\ninterface ToolStats {\n count: number;\n successCount: number;\n totalDuration: number;\n}\n\nexport const create = (): CollectorInstance => {\n const logger = Logging.getLogger();\n \n let startTime: Date = new Date();\n let whisperDuration = 0;\n let iterations = 0;\n let originalLength = 0;\n let correctedLength = 0;\n let correctionsApplied = 0;\n let model = '';\n let tokensUsed = 0;\n \n const unknownEntities: string[] = [];\n const resolvedEntities: Map<string, string> = new Map();\n const toolCalls: Map<string, ToolStats> = new Map();\n const contextChanges: ContextChange[] = [];\n let routingDecision: RoutingDecisionRecord | undefined;\n \n const start = () => {\n startTime = new Date();\n logger.debug('Reflection collector started');\n };\n \n const recordWhisper = (duration: number) => {\n whisperDuration = duration;\n };\n \n const recordToolCall = (name: string, duration: number, success: boolean) => {\n iterations++;\n \n if (!toolCalls.has(name)) {\n toolCalls.set(name, { count: 0, successCount: 0, totalDuration: 0 });\n }\n \n const stats = toolCalls.get(name)!;\n stats.count++;\n stats.totalDuration += duration;\n if (success) {\n stats.successCount++;\n }\n };\n \n const recordCorrection = (original: string, corrected: string) => {\n if (originalLength === 0) {\n originalLength = original.length;\n }\n correctedLength = corrected.length;\n correctionsApplied++;\n };\n \n const recordUnknownEntity = (entity: string) => {\n unknownEntities.push(entity);\n };\n \n const recordResolvedEntity = (entity: string, resolved: string) => {\n resolvedEntities.set(entity, resolved);\n };\n \n const recordModelResponse = (m: string, tokens: number) => {\n model = m;\n tokensUsed += tokens;\n };\n \n const recordContextChange = (change: ContextChange) => {\n contextChanges.push(change);\n logger.info('Context change recorded: %s %s \"%s\"', change.action, change.entityType, change.entityName);\n };\n\n const getContextChanges = (): ContextChange[] => {\n return [...contextChanges];\n };\n\n const recordRoutingDecision = (decision: RoutingDecisionRecord) => {\n routingDecision = decision;\n logger.debug('Routing decision recorded: project=%s, confidence=%.1f%%', \n decision.projectId || 'default', decision.confidence * 100);\n };\n\n const getRoutingDecision = (): RoutingDecisionRecord | undefined => {\n return routingDecision;\n };\n \n const getMetrics = (): TranscriptionMetrics => {\n const endTime = new Date();\n const totalDuration = endTime.getTime() - startTime.getTime();\n const reasoningDuration = totalDuration - whisperDuration;\n \n return {\n startTime,\n endTime,\n totalDuration,\n whisperDuration,\n reasoningDuration,\n iterations,\n toolCallsExecuted: Array.from(toolCalls.values()).reduce((sum, t) => sum + t.count, 0),\n toolsUsed: Array.from(toolCalls.keys()),\n originalLength,\n correctedLength,\n correctionsApplied,\n unknownEntitiesFound: unknownEntities.length,\n entitiesResolved: resolvedEntities.size,\n model,\n tokensUsed,\n };\n };\n \n const getToolEffectiveness = (): ToolEffectiveness[] => {\n return Array.from(toolCalls.entries()).map(([name, stats]) => ({\n name,\n callCount: stats.count,\n successCount: stats.successCount,\n failureCount: stats.count - stats.successCount,\n avgDuration: stats.count > 0 ? stats.totalDuration / stats.count : 0,\n successRate: stats.count > 0 ? stats.successCount / stats.count : 0,\n }));\n };\n \n return {\n start,\n recordWhisper,\n recordToolCall,\n recordCorrection,\n recordUnknownEntity,\n recordResolvedEntity,\n recordModelResponse,\n recordContextChange,\n recordRoutingDecision,\n getMetrics,\n getToolEffectiveness,\n getContextChanges,\n getRoutingDecision,\n };\n};\n\n","/**\n * Report Generator\n *\n * Generates self-reflection reports in markdown or JSON format.\n */\n\nimport { \n ReflectionReport, \n ReflectionConfig, \n TranscriptionMetrics, \n ToolEffectiveness,\n QualityAssessment,\n Recommendation \n} from './types';\nimport * as Collector from './collector';\nimport * as fs from 'fs/promises';\nimport * as Logging from '../logging';\n\nexport interface ReporterInstance {\n generate(\n collector: Collector.CollectorInstance,\n audioFile: string,\n outputFile: string,\n conversationHistory?: unknown[],\n output?: string\n ): ReflectionReport;\n \n formatMarkdown(report: ReflectionReport): string;\n formatJson(report: ReflectionReport): string;\n save(report: ReflectionReport, path: string): Promise<void>;\n}\n\nexport const create = (config: ReflectionConfig): ReporterInstance => {\n const logger = Logging.getLogger();\n \n const assessQuality = (\n metrics: TranscriptionMetrics,\n toolEffectiveness: ToolEffectiveness[]\n ): QualityAssessment => {\n // Calculate name accuracy based on resolution rate\n const nameAccuracy = metrics.unknownEntitiesFound > 0\n ? metrics.entitiesResolved / metrics.unknownEntitiesFound\n : 1.0;\n \n // Content preservation (should be close to 1.0)\n const contentPreservation = metrics.originalLength > 0\n ? Math.min(metrics.correctedLength / metrics.originalLength, 1.0)\n : 1.0;\n \n // Tool success rate\n const avgToolSuccess = toolEffectiveness.length > 0\n ? toolEffectiveness.reduce((sum, t) => sum + t.successRate, 0) / toolEffectiveness.length\n : 1.0;\n \n // Overall confidence\n const confidence = (nameAccuracy * 0.4) + (contentPreservation * 0.3) + (avgToolSuccess * 0.3);\n \n return {\n confidence,\n nameAccuracy,\n routingConfidence: 0.9, // Would be calculated from routing decision\n contentPreservation,\n overallScore: confidence,\n };\n };\n \n const generateRecommendations = (\n metrics: TranscriptionMetrics,\n toolEffectiveness: ToolEffectiveness[],\n quality: QualityAssessment\n ): Recommendation[] => {\n const recommendations: Recommendation[] = [];\n \n // Check for tool failures\n const failedTools = toolEffectiveness.filter(t => t.successRate < 0.8);\n if (failedTools.length > 0) {\n recommendations.push({\n type: 'tool-issue',\n severity: 'high',\n message: `${failedTools.length} tool(s) had low success rates`,\n suggestion: `Review tool implementations: ${failedTools.map(t => t.name).join(', ')}`,\n });\n }\n \n // Check for unresolved entities\n if (metrics.unknownEntitiesFound > metrics.entitiesResolved) {\n const unresolved = metrics.unknownEntitiesFound - metrics.entitiesResolved;\n recommendations.push({\n type: 'context-gap',\n severity: 'medium',\n message: `${unresolved} entities could not be resolved`,\n suggestion: 'Run in interactive mode to add new context entries',\n });\n }\n \n // Check for high iteration count (real issue is usually unclear routing)\n if (metrics.iterations > 10) {\n recommendations.push({\n type: 'context-gap',\n severity: 'medium',\n message: `High iteration count (${metrics.iterations}) - model may be struggling to route this note`,\n suggestion: 'Add explicit trigger phrases to your project context files (e.g., \"update on [project]\")',\n });\n }\n \n // Only flag extremely long processing (> 5 minutes) as potential issue\n // Normal reasoning with gpt-5.2 can take 1-3 minutes and that's fine\n if (metrics.totalDuration > 300000) { // > 5 minutes\n recommendations.push({\n type: 'performance',\n severity: 'low',\n message: `Processing took ${(metrics.totalDuration / 1000).toFixed(1)}s`,\n suggestion: 'Consider reviewing context files - unclear routing can cause excessive iterations',\n });\n }\n \n // Check content preservation\n if (quality.contentPreservation < 0.9) {\n recommendations.push({\n type: 'quality',\n severity: 'high',\n message: 'Significant content may have been lost',\n suggestion: 'Review prompt to ensure full content preservation',\n });\n }\n \n return recommendations;\n };\n \n const generate = (\n collector: Collector.CollectorInstance,\n audioFile: string,\n outputFile: string,\n conversationHistory?: unknown[],\n output?: string\n ): ReflectionReport => {\n const metrics = collector.getMetrics();\n const toolEffectiveness = collector.getToolEffectiveness();\n const contextChanges = collector.getContextChanges();\n const routingDecision = collector.getRoutingDecision();\n const quality = assessQuality(metrics, toolEffectiveness);\n const recommendations = generateRecommendations(metrics, toolEffectiveness, quality);\n \n return {\n id: `reflection-${Date.now()}`,\n generated: new Date(),\n audioFile,\n outputFile,\n summary: {\n duration: metrics.totalDuration,\n iterations: metrics.iterations,\n toolCalls: metrics.toolCallsExecuted,\n corrections: metrics.correctionsApplied,\n confidence: quality.confidence,\n },\n metrics,\n toolEffectiveness,\n quality,\n recommendations,\n routingDecision,\n contextChanges: contextChanges.length > 0 ? contextChanges : undefined,\n conversationHistory: config.includeConversation ? conversationHistory : undefined,\n output: config.includeOutput ? output : undefined,\n };\n };\n \n const formatMarkdown = (report: ReflectionReport): string => {\n let md = `# Protokoll - Self-Reflection Report\\n\\n`;\n md += `**Generated:** ${report.generated.toISOString()}\\n`;\n md += `**Audio File:** ${report.audioFile}\\n`;\n md += `**Output:** ${report.outputFile}\\n\\n`;\n \n md += `## Summary\\n\\n`;\n md += `- **Duration**: ${(report.summary.duration / 1000).toFixed(1)}s\\n`;\n md += `- **Iterations**: ${report.summary.iterations}\\n`;\n md += `- **Tool Calls**: ${report.summary.toolCalls}\\n`;\n md += `- **Corrections**: ${report.summary.corrections}\\n`;\n md += `- **Confidence**: ${(report.summary.confidence * 100).toFixed(1)}%\\n\\n`;\n \n md += `## Quality Assessment\\n\\n`;\n md += `- **Overall Score**: ${(report.quality.overallScore * 100).toFixed(1)}%\\n`;\n md += `- **Name Accuracy**: ${(report.quality.nameAccuracy * 100).toFixed(1)}%\\n`;\n md += `- **Content Preservation**: ${(report.quality.contentPreservation * 100).toFixed(1)}%\\n`;\n md += `- **Routing Confidence**: ${(report.quality.routingConfidence * 100).toFixed(1)}%\\n\\n`;\n \n // Routing Decision with Reasoning\n if (report.routingDecision) {\n const rd = report.routingDecision;\n md += `## Routing Decision\\n\\n`;\n md += `**Project**: ${rd.projectId || '(default routing)'}\\n`;\n md += `**Destination**: \\`${rd.destination}\\`\\n`;\n md += `**Confidence**: ${(rd.confidence * 100).toFixed(1)}%\\n\\n`;\n \n md += `### Reasoning\\n\\n`;\n md += `${rd.reasoning}\\n\\n`;\n \n if (rd.signals && rd.signals.length > 0) {\n md += `### Classification Signals\\n\\n`;\n md += `| Signal Type | Value | Weight | Source |\\n`;\n md += `|-------------|-------|--------|--------|\\n`;\n for (const signal of rd.signals) {\n const source = signal.source || '-';\n md += `| ${signal.type} | \"${signal.value}\" | ${(signal.weight * 100).toFixed(0)}% | ${source} |\\n`;\n }\n md += '\\n';\n }\n \n if (rd.alternativesConsidered && rd.alternativesConsidered.length > 0) {\n md += `### Alternatives Considered\\n\\n`;\n for (const alt of rd.alternativesConsidered) {\n md += `- **${alt.projectId}** (${(alt.confidence * 100).toFixed(1)}% confidence)\\n`;\n md += ` - Not chosen because: ${alt.whyNotChosen}\\n`;\n }\n md += '\\n';\n }\n \n if (rd.userConfirmed) {\n md += `*User confirmed this routing decision in interactive mode.*\\n\\n`;\n }\n \n if (rd.feedbackProvided) {\n md += `### Feedback Received\\n\\n`;\n md += `This routing was later corrected: ${rd.feedbackCorrection}\\n\\n`;\n }\n }\n \n if (report.toolEffectiveness.length > 0) {\n md += `## Tool Effectiveness\\n\\n`;\n md += `| Tool | Calls | Success | Failure | Success Rate | Avg Duration |\\n`;\n md += `|------|-------|---------|---------|--------------|-------------|\\n`;\n \n for (const tool of report.toolEffectiveness) {\n md += `| ${tool.name} | ${tool.callCount} | ${tool.successCount} | ${tool.failureCount} | `;\n md += `${(tool.successRate * 100).toFixed(1)}% | ${tool.avgDuration.toFixed(0)}ms |\\n`;\n }\n md += '\\n';\n }\n \n if (report.recommendations.length > 0) {\n md += `## Recommendations\\n\\n`;\n \n const bySeverity = {\n high: report.recommendations.filter(r => r.severity === 'high'),\n medium: report.recommendations.filter(r => r.severity === 'medium'),\n low: report.recommendations.filter(r => r.severity === 'low'),\n };\n \n if (bySeverity.high.length > 0) {\n md += `### 🔴 High Priority\\n\\n`;\n bySeverity.high.forEach((rec, i) => {\n md += `${i + 1}. **${rec.message}**\\n`;\n if (rec.suggestion) md += ` - ${rec.suggestion}\\n`;\n });\n md += '\\n';\n }\n \n if (bySeverity.medium.length > 0) {\n md += `### 🟡 Medium Priority\\n\\n`;\n bySeverity.medium.forEach((rec, i) => {\n md += `${i + 1}. **${rec.message}**\\n`;\n if (rec.suggestion) md += ` - ${rec.suggestion}\\n`;\n });\n md += '\\n';\n }\n \n if (bySeverity.low.length > 0) {\n md += `### 🟢 Low Priority\\n\\n`;\n bySeverity.low.forEach((rec, i) => {\n md += `${i + 1}. **${rec.message}**\\n`;\n if (rec.suggestion) md += ` - ${rec.suggestion}\\n`;\n });\n md += '\\n';\n }\n }\n \n // Context changes section\n if (report.contextChanges && report.contextChanges.length > 0) {\n md += `## Context Changes\\n\\n`;\n md += `The following context entries were created or updated during this session:\\n\\n`;\n \n for (const change of report.contextChanges) {\n const emoji = change.action === 'created' ? '✨' : '📝';\n md += `${emoji} **${change.action.charAt(0).toUpperCase() + change.action.slice(1)} ${change.entityType}**: ${change.entityName}\\n`;\n if (change.details) {\n const details = change.details as Record<string, unknown>;\n const routing = details.routing as Record<string, unknown> | undefined;\n const destination = details.destination || routing?.destination;\n if (destination) {\n md += ` - Routing to: \\`${destination}\\`\\n`;\n }\n }\n }\n md += '\\n';\n }\n \n md += `---\\n\\n`;\n md += `*Report generated by Protokoll Self-Reflection System*\\n`;\n \n return md;\n };\n \n const formatJson = (report: ReflectionReport): string => {\n return JSON.stringify(report, null, 2);\n };\n \n const save = async (report: ReflectionReport, path: string): Promise<void> => {\n const content = config.format === 'markdown' \n ? formatMarkdown(report)\n : formatJson(report);\n \n await fs.writeFile(path, content, 'utf-8');\n logger.info('Saved reflection report', { path });\n };\n \n return {\n generate,\n formatMarkdown,\n formatJson,\n save,\n };\n};\n\n","/**\n * Self-Reflection System\n *\n * Main entry point for the self-reflection system. Provides metrics collection\n * and report generation for transcription quality analysis.\n */\n\nimport { ReflectionConfig, ReflectionReport } from './types';\nimport * as Collector from './collector';\nimport * as Reporter from './reporter';\n\nexport interface ReflectionInstance {\n collector: Collector.CollectorInstance;\n reporter: Reporter.ReporterInstance;\n generate(\n audioFile: string,\n outputFile: string,\n conversationHistory?: unknown[],\n output?: string\n ): ReflectionReport;\n save(report: ReflectionReport, path: string): Promise<void>;\n}\n\nexport const create = (config: ReflectionConfig): ReflectionInstance => {\n const collector = Collector.create();\n const reporter = Reporter.create(config);\n \n return {\n collector,\n reporter,\n generate: (audioFile, outputFile, conversationHistory, output) => \n reporter.generate(collector, audioFile, outputFile, conversationHistory, output),\n save: (report, path) => reporter.save(report, path),\n };\n};\n\nexport const DEFAULT_REFLECTION_CONFIG: ReflectionConfig = {\n enabled: false,\n format: 'markdown',\n includeConversation: false,\n includeOutput: true,\n};\n\n// Re-export types\nexport * from './types';\n\n","import ffmpeg from 'fluent-ffmpeg';\nimport { Logger } from 'winston';\nimport path from 'node:path';\nimport * as Storage from '@/util/storage';\n\nexport interface Media {\n getAudioCreationTime: (filePath: string) => Promise<Date | null>;\n getFileSize: (filePath: string) => Promise<number>;\n splitAudioFile: (filePath: string, outputDir: string, maxSizeBytes: number) => Promise<string[]>;\n convertToSupportedFormat: (filePath: string, outputDir: string) => Promise<string>;\n}\n\nconst ffprobeAsync = (filePath: string): Promise<any> => {\n return new Promise((resolve, reject) => {\n ffmpeg.ffprobe(filePath, (err, metadata) => {\n if (err) return reject(err);\n resolve(metadata);\n });\n });\n};\n\n\nexport const create = (logger: Logger): Media => {\n const storage = Storage.create({ log: logger.debug });\n\n // Extract creation time from audio file using ffmpeg\n const getAudioCreationTime = async (filePath: string): Promise<Date | null> => {\n try {\n const metadata = await ffprobeAsync(filePath);\n\n // Look for creation_time in format tags\n const formatTags = metadata?.format?.tags;\n if (formatTags?.creation_time) {\n logger.debug('Found creation_time in format tags: %s', formatTags.creation_time);\n return new Date(formatTags.creation_time);\n }\n\n // Check for creation_time in stream tags as fallback\n if (metadata?.streams?.length > 0) {\n for (const stream of metadata.streams) {\n if (stream.tags?.creation_time) {\n logger.debug('Found creation_time in stream tags: %s', stream.tags.creation_time);\n return new Date(stream.tags.creation_time);\n }\n }\n }\n\n logger.debug('No creation_time found in audio file metadata');\n return null;\n } catch (error) {\n logger.error('Error extracting creation time from audio file: %s', error);\n return null;\n }\n };\n\n // Get file size in bytes\n const getFileSize = async (filePath: string): Promise<number> => {\n try {\n return await storage.getFileSize(filePath);\n } catch (error) {\n logger.error('Error getting file size: %s', error);\n throw new Error(`Failed to get file size for ${filePath}: ${error}`);\n }\n };\n\n // Split large audio file into smaller chunks\n const splitAudioFile = async (filePath: string, outputDir: string, maxSizeBytes: number): Promise<string[]> => {\n try {\n const metadata = await ffprobeAsync(filePath);\n const duration = parseFloat(metadata.format.duration);\n\n // Calculate how many segments we need based on file size and max size\n const fileSize = await getFileSize(filePath);\n const segmentCount = Math.ceil(fileSize / maxSizeBytes);\n\n // Calculate segment duration\n const segmentDuration = duration / segmentCount;\n logger.debug(`Splitting ${filePath} (${fileSize} bytes) into ${segmentCount} segments of ~${segmentDuration} seconds each`);\n\n // Create output directory if it doesn't exist\n await storage.createDirectory(outputDir);\n\n const outputFiles: string[] = [];\n const fileExt = path.extname(filePath);\n const fileName = path.basename(filePath, fileExt);\n\n // Create a promise for each segment\n const promises = [];\n\n for (let i = 0; i < segmentCount; i++) {\n const startTime = i * segmentDuration;\n const outputPath = path.join(outputDir, `${fileName}_part${i + 1}${fileExt}`);\n outputFiles.push(outputPath);\n\n const promise = new Promise<void>((resolve, reject) => {\n ffmpeg(filePath)\n .setStartTime(startTime)\n .setDuration(segmentDuration)\n .output(outputPath)\n .on('end', () => {\n logger.debug(`Created segment ${i + 1}/${segmentCount}: ${outputPath}`);\n resolve();\n })\n .on('error', (err) => {\n logger.error(`Error creating segment ${i + 1}/${segmentCount}: ${err}`);\n reject(err);\n })\n .run();\n });\n\n promises.push(promise);\n }\n\n // Wait for all segments to be created\n await Promise.all(promises);\n return outputFiles;\n } catch (error) {\n logger.error('Error splitting audio file: %s', error);\n throw new Error(`Failed to split audio file ${filePath}: ${error}`);\n }\n };\n\n // Convert audio file to a format supported by OpenAI Whisper API\n // Supported formats: flac, m4a, mp3, mp4, mpeg, mpga, oga, ogg, wav, webm\n const convertToSupportedFormat = async (filePath: string, outputDir: string): Promise<string> => {\n try {\n const fileExt = path.extname(filePath).toLowerCase();\n\n // List of formats that OpenAI supports\n const supportedFormats = ['.flac', '.m4a', '.mp3', '.mp4', '.mpeg', '.mpga', '.oga', '.ogg', '.wav', '.webm'];\n\n // If already in a supported format, return as-is\n if (supportedFormats.includes(fileExt)) {\n logger.debug(`File ${filePath} is already in a supported format: ${fileExt}`);\n return filePath;\n }\n\n // Otherwise, convert to mp3 (widely supported and good compression)\n logger.info(`Converting ${fileExt} file to mp3 for transcription...`);\n const fileName = path.basename(filePath, fileExt);\n const outputPath = path.join(outputDir, `${fileName}.mp3`);\n\n // Check if converted file already exists\n if (await storage.exists(outputPath)) {\n logger.debug(`Converted file already exists: ${outputPath}`);\n return outputPath;\n }\n\n // Create output directory if it doesn't exist\n await storage.createDirectory(outputDir);\n\n return new Promise<string>((resolve, reject) => {\n ffmpeg(filePath)\n .toFormat('mp3')\n .audioBitrate('128k')\n .output(outputPath)\n .on('end', () => {\n logger.info(`Successfully converted to: ${outputPath}`);\n resolve(outputPath);\n })\n .on('error', (err) => {\n logger.error(`Error converting audio file: ${err}`);\n reject(new Error(`Failed to convert ${filePath} to mp3: ${err.message}`));\n })\n .run();\n });\n } catch (error) {\n logger.error('Error in convertToSupportedFormat: %s', error);\n throw new Error(`Failed to convert audio file ${filePath}: ${error}`);\n }\n };\n\n return {\n getAudioCreationTime,\n getFileSize,\n splitAudioFile,\n convertToSupportedFormat,\n }\n}\n","/**\n * Transcription System Types\n * \n * Supports multiple OpenAI transcription models with different capabilities.\n * The transcription service produces raw phonetic output that will be\n * corrected by the full reasoning pass.\n */\n\nexport type TranscriptionModel = \n | 'whisper-1'\n | 'gpt-4o-mini-transcribe'\n | 'gpt-4o-transcribe'\n | 'gpt-4o-transcribe-diarize';\n\nexport interface TranscriptionConfig {\n model: TranscriptionModel;\n language?: string;\n prompt?: string;\n response_format?: 'json' | 'text' | 'verbose_json' | 'srt' | 'vtt';\n temperature?: number;\n streaming?: boolean;\n}\n\nexport interface TranscriptionRequest {\n audioFile: string; // Path to audio file\n config: TranscriptionConfig;\n contextPrompt?: string; // Built from known entities (limited to 224 tokens)\n}\n\nexport interface TranscriptionSegment {\n start: number;\n end: number;\n text: string;\n speaker?: string; // For diarization\n}\n\nexport interface TranscriptionResult {\n text: string;\n model: string;\n segments?: TranscriptionSegment[];\n duration?: number;\n language?: string;\n}\n\nexport interface ModelCapabilities {\n supportsStreaming: boolean;\n supportsDiarization: boolean;\n maxFileSize: number;\n}\n\nexport const MODEL_CAPABILITIES: Record<TranscriptionModel, ModelCapabilities> = {\n 'whisper-1': {\n supportsStreaming: false,\n supportsDiarization: false,\n maxFileSize: 25 * 1024 * 1024, // 25 MB\n },\n 'gpt-4o-mini-transcribe': {\n supportsStreaming: true,\n supportsDiarization: false,\n maxFileSize: 25 * 1024 * 1024,\n },\n 'gpt-4o-transcribe': {\n supportsStreaming: true,\n supportsDiarization: false,\n maxFileSize: 25 * 1024 * 1024,\n },\n 'gpt-4o-transcribe-diarize': {\n supportsStreaming: true,\n supportsDiarization: true,\n maxFileSize: 25 * 1024 * 1024,\n },\n};\n\n","/**\n * Transcription Service\n * \n * Handles audio transcription using OpenAI's transcription models.\n * Keeps transcription simple - the complexity is in the reasoning pass.\n */\n\nimport OpenAI from 'openai';\nimport * as Storage from '../util/storage';\nimport * as Media from '../util/media';\nimport {\n TranscriptionRequest,\n TranscriptionResult,\n TranscriptionModel,\n MODEL_CAPABILITIES\n} from './types';\nimport * as Logging from '../logging';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\nexport interface ServiceInstance {\n transcribe(request: TranscriptionRequest): Promise<TranscriptionResult>;\n supportsStreaming(model: TranscriptionModel): boolean;\n supportsDiarization(model: TranscriptionModel): boolean;\n}\n\n// Alias for backwards compatibility\nexport type TranscriptionService = ServiceInstance;\n\nexport const create = (openai: OpenAI): ServiceInstance => {\n const logger = Logging.getLogger();\n const storage = Storage.create({ log: logger.debug });\n const media = Media.create(logger);\n\n const supportsStreaming = (model: TranscriptionModel): boolean => {\n return MODEL_CAPABILITIES[model]?.supportsStreaming ?? false;\n };\n\n const supportsDiarization = (model: TranscriptionModel): boolean => {\n return MODEL_CAPABILITIES[model]?.supportsDiarization ?? false;\n };\n\n const transcribe = async (request: TranscriptionRequest): Promise<TranscriptionResult> => {\n const { audioFile, config } = request;\n\n logger.debug('Starting transcription', { model: config.model, file: audioFile });\n\n // Convert audio file to a supported format if necessary\n const tempDir = path.join(os.tmpdir(), 'protokoll-conversions');\n const convertedAudioFile = await media.convertToSupportedFormat(audioFile, tempDir);\n logger.debug(`Using audio file for transcription: ${convertedAudioFile}`);\n\n const audioStream = await storage.readStream(convertedAudioFile);\n \n // Execute transcription\n const startTime = Date.now();\n const response = await openai.audio.transcriptions.create({\n model: config.model,\n file: audioStream,\n response_format: config.response_format ?? 'json',\n ...(config.language && { language: config.language }),\n ...(config.temperature !== undefined && { temperature: config.temperature }),\n ...(config.prompt && { prompt: config.prompt }),\n });\n const duration = Date.now() - startTime;\n \n logger.debug('Transcription complete', { duration, model: config.model });\n \n // Handle the response\n return {\n text: response.text,\n model: config.model,\n duration,\n };\n };\n \n return {\n transcribe,\n supportsStreaming,\n supportsDiarization,\n };\n};\n","/**\n * Transcription System\n * \n * Main entry point for the transcription system. Provides a factory function\n * to create transcription instances that can transcribe audio files using\n * various OpenAI models.\n * \n * Design Philosophy:\n * - Keep transcription simple - it produces raw phonetic output\n * - The reasoning pass handles corrections with full context\n * - Model choice is user preference (quality vs cost)\n */\n\nimport OpenAI from 'openai';\nimport { TranscriptionConfig, TranscriptionResult, TranscriptionModel } from './types';\nimport * as Service from './service';\n\nexport interface TranscriptionInstance {\n // Core transcription\n transcribe(audioFile: string, options?: Partial<TranscriptionConfig>): Promise<TranscriptionResult>;\n \n // Model capabilities\n supportsStreaming(model: TranscriptionModel): boolean;\n supportsDiarization(model: TranscriptionModel): boolean;\n \n // Configuration\n setDefaultModel(model: TranscriptionModel): void;\n getDefaultModel(): TranscriptionModel;\n}\n\nexport interface CreateOptions {\n apiKey?: string;\n defaultModel?: TranscriptionModel;\n openaiClient?: OpenAI;\n}\n\nexport const create = (options: CreateOptions = {}): TranscriptionInstance => {\n // Lazy-initialize OpenAI client (only when actually needed for transcription)\n let service: Service.ServiceInstance | null = null;\n const getService = (): Service.ServiceInstance => {\n if (!service) {\n const openai = options.openaiClient ?? new OpenAI({ apiKey: options.apiKey });\n service = Service.create(openai);\n }\n return service;\n };\n \n let defaultModel: TranscriptionModel = options.defaultModel ?? 'whisper-1';\n \n const transcribe = async (\n audioFile: string, \n configOptions: Partial<TranscriptionConfig> = {}\n ): Promise<TranscriptionResult> => {\n return getService().transcribe({\n audioFile,\n config: {\n model: configOptions.model ?? defaultModel,\n ...configOptions,\n },\n });\n };\n \n return {\n transcribe,\n supportsStreaming: (model) => getService().supportsStreaming(model),\n supportsDiarization: (model) => getService().supportsDiarization(model),\n setDefaultModel: (model) => { defaultModel = model; },\n getDefaultModel: () => defaultModel,\n };\n};\n\n// Re-export types\nexport * from './types';\n\n","/**\n * Reasoning Client\n * \n * Wrapper for reasoning model calls with tool/function calling support.\n * Uses OpenAI's native function calling for agentic workflows.\n */\n\nimport OpenAI from 'openai';\nimport { ReasoningConfig, ReasoningRequest, ReasoningResponse, ToolCall } from './types';\nimport * as Logging from '../logging';\n\nexport interface ToolCallRequest {\n messages: Array<{\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{ id: string; function: { name: string; arguments: string } }>;\n }>;\n tools?: Array<{\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n }>;\n}\n\nexport interface ToolCallResponse {\n content: string;\n tool_calls?: Array<{\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n finish_reason?: string;\n}\n\nexport interface ClientInstance {\n complete(request: ReasoningRequest): Promise<ReasoningResponse>;\n completeWithTools(request: ToolCallRequest): Promise<ToolCallResponse>;\n isReasoningModel(model: string): boolean;\n getModelFamily(model: string): 'openai' | 'anthropic' | 'gemini' | 'unknown';\n}\n\nexport const create = (config: ReasoningConfig): ClientInstance => {\n const logger = Logging.getLogger();\n \n // Lazy-initialize OpenAI client (only when actually needed)\n let client: OpenAI | null = null;\n const getClient = (): OpenAI => {\n if (!client) {\n client = new OpenAI({ apiKey: config.apiKey });\n }\n return client;\n };\n \n const getModelFamily = (model: string): 'openai' | 'anthropic' | 'gemini' | 'unknown' => {\n if (model.startsWith('gpt') || model.startsWith('o1') || model.startsWith('o3')) return 'openai';\n if (model.startsWith('claude')) return 'anthropic';\n if (model.startsWith('gemini')) return 'gemini';\n return 'unknown';\n };\n \n const isReasoningModel = (model: string): boolean => {\n // Models known for strong reasoning\n const reasoningModels = [\n 'gpt-4o', 'gpt-4-turbo', 'gpt-5', 'gpt-5-mini', 'gpt-5.1', 'gpt-5.2',\n 'o1', 'o1-mini', 'o1-preview', 'o3', 'o3-mini',\n 'claude-3-5-sonnet', 'claude-3-opus', 'claude-4',\n ];\n return reasoningModels.some(rm => model.includes(rm));\n };\n \n const supportsReasoningLevel = (model: string): boolean => {\n // Models that support reasoning_effort parameter\n const models = ['gpt-5.1', 'gpt-5.2', 'o1', 'o1-mini', 'o3', 'o3-mini'];\n return models.some(m => model.includes(m));\n };\n \n const complete = async (request: ReasoningRequest): Promise<ReasoningResponse> => {\n const startTime = Date.now();\n logger.debug('Reasoning request starting', { model: config.model });\n \n try {\n // Build messages for OpenAI\n const messages: Array<OpenAI.Chat.ChatCompletionMessageParam> = [];\n \n if (request.systemPrompt) {\n messages.push({ role: 'system', content: request.systemPrompt });\n }\n \n // Add the main prompt\n messages.push({ role: 'user', content: request.prompt });\n \n // Build tools if provided\n const tools: OpenAI.Chat.ChatCompletionTool[] | undefined = request.tools?.map(tool => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n \n // Build request options\n const requestOptions: Record<string, unknown> = {\n model: config.model,\n messages,\n tools: tools && tools.length > 0 ? tools : undefined,\n tool_choice: tools && tools.length > 0 ? 'auto' : undefined,\n };\n \n // Add reasoning_effort for models that support it (default to 'medium')\n if (supportsReasoningLevel(config.model)) {\n const reasoningLevel = config.reasoningLevel || 'medium';\n requestOptions.reasoning_effort = reasoningLevel;\n logger.debug('Using reasoning_effort: %s for model %s', reasoningLevel, config.model);\n }\n \n const response = await getClient().chat.completions.create(\n requestOptions as unknown as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n );\n \n const duration = Date.now() - startTime;\n logger.debug('Reasoning model responded in %dms', duration);\n \n const choice = response.choices[0];\n const message = choice.message;\n \n // Extract token usage\n const usage = response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined;\n \n // Extract tool calls if any\n const toolCalls: ToolCall[] | undefined = message.tool_calls?.map(tc => {\n // Handle both standard and custom tool call formats\n const fn = 'function' in tc ? tc.function : null;\n if (!fn) {\n return { id: tc.id, name: 'unknown', arguments: {} };\n }\n return {\n id: tc.id,\n name: fn.name,\n arguments: JSON.parse(fn.arguments),\n };\n });\n \n if (toolCalls && toolCalls.length > 0) {\n logger.debug('Model requested %d tool calls: %s', toolCalls.length, toolCalls.map(t => t.name).join(', '));\n }\n \n return {\n content: message.content || '',\n model: config.model,\n duration,\n usage,\n toolCalls,\n finishReason: choice.finish_reason,\n };\n } catch (error) {\n logger.error('Reasoning request failed', { error });\n throw error;\n }\n };\n \n const completeWithTools = async (request: ToolCallRequest): Promise<ToolCallResponse> => {\n logger.debug('Tool call request starting', { model: config.model, messageCount: request.messages.length });\n \n try {\n // Convert messages to OpenAI format\n const messages: Array<OpenAI.Chat.ChatCompletionMessageParam> = request.messages.map(msg => {\n if (msg.role === 'tool') {\n return {\n role: 'tool' as const,\n content: msg.content,\n tool_call_id: msg.tool_call_id || '',\n };\n }\n if (msg.role === 'assistant' && msg.tool_calls) {\n return {\n role: 'assistant' as const,\n content: msg.content || null,\n tool_calls: msg.tool_calls.map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: tc.function,\n })),\n };\n }\n return {\n role: msg.role as 'system' | 'user' | 'assistant',\n content: msg.content,\n };\n });\n \n // Build request options\n const requestOptions: Record<string, unknown> = {\n model: config.model,\n messages,\n tools: request.tools,\n tool_choice: request.tools && request.tools.length > 0 ? 'auto' : undefined,\n };\n \n // Add reasoning_effort for models that support it\n if (supportsReasoningLevel(config.model)) {\n requestOptions.reasoning_effort = config.reasoningLevel || 'medium';\n }\n \n const response = await getClient().chat.completions.create(\n requestOptions as unknown as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n );\n \n const choice = response.choices[0];\n const message = choice.message;\n \n // Extract tool calls if any\n const toolCalls = message.tool_calls?.map(tc => {\n // Handle both standard and custom tool call formats\n const fn = 'function' in tc ? tc.function : null;\n if (!fn) {\n return { id: tc.id, function: { name: 'unknown', arguments: '{}' } };\n }\n return {\n id: tc.id,\n function: {\n name: fn.name,\n arguments: fn.arguments,\n },\n };\n });\n \n if (toolCalls && toolCalls.length > 0) {\n logger.debug('Model requested %d tool calls: %s', toolCalls.length, toolCalls.map(t => t.function.name).join(', '));\n }\n \n return {\n content: message.content || '',\n tool_calls: toolCalls,\n finish_reason: choice.finish_reason,\n };\n } catch (error) {\n logger.error('Tool call request failed', { error });\n throw error;\n }\n };\n \n return {\n complete,\n completeWithTools,\n isReasoningModel,\n getModelFamily,\n };\n};\n","/**\n * Reasoning Strategy\n * \n * Strategy factory for different transcription processing approaches.\n * Uses riotprompt's IterationStrategyFactory for complex workflows.\n */\n\nimport { IterationStrategy, IterationStrategyFactory } from '@riotprompt/riotprompt';\nimport { ReasoningLevel } from './types';\n\nexport type TranscriptionStrategy = \n | 'simple' // Basic completion\n | 'investigate-then-respond' // Use tools to gather info, then respond\n | 'multi-pass' // Multiple refinement passes\n | 'adaptive'; // Changes based on complexity\n\nexport interface StrategyConfig {\n type: TranscriptionStrategy;\n maxIterations?: number;\n requireMinimumTools?: number;\n reasoningLevel?: ReasoningLevel;\n}\n\nexport const createStrategy = (config: StrategyConfig): IterationStrategy => {\n const maxIterations = config.maxIterations ?? getDefaultIterations(config.type);\n \n switch (config.type) {\n case 'simple':\n return IterationStrategyFactory.simple({\n maxIterations,\n allowTools: false,\n });\n \n case 'investigate-then-respond':\n return IterationStrategyFactory.investigateThenRespond({\n maxInvestigationSteps: Math.floor(maxIterations * 0.8),\n requireMinimumTools: config.requireMinimumTools ?? 2,\n finalSynthesis: true,\n });\n \n case 'multi-pass':\n return IterationStrategyFactory.multiPassRefinement({\n passes: 3,\n critiqueBetweenPasses: true,\n });\n \n case 'adaptive':\n return IterationStrategyFactory.adaptive({});\n \n default:\n return IterationStrategyFactory.simple({ maxIterations });\n }\n};\n\nconst getDefaultIterations = (type: TranscriptionStrategy): number => {\n switch (type) {\n case 'simple': return 1;\n case 'investigate-then-respond': return 15;\n case 'multi-pass': return 6;\n case 'adaptive': return 20;\n default: return 10;\n }\n};\n\nexport const getRecommendedStrategy = (\n transcriptLength: number,\n hasUnknownNames: boolean,\n complexity: 'low' | 'medium' | 'high'\n): TranscriptionStrategy => {\n // Short, simple transcripts\n if (transcriptLength < 500 && !hasUnknownNames && complexity === 'low') {\n return 'simple';\n }\n \n // Complex or with unknowns - need investigation\n if (hasUnknownNames || complexity === 'high') {\n return 'investigate-then-respond';\n }\n \n // Medium complexity - adaptive is good\n return 'adaptive';\n};\n\n","/**\n * Reasoning System\n * \n * Main entry point for the reasoning system. Provides a factory function\n * to create reasoning instances that can execute LLM calls with various\n * strategies using riotprompt.\n */\n\nimport { ReasoningConfig, ReasoningRequest, ReasoningResponse, ReasoningMetrics } from './types';\nimport * as Client from './client';\nimport * as Strategy from './strategy';\n\nexport interface ReasoningInstance {\n // Single completion\n complete(request: ReasoningRequest): Promise<ReasoningResponse>;\n \n // Multi-turn tool calling\n completeWithTools(request: Client.ToolCallRequest): Promise<Client.ToolCallResponse>;\n \n // Strategy-based execution\n executeWithStrategy(\n request: ReasoningRequest,\n strategyType: Strategy.TranscriptionStrategy\n ): Promise<ReasoningResponse & { metrics: ReasoningMetrics }>;\n \n // Model information\n isReasoningModel(model: string): boolean;\n getModelFamily(model: string): 'openai' | 'anthropic' | 'gemini' | 'unknown';\n \n // Strategy helpers\n getRecommendedStrategy(\n transcriptLength: number,\n hasUnknownNames: boolean,\n complexity: 'low' | 'medium' | 'high'\n ): Strategy.TranscriptionStrategy;\n}\n\nexport const create = (config: ReasoningConfig): ReasoningInstance => {\n const client = Client.create(config);\n \n return {\n complete: (request) => client.complete(request),\n completeWithTools: (request) => client.completeWithTools(request),\n \n executeWithStrategy: async (request, strategyType) => {\n // Create the strategy (for future use with full agentic execution)\n Strategy.createStrategy({\n type: strategyType,\n maxIterations: request.maxIterations,\n });\n \n // For now, simple execution\n // Full strategy execution will be implemented in Step 05 (Agentic)\n const response = await client.complete(request);\n \n return {\n ...response,\n metrics: {\n iterations: 1,\n toolCallsExecuted: response.toolCalls?.length ?? 0,\n totalDuration: response.duration ?? 0,\n tokensUsed: response.usage?.totalTokens ?? 0,\n },\n };\n },\n \n isReasoningModel: client.isReasoningModel,\n getModelFamily: client.getModelFamily,\n getRecommendedStrategy: Strategy.getRecommendedStrategy,\n };\n};\n\n// Re-export types\nexport * from './types';\nexport type { TranscriptionStrategy, StrategyConfig } from './strategy';\n\n","/**\n * Lookup Person Tool\n * \n * Looks up information about a person mentioned in the transcript.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\n/**\n * Extract context from transcript around where a name is mentioned.\n * Returns approximately one sentence before and after the name mention.\n */\nfunction extractNameContext(transcript: string, name: string): string | null {\n // Case-insensitive search for the name\n const lowerTranscript = transcript.toLowerCase();\n const lowerName = name.toLowerCase();\n const index = lowerTranscript.indexOf(lowerName);\n \n if (index === -1) {\n return null;\n }\n \n // Define strong sentence boundaries (., !, ?)\n const sentenceBoundary = /[.!?]/;\n \n // Look backwards for the start (find the sentence boundary 1 sentence before)\n let startIndex = 0;\n let boundariesFound = 0;\n for (let i = index - 1; i >= 0; i--) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence), \n // keep looking for the second (end of previous sentence)\n if (boundariesFound === 2) {\n // Start after this boundary\n startIndex = i + 1;\n break;\n }\n }\n }\n \n // Look forwards for the end (find sentence boundary 1 sentence after)\n let endIndex = transcript.length;\n boundariesFound = 0;\n for (let i = index + name.length; i < transcript.length; i++) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence),\n // keep looking for the second (end of next sentence)\n if (boundariesFound === 2) {\n // Include this boundary\n endIndex = i + 1;\n break;\n }\n }\n }\n \n // Extract and clean up the context\n let context = transcript.substring(startIndex, endIndex).trim();\n \n // Limit length to avoid overwhelming the prompt (max ~300 chars)\n if (context.length > 300) {\n // Try to cut at a sentence boundary\n const midPoint = context.indexOf(name);\n if (midPoint !== -1) {\n // Keep the sentence with the name, trim around it\n let sentenceStart = midPoint;\n let sentenceEnd = midPoint + name.length;\n \n // Find sentence start\n for (let i = midPoint - 1; i >= 0; i--) {\n if (sentenceBoundary.test(context[i])) {\n sentenceStart = i + 1;\n break;\n }\n }\n \n // Find sentence end\n for (let i = midPoint + name.length; i < context.length; i++) {\n if (sentenceBoundary.test(context[i])) {\n sentenceEnd = i + 1;\n break;\n }\n }\n \n context = context.substring(sentenceStart, sentenceEnd).trim();\n } else {\n // Just truncate if name not found in extracted context\n context = context.substring(0, 300) + '...';\n }\n }\n \n return context;\n}\n\nexport const create = (ctx: ToolContext): TranscriptionTool => ({\n name: 'lookup_person',\n description: 'Look up information about a person mentioned in the transcript. Use when you encounter a name that might need spelling verification or additional context.',\n parameters: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'The name to look up (as heard in transcript)',\n },\n phonetic: {\n type: 'string',\n description: 'How the name sounds (for alias matching)',\n },\n },\n required: ['name'],\n },\n execute: async (args: { name: string; phonetic?: string }): Promise<ToolResult> => {\n const context = ctx.contextInstance;\n \n // First, check if this person was already resolved in this session\n if (ctx.resolvedEntities?.has(args.name)) {\n const resolvedName = ctx.resolvedEntities.get(args.name);\n return {\n success: true,\n data: {\n found: true,\n suggestion: `Already resolved: use \"${resolvedName}\"`,\n cached: true,\n },\n };\n }\n \n // Try direct name search\n const people = context.search(args.name);\n const personMatches = people.filter(e => e.type === 'person');\n \n if (personMatches.length > 0) {\n return {\n success: true,\n data: {\n found: true,\n person: personMatches[0],\n suggestion: `Use \"${personMatches[0].name}\" for correct spelling`,\n },\n };\n }\n \n // Try phonetic match (sounds_like)\n if (args.phonetic) {\n const person = context.findBySoundsLike(args.phonetic);\n if (person) {\n return {\n success: true,\n data: {\n found: true,\n person,\n suggestion: `\"${args.phonetic}\" likely refers to \"${person.name}\"`,\n },\n };\n }\n }\n \n // Not found - always signal that we need user input\n // The executor will decide whether to actually prompt based on handler availability\n const allProjects = context.getAllProjects();\n const projectOptions = allProjects\n .filter(p => p.active !== false)\n .map(p => `${p.name}${p.description ? ` - ${p.description}` : ''}`);\n \n // Extract filename from sourceFile path for cleaner display\n const fileName = ctx.sourceFile.split('/').pop() || ctx.sourceFile;\n const fileDate = ctx.audioDate.toLocaleString('en-US', {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n \n // Find context from transcript where the name is mentioned\n const transcriptContext = extractNameContext(ctx.transcriptText, args.name);\n \n const promptLines = [\n `File: ${fileName}`,\n `Date: ${fileDate}`,\n '',\n `Unknown person mentioned: \"${args.name}\"`,\n ];\n \n if (transcriptContext) {\n promptLines.push('');\n promptLines.push('Context from transcript:');\n promptLines.push(`\"${transcriptContext}\"`);\n }\n \n return {\n success: true,\n needsUserInput: true,\n userPrompt: promptLines.join('\\n'),\n data: {\n found: false,\n clarificationType: 'new_person',\n term: args.name,\n message: `Person \"${args.name}\" not found. Asking user for details.`,\n knownProjects: allProjects.filter(p => p.active !== false),\n options: projectOptions,\n },\n };\n },\n});\n\n","/**\n * Lookup Project Tool\n * \n * Looks up project information for routing and context.\n * Prompts to create unknown projects when user input is available.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\n/**\n * Extract context from transcript around where a term is mentioned.\n * Returns approximately one sentence before and after the term mention.\n */\nfunction extractTermContext(transcript: string, term: string): string | null {\n // Case-insensitive search for the term\n const lowerTranscript = transcript.toLowerCase();\n const lowerTerm = term.toLowerCase();\n const index = lowerTranscript.indexOf(lowerTerm);\n \n if (index === -1) {\n return null;\n }\n \n // Define strong sentence boundaries (., !, ?)\n const sentenceBoundary = /[.!?]/;\n \n // Look backwards for the start (find the sentence boundary 1 sentence before)\n let startIndex = 0;\n let boundariesFound = 0;\n for (let i = index - 1; i >= 0; i--) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence), \n // keep looking for the second (end of previous sentence)\n if (boundariesFound === 2) {\n // Start after this boundary\n startIndex = i + 1;\n break;\n }\n }\n }\n \n // Look forwards for the end (find sentence boundary 1 sentence after)\n let endIndex = transcript.length;\n boundariesFound = 0;\n for (let i = index + term.length; i < transcript.length; i++) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence),\n // keep looking for the second (end of next sentence)\n if (boundariesFound === 2) {\n // Include this boundary\n endIndex = i + 1;\n break;\n }\n }\n }\n \n // Extract and clean up the context\n let context = transcript.substring(startIndex, endIndex).trim();\n \n // Limit length to avoid overwhelming the prompt (max ~300 chars)\n if (context.length > 300) {\n // Try to cut at a sentence boundary\n const midPoint = context.indexOf(term);\n if (midPoint !== -1) {\n // Keep the sentence with the term, trim around it\n let sentenceStart = midPoint;\n let sentenceEnd = midPoint + term.length;\n \n // Find sentence start\n for (let i = midPoint - 1; i >= 0; i--) {\n if (sentenceBoundary.test(context[i])) {\n sentenceStart = i + 1;\n break;\n }\n }\n \n // Find sentence end\n for (let i = midPoint + term.length; i < context.length; i++) {\n if (sentenceBoundary.test(context[i])) {\n sentenceEnd = i + 1;\n break;\n }\n }\n \n context = context.substring(sentenceStart, sentenceEnd).trim();\n } else {\n // Just truncate if term not found in extracted context\n context = context.substring(0, 300) + '...';\n }\n }\n \n return context;\n}\n\nexport const create = (ctx: ToolContext): TranscriptionTool => ({\n name: 'lookup_project',\n description: 'Look up project information for routing and context. Use when you need to determine where this note should be filed.',\n parameters: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'The project name or identifier',\n },\n triggerPhrase: {\n type: 'string',\n description: 'A phrase from the transcript that might indicate the project',\n },\n },\n required: ['name'],\n },\n execute: async (args: { name: string; triggerPhrase?: string }): Promise<ToolResult> => {\n const context = ctx.contextInstance;\n \n // First, check if this project/term was already resolved in this session\n if (ctx.resolvedEntities?.has(args.name)) {\n const resolvedName = ctx.resolvedEntities.get(args.name);\n return {\n success: true,\n data: {\n found: true,\n suggestion: `Already resolved: use \"${resolvedName}\"`,\n cached: true,\n },\n };\n }\n \n // Check if this term is on the ignore list\n if (context.isIgnored(args.name)) {\n return {\n success: true,\n data: {\n found: false,\n ignored: true,\n message: `\"${args.name}\" is on the ignore list - skipping without prompting`,\n },\n };\n }\n \n // Try to determine context from routing instance if available\n let contextProjectId: string | undefined;\n if (ctx.routingInstance) {\n const allProjects = context.getAllProjects();\n // Use the first active project as a context hint (could be improved)\n const activeProject = allProjects.find(p => p.active !== false);\n contextProjectId = activeProject?.id;\n }\n \n // Use context-aware search (prefers related projects)\n const searchResults = context.searchWithContext(args.name, contextProjectId);\n const projectMatches = searchResults.filter(e => e.type === 'project');\n const termMatches = searchResults.filter(e => e.type === 'term');\n \n if (projectMatches.length > 0) {\n const project = projectMatches[0];\n return {\n success: true,\n data: {\n found: true,\n project,\n matchedVia: 'context_aware_search',\n },\n };\n }\n \n // Check if we found a term that's associated with projects\n if (termMatches.length > 0) {\n const term = termMatches[0];\n const termProjects = term.projects || [];\n \n if (termProjects.length > 0) {\n // Get the first associated project\n const allProjects = context.getAllProjects();\n const associatedProject = allProjects.find(p => p.id === termProjects[0]);\n \n if (associatedProject) {\n return {\n success: true,\n data: {\n found: true,\n project: associatedProject,\n matchedVia: 'term',\n termName: term.name,\n },\n };\n }\n }\n }\n \n // Try findBySoundsLike as a fallback for exact phonetic matches\n const soundsLikeMatch = context.findBySoundsLike(args.name);\n if (soundsLikeMatch) {\n if (soundsLikeMatch.type === 'project') {\n return {\n success: true,\n data: {\n found: true,\n project: soundsLikeMatch,\n matchedVia: 'sounds_like',\n },\n };\n } else if (soundsLikeMatch.type === 'term') {\n const termProjects = soundsLikeMatch.projects || [];\n \n if (termProjects.length > 0) {\n const allProjects = context.getAllProjects();\n const associatedProject = allProjects.find(p => p.id === termProjects[0]);\n \n if (associatedProject) {\n return {\n success: true,\n data: {\n found: true,\n project: associatedProject,\n matchedVia: 'term_sounds_like',\n termName: soundsLikeMatch.name,\n },\n };\n }\n }\n }\n }\n \n // Try getting all projects and matching trigger phrases\n if (args.triggerPhrase) {\n const allProjects = context.getAllProjects();\n for (const project of allProjects) {\n const phrases = project.classification?.explicit_phrases ?? [];\n if (phrases.some(p => args.triggerPhrase?.toLowerCase().includes(p.toLowerCase()))) {\n return {\n success: true,\n data: {\n found: true,\n project,\n matchedTrigger: args.triggerPhrase,\n },\n };\n }\n }\n }\n \n // Project not found - always signal that we need user input\n // The executor will decide whether to actually prompt based on handler availability\n const allProjects = context.getAllProjects();\n const projectOptions = allProjects\n .filter(p => p.active !== false)\n .map(p => `${p.name}${p.description ? ` - ${p.description}` : ''}`);\n \n // Extract filename from sourceFile path for cleaner display\n const fileName = ctx.sourceFile.split('/').pop() || ctx.sourceFile;\n const fileDate = ctx.audioDate.toLocaleString('en-US', {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n \n // Find context from transcript where the project/term is mentioned\n const transcriptContext = extractTermContext(ctx.transcriptText, args.name);\n \n const contextLines = [\n `File: ${fileName}`,\n `Date: ${fileDate}`,\n '',\n `Unknown project/term: \"${args.name}\"`,\n ];\n \n if (transcriptContext) {\n contextLines.push('');\n contextLines.push('Context from transcript:');\n contextLines.push(`\"${transcriptContext}\"`);\n } else if (args.triggerPhrase) {\n contextLines.push('');\n contextLines.push('Context from transcript:');\n contextLines.push(`\"${args.triggerPhrase}\"`);\n }\n \n return {\n success: true,\n needsUserInput: true,\n userPrompt: contextLines.join('\\n'),\n data: {\n found: false,\n clarificationType: 'new_project',\n term: args.name,\n triggerPhrase: args.triggerPhrase,\n message: `Project \"${args.name}\" not found. Asking user if this is a new project.`,\n knownProjects: allProjects.filter(p => p.active !== false),\n options: projectOptions,\n },\n };\n },\n});\n\n","/**\n * Verify Spelling Tool\n * \n * Requests user verification for an unknown name or term.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\nexport const create = (ctx: ToolContext): TranscriptionTool => ({\n name: 'verify_spelling',\n description: 'Request user verification for an unknown name or term. Use when you encounter something that needs human confirmation.',\n parameters: {\n type: 'object',\n properties: {\n term: {\n type: 'string',\n description: 'The term that needs verification',\n },\n context: {\n type: 'string',\n description: 'Context around where this term appears',\n },\n suggestedSpelling: {\n type: 'string',\n description: 'Your best guess at the correct spelling',\n },\n },\n required: ['term'],\n },\n execute: async (args: { term: string; context?: string; suggestedSpelling?: string }): Promise<ToolResult> => {\n if (!ctx.interactiveMode) {\n // In batch mode, return best guess\n return {\n success: true,\n data: {\n verified: false,\n useSuggestion: true,\n spelling: args.suggestedSpelling || args.term,\n message: 'Non-interactive mode: using best guess',\n },\n };\n }\n \n // In interactive mode, mark for user input\n return {\n success: true,\n needsUserInput: true,\n userPrompt: `Unknown term: \"${args.term}\"${args.context ? ` (context: \"${args.context}\")` : ''}\n${args.suggestedSpelling ? `Suggested spelling: \"${args.suggestedSpelling}\"` : ''}\nPlease provide the correct spelling:`,\n data: {\n term: args.term,\n suggestedSpelling: args.suggestedSpelling,\n },\n };\n },\n});\n\n","/**\n * Route Note Tool\n * \n * Determines the destination for a note based on content analysis.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\nexport const create = (ctx: ToolContext): TranscriptionTool => ({\n name: 'route_note',\n description: 'Determine the destination for this note based on content analysis.',\n parameters: {\n type: 'object',\n properties: {\n projectHint: {\n type: 'string',\n description: 'The detected project name or hint',\n },\n contentSummary: {\n type: 'string',\n description: 'Brief summary of what the note is about',\n },\n },\n },\n execute: async (args: { projectHint?: string; contentSummary?: string }): Promise<ToolResult> => {\n const routing = ctx.routingInstance;\n \n const routingContext = {\n transcriptText: ctx.transcriptText,\n audioDate: ctx.audioDate,\n sourceFile: ctx.sourceFile,\n };\n \n const decision = routing.route(routingContext);\n const outputPath = routing.buildOutputPath(decision, routingContext);\n \n return {\n success: true,\n data: {\n projectId: decision.projectId,\n // Return the routing decision (base path + structure), NOT the built output path\n // The orchestrator will call buildOutputPath() later\n routingDecision: decision,\n // Also include the built path for informational purposes\n outputPath: outputPath,\n confidence: decision.confidence,\n reasoning: decision.reasoning,\n projectHint: args.projectHint,\n contentSummary: args.contentSummary,\n },\n };\n },\n});\n\n","/**\n * Store Context Tool\n * \n * Stores new context information for future use.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\nexport const create = (_ctx: ToolContext): TranscriptionTool => ({\n name: 'store_context',\n description: 'Store new context information for future use. Use when you learn something new that should be remembered.',\n parameters: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'project', 'company', 'term'],\n description: 'Type of entity to store',\n },\n name: {\n type: 'string',\n description: 'Name of the entity',\n },\n details: {\n type: 'object',\n description: 'Additional details about the entity',\n },\n },\n required: ['entityType', 'name'],\n },\n \n execute: async (args: { entityType: string; name: string; details?: any }): Promise<ToolResult> => {\n // This tool requires --self-update flag to actually persist\n // Otherwise it just acknowledges without saving\n \n return {\n success: true,\n data: {\n stored: false,\n message: 'Context storage requires --self-update flag. Information noted but not persisted.',\n entityType: args.entityType,\n name: args.name,\n },\n };\n },\n});\n\n","/**\n * Tool Registry\n * \n * Manages available tools for agentic transcription.\n * Uses RiotPrompt's ToolRegistry for format conversion while\n * preserving protokoll's custom ToolResult interface.\n */\n\nimport { ToolRegistry } from '@riotprompt/riotprompt';\nimport type { Tool as RiotTool } from '@riotprompt/riotprompt';\nimport { TranscriptionTool, ToolContext, ToolResult } from './types';\nimport * as LookupPerson from './tools/lookup-person';\nimport * as LookupProject from './tools/lookup-project';\nimport * as VerifySpelling from './tools/verify-spelling';\nimport * as RouteNote from './tools/route-note';\nimport * as StoreContext from './tools/store-context';\n\nexport interface RegistryInstance {\n getTools(): TranscriptionTool[];\n \n getToolDefinitions(): any[]; // For LLM API format (OpenAI compatible)\n \n executeTool(name: string, args: any): Promise<ToolResult>;\n \n /** Get the underlying RiotPrompt ToolRegistry */\n getRiotRegistry(): ToolRegistry;\n}\n\n/**\n * Convert a protokoll TranscriptionTool to a RiotPrompt Tool.\n * The execute function is adapted to work with both systems.\n */\nconst toRiotTool = (tool: TranscriptionTool, category?: string): RiotTool => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters as RiotTool['parameters'],\n category,\n cost: 'cheap',\n execute: async (params: any) => {\n const result = await tool.execute(params);\n return result;\n },\n});\n\nexport const create = (ctx: ToolContext): RegistryInstance => {\n // Create protokoll tools\n const tools: TranscriptionTool[] = [\n LookupPerson.create(ctx),\n LookupProject.create(ctx),\n VerifySpelling.create(ctx),\n RouteNote.create(ctx),\n StoreContext.create(ctx),\n ];\n \n const toolMap = new Map(tools.map(t => [t.name, t]));\n \n // Create RiotPrompt ToolRegistry for format conversion\n const riotRegistry = ToolRegistry.create();\n \n // Register tools with categories\n riotRegistry.register(toRiotTool(tools[0], 'lookup')); // lookup_person\n riotRegistry.register(toRiotTool(tools[1], 'lookup')); // lookup_project\n riotRegistry.register(toRiotTool(tools[2], 'verification')); // verify_spelling\n riotRegistry.register(toRiotTool(tools[3], 'routing')); // route_note\n riotRegistry.register(toRiotTool(tools[4], 'storage')); // store_context\n \n return {\n getTools: () => tools,\n \n // Use RiotPrompt's OpenAI format export\n getToolDefinitions: () => riotRegistry.toOpenAIFormat().map(t => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters,\n })),\n \n executeTool: async (name: string, args: any): Promise<ToolResult> => {\n const tool = toolMap.get(name);\n if (!tool) {\n return {\n success: false,\n error: `Unknown tool: ${name}`,\n };\n }\n return tool.execute(args);\n },\n \n getRiotRegistry: () => riotRegistry,\n };\n};\n\n","/**\n * Agentic Executor\n * \n * Executes the agentic transcription loop with tool calls.\n * Uses RiotPrompt's ConversationBuilder for conversation management.\n */\n\nimport { ToolContext, TranscriptionState } from './types';\nimport * as Registry from './registry';\nimport * as Reasoning from '../reasoning';\nimport * as Logging from '../logging';\nimport { ConversationBuilder, ToolCall as RiotToolCall } from '@riotprompt/riotprompt';\n\nexport interface ContextChangeRecord {\n entityType: 'person' | 'project' | 'company' | 'term' | 'ignored';\n entityId: string;\n entityName: string;\n action: 'created' | 'updated';\n details?: Record<string, unknown>;\n}\n\nexport interface ExecutorInstance {\n process(transcriptText: string): Promise<{\n enhancedText: string;\n state: TranscriptionState;\n toolsUsed: string[];\n iterations: number;\n totalTokens?: number;\n contextChanges?: ContextChangeRecord[];\n }>;\n}\n\n/**\n * Convert internal tool call format to RiotPrompt's ToolCall format\n */\nconst toRiotToolCalls = (toolCalls: Array<{ id: string; name: string; arguments: Record<string, unknown> }>): RiotToolCall[] => {\n return toolCalls.map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.arguments),\n },\n }));\n};\n\n/**\n * Clean response content by removing any leaked internal processing information\n * that should never appear in the user-facing transcript.\n */\nconst cleanResponseContent = (content: string): string => {\n // Remove common patterns of leaked internal processing\n // Pattern 1: \"Using tools to...\" type commentary\n let cleaned = content.replace(/^(?:Using tools?|Let me|I'll|I will|Now I'll|First,?\\s*I(?:'ll| will)).*?[\\r\\n]+/gim, '');\n \n // Pattern 2: JSON tool call artifacts - match complete JSON objects with \"tool\" key\n // Matches: {\"tool\":\"...\",\"args\":{...}}, {\"tool\":\"...\",\"input\":{...}}, etc.\n // Use a more careful pattern that matches balanced braces\n cleaned = cleaned.replace(/\\{\"tool\":\\s*\"[^\"]+\",\\s*\"(?:args|input)\":\\s*\\{[^}]*\\}\\}/g, '');\n \n // Pattern 3: Tool call references in the format tool_name({...})\n cleaned = cleaned.replace(/\\b\\w+_\\w+\\(\\{[^}]*\\}\\)/g, '');\n \n // Pattern 4: Remove lines with \"to=\" patterns (internal routing artifacts)\n // Matches: \"Այ to=lookup_project.commentary\", \"undefined to=route_note.commentary\"\n // Do this BEFORE Unicode filtering to catch mixed corruption\n cleaned = cleaned.replace(/^.*\\s+to=\\w+\\.\\w+.*$/gm, '');\n \n // Pattern 5: Remove lines that look like spam/SEO (Chinese gambling sites, etc.)\n // Matches lines with Chinese characters followed by \"app\", \"官网\", etc.\n // This is more specific than general Unicode filtering\n const spamPattern = /^.*[\\u4E00-\\u9FFF].*(app|官网|彩票|中彩票).*$/gm;\n cleaned = cleaned.replace(spamPattern, '');\n \n // Pattern 6: Remove lines with suspicious Unicode at the START (corruption indicators)\n // Only remove lines that START with non-Latin scripts (not legitimate content)\n // This catches corruption like \"Այ to=...\" or \"สามสิบเอ็ด\" at line start\n const corruptionStartPattern = /^[\\u0530-\\u058F\\u0E00-\\u0E7F\\u0A80-\\u0AFF\\u0C00-\\u0C7F].*$/gm;\n cleaned = cleaned.replace(corruptionStartPattern, '');\n \n // Pattern 7: Lines that are purely reasoning/commentary before the actual content\n // Look for lines like \"I'll verify...\", \"Checking...\", etc.\n const lines = cleaned.split('\\n');\n let startIndex = 0;\n \n // Skip leading lines that look like internal commentary\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n \n // Skip empty lines\n if (line === '') continue;\n \n // Check if line looks like commentary (starts with action verbs, contains \"tool\", etc.)\n const isCommentary = /^(checking|verifying|looking|searching|analyzing|processing|determining|using|calling|executing|I'm|I am|Let me)/i.test(line)\n || line.includes('tool')\n || line.includes('{\"')\n || line.includes('reasoning')\n || line.includes('undefined');\n \n if (!isCommentary) {\n // This looks like actual content - start from here\n startIndex = i;\n break;\n }\n }\n \n // Rejoin from the first real content line\n if (startIndex > 0) {\n cleaned = lines.slice(startIndex).join('\\n');\n }\n \n // Final cleanup: remove multiple consecutive blank lines\n cleaned = cleaned.replace(/\\n{3,}/g, '\\n\\n');\n \n return cleaned.trim();\n};\n\nexport const create = (\n reasoning: Reasoning.ReasoningInstance,\n ctx: ToolContext\n): ExecutorInstance => {\n const logger = Logging.getLogger();\n const registry = Registry.create(ctx);\n \n const process = async (transcriptText: string) => {\n const state: TranscriptionState = {\n originalText: transcriptText,\n correctedText: transcriptText,\n unknownEntities: [],\n resolvedEntities: new Map(),\n referencedEntities: {\n people: new Set(),\n projects: new Set(),\n terms: new Set(),\n companies: new Set(),\n },\n confidence: 0,\n };\n \n // Make resolvedEntities available to tools so they can avoid re-asking\n ctx.resolvedEntities = state.resolvedEntities;\n \n const toolsUsed: string[] = [];\n const contextChanges: ContextChangeRecord[] = [];\n let iterations = 0;\n let totalTokens = 0;\n const maxIterations = 15;\n \n // Use ConversationBuilder for conversation management with token budget\n const conversation = ConversationBuilder.create({ model: 'gpt-4o' })\n .withTokenBudget({\n max: 100000, // 100k token context window\n reserveForResponse: 4000, // Reserve 4k tokens for response\n strategy: 'summarize', // Summarize old messages if budget exceeded\n onBudgetExceeded: 'compress', // Automatically compress when exceeded\n preserveSystem: true, // Always keep system messages\n preserveRecent: 5 // Keep last 5 messages\n });\n \n // Build the system prompt\n const systemPrompt = `You are an intelligent transcription assistant. Your job is to:\n1. Analyze the transcript for names, projects, and companies\n2. Use the available tools to verify spellings and gather context\n3. Correct any misheard names or terms\n4. Determine the appropriate destination for this note\n5. Produce a clean, accurate Markdown transcript\n\nCRITICAL RULES:\n- This is NOT a summary. Preserve ALL content from the original transcript.\n- Only fix obvious transcription errors like misheard names.\n- When you have finished processing, output the COMPLETE corrected transcript as Markdown.\n- Do NOT say you don't have the transcript - it's in the conversation history.\n\nOUTPUT REQUIREMENTS - EXTREMELY IMPORTANT:\n- Your final response MUST contain ONLY the corrected transcript text.\n- DO NOT include any commentary like \"Using tools to...\" or \"Let me verify...\".\n- DO NOT include any explanations about what you're doing or have done.\n- DO NOT include any tool call information or JSON in your response.\n- DO NOT include any reasoning or processing notes.\n- Your output will be inserted directly into the user-facing document.\n- If you need to use tools, use them silently - don't narrate what you're doing.\n\nAvailable tools:\n- lookup_person: Find information about people (use for any name that might be misspelled)\n- lookup_project: Find project routing information \n- verify_spelling: Ask user about unknown terms (if interactive mode)\n- route_note: Determine where to file this note\n- store_context: Remember new information for future use`;\n\n // Add system message using ConversationBuilder\n conversation.addSystemMessage(systemPrompt);\n \n // Add the initial user message with transcript\n const initialPrompt = `Here is the raw transcript to process:\n\n--- BEGIN TRANSCRIPT ---\n${transcriptText}\n--- END TRANSCRIPT ---\n\nPlease:\n1. Identify any names, companies, or technical terms that might be misspelled\n2. Use the lookup_person tool to verify spelling of any names you find\n3. Use route_note to determine the destination\n4. Then output the COMPLETE corrected transcript as clean Markdown\n\nCRITICAL: Your response must contain ONLY the transcript text - no commentary, no explanations, no tool information.\nRemember: preserve ALL content, only fix transcription errors.`;\n\n conversation.addUserMessage(initialPrompt);\n\n try {\n // Initial reasoning call\n logger.debug('Starting agentic transcription - analyzing for names and routing...');\n let response = await reasoning.complete({\n systemPrompt,\n prompt: initialPrompt,\n tools: registry.getToolDefinitions(),\n maxIterations,\n });\n \n // Track token usage\n if (response.usage) {\n totalTokens += response.usage.totalTokens;\n }\n \n // Add assistant response to conversation\n if (response.toolCalls && response.toolCalls.length > 0) {\n conversation.addAssistantWithToolCalls(\n response.content,\n toRiotToolCalls(response.toolCalls)\n );\n } else {\n conversation.addAssistantMessage(response.content);\n }\n \n // Iterative tool use loop\n while (response.toolCalls && response.toolCalls.length > 0 && iterations < maxIterations) {\n iterations++;\n logger.debug('Iteration %d: Processing %d tool calls...', iterations, response.toolCalls.length);\n \n // Collect tool results\n const toolResults: Array<{ id: string; name: string; result: string }> = [];\n \n // Execute each tool call\n for (const toolCall of response.toolCalls) {\n logger.debug('Executing tool: %s', toolCall.name);\n toolsUsed.push(toolCall.name);\n \n try {\n const result = await registry.executeTool(toolCall.name, toolCall.arguments);\n \n // Format result for the model\n const resultStr = JSON.stringify(result.data || { success: result.success, message: result.error || 'OK' });\n toolResults.push({ id: toolCall.id, name: toolCall.name, result: resultStr });\n \n logger.debug('Tool %s result: %s', toolCall.name, result.success ? 'success' : 'failed');\n \n // Handle results that need user input\n // Check if interactive handler is available (not gated by interactiveMode flag)\n if (result.needsUserInput && ctx.interactiveInstance) {\n logger.info('Interactive: %s requires clarification', toolCall.name);\n \n const termName = String(toolCall.arguments.name || toolCall.arguments.term || '');\n \n const clarification = await ctx.interactiveInstance.handleClarification({\n type: result.data?.clarificationType || 'general',\n term: result.data?.term || termName,\n context: result.userPrompt || '',\n suggestion: result.data?.suggestion,\n options: result.data?.options,\n });\n \n if (clarification.response) {\n state.resolvedEntities.set(termName, clarification.response);\n logger.info('Clarified: %s -> %s', termName, clarification.response);\n \n // Handle new project/term wizard response\n if (result.data?.clarificationType === 'new_project' && clarification.additionalInfo) {\n const wizardResult = clarification.additionalInfo as {\n action: 'create' | 'link' | 'term' | 'skip' | 'ignore';\n projectName?: string;\n destination?: string;\n description?: string;\n linkedProjectIndex?: number;\n linkedTermName?: string;\n aliasName?: string;\n termDescription?: string;\n // For 'term' action\n termName?: string;\n termExpansion?: string;\n termProjects?: number[];\n // For nested project creation from term wizard\n createdProject?: {\n action: 'create' | 'link' | 'skip';\n projectName?: string;\n destination?: string;\n description?: string;\n };\n // For 'ignore' action\n ignoredTerm?: string;\n };\n \n const knownProjects = result.data?.knownProjects as Array<{\n id: string;\n name: string;\n description?: string;\n classification?: { explicit_phrases?: string[]; context_type?: string };\n routing?: { destination: string; structure?: string; filename_options?: string[] };\n }> | undefined;\n \n if (wizardResult.action === 'create') {\n // CREATE NEW PROJECT\n const projectName = wizardResult.projectName || termName;\n const projectId = projectName.toLowerCase().replace(/\\s+/g, '-');\n const projectDestination = wizardResult.destination;\n \n const newProject = {\n id: projectId,\n name: projectName,\n type: 'project' as const,\n description: wizardResult.description || `Project for \"${projectName}\"`,\n classification: {\n context_type: 'work' as const,\n explicit_phrases: [termName.toLowerCase(), projectName.toLowerCase()].filter((v, i, a) => a.indexOf(v) === i),\n },\n routing: {\n // Only include destination if explicitly provided - otherwise uses global default\n ...(projectDestination && { destination: projectDestination }),\n structure: 'month' as const,\n filename_options: ['date', 'time', 'subject'] as Array<'date' | 'time' | 'subject'>,\n },\n active: true,\n };\n \n try {\n await ctx.contextInstance.saveEntity(newProject);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Created new project: %s%s', projectName, projectDestination ? ` -> ${projectDestination}` : ' (using default destination)');\n \n contextChanges.push({\n entityType: 'project',\n entityId: projectId,\n entityName: projectName,\n action: 'created',\n details: {\n ...(projectDestination && { destination: projectDestination }),\n description: wizardResult.description,\n triggeredByTerm: termName,\n },\n });\n \n // Update routing if destination was specified\n if (projectDestination) {\n state.routeDecision = {\n projectId,\n destination: { path: projectDestination, structure: 'month' },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: termName, weight: 1.0 }],\n reasoning: `User created new project \"${projectName}\" routing to ${projectDestination}`,\n };\n }\n } catch (error) {\n logger.warn('Failed to save new project: %s', error);\n }\n \n } else if (wizardResult.action === 'link' && wizardResult.linkedTermName) {\n // LINK AS ALIAS TO EXISTING TERM\n const existingTermName = wizardResult.linkedTermName;\n const aliasVariant = wizardResult.aliasName || termName;\n \n // Search for the existing term\n const termSearch = await ctx.contextInstance.search(existingTermName);\n const existingTerm = termSearch.find(e => e.type === 'term' && \n e.name.toLowerCase() === existingTermName.toLowerCase());\n \n if (existingTerm) {\n // Add the new variant to sounds_like\n const existingVariants = (existingTerm as { sounds_like?: string[] }).sounds_like || [];\n const updatedVariants = [...existingVariants, aliasVariant.toLowerCase()]\n .filter((v, i, a) => a.indexOf(v) === i); // dedupe\n \n const updatedTerm = {\n ...existingTerm,\n type: 'term' as const,\n sounds_like: updatedVariants,\n };\n \n try {\n await ctx.contextInstance.saveEntity(updatedTerm);\n await ctx.contextInstance.reload();\n logger.info('Added alias \"%s\" to existing term \"%s\"', aliasVariant, existingTerm.name);\n \n // Mark as resolved\n state.resolvedEntities.set(termName, existingTerm.name);\n state.resolvedEntities.set(aliasVariant, existingTerm.name);\n \n contextChanges.push({\n entityType: 'term',\n entityId: existingTerm.id,\n entityName: existingTerm.name,\n action: 'updated',\n details: {\n addedAlias: aliasVariant,\n sounds_like: updatedVariants,\n },\n });\n \n // If term has associated projects, use for routing\n const termProjects = (existingTerm as { projects?: string[] }).projects || [];\n if (termProjects.length > 0) {\n const allProjects = ctx.contextInstance.getAllProjects();\n const primaryProject = allProjects.find(p => p.id === termProjects[0]);\n if (primaryProject?.routing?.destination) {\n state.routeDecision = {\n projectId: primaryProject.id,\n destination: {\n path: primaryProject.routing.destination,\n structure: 'month'\n },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: existingTerm.name, weight: 1.0 }],\n reasoning: `User linked \"${aliasVariant}\" as alias for term \"${existingTerm.name}\" associated with project \"${primaryProject.name}\"`,\n };\n }\n }\n } catch (error) {\n logger.warn('Failed to add alias to existing term: %s', error);\n }\n } else {\n logger.warn('Could not find existing term \"%s\" to link alias', existingTermName);\n }\n \n } else if (wizardResult.action === 'link' && typeof wizardResult.linkedProjectIndex === 'number') {\n // LINK TO EXISTING PROJECT\n if (knownProjects && wizardResult.linkedProjectIndex < knownProjects.length) {\n const linkedProject = knownProjects[wizardResult.linkedProjectIndex];\n \n // Add the term as an alias\n const existingPhrases = linkedProject.classification?.explicit_phrases || [];\n const updatedPhrases = [...existingPhrases, termName.toLowerCase()]\n .filter((v, i, a) => a.indexOf(v) === i); // dedupe\n \n const updatedProject = {\n ...linkedProject,\n type: 'project' as const,\n // Add term description to project notes if provided\n notes: wizardResult.termDescription \n ? `${linkedProject.description || ''}\\n\\n${termName}: ${wizardResult.termDescription}`.trim()\n : linkedProject.description,\n classification: {\n ...linkedProject.classification,\n context_type: (linkedProject.classification?.context_type || 'work') as 'work' | 'personal' | 'mixed',\n explicit_phrases: updatedPhrases,\n },\n routing: {\n // Preserve existing destination (or omit if not set)\n ...(linkedProject.routing?.destination && { destination: linkedProject.routing.destination }),\n structure: (linkedProject.routing?.structure || 'month') as 'none' | 'year' | 'month' | 'day',\n filename_options: (linkedProject.routing?.filename_options || ['date', 'time']) as Array<'date' | 'time' | 'subject'>,\n },\n };\n \n try {\n await ctx.contextInstance.saveEntity(updatedProject);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Linked \"%s\" to project \"%s\"', termName, linkedProject.name);\n \n contextChanges.push({\n entityType: 'project',\n entityId: linkedProject.id,\n entityName: linkedProject.name,\n action: 'updated',\n details: {\n addedAlias: termName,\n termDescription: wizardResult.termDescription,\n explicit_phrases: updatedPhrases,\n },\n });\n \n // Update routing to use the linked project\n if (linkedProject.routing?.destination) {\n state.routeDecision = {\n projectId: linkedProject.id,\n destination: { \n path: linkedProject.routing.destination, \n structure: 'month' \n },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: termName, weight: 1.0 }],\n reasoning: `User linked \"${termName}\" to existing project \"${linkedProject.name}\"`,\n };\n }\n } catch (error) {\n logger.warn('Failed to update project with alias: %s', error);\n }\n }\n } else if (wizardResult.action === 'term') {\n // CREATE NEW TERM ENTITY\n const termNameFinal = wizardResult.termName || termName;\n const termId = termNameFinal.toLowerCase().replace(/\\s+/g, '-');\n \n // Get project IDs from indices\n const projectIds: string[] = [];\n if (wizardResult.termProjects && knownProjects) {\n for (const idx of wizardResult.termProjects) {\n if (idx >= 0 && idx < knownProjects.length) {\n projectIds.push(knownProjects[idx].id);\n }\n }\n }\n \n // Handle nested project creation from term wizard\n if (wizardResult.createdProject?.action === 'create' && wizardResult.createdProject.projectName) {\n const projectName = wizardResult.createdProject.projectName;\n const projectId = projectName.toLowerCase().replace(/\\s+/g, '-');\n const projectDestination = wizardResult.createdProject.destination;\n \n const newProject = {\n id: projectId,\n name: projectName,\n type: 'project' as const,\n description: wizardResult.createdProject.description || `Project for \"${projectName}\"`,\n classification: {\n context_type: 'work' as const,\n explicit_phrases: [projectName.toLowerCase(), termNameFinal.toLowerCase()].filter((v, i, a) => a.indexOf(v) === i),\n },\n routing: {\n // Only include destination if explicitly provided - otherwise uses global default\n ...(projectDestination && { destination: projectDestination }),\n structure: 'month' as const,\n filename_options: ['date', 'time', 'subject'] as Array<'date' | 'time' | 'subject'>,\n },\n active: true,\n };\n \n try {\n await ctx.contextInstance.saveEntity(newProject);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Created new project from term wizard: %s%s', projectName, projectDestination ? ` -> ${projectDestination}` : ' (using default destination)');\n \n // Add the new project to the projectIds list for term association\n projectIds.push(projectId);\n \n contextChanges.push({\n entityType: 'project',\n entityId: projectId,\n entityName: projectName,\n action: 'created',\n details: {\n ...(projectDestination && { destination: projectDestination }),\n description: wizardResult.createdProject.description,\n createdForTerm: termNameFinal,\n },\n });\n \n // Update routing to use the new project (if destination was specified)\n if (projectDestination) {\n state.routeDecision = {\n projectId,\n destination: { path: projectDestination, structure: 'month' },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: termNameFinal, weight: 1.0 }],\n reasoning: `User created project \"${projectName}\" for term \"${termNameFinal}\"`,\n };\n }\n } catch (error) {\n logger.warn('Failed to save new project from term wizard: %s', error);\n }\n }\n \n const newTerm = {\n id: termId,\n name: termNameFinal,\n type: 'term' as const,\n expansion: wizardResult.termExpansion,\n notes: wizardResult.termDescription,\n projects: projectIds.length > 0 ? projectIds : undefined,\n sounds_like: [termName.toLowerCase()],\n };\n \n try {\n await ctx.contextInstance.saveEntity(newTerm);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Created new term: %s (projects: %s)', \n termNameFinal, \n projectIds.length > 0 ? projectIds.join(', ') : 'none'\n );\n \n contextChanges.push({\n entityType: 'term',\n entityId: termId,\n entityName: termNameFinal,\n action: 'created',\n details: {\n expansion: wizardResult.termExpansion,\n projects: projectIds,\n description: wizardResult.termDescription,\n },\n });\n \n // If term has associated projects and we haven't set routing yet, use the first one\n if (projectIds.length > 0 && !state.routeDecision) {\n // For newly created project, we already set routing above\n // For existing projects, look them up\n if (knownProjects) {\n const primaryProject = knownProjects.find(p => p.id === projectIds[0]);\n if (primaryProject?.routing?.destination) {\n state.routeDecision = {\n projectId: primaryProject.id,\n destination: { \n path: primaryProject.routing.destination, \n structure: 'month' \n },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: termNameFinal, weight: 1.0 }],\n reasoning: `User created term \"${termNameFinal}\" associated with project \"${primaryProject.name}\"`,\n };\n }\n }\n }\n } catch (error) {\n logger.warn('Failed to save new term: %s', error);\n }\n } else if (wizardResult.action === 'ignore' && wizardResult.ignoredTerm) {\n // IGNORE - add term to ignore list so user won't be asked again\n const ignoredTermName = wizardResult.ignoredTerm;\n const ignoredId = ignoredTermName.toLowerCase()\n .replace(/[^a-z0-9]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n \n const newIgnored = {\n id: ignoredId,\n name: ignoredTermName,\n type: 'ignored' as const,\n ignoredAt: new Date().toISOString(),\n };\n \n try {\n await ctx.contextInstance.saveEntity(newIgnored);\n await ctx.contextInstance.reload();\n logger.info('Added to ignore list: %s', ignoredTermName);\n \n contextChanges.push({\n entityType: 'ignored',\n entityId: ignoredId,\n entityName: ignoredTermName,\n action: 'created',\n details: {\n reason: 'User chose to ignore this term',\n },\n });\n } catch (error) {\n logger.warn('Failed to save ignored term: %s', error);\n }\n }\n // 'skip' action - do nothing\n }\n \n // Handle new person wizard response\n if (result.data?.clarificationType === 'new_person' && clarification.additionalInfo) {\n const personWizardResult = clarification.additionalInfo as {\n action: 'create' | 'skip';\n personName?: string;\n organization?: string;\n notes?: string;\n linkedProjectId?: string;\n linkedProjectIndex?: number;\n createdProject?: {\n action: 'create' | 'link' | 'skip';\n projectName?: string;\n destination?: string;\n description?: string;\n };\n };\n \n const knownProjects = result.data?.knownProjects as Array<{\n id: string;\n name: string;\n description?: string;\n classification?: { explicit_phrases?: string[]; context_type?: string };\n routing?: { destination: string; structure?: string; filename_options?: string[] };\n }> | undefined;\n \n if (personWizardResult.action === 'create') {\n let linkedProjectId: string | undefined;\n \n // First, handle any nested project creation\n if (personWizardResult.createdProject?.action === 'create' && personWizardResult.createdProject.projectName) {\n const projectName = personWizardResult.createdProject.projectName;\n const projectId = projectName.toLowerCase().replace(/\\s+/g, '-');\n const projectDestination = personWizardResult.createdProject.destination;\n \n const newProject = {\n id: projectId,\n name: projectName,\n type: 'project' as const,\n description: personWizardResult.createdProject.description || `Project for \"${projectName}\"`,\n classification: {\n context_type: 'work' as const,\n explicit_phrases: [projectName.toLowerCase()],\n },\n routing: {\n // Only include destination if explicitly provided - otherwise uses global default\n ...(projectDestination && { destination: projectDestination }),\n structure: 'month' as const,\n filename_options: ['date', 'time', 'subject'] as Array<'date' | 'time' | 'subject'>,\n },\n active: true,\n };\n \n try {\n await ctx.contextInstance.saveEntity(newProject);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Created new project from person wizard: %s%s', projectName, projectDestination ? ` -> ${projectDestination}` : ' (using default destination)');\n linkedProjectId = projectId;\n \n contextChanges.push({\n entityType: 'project',\n entityId: projectId,\n entityName: projectName,\n action: 'created',\n details: {\n ...(projectDestination && { destination: projectDestination }),\n description: personWizardResult.createdProject.description,\n createdForPerson: personWizardResult.personName,\n },\n });\n \n // Update routing to use the new project (if destination was specified)\n if (projectDestination) {\n state.routeDecision = {\n projectId,\n destination: { path: projectDestination, structure: 'month' },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: projectName, weight: 1.0 }],\n reasoning: `User created project \"${projectName}\" for person \"${personWizardResult.personName}\"`,\n };\n }\n } catch (error) {\n logger.warn('Failed to save new project from person wizard: %s', error);\n }\n } else if (typeof personWizardResult.linkedProjectIndex === 'number' && knownProjects) {\n // User linked to existing project\n if (personWizardResult.linkedProjectIndex < knownProjects.length) {\n const linkedProject = knownProjects[personWizardResult.linkedProjectIndex];\n linkedProjectId = linkedProject.id;\n \n // Update routing to use the linked project\n if (linkedProject.routing?.destination) {\n state.routeDecision = {\n projectId: linkedProject.id,\n destination: { \n path: linkedProject.routing.destination, \n structure: 'month' \n },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: personWizardResult.personName || termName, weight: 1.0 }],\n reasoning: `User linked person \"${personWizardResult.personName}\" to project \"${linkedProject.name}\"`,\n };\n }\n }\n }\n \n // Now save the person\n const personName = personWizardResult.personName || termName;\n const personId = personName.toLowerCase().replace(/\\s+/g, '-');\n \n const newPerson = {\n id: personId,\n name: personName,\n type: 'person' as const,\n organization: personWizardResult.organization,\n notes: personWizardResult.notes,\n projects: linkedProjectId ? [linkedProjectId] : [],\n sounds_like: [termName.toLowerCase()],\n };\n \n try {\n await ctx.contextInstance.saveEntity(newPerson);\n await ctx.contextInstance.reload(); // Reload so subsequent searches find this entity\n logger.info('Created new person: %s (org: %s, project: %s)', \n personName, \n personWizardResult.organization || 'none',\n linkedProjectId || 'none'\n );\n \n // Update resolved entities with correct name\n state.resolvedEntities.set(termName, personName);\n \n contextChanges.push({\n entityType: 'person',\n entityId: personId,\n entityName: personName,\n action: 'created',\n details: {\n organization: personWizardResult.organization,\n linkedProject: linkedProjectId,\n notes: personWizardResult.notes,\n heardAs: termName,\n },\n });\n } catch (error) {\n logger.warn('Failed to save new person: %s', error);\n }\n }\n // 'skip' action - do nothing\n }\n }\n }\n \n // Update state based on tool results\n if (result.data?.person) {\n state.resolvedEntities.set(result.data.person.name, result.data.suggestion);\n // Track person entity reference\n state.referencedEntities.people.add(result.data.person.id);\n }\n \n // Track term entities\n if (result.data?.term) {\n state.referencedEntities.terms.add(result.data.term.id);\n }\n \n // Track company entities\n if (result.data?.company) {\n state.referencedEntities.companies.add(result.data.company.id);\n }\n \n // Capture routing from route_note tool\n if (result.data?.routingDecision?.destination) {\n const routingDecision = result.data.routingDecision;\n state.routeDecision = {\n projectId: routingDecision.projectId,\n destination: routingDecision.destination,\n confidence: routingDecision.confidence || 1.0,\n signals: routingDecision.signals,\n reasoning: routingDecision.reasoning || 'Determined by route_note tool',\n };\n \n // Track project if routing decision includes it\n if (routingDecision.projectId) {\n state.referencedEntities.projects.add(routingDecision.projectId);\n }\n }\n \n // Capture routing from lookup_project when project has routing config\n if (result.data?.found && result.data?.project?.routing?.destination) {\n const project = result.data.project;\n state.routeDecision = {\n projectId: project.id,\n destination: { \n path: project.routing.destination,\n structure: project.routing.structure || 'month',\n },\n confidence: 1.0,\n signals: [{ type: 'explicit_phrase', value: project.name, weight: 1.0 }],\n reasoning: `Matched project \"${project.name}\" with routing to ${project.routing.destination}`,\n };\n logger.debug('Captured routing from project lookup: %s -> %s', \n project.name, project.routing.destination);\n \n // Track project entity reference\n state.referencedEntities.projects.add(project.id);\n }\n \n } catch (error) {\n logger.error('Tool execution failed', { tool: toolCall.name, error });\n toolResults.push({ \n id: toolCall.id, \n name: toolCall.name, \n result: JSON.stringify({ error: String(error) }) \n });\n }\n }\n \n // Add tool results to conversation\n for (const tr of toolResults) {\n conversation.addToolResult(tr.id, tr.result, tr.name);\n }\n \n // Build continuation prompt with full context\n const continuationPrompt = `Tool results received. Here's a reminder of your task:\n\nORIGINAL TRANSCRIPT (process this):\n--- BEGIN TRANSCRIPT ---\n${transcriptText}\n--- END TRANSCRIPT ---\n\nCorrections made so far: ${state.resolvedEntities.size > 0 ? Array.from(state.resolvedEntities.entries()).map(([k, v]) => `${k} -> ${v}`).join(', ') : 'none yet'}\n\nContinue analyzing. If you need more information, use the tools. \nWhen you're done with tool calls, output the COMPLETE corrected transcript as Markdown.\nDo NOT summarize - include ALL original content with corrections applied.\n\nCRITICAL REMINDER: Your response must contain ONLY the transcript text. Do NOT include any commentary, explanations, or processing notes - those will leak into the user-facing document.`;\n\n conversation.addUserMessage(continuationPrompt);\n \n // Continue conversation with full context\n response = await reasoning.complete({\n systemPrompt,\n prompt: continuationPrompt,\n tools: registry.getToolDefinitions(),\n });\n \n // Track token usage\n if (response.usage) {\n totalTokens += response.usage.totalTokens;\n }\n \n // Add assistant response to conversation\n if (response.toolCalls && response.toolCalls.length > 0) {\n conversation.addAssistantWithToolCalls(\n response.content,\n toRiotToolCalls(response.toolCalls)\n );\n } else {\n conversation.addAssistantMessage(response.content);\n }\n }\n \n // Extract final corrected text\n if (response.content && response.content.length > 50) {\n // Clean the response to remove any leaked internal processing\n const cleanedContent = cleanResponseContent(response.content);\n \n if (cleanedContent !== response.content) {\n const removedChars = response.content.length - cleanedContent.length;\n logger.warn('Removed leaked internal processing from response (%d -> %d chars, removed %d chars)',\n response.content.length, cleanedContent.length, removedChars);\n \n // Detect severe corruption (>10% of content removed or suspicious patterns)\n const corruptionRatio = removedChars / response.content.length;\n const hasSuspiciousUnicode = /[\\u0530-\\u058F\\u0E00-\\u0E7F\\u4E00-\\u9FFF\\u0A80-\\u0AFF\\u0C00-\\u0C7F]/.test(response.content);\n \n if (corruptionRatio > 0.1 || hasSuspiciousUnicode) {\n logger.error('SEVERE CORRUPTION DETECTED in LLM response (%.1f%% removed, suspicious unicode: %s)',\n corruptionRatio * 100, hasSuspiciousUnicode);\n logger.error('Raw response preview (first 500 chars): %s', \n response.content.substring(0, 500).replace(/\\n/g, '\\\\n'));\n }\n }\n \n state.correctedText = cleanedContent;\n state.confidence = 0.9;\n logger.debug('Final transcript generated: %d characters', cleanedContent.length);\n } else {\n // Model didn't produce content - ask for it explicitly\n logger.debug('Model did not produce transcript, requesting explicitly...');\n \n const finalRequest = `Please output the COMPLETE corrected transcript now.\n\nORIGINAL:\n${transcriptText}\n\nCORRECTIONS TO APPLY:\n${state.resolvedEntities.size > 0 ? Array.from(state.resolvedEntities.entries()).map(([k, v]) => `- \"${k}\" should be \"${v}\"`).join('\\n') : 'None identified'}\n\nOutput the full transcript as clean Markdown. Do NOT summarize.\n\nCRITICAL: Your response must contain ONLY the corrected transcript text - absolutely no commentary, tool information, or explanations.`;\n\n const finalResponse = await reasoning.complete({\n systemPrompt,\n prompt: finalRequest,\n });\n \n // Track token usage\n if (finalResponse.usage) {\n totalTokens += finalResponse.usage.totalTokens;\n }\n \n // Clean the final response as well\n const cleanedFinalContent = cleanResponseContent(finalResponse.content || transcriptText);\n \n if (cleanedFinalContent !== finalResponse.content) {\n const removedChars = (finalResponse.content?.length || 0) - cleanedFinalContent.length;\n logger.warn('Removed leaked internal processing from final response (%d -> %d chars, removed %d chars)',\n finalResponse.content?.length || 0, cleanedFinalContent.length, removedChars);\n \n // Detect severe corruption\n const corruptionRatio = removedChars / (finalResponse.content?.length || 1);\n const hasSuspiciousUnicode = /[\\u0530-\\u058F\\u0E00-\\u0E7F\\u4E00-\\u9FFF\\u0A80-\\u0AFF\\u0C00-\\u0C7F]/.test(finalResponse.content || '');\n \n if (corruptionRatio > 0.1 || hasSuspiciousUnicode) {\n logger.error('SEVERE CORRUPTION DETECTED in final LLM response (%.1f%% removed, suspicious unicode: %s)',\n corruptionRatio * 100, hasSuspiciousUnicode);\n logger.error('Raw response preview (first 500 chars): %s', \n (finalResponse.content || '').substring(0, 500).replace(/\\n/g, '\\\\n'));\n }\n }\n \n state.correctedText = cleanedFinalContent;\n state.confidence = 0.8;\n }\n \n } catch (error) {\n logger.error('Agentic processing failed', { error });\n // Fall back to original text\n state.correctedText = transcriptText;\n state.confidence = 0.5;\n }\n \n return {\n enhancedText: state.correctedText,\n state,\n toolsUsed: [...new Set(toolsUsed)],\n iterations,\n totalTokens: totalTokens > 0 ? totalTokens : undefined,\n contextChanges: contextChanges.length > 0 ? contextChanges : undefined,\n };\n };\n \n return { process };\n};\n\n","/**\n * Agentic Transcription Types\n *\n * Types for tool-based transcription enhancement.\n * Includes Zod schemas for validation and documentation.\n */\n\nimport { z } from 'zod';\nimport * as Context from '../context';\nimport * as Routing from '../routing';\nimport * as Interactive from '../interactive';\n\n// ============================================================================\n// Zod Schemas for Structured Outputs\n// ============================================================================\n\n/**\n * Schema for a corrected entity (spelling/name correction)\n */\nexport const CorrectedEntitySchema = z.object({\n original: z.string().describe('Original text from transcript'),\n corrected: z.string().describe('Corrected spelling/name'),\n type: z.enum(['person', 'project', 'term', 'company']).describe('Entity type'),\n confidence: z.number().min(0).max(1).describe('Confidence in correction'),\n});\n\nexport type CorrectedEntity = z.infer<typeof CorrectedEntitySchema>;\n\n/**\n * Schema for routing decision\n * Note: Uses the existing ClassificationSignal types from routing/types.ts\n */\nexport const RoutingDecisionSchema = z.object({\n projectId: z.string().optional().describe('Matched project ID'),\n destination: z.object({\n path: z.string().describe('File destination path'),\n structure: z.enum(['none', 'year', 'month', 'day']).default('month'),\n }),\n confidence: z.number().min(0).max(1).describe('Confidence in routing'),\n signals: z.array(z.object({\n type: z.enum(['explicit_phrase', 'associated_person', 'associated_company', 'topic', 'context_type']),\n value: z.string(),\n weight: z.number(),\n })).optional(),\n reasoning: z.string().optional().describe('Why this destination was chosen'),\n});\n\nexport type RoutingDecision = z.infer<typeof RoutingDecisionSchema>;\n\n/**\n * Schema for referenced entities\n */\nexport const ReferencedEntitiesSchema = z.object({\n people: z.array(z.string()).describe('IDs of people mentioned'),\n projects: z.array(z.string()).describe('IDs of projects mentioned'),\n terms: z.array(z.string()).describe('IDs of terms mentioned'),\n companies: z.array(z.string()).describe('IDs of companies mentioned'),\n});\n\nexport type ReferencedEntitiesOutput = z.infer<typeof ReferencedEntitiesSchema>;\n\n/**\n * Schema for tool result data\n */\nexport const ToolResultSchema = z.object({\n success: z.boolean(),\n data: z.any().optional(),\n error: z.string().optional(),\n needsUserInput: z.boolean().optional(),\n userPrompt: z.string().optional(),\n});\n\n// ============================================================================\n// TypeScript Interfaces (existing, preserved for compatibility)\n// ============================================================================\n\nexport interface TranscriptionTool {\n name: string;\n description: string;\n \n parameters: Record<string, any>; // JSON Schema\n \n execute: (args: any) => Promise<ToolResult>;\n}\n\nexport interface ToolContext {\n transcriptText: string;\n audioDate: Date;\n sourceFile: string;\n contextInstance: Context.ContextInstance;\n routingInstance: Routing.RoutingInstance;\n interactiveMode: boolean;\n interactiveInstance?: Interactive.InteractiveInstance;\n resolvedEntities?: Map<string, string>; // Entities resolved during this session\n}\n\nexport interface ToolResult {\n success: boolean;\n \n data?: any;\n error?: string;\n needsUserInput?: boolean;\n userPrompt?: string;\n}\n\nexport interface ReferencedEntity {\n id: string;\n name: string;\n type: 'person' | 'project' | 'term' | 'company';\n}\n\nexport interface TranscriptionState {\n originalText: string;\n correctedText: string;\n unknownEntities: string[];\n resolvedEntities: Map<string, string>; // name mapping (old -> new)\n \n routeDecision?: RoutingDecision;\n confidence: number;\n \n // Track all entities referenced during processing\n referencedEntities: {\n people: Set<string>; // IDs of people mentioned\n projects: Set<string>; // IDs of projects mentioned\n terms: Set<string>; // IDs of terms mentioned\n companies: Set<string>; // IDs of companies mentioned\n };\n}\n\n","/**\n * Agentic Transcription System\n * \n * Main entry point for the agentic transcription system. Provides tool-based\n * enhancement of transcripts using reasoning models.\n * \n * The agentic approach means the model queries context via tools rather than\n * receiving all context upfront in the prompt. This allows for:\n * - Smaller prompt sizes\n * - More targeted context retrieval \n * - Better handling of large context sets\n */\n\nimport { ToolContext, TranscriptionState } from './types';\nimport * as Executor from './executor';\nimport * as Registry from './registry';\nimport * as Reasoning from '../reasoning';\n\nexport interface ContextChangeRecord {\n entityType: 'person' | 'project' | 'company' | 'term' | 'ignored';\n entityId: string;\n entityName: string;\n action: 'created' | 'updated';\n details?: Record<string, unknown>;\n}\n\nexport interface AgenticInstance {\n process(transcriptText: string): Promise<{\n enhancedText: string;\n state: TranscriptionState;\n toolsUsed: string[];\n iterations: number;\n totalTokens?: number;\n contextChanges?: ContextChangeRecord[];\n }>;\n getAvailableTools(): string[];\n}\n\n/**\n * Create an agentic executor from a ToolContext\n * This is the primary factory method - always agentic, no flags needed\n */\nexport const create = (\n reasoning: Reasoning.ReasoningInstance,\n toolContext: ToolContext\n): AgenticInstance => {\n const executor = Executor.create(reasoning, toolContext);\n \n return {\n process: (transcriptText: string) => executor.process(transcriptText),\n \n getAvailableTools: () => {\n const registry = Registry.create(toolContext);\n return registry.getTools().map(t => t.name);\n },\n };\n};\n\n// Re-export types\nexport * from './types';\n\n","/**\n * Complete Phase\n * \n * Handles post-processing completion: moving audio files to the processed directory\n * after successful transcription.\n */\n\nimport * as path from 'node:path';\nimport * as Logging from '@/logging';\nimport * as Storage from '@/util/storage';\n\nexport type FilesystemStructure = 'none' | 'year' | 'month' | 'day';\n\nexport interface CompleteConfig {\n processedDirectory: string;\n outputStructure?: FilesystemStructure;\n dryRun?: boolean;\n}\n\nexport interface Instance {\n complete(audioFile: string, hash: string, creationTime: Date, subject?: string): Promise<string>;\n}\n\nexport const create = (config: CompleteConfig): Instance => {\n const logger = Logging.getLogger();\n const storage = Storage.create({ log: logger.debug });\n\n // Build directory path matching output structure (year/month)\n const buildDirectoryPath = (date: Date): string => {\n const structure = config.outputStructure || 'month';\n const year = date.getFullYear().toString();\n const month = (date.getMonth() + 1).toString();\n const day = date.getDate().toString();\n\n switch (structure) {\n case 'none':\n return config.processedDirectory;\n case 'year':\n return path.join(config.processedDirectory, year);\n case 'month':\n return path.join(config.processedDirectory, year, month);\n case 'day':\n return path.join(config.processedDirectory, year, month, day);\n }\n };\n\n // Format date portion of filename based on directory structure\n // Don't repeat info already in the path\n const formatDateForFilename = (date: Date): string => {\n const structure = config.outputStructure || 'month';\n const pad = (n: number) => n.toString().padStart(2, '0');\n const year = date.getFullYear().toString();\n const month = pad(date.getMonth() + 1);\n const day = pad(date.getDate());\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n\n switch (structure) {\n case 'day':\n // Path has year/month/day - only time in filename\n return `${hours}${minutes}`;\n case 'month':\n // Path has year/month - day and time in filename\n return `${day}-${hours}${minutes}`;\n case 'year':\n // Path has year - month, day and time in filename\n return `${month}-${day}-${hours}${minutes}`;\n case 'none':\n // No date in path - full date in filename (YYYY-MM-DD-HHmm)\n return `${year}-${month}-${day}-${hours}${minutes}`;\n }\n };\n\n // Strip date prefix and hash suffix from subject if already present\n // This handles cases where subject comes from an already-formatted filename\n const cleanSubjectOfPatterns = (subject: string): string => {\n let cleaned = subject;\n \n // Remove common date-time prefixes (try most specific first):\n // - YYYY-MM-DD-HHmm- (e.g., \"2026-01-14-2330-\")\n // - YYMMDD-HHmm- (e.g., \"260114-2330-\") \n // - MM-DD-HHmm- (e.g., \"01-14-2330-\")\n // - DD-HHmm- (e.g., \"14-2330-\" or \"15-1435-\")\n // - HHmm- (e.g., \"2330-\")\n \n // Pattern 1: YYYY-MM-DD-HHmm- (full ISO-like date with time)\n cleaned = cleaned.replace(/^\\d{4}-\\d{2}-\\d{2}-\\d{4}-/, '');\n \n // Pattern 2: YYMMDD-HHmm- (compact date with time)\n cleaned = cleaned.replace(/^\\d{6}-\\d{4}-/, '');\n \n // Pattern 3: MM-DD-HHmm- (month-day-time)\n cleaned = cleaned.replace(/^\\d{2}-\\d{2}-\\d{4}-/, '');\n \n // Pattern 4: DD-HHmm- (day-time, most common for 'month' structure)\n // This matches patterns like \"15-1435-\" where 15 is day and 1435 is HHmm\n cleaned = cleaned.replace(/^\\d{1,2}-\\d{4}-/, '');\n \n // Pattern 5: Just HHmm- at the start (time only)\n cleaned = cleaned.replace(/^\\d{4}-/, '');\n \n // Remove hash suffix (5-8 hex characters at end, preceded by dash)\n cleaned = cleaned.replace(/-[a-f0-9]{5,8}$/i, '');\n \n // Clean up any leading dashes that might remain\n cleaned = cleaned.replace(/^-+/, '');\n \n return cleaned;\n };\n\n const complete = async (\n audioFile: string, \n hash: string, \n creationTime: Date, \n subject?: string\n ): Promise<string> => {\n logger.debug('Completing file processing for %s', audioFile);\n\n if (config.dryRun) {\n logger.info('Dry run: would move %s to processed directory', audioFile);\n return audioFile;\n }\n\n if (!config.processedDirectory) {\n logger.debug('No processed directory configured, skipping file move');\n return audioFile;\n }\n\n // Build the target directory path with year/month structure\n const targetDir = buildDirectoryPath(creationTime);\n\n // Create the target directory if it doesn't exist\n if (!await storage.exists(targetDir)) {\n logger.debug('Creating processed directory %s', targetDir);\n await storage.createDirectory(targetDir);\n }\n\n // Get the file extension\n const fileExt = path.extname(audioFile);\n\n // Format date for filename (adjusted based on directory structure)\n const dateStr = formatDateForFilename(creationTime);\n\n // Create new filename: <date>-<subject>-<hash>\n // Hash is at the end for easier correlation with output files\n // Clean subject by removing special characters and spaces\n // Also strip any existing date/hash patterns from the subject\n const shortHash = hash.substring(0, 6);\n let newFilename: string;\n if (subject) {\n // First strip any existing date prefixes and hash suffixes\n const strippedSubject = cleanSubjectOfPatterns(subject);\n const cleanSubject = strippedSubject\n .replace(/[^a-zA-Z0-9]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase()\n .substring(0, 50);\n \n // Only include subject if there's something left after cleaning\n if (cleanSubject) {\n newFilename = `${dateStr}-${cleanSubject}-${shortHash}${fileExt}`;\n } else {\n newFilename = `${dateStr}-${shortHash}${fileExt}`;\n }\n } else {\n newFilename = `${dateStr}-${shortHash}${fileExt}`;\n }\n \n const newFilePath = path.join(targetDir, newFilename);\n\n try {\n // Read the original file\n const fileContent = await storage.readFile(audioFile, 'binary');\n\n // Write to the new location\n logger.debug('Moving file from %s to %s', audioFile, newFilePath);\n await storage.writeFile(newFilePath, fileContent, 'binary');\n\n // Remove the original file\n await storage.deleteFile(audioFile);\n\n logger.info('Moved to processed: %s', newFilePath);\n return newFilePath;\n } catch (error) {\n logger.error('Failed to move file to processed directory: %s', error);\n // Don't fail the whole process, just log the error\n return audioFile;\n }\n };\n\n return {\n complete,\n };\n};\n\n","/**\n * Pipeline Orchestrator\n *\n * Orchestrates the intelligent transcription pipeline, coordinating\n * all the modules: context, routing, transcription, reasoning,\n * agentic tools, interactive mode, output management, and reflection.\n * \n * THIS IS THE MAIN PROCESSING FLOW - NOT DEAD CODE!\n */\n\nimport { PipelineConfig, PipelineInput, PipelineResult, PipelineState } from './types';\nimport * as Context from '../context';\nimport * as Routing from '../routing';\nimport * as Interactive from '../interactive';\nimport * as Output from '../output';\nimport * as Reflection from '../reflection';\nimport * as Transcription from '../transcription';\nimport * as Reasoning from '../reasoning';\nimport * as Agentic from '../agentic';\nimport * as CompletePhase from '../phases/complete';\nimport * as Logging from '../logging';\nimport * as Metadata from '../util/metadata';\n\nexport interface OrchestratorInstance {\n process(input: PipelineInput): Promise<PipelineResult>;\n}\n\nexport interface OrchestratorConfig extends PipelineConfig {\n outputDirectory: string;\n outputStructure: string;\n outputFilenameOptions: string[];\n maxAudioSize: number;\n tempDirectory: string;\n}\n\nexport const create = async (config: OrchestratorConfig): Promise<OrchestratorInstance> => {\n const logger = Logging.getLogger();\n const currentWorkingDir = globalThis.process.cwd();\n \n logger.debug('Initializing intelligent transcription pipeline...');\n \n // Initialize context system (async)\n const context = await Context.create({\n startingDir: config.contextDirectory || currentWorkingDir,\n });\n logger.debug('Context system initialized - ready to query entities via tools');\n \n // Default routing configuration (used as fallback for projects without custom destination)\n const defaultPath = config.outputDirectory || '~/notes';\n const defaultStructure = (config.outputStructure || 'month') as Routing.FilesystemStructure;\n const defaultFilenameOptions = (config.outputFilenameOptions || ['date', 'time', 'subject']) as Routing.FilenameOption[];\n\n // Convert context projects to routing format\n // Projects without a destination inherit from the global default\n const contextProjects = context.getAllProjects();\n const routingProjects: Routing.ProjectRoute[] = contextProjects\n .filter(project => project.active !== false)\n .map(project => ({\n projectId: project.id,\n destination: {\n path: project.routing?.destination || defaultPath,\n structure: project.routing?.structure || defaultStructure,\n filename_options: project.routing?.filename_options || defaultFilenameOptions,\n createDirectories: true,\n },\n classification: project.classification,\n active: project.active,\n auto_tags: project.routing?.auto_tags,\n }));\n \n logger.debug('Loaded %d projects from context for routing', routingProjects.length);\n \n // Initialize routing with config-based defaults\n const routingConfig: Routing.RoutingConfig = {\n default: {\n path: defaultPath,\n structure: defaultStructure,\n filename_options: defaultFilenameOptions,\n createDirectories: true,\n },\n projects: routingProjects,\n conflict_resolution: 'primary',\n };\n \n const routing = Routing.create(routingConfig, context);\n logger.debug('Routing system initialized');\n \n const interactive = Interactive.create(\n { enabled: config.interactive, defaultToSuggestion: true, silent: config.silent },\n context\n );\n \n const output = Output.create({\n intermediateDir: config.intermediateDir || './output/protokoll',\n keepIntermediates: config.keepIntermediates ?? true,\n timestampFormat: 'YYMMDD-HHmm',\n });\n logger.debug('Output manager initialized');\n \n const reflection = config.selfReflection \n ? Reflection.create({\n enabled: true,\n format: 'markdown',\n includeConversation: false,\n includeOutput: true,\n })\n : null;\n if (reflection) {\n logger.debug('Self-reflection system enabled');\n }\n \n // Initialize transcription service\n const transcription = Transcription.create({\n defaultModel: config.transcriptionModel as Transcription.TranscriptionModel,\n });\n logger.debug('Transcription service initialized with model: %s', config.transcriptionModel);\n \n // Initialize reasoning for agentic processing\n const reasoning = Reasoning.create({ \n model: config.model,\n reasoningLevel: config.reasoningLevel,\n });\n logger.debug('Reasoning system initialized with model: %s, reasoning level: %s', config.model, config.reasoningLevel || 'medium');\n\n // Initialize complete phase for moving files to processed directory\n // Pass outputStructure so processed files use the same directory structure as output\n const complete = config.processedDirectory \n ? CompletePhase.create({\n processedDirectory: config.processedDirectory,\n outputStructure: config.outputStructure as CompletePhase.FilesystemStructure,\n dryRun: config.dryRun,\n })\n : null;\n if (complete) {\n logger.debug('Complete phase initialized with processed directory: %s', config.processedDirectory);\n }\n \n // Helper to extract a human-readable title from the output path\n const extractTitleFromPath = (outputPath: string): string | undefined => {\n const filename = outputPath.split('/').pop()?.replace('.md', '');\n if (!filename) return undefined;\n \n // Remove date prefix (e.g., \"27-0716-\" from \"27-0716-meeting-notes\")\n const withoutDate = filename.replace(/^\\d{2}-\\d{4}-/, '');\n if (!withoutDate) return undefined;\n \n // Convert kebab-case to Title Case\n return withoutDate\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n };\n\n const processInput = async (input: PipelineInput): Promise<PipelineResult> => {\n const startTime = Date.now();\n \n // Format progress prefix for log messages\n const progressPrefix = input.progress \n ? `[${input.progress.current}/${input.progress.total}]` \n : '';\n const log = (level: 'info' | 'debug', message: string, ...args: unknown[]) => {\n const prefixedMessage = progressPrefix ? `${progressPrefix} ${message}` : message;\n if (level === 'info') {\n logger.info(prefixedMessage, ...args);\n } else {\n logger.debug(prefixedMessage, ...args);\n }\n };\n \n log('info', 'Processing: %s (hash: %s)', input.audioFile, input.hash);\n \n // Initialize state\n const state: PipelineState = {\n input,\n startTime: new Date(),\n };\n \n // Start reflection collection if enabled\n if (reflection) {\n reflection.collector.start();\n }\n \n // Start interactive session if enabled\n if (config.interactive) {\n interactive.startSession();\n log('debug', 'Interactive session started');\n }\n \n try {\n // Step 1: Check onboarding needs\n log('debug', 'Checking onboarding state...');\n const onboardingState = interactive.checkNeedsOnboarding();\n if (onboardingState.needsOnboarding) {\n log('debug', 'First-run detected - onboarding may be triggered');\n }\n \n // Step 2: Raw transcription using Transcription module\n log('info', 'Transcribing audio...');\n const whisperStart = Date.now();\n \n const transcriptionResult = await transcription.transcribe(input.audioFile, {\n model: config.transcriptionModel as Transcription.TranscriptionModel,\n });\n state.rawTranscript = transcriptionResult.text;\n \n const whisperDuration = Date.now() - whisperStart;\n log('info', 'Transcription: %d chars in %.1fs', \n state.rawTranscript.length, whisperDuration / 1000);\n \n if (reflection) {\n reflection.collector.recordWhisper(whisperDuration);\n }\n \n // Step 3: Route detection\n log('debug', 'Determining routing destination...');\n const routingContext: Routing.RoutingContext = {\n transcriptText: state.rawTranscript || '',\n audioDate: input.creation,\n sourceFile: input.audioFile,\n hash: input.hash,\n };\n \n const routeResult = routing.route(routingContext);\n \n log('debug', 'Routing decision: project=%s, confidence=%.2f', \n routeResult.projectId || 'default', routeResult.confidence);\n \n // Record routing decision in reflection\n if (reflection) {\n reflection.collector.recordRoutingDecision({\n projectId: routeResult.projectId,\n destination: routeResult.destination.path,\n confidence: routeResult.confidence,\n reasoning: routeResult.reasoning,\n signals: routeResult.signals.map(s => ({\n type: s.type,\n value: s.value,\n weight: s.weight,\n })),\n alternativesConsidered: routeResult.alternateMatches?.map(alt => ({\n projectId: alt.projectId,\n confidence: alt.confidence,\n whyNotChosen: `Lower confidence (${(alt.confidence * 100).toFixed(1)}%)`,\n })),\n });\n }\n \n // Build output path\n const outputPath = routing.buildOutputPath(routeResult, routingContext);\n log('debug', 'Output path: %s', outputPath);\n \n // Step 4: Create output paths using Output module\n log('debug', 'Setting up output directories...');\n const paths = output.createOutputPaths(\n input.audioFile,\n outputPath,\n input.hash,\n input.creation\n );\n \n await output.ensureDirectories(paths);\n \n // Write raw transcript to intermediate (for debugging)\n await output.writeIntermediate(paths, 'transcript', {\n text: state.rawTranscript,\n model: config.transcriptionModel,\n duration: whisperDuration,\n });\n \n // Step 5: Agentic enhancement using real executor\n log('info', 'Enhancing with %s...', config.model);\n \n const agenticStart = Date.now();\n const toolContext: Agentic.ToolContext = {\n transcriptText: state.rawTranscript || '',\n audioDate: input.creation,\n sourceFile: input.audioFile,\n contextInstance: context,\n routingInstance: routing,\n interactiveMode: config.interactive,\n // Always pass interactive handler - it will handle enabled/disabled internally\n interactiveInstance: interactive,\n };\n \n const executor = Agentic.create(reasoning, toolContext);\n const agenticResult = await executor.process(state.rawTranscript || '');\n \n state.enhancedText = agenticResult.enhancedText;\n const toolsUsed = agenticResult.toolsUsed;\n const agenticDuration = Date.now() - agenticStart;\n \n // Record tool calls in reflection\n if (reflection) {\n for (const tool of toolsUsed) {\n reflection.collector.recordToolCall(tool, agenticDuration / toolsUsed.length, true);\n }\n reflection.collector.recordCorrection(state.rawTranscript || '', state.enhancedText);\n // Record token usage from agentic result\n if (agenticResult.totalTokens) {\n reflection.collector.recordModelResponse(config.model, agenticResult.totalTokens);\n }\n // Record context changes (new projects, entities created)\n if (agenticResult.contextChanges) {\n for (const change of agenticResult.contextChanges) {\n reflection.collector.recordContextChange(change);\n }\n }\n }\n \n // Write agentic session to intermediate\n await output.writeIntermediate(paths, 'session', {\n iterations: agenticResult.iterations,\n toolsUsed: agenticResult.toolsUsed,\n state: agenticResult.state,\n });\n \n // Step 5b: Check if agentic processing found a different route\n // (e.g., via lookup_project tool finding a project with custom destination)\n if (agenticResult.state.routeDecision?.destination?.path) {\n const agenticRoute = agenticResult.state.routeDecision;\n log('debug', 'Agentic processing found route: %s -> %s', \n agenticRoute.projectId || 'unknown', \n agenticRoute.destination.path\n );\n \n // Update routeResult with the agentic decision\n routeResult.projectId = agenticRoute.projectId || routeResult.projectId;\n routeResult.destination = {\n ...routeResult.destination,\n path: agenticRoute.destination.path,\n structure: agenticRoute.destination.structure || routeResult.destination.structure,\n };\n routeResult.confidence = agenticRoute.confidence || routeResult.confidence;\n routeResult.reasoning = agenticRoute.reasoning || routeResult.reasoning;\n if (agenticRoute.signals) {\n routeResult.signals = agenticRoute.signals;\n }\n \n // Rebuild output path with the new destination\n const newOutputPath = routing.buildOutputPath(routeResult, routingContext);\n log('debug', 'Updated output path: %s -> %s', outputPath, newOutputPath);\n \n // Recreate output paths with new destination\n const newPaths = output.createOutputPaths(\n input.audioFile,\n newOutputPath,\n input.hash,\n input.creation\n );\n await output.ensureDirectories(newPaths);\n \n // Update paths reference (reassign properties since paths is const)\n Object.assign(paths, newPaths);\n }\n\n // Step 5c: Write raw transcript to .transcript/ directory alongside final output\n // This is done AFTER the route is finalized so it goes to the correct location\n // Enables compare and reanalyze workflows\n log('debug', 'Writing raw transcript to .transcript/ directory...');\n await output.writeRawTranscript(paths, {\n text: state.rawTranscript,\n model: config.transcriptionModel,\n duration: whisperDuration,\n audioFile: input.audioFile,\n audioHash: input.hash,\n transcribedAt: new Date().toISOString(),\n });\n\n // Step 6: Write final output using Output module with metadata\n log('debug', 'Writing final transcript...');\n if (state.enhancedText) {\n // Build entity metadata from referenced entities\n const buildEntityReferences = (): Metadata.TranscriptMetadata['entities'] => {\n const refs = agenticResult.state.referencedEntities;\n if (!refs) return undefined;\n \n const entities: NonNullable<Metadata.TranscriptMetadata['entities']> = {\n people: [],\n projects: [],\n terms: [],\n companies: [],\n };\n \n // Convert sets of IDs to EntityReference arrays\n for (const personId of refs.people) {\n const person = context.getPerson(personId);\n if (person) {\n entities.people!.push({ id: person.id, name: person.name, type: 'person' });\n }\n }\n \n for (const projectId of refs.projects) {\n const project = context.getProject(projectId);\n if (project) {\n entities.projects!.push({ id: project.id, name: project.name, type: 'project' });\n }\n }\n \n for (const termId of refs.terms) {\n const term = context.getTerm(termId);\n if (term) {\n entities.terms!.push({ id: term.id, name: term.name, type: 'term' });\n }\n }\n \n for (const companyId of refs.companies) {\n const company = context.getCompany(companyId);\n if (company) {\n entities.companies!.push({ id: company.id, name: company.name, type: 'company' });\n }\n }\n \n // Only return if we found any entities\n const hasEntities = \n entities.people!.length > 0 ||\n entities.projects!.length > 0 ||\n entities.terms!.length > 0 ||\n entities.companies!.length > 0;\n \n return hasEntities ? entities : undefined;\n };\n \n // Build metadata from routing decision and input\n const transcriptMetadata: Metadata.TranscriptMetadata = {\n title: extractTitleFromPath(paths.final),\n projectId: routeResult.projectId || undefined,\n project: routeResult.projectId || undefined,\n date: input.creation,\n routing: Metadata.createRoutingMetadata(routeResult),\n tags: Metadata.extractTagsFromSignals(routeResult.signals),\n confidence: routeResult.confidence,\n entities: buildEntityReferences(),\n };\n \n await output.writeTranscript(paths, state.enhancedText, transcriptMetadata);\n }\n \n // Step 7: Generate reflection report\n log('debug', 'Generating reflection report...');\n let reflectionReport: Reflection.ReflectionReport | undefined;\n if (reflection) {\n reflectionReport = reflection.generate(\n input.audioFile,\n paths.final,\n undefined,\n state.enhancedText\n );\n \n if (paths.intermediate.reflection) {\n await reflection.save(reflectionReport, paths.intermediate.reflection);\n }\n }\n \n // Step 8: End interactive session\n log('debug', 'Finalizing session...');\n let session: Interactive.InteractiveSession | undefined;\n if (config.interactive) {\n session = interactive.endSession();\n log('debug', 'Interactive session ended: %d clarifications', session.responses.length);\n \n // Save session if path available\n if (paths.intermediate.session) {\n await output.writeIntermediate(paths, 'session', session);\n }\n }\n \n // Step 9: Cleanup if needed\n if (!config.keepIntermediates && !config.debug) {\n await output.cleanIntermediates(paths);\n }\n\n // Step 10: Move audio file to processed directory\n let processedAudioPath: string | undefined;\n if (complete) {\n // Extract subject from output path for naming\n const subject = paths.final.split('/').pop()?.replace('.md', '') || undefined;\n processedAudioPath = await complete.complete(\n input.audioFile, \n input.hash, \n input.creation,\n subject\n );\n }\n \n const processingTime = Date.now() - startTime;\n \n // Compact summary output\n log('info', 'Enhancement: %d iterations, %d tools, %.1fs', \n agenticResult.iterations, toolsUsed.length, agenticDuration / 1000);\n if (agenticResult.totalTokens) {\n log('info', 'Tokens: %d total', agenticResult.totalTokens);\n }\n log('info', 'Output: %s (%.1fs total)', paths.final, processingTime / 1000);\n \n return {\n outputPath: paths.final,\n enhancedText: state.enhancedText || '',\n rawTranscript: state.rawTranscript || '',\n routedProject: routeResult.projectId,\n routingConfidence: routeResult.confidence,\n processingTime,\n toolsUsed,\n correctionsApplied: agenticResult.state.resolvedEntities.size,\n processedAudioPath,\n reflection: reflectionReport,\n session,\n intermediatePaths: paths,\n };\n \n } catch (error) {\n logger.error('Pipeline error', { error });\n throw error;\n }\n };\n \n return { process: processInput };\n};\n","/**\n * Pipeline Integration\n *\n * Main entry point for the intelligent transcription pipeline.\n * Brings together all modules into a unified processing flow.\n * \n * THIS IS THE MAIN ENTRY POINT - USE Pipeline.create() IN protokoll.ts\n */\n\nimport { PipelineInput, PipelineResult } from './types';\nimport * as Orchestrator from './orchestrator';\n\nexport interface PipelineInstance {\n process(input: PipelineInput): Promise<PipelineResult>;\n}\n\nexport type { OrchestratorConfig } from './orchestrator';\n\nexport const create = async (config: Orchestrator.OrchestratorConfig): Promise<PipelineInstance> => {\n return Orchestrator.create(config);\n};\n\nexport const DEFAULT_PIPELINE_CONFIG: Partial<Orchestrator.OrchestratorConfig> = {\n model: 'gpt-5.2',\n transcriptionModel: 'whisper-1',\n interactive: false,\n selfReflection: true,\n debug: false,\n intermediateDir: './output/protokoll',\n keepIntermediates: true,\n outputDirectory: './output',\n outputStructure: 'month',\n outputFilenameOptions: ['date', 'time', 'subject'],\n maxAudioSize: 25 * 1024 * 1024,\n tempDirectory: '/tmp',\n};\n\n// Re-export types\nexport * from './types';\n\n","/**\n * Project Assist\n * \n * LLM-assisted project metadata generation for smart project creation.\n * \n * Two distinct generation functions:\n * - generateSoundsLike(): Phonetic variants of project NAME (for transcription correction)\n * - generateTriggerPhrases(): Content-matching phrases (for classification/routing)\n */\n\nimport { getLogger } from '../logging';\nimport * as OpenAI from '../util/openai';\nimport { SmartAssistanceConfig } from '../context/types';\nimport * as ContentFetcher from './content-fetcher';\n\nexport interface ProjectSuggestions {\n name?: string;\n soundsLike: string[]; // Phonetic variants of project name\n triggerPhrases: string[]; // Content-matching phrases\n topics?: string[];\n description?: string;\n}\n\nexport interface ProjectAssistInstance {\n generateSoundsLike(name: string): Promise<string[]>;\n generateTriggerPhrases(name: string): Promise<string[]>;\n analyzeSource(source: string, existingName?: string): Promise<ProjectSuggestions>;\n isAvailable(): boolean;\n}\n\ninterface ContentAnalysisResponse {\n name: string | null;\n topics: string[];\n description: string;\n}\n\nexport const create = (config: SmartAssistanceConfig): ProjectAssistInstance => {\n const logger = getLogger();\n const fetcher = ContentFetcher.create();\n \n const isAvailable = (): boolean => {\n return !!process.env.OPENAI_API_KEY && config.enabled;\n };\n\n const generateSoundsLike = async (name: string): Promise<string[]> => {\n if (!isAvailable()) {\n logger.debug('Smart assistance not available, skipping sounds_like generation');\n return [];\n }\n\n logger.debug('Generating phonetic variants (sounds_like) for: %s', name);\n\n const prompt = `The project name \"${name}\" will be spoken in audio recordings and transcribed by Whisper speech-to-text.\n\nGenerate phonetic variations that Whisper might produce when mishearing this project name. Include:\n- Common phonetic mishearings\n- How the name sounds in different accents\n- Alternate spellings a speech-to-text system might produce\n- Common transcription errors (dropped letters, substitutions)\n- Phonetically similar words\n\nThis is for correcting the PROJECT NAME when it's misheard, NOT for matching content.\n\nOutput ONLY a comma-separated list with no explanation, no quotes, no extra text.\nDo NOT include the original name in the list.\n\nExample for \"Protokoll\": protocol,pro to call,proto call,proto col,protocolle\nExample for \"Kubernetes\": cube a net ease,coober nettys,cube er netes,k8s\nExample for \"Grunnverk\": ground work,grundverk,grunnwerk,grunverk,groon verk`;\n\n try {\n const response = await OpenAI.createCompletion(\n [{ role: 'user', content: prompt }],\n { \n model: config.phoneticModel,\n reasoningLevel: 'low',\n maxTokens: 4000,\n reason: `phonetic variants for \"${name}\"`,\n }\n );\n\n // Parse comma-separated response\n const variants: string[] = response\n .split(',')\n .map((p: string) => p.trim().toLowerCase())\n .filter((p: string) => p.length > 0 && p.toLowerCase() !== name.toLowerCase());\n\n // Remove duplicates\n const uniqueVariants: string[] = [...new Set(variants)];\n\n logger.debug('Generated %d phonetic variants', uniqueVariants.length);\n return uniqueVariants;\n\n } catch (error: any) {\n logger.error('Failed to generate phonetic variants: %s', error.message);\n return [];\n }\n };\n\n const generateTriggerPhrases = async (name: string): Promise<string[]> => {\n if (!isAvailable()) {\n logger.debug('Smart assistance not available, skipping trigger phrase generation');\n return [];\n }\n\n logger.debug('Generating trigger phrases (content matching) for: %s', name);\n\n const prompt = `Generate trigger phrases for a project named \"${name}\".\n\nTrigger phrases are used to identify when audio content is ABOUT this project. These are phrases someone might say that indicate they're discussing this project.\n\nGenerate phrases that would appear in conversation about this project:\n- \"working on ${name.toLowerCase()}\"\n- \"${name.toLowerCase()} meeting\"\n- \"${name.toLowerCase()} project\"\n- Other contextual phrases that indicate the content is about this project\n\nDo NOT include phonetic variations of the name - those go in a separate field.\nFocus on CONTEXTUAL phrases that indicate content belongs to this project.\n\nOutput ONLY a comma-separated list with no explanation, no quotes, no extra text.\nInclude the project name in lowercase as the first item.\n\nExample for \"Protokoll\": protokoll,working on protokoll,protokoll project,protokoll meeting,discussing protokoll\nExample for \"Quarterly Planning\": quarterly planning,quarterly planning meeting,q1 planning,roadmap review`;\n\n try {\n const response = await OpenAI.createCompletion(\n [{ role: 'user', content: prompt }],\n { \n model: config.analysisModel,\n reasoningLevel: 'low',\n maxTokens: 4000,\n reason: `trigger phrases for \"${name}\"`,\n }\n );\n\n // Parse comma-separated response\n const phrases: string[] = response\n .split(',')\n .map((p: string) => p.trim().toLowerCase())\n .filter((p: string) => p.length > 0);\n\n // Ensure original name is included as first item\n if (!phrases.includes(name.toLowerCase())) {\n phrases.unshift(name.toLowerCase());\n }\n\n // Remove duplicates\n const uniquePhrases: string[] = [...new Set(phrases)];\n\n logger.debug('Generated %d trigger phrases', uniquePhrases.length);\n return uniquePhrases;\n\n } catch (error: any) {\n logger.error('Failed to generate trigger phrases: %s', error.message);\n // Return just the original name as fallback\n return [name.toLowerCase()];\n }\n };\n\n const analyzeSource = async (source: string, existingName?: string): Promise<ProjectSuggestions> => {\n if (!isAvailable()) {\n logger.debug('Smart assistance not available, skipping content analysis');\n return { soundsLike: [], triggerPhrases: [] };\n }\n\n // Fetch content from source (file path, URL, or directory)\n logger.debug('Fetching content from source: %s', source);\n const fetchResult = await fetcher.fetch(source);\n \n if (!fetchResult.success || !fetchResult.content) {\n logger.error('Failed to fetch content: %s', fetchResult.error);\n return { soundsLike: [], triggerPhrases: [] };\n }\n\n const content = fetchResult.content;\n logger.info('Fetched %d chars from %s', content.length, fetchResult.sourceName);\n logger.debug('Analyzing content with AI...');\n\n const nameInstruction = existingName \n ? `The project name is already known: \"${existingName}\". Set \"name\" to null in your response.`\n : `Extract or suggest a concise project name from the content. If the name is not obvious, suggest one based on the project's purpose.`;\n\n const prompt = `Analyze this project documentation and extract structured information.\n\n${nameInstruction}\n\nExtract the following:\n1. **topics**: A list of single-word or hyphenated keywords that describe what this project is about. Focus on technologies, concepts, and domains. Aim for 10-25 relevant keywords.\n2. **description**: A single paragraph (3-5 sentences) that provides context about what this project does, its purpose, and main features.\n\nDocumentation content:\n---\n${content}\n---\n\nRespond ONLY with valid JSON in this exact format:\n{\n \"name\": \"ProjectName or null\",\n \"topics\": [\"keyword1\", \"keyword2\", \"keyword3\"],\n \"description\": \"A concise paragraph describing the project...\"\n}`;\n\n try {\n const response = await OpenAI.createCompletion(\n [{ role: 'user', content: prompt }],\n { \n model: config.analysisModel,\n reasoningLevel: 'low',\n maxTokens: 3000,\n reason: 'content analysis',\n }\n );\n\n // Parse JSON response\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('No JSON found in response');\n }\n\n const parsed: ContentAnalysisResponse = JSON.parse(jsonMatch[0]);\n\n // Generate both sounds_like AND trigger phrases for the name\n const projectName = existingName || parsed.name || undefined;\n let soundsLike: string[] = [];\n let triggerPhrases: string[] = [];\n \n if (projectName) {\n // Generate in parallel for efficiency\n logger.debug('Generating phonetic and trigger phrases for: %s', projectName);\n [soundsLike, triggerPhrases] = await Promise.all([\n generateSoundsLike(projectName),\n generateTriggerPhrases(projectName),\n ]);\n }\n\n return {\n name: parsed.name || undefined,\n topics: parsed.topics || [],\n description: parsed.description || undefined,\n soundsLike,\n triggerPhrases,\n };\n\n } catch (error: any) {\n logger.error('Failed to analyze content: %s', error.message);\n \n // Return partial result with sounds_like and trigger phrases if we have a name\n if (existingName) {\n logger.debug('Generating phonetic and trigger phrases for existing name: %s', existingName);\n const [soundsLike, triggerPhrases] = await Promise.all([\n generateSoundsLike(existingName),\n generateTriggerPhrases(existingName),\n ]);\n return { soundsLike, triggerPhrases };\n }\n \n return { soundsLike: [], triggerPhrases: [] };\n }\n };\n\n return {\n generateSoundsLike,\n generateTriggerPhrases,\n analyzeSource,\n isAvailable,\n };\n};\n\n/**\n * Helper for showing progress during async operations\n */\nexport const withProgress = async <T>(\n message: string,\n operation: () => Promise<T>,\n print: (text: string) => void\n): Promise<T> => {\n print(`[${message}...]`);\n try {\n const result = await operation();\n return result;\n } finally {\n // Clear the progress message line (optional)\n }\n};\n","/**\n * Action CLI\n * \n * Provides commands for performing actions on existing transcripts:\n * - combine: Merge multiple transcripts into a single document\n * - (future: split, archive, etc.)\n * \n * The combine action preserves the timestamp of the first transcript\n * and can optionally change the project (with routing-aware relocation).\n */\n\nimport { Command } from 'commander';\nimport * as fs from 'fs/promises';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as Context from '../context';\nimport * as Routing from '../routing';\nimport { Project } from '../context/types';\n\n// Helper to print to stdout\nconst print = (text: string) => process.stdout.write(text + '\\n');\n\n/**\n * Parsed transcript structure\n */\nexport interface ParsedTranscript {\n filePath: string;\n title?: string;\n metadata: TranscriptMetadata;\n content: string;\n rawText: string;\n}\n\nexport interface TranscriptMetadata {\n date?: string;\n time?: string;\n project?: string;\n projectId?: string;\n destination?: string;\n confidence?: string;\n signals?: string[];\n reasoning?: string;\n tags?: string[];\n duration?: string;\n}\n\n/**\n * Parse a transcript file into its components\n */\nexport const parseTranscript = async (filePath: string): Promise<ParsedTranscript> => {\n const rawText = await fs.readFile(filePath, 'utf-8');\n const lines = rawText.split('\\n');\n \n const result: ParsedTranscript = {\n filePath,\n metadata: {},\n content: '',\n rawText,\n };\n \n let inMetadata = false;\n let inRouting = false;\n let contentStartIndex = 0;\n \n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n \n // Title detection (first # heading)\n if (!result.title && trimmed.startsWith('# ') && !trimmed.startsWith('## ')) {\n result.title = trimmed.slice(2).trim();\n continue;\n }\n \n // Metadata section start\n if (trimmed === '## Metadata') {\n inMetadata = true;\n continue;\n }\n \n // Routing subsection\n if (trimmed === '### Routing') {\n inRouting = true;\n continue;\n }\n \n // End of metadata section (horizontal rule)\n if (trimmed === '---' && inMetadata) {\n contentStartIndex = i + 1;\n inMetadata = false;\n inRouting = false;\n continue;\n }\n \n // Parse metadata fields\n if (inMetadata && trimmed.startsWith('**')) {\n const match = trimmed.match(/^\\*\\*([^*]+)\\*\\*:\\s*(.*)$/);\n if (match) {\n const [, key, value] = match;\n const normalizedKey = key.toLowerCase().replace(/\\s+/g, '');\n \n switch (normalizedKey) {\n case 'date':\n result.metadata.date = value;\n break;\n case 'time':\n result.metadata.time = value;\n break;\n case 'project':\n result.metadata.project = value;\n break;\n case 'projectid':\n // Remove backticks from project ID\n result.metadata.projectId = value.replace(/`/g, '');\n break;\n case 'destination':\n result.metadata.destination = value;\n break;\n case 'confidence':\n result.metadata.confidence = value;\n break;\n case 'reasoning':\n result.metadata.reasoning = value;\n break;\n case 'tags':\n // Parse tags from backtick-wrapped format\n result.metadata.tags = value.match(/`([^`]+)`/g)?.map(t => t.replace(/`/g, '')) || [];\n break;\n case 'duration':\n result.metadata.duration = value;\n break;\n }\n }\n }\n \n // Parse classification signals (list items under routing)\n if (inRouting && trimmed.startsWith('- ') && !trimmed.startsWith('**')) {\n if (!result.metadata.signals) {\n result.metadata.signals = [];\n }\n result.metadata.signals.push(trimmed.slice(2));\n }\n }\n \n // Extract content after metadata\n if (contentStartIndex > 0) {\n // Skip empty lines after ---\n while (contentStartIndex < lines.length && lines[contentStartIndex].trim() === '') {\n contentStartIndex++;\n }\n result.content = lines.slice(contentStartIndex).join('\\n').trim();\n } else {\n // No metadata section found, entire file is content\n result.content = rawText.trim();\n }\n \n return result;\n};\n\n/**\n * Extract the timestamp from a transcript filename\n * Expected format: DD-HHMM-subject.md (e.g., 15-1412-ne-4th-st-0.md)\n */\nexport const extractTimestampFromFilename = (filePath: string): { day: number; hour: number; minute: number } | null => {\n const basename = path.basename(filePath, '.md');\n const match = basename.match(/^(\\d{1,2})-(\\d{2})(\\d{2})/);\n \n if (match) {\n return {\n day: parseInt(match[1], 10),\n hour: parseInt(match[2], 10),\n minute: parseInt(match[3], 10),\n };\n }\n \n return null;\n};\n\n/**\n * Format metadata as Markdown heading section (matching util/metadata.ts format)\n */\nexport const formatMetadataMarkdown = (\n title: string,\n metadata: TranscriptMetadata,\n project?: Project\n): string => {\n const lines: string[] = [];\n \n // Title section\n lines.push(`# ${title}`);\n lines.push('');\n \n // Metadata frontmatter as readable markdown\n lines.push('## Metadata');\n lines.push('');\n \n // Date and Time\n if (metadata.date) {\n lines.push(`**Date**: ${metadata.date}`);\n }\n if (metadata.time) {\n lines.push(`**Time**: ${metadata.time}`);\n }\n \n lines.push('');\n \n // Project\n if (project) {\n lines.push(`**Project**: ${project.name}`);\n lines.push(`**Project ID**: \\`${project.id}\\``);\n lines.push('');\n } else if (metadata.project) {\n lines.push(`**Project**: ${metadata.project}`);\n if (metadata.projectId) {\n lines.push(`**Project ID**: \\`${metadata.projectId}\\``);\n }\n lines.push('');\n }\n \n // Routing Information\n if (metadata.destination) {\n lines.push('### Routing');\n lines.push('');\n lines.push(`**Destination**: ${metadata.destination}`);\n if (metadata.confidence) {\n lines.push(`**Confidence**: ${metadata.confidence}`);\n }\n lines.push('');\n \n if (metadata.signals && metadata.signals.length > 0) {\n lines.push('**Classification Signals**:');\n for (const signal of metadata.signals) {\n lines.push(`- ${signal}`);\n }\n lines.push('');\n }\n \n if (metadata.reasoning) {\n lines.push(`**Reasoning**: ${metadata.reasoning}`);\n lines.push('');\n }\n }\n \n // Tags\n if (metadata.tags && metadata.tags.length > 0) {\n lines.push('**Tags**: ' + metadata.tags.map(tag => `\\`${tag}\\``).join(', '));\n lines.push('');\n }\n \n // Duration\n if (metadata.duration) {\n lines.push(`**Duration**: ${metadata.duration}`);\n lines.push('');\n }\n \n // Separator\n lines.push('---');\n lines.push('');\n \n return lines.join('\\n');\n};\n\n/**\n * Slugify a title for use in filenames\n */\nexport const slugifyTitle = (title: string): string => {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') // Replace non-alphanumeric with dash\n .replace(/--+/g, '-') // Collapse multiple dashes\n .replace(/^-|-$/g, '') // Remove leading/trailing dashes\n .slice(0, 50); // Limit length\n};\n\n/**\n * Combine multiple transcripts into a single document\n */\nexport const combineTranscripts = async (\n filePaths: string[],\n options: {\n projectId?: string;\n title?: string;\n dryRun?: boolean;\n verbose?: boolean;\n } = {}\n): Promise<{ outputPath: string; content: string }> => {\n if (filePaths.length === 0) {\n throw new Error('No transcript files provided');\n }\n \n // Parse all transcripts\n const transcripts: ParsedTranscript[] = [];\n for (const filePath of filePaths) {\n try {\n const parsed = await parseTranscript(filePath);\n transcripts.push(parsed);\n } catch (error) {\n throw new Error(`Failed to parse transcript: ${filePath} - ${error}`);\n }\n }\n \n // Sort by filename (which should be chronological due to timestamp prefix)\n transcripts.sort((a, b) => {\n const aName = path.basename(a.filePath);\n const bName = path.basename(b.filePath);\n return aName.localeCompare(bName);\n });\n \n // Use the first transcript's metadata as the base\n const firstTranscript = transcripts[0];\n const baseMetadata = { ...firstTranscript.metadata };\n \n // Load context to get project information if needed\n const context = await Context.create();\n let targetProject: Project | undefined;\n \n if (options.projectId) {\n targetProject = context.getProject(options.projectId);\n if (!targetProject) {\n throw new Error(`Project not found: ${options.projectId}`);\n }\n \n // Update metadata with new project\n baseMetadata.project = targetProject.name;\n baseMetadata.projectId = targetProject.id;\n \n // Update destination if project has routing configured\n if (targetProject.routing?.destination) {\n baseMetadata.destination = expandPath(targetProject.routing.destination);\n }\n }\n \n // Calculate combined duration if available\n let totalSeconds = 0;\n let hasDuration = false;\n for (const t of transcripts) {\n if (t.metadata.duration) {\n hasDuration = true;\n totalSeconds += parseDuration(t.metadata.duration);\n }\n }\n if (hasDuration && totalSeconds > 0) {\n baseMetadata.duration = formatDuration(totalSeconds);\n }\n \n // Combine tags from all transcripts (deduplicated)\n const allTags = new Set<string>();\n for (const t of transcripts) {\n if (t.metadata.tags) {\n for (const tag of t.metadata.tags) {\n allTags.add(tag);\n }\n }\n }\n if (allTags.size > 0) {\n baseMetadata.tags = Array.from(allTags).sort();\n }\n \n // Build combined title - use custom title if provided\n const combinedTitle = options.title \n ? options.title\n : (firstTranscript.title \n ? `${firstTranscript.title} (Combined)`\n : 'Combined Transcript');\n \n // Build combined content with section markers\n const contentParts: string[] = [];\n \n for (let i = 0; i < transcripts.length; i++) {\n const t = transcripts[i];\n const sectionTitle = t.title || `Part ${i + 1}`;\n const sourceFile = path.basename(t.filePath);\n \n contentParts.push(`## ${sectionTitle}`);\n contentParts.push(`*Source: ${sourceFile}*`);\n contentParts.push('');\n contentParts.push(t.content);\n contentParts.push('');\n }\n \n // Build final document\n const metadataSection = formatMetadataMarkdown(combinedTitle, baseMetadata, targetProject);\n const finalContent = metadataSection + contentParts.join('\\n');\n \n // Determine output path\n let outputPath: string;\n \n if (targetProject?.routing?.destination) {\n // Build path using project routing configuration\n const routingConfig = buildRoutingConfig(context, targetProject);\n const routing = Routing.create(routingConfig, context);\n \n // Extract date from first transcript for routing\n const audioDate = extractDateFromMetadata(baseMetadata, firstTranscript.filePath);\n \n const routingContext: Routing.RoutingContext = {\n transcriptText: finalContent,\n audioDate,\n sourceFile: firstTranscript.filePath,\n };\n \n const decision = routing.route(routingContext);\n outputPath = routing.buildOutputPath(decision, routingContext);\n } else {\n // Use the directory of the first transcript with a new filename\n const firstDir = path.dirname(firstTranscript.filePath);\n const timestamp = extractTimestampFromFilename(firstTranscript.filePath);\n \n // Use slugified custom title if provided, otherwise \"combined\"\n const filenameSuffix = options.title \n ? slugifyTitle(options.title)\n : 'combined';\n \n if (timestamp) {\n const day = timestamp.day.toString().padStart(2, '0');\n const hour = timestamp.hour.toString().padStart(2, '0');\n const minute = timestamp.minute.toString().padStart(2, '0');\n outputPath = path.join(firstDir, `${day}-${hour}${minute}-${filenameSuffix}.md`);\n } else {\n outputPath = path.join(firstDir, `${filenameSuffix}.md`);\n }\n }\n \n return { outputPath, content: finalContent };\n};\n\n/**\n * Build a routing config from context and project\n */\nconst buildRoutingConfig = (\n context: Context.ContextInstance,\n _targetProject: Project\n): Routing.RoutingConfig => {\n const config = context.getConfig();\n const defaultPath = expandPath((config.outputDirectory as string) || '~/notes');\n \n // Build project routes from all projects\n const projects: Routing.ProjectRoute[] = context.getAllProjects()\n .filter(p => p.active !== false)\n .map(p => ({\n projectId: p.id,\n destination: {\n path: expandPath(p.routing?.destination || defaultPath),\n structure: p.routing?.structure || 'month',\n filename_options: p.routing?.filename_options || ['date', 'time', 'subject'],\n },\n classification: p.classification,\n auto_tags: p.routing?.auto_tags,\n }));\n \n return {\n default: {\n path: defaultPath,\n structure: (config.outputStructure as Routing.FilesystemStructure) || 'month',\n filename_options: (config.outputFilenameOptions as Routing.FilenameOption[]) || ['date', 'time', 'subject'],\n },\n projects,\n conflict_resolution: 'primary',\n };\n};\n\n/**\n * Extract date from metadata or filename\n */\nconst extractDateFromMetadata = (metadata: TranscriptMetadata, filePath: string): Date => {\n // Try to parse from metadata date string\n if (metadata.date) {\n const parsed = new Date(metadata.date);\n if (!isNaN(parsed.getTime())) {\n // Add time if available\n if (metadata.time) {\n const timeMatch = metadata.time.match(/(\\d{1,2}):(\\d{2})\\s*(AM|PM)?/i);\n if (timeMatch) {\n let hours = parseInt(timeMatch[1], 10);\n const minutes = parseInt(timeMatch[2], 10);\n const ampm = timeMatch[3]?.toUpperCase();\n \n if (ampm === 'PM' && hours < 12) hours += 12;\n if (ampm === 'AM' && hours === 12) hours = 0;\n \n parsed.setHours(hours, minutes);\n }\n }\n return parsed;\n }\n }\n \n // Fall back to extracting from directory structure and filename\n // Expected path: .../2026/1/15-1412-subject.md\n const parts = filePath.split(path.sep);\n \n // Look for year/month in path\n let year = new Date().getFullYear();\n let month = new Date().getMonth();\n \n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n const num = parseInt(part, 10);\n if (num >= 2000 && num <= 2100) {\n year = num;\n // Next part might be month\n if (i + 1 < parts.length - 1) {\n const nextNum = parseInt(parts[i + 1], 10);\n if (nextNum >= 1 && nextNum <= 12) {\n month = nextNum - 1; // 0-indexed\n }\n }\n }\n }\n \n // Extract day and time from filename\n const timestamp = extractTimestampFromFilename(filePath);\n const day = timestamp?.day || 1;\n const hour = timestamp?.hour || 0;\n const minute = timestamp?.minute || 0;\n \n return new Date(year, month, day, hour, minute);\n};\n\n/**\n * Parse duration string to seconds\n */\nconst parseDuration = (duration: string): number => {\n let seconds = 0;\n \n const minuteMatch = duration.match(/(\\d+)m/);\n const secondMatch = duration.match(/(\\d+)s/);\n \n if (minuteMatch) {\n seconds += parseInt(minuteMatch[1], 10) * 60;\n }\n if (secondMatch) {\n seconds += parseInt(secondMatch[1], 10);\n }\n \n return seconds;\n};\n\n/**\n * Format seconds as duration string\n */\nconst formatDuration = (seconds: number): string => {\n const minutes = Math.floor(seconds / 60);\n const secs = Math.round(seconds % 60);\n \n if (minutes === 0) {\n return `${secs}s`;\n }\n if (secs === 0) {\n return `${minutes}m`;\n }\n return `${minutes}m ${secs}s`;\n};\n\n/**\n * Expand ~ to home directory\n */\nconst expandPath = (p: string): string => {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n};\n\n/**\n * Parse file paths from the combine argument\n * Supports newline-separated paths (from command line) or array\n */\nexport const parseFilePaths = (input: string): string[] => {\n // Split by newlines and filter empty lines\n return input\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.length > 0);\n};\n\n/**\n * Edit a single transcript - update title and/or project\n */\nexport const editTranscript = async (\n filePath: string,\n options: {\n title?: string;\n projectId?: string;\n dryRun?: boolean;\n verbose?: boolean;\n }\n): Promise<{ outputPath: string; content: string }> => {\n // Parse the existing transcript\n const transcript = await parseTranscript(filePath);\n \n // Load context if we need project info\n const context = await Context.create();\n let targetProject: Project | undefined;\n \n if (options.projectId) {\n targetProject = context.getProject(options.projectId);\n if (!targetProject) {\n throw new Error(`Project not found: ${options.projectId}`);\n }\n }\n \n // Use new title if provided, otherwise keep existing\n const newTitle = options.title || transcript.title || 'Untitled';\n \n // Update metadata\n const updatedMetadata = { ...transcript.metadata };\n \n if (targetProject) {\n updatedMetadata.project = targetProject.name;\n updatedMetadata.projectId = targetProject.id;\n if (targetProject.routing?.destination) {\n updatedMetadata.destination = expandPath(targetProject.routing.destination);\n }\n }\n \n // Build the updated document\n const metadataSection = formatMetadataMarkdown(newTitle, updatedMetadata, targetProject);\n const finalContent = metadataSection + transcript.content;\n \n // Determine output path\n let outputPath: string;\n \n if (targetProject?.routing?.destination) {\n // Build path using project routing configuration\n const routingConfig = buildRoutingConfig(context, targetProject);\n const routing = Routing.create(routingConfig, context);\n \n const audioDate = extractDateFromMetadata(updatedMetadata, filePath);\n \n const routingContext: Routing.RoutingContext = {\n transcriptText: finalContent,\n audioDate,\n sourceFile: filePath,\n };\n \n const decision = routing.route(routingContext);\n \n // If we have a custom title, override the filename with slugified title\n if (options.title) {\n const basePath = path.dirname(routing.buildOutputPath(decision, routingContext));\n const timestamp = extractTimestampFromFilename(filePath);\n const sluggedTitle = slugifyTitle(options.title);\n \n if (timestamp) {\n const day = timestamp.day.toString().padStart(2, '0');\n const hour = timestamp.hour.toString().padStart(2, '0');\n const minute = timestamp.minute.toString().padStart(2, '0');\n outputPath = path.join(basePath, `${day}-${hour}${minute}-${sluggedTitle}.md`);\n } else {\n outputPath = path.join(basePath, `${sluggedTitle}.md`);\n }\n } else {\n outputPath = routing.buildOutputPath(decision, routingContext);\n }\n } else {\n // Keep in same directory, potentially with new filename\n const dir = path.dirname(filePath);\n const timestamp = extractTimestampFromFilename(filePath);\n \n if (options.title) {\n const sluggedTitle = slugifyTitle(options.title);\n if (timestamp) {\n const day = timestamp.day.toString().padStart(2, '0');\n const hour = timestamp.hour.toString().padStart(2, '0');\n const minute = timestamp.minute.toString().padStart(2, '0');\n outputPath = path.join(dir, `${day}-${hour}${minute}-${sluggedTitle}.md`);\n } else {\n outputPath = path.join(dir, `${sluggedTitle}.md`);\n }\n } else {\n // Keep original filename\n outputPath = filePath;\n }\n }\n \n return { outputPath, content: finalContent };\n};\n\n/**\n * Execute the action command\n */\nconst executeAction = async (\n file: string | undefined,\n options: { \n project?: string; \n title?: string; \n combine?: string;\n dryRun?: boolean; \n verbose?: boolean;\n }\n) => {\n // Determine mode: combine or edit\n if (options.combine) {\n // Combine mode\n const filePaths = parseFilePaths(options.combine);\n \n if (filePaths.length === 0) {\n print('Error: No transcript files provided for --combine.');\n process.exit(1);\n }\n \n if (filePaths.length === 1) {\n print('Error: At least 2 transcript files are required for --combine.');\n process.exit(1);\n }\n \n // Validate all files exist\n for (const filePath of filePaths) {\n try {\n await fs.access(filePath);\n } catch {\n print(`Error: File not found: ${filePath}`);\n process.exit(1);\n }\n }\n \n if (options.verbose) {\n print(`\\n[Combining ${filePaths.length} transcripts]`);\n for (const fp of filePaths) {\n print(` - ${fp}`);\n }\n if (options.project) {\n print(`\\nTarget project: ${options.project}`);\n }\n if (options.title) {\n print(`\\nCustom title: ${options.title}`);\n }\n print('');\n }\n \n try {\n const result = await combineTranscripts(filePaths, {\n projectId: options.project,\n title: options.title,\n dryRun: options.dryRun,\n verbose: options.verbose,\n });\n \n if (options.dryRun) {\n print('[Dry Run] Would create combined transcript:');\n print(` Output: ${result.outputPath}`);\n print(` Size: ${result.content.length} characters`);\n print('');\n print('[Dry Run] Would delete source files:');\n for (const fp of filePaths) {\n print(` - ${fp}`);\n }\n if (options.verbose) {\n print('\\n--- Preview (first 500 chars) ---');\n print(result.content.slice(0, 500));\n print('...');\n }\n } else {\n // Ensure output directory exists\n await fs.mkdir(path.dirname(result.outputPath), { recursive: true });\n \n // Write the combined transcript\n await fs.writeFile(result.outputPath, result.content, 'utf-8');\n print(`Combined transcript created: ${result.outputPath}`);\n \n // Automatically delete source files when combining\n if (options.verbose) {\n print('\\nDeleting source files...');\n }\n for (const fp of filePaths) {\n try {\n await fs.unlink(fp);\n if (options.verbose) {\n print(` Deleted: ${fp}`);\n }\n } catch (error) {\n print(` Warning: Could not delete ${fp}: ${error}`);\n }\n }\n print(`Deleted ${filePaths.length} source files.`);\n }\n } catch (error) {\n print(`Error: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n } else if (file) {\n // Edit mode - single file\n if (!options.title && !options.project) {\n print('Error: Must specify --title and/or --project when editing a single file.');\n process.exit(1);\n }\n \n // Validate file exists\n try {\n await fs.access(file);\n } catch {\n print(`Error: File not found: ${file}`);\n process.exit(1);\n }\n \n if (options.verbose) {\n print(`\\n[Editing transcript]`);\n print(` File: ${file}`);\n if (options.title) {\n print(` New title: ${options.title}`);\n }\n if (options.project) {\n print(` New project: ${options.project}`);\n }\n print('');\n }\n \n try {\n const result = await editTranscript(file, {\n title: options.title,\n projectId: options.project,\n dryRun: options.dryRun,\n verbose: options.verbose,\n });\n \n const isRename = result.outputPath !== file;\n \n if (options.dryRun) {\n print('[Dry Run] Would update transcript:');\n if (isRename) {\n print(` From: ${file}`);\n print(` To: ${result.outputPath}`);\n } else {\n print(` File: ${result.outputPath}`);\n }\n print(` Size: ${result.content.length} characters`);\n if (options.verbose) {\n print('\\n--- Preview (first 500 chars) ---');\n print(result.content.slice(0, 500));\n print('...');\n }\n } else {\n // Ensure output directory exists\n await fs.mkdir(path.dirname(result.outputPath), { recursive: true });\n \n // Write the updated transcript\n await fs.writeFile(result.outputPath, result.content, 'utf-8');\n \n // Delete original if renamed\n if (isRename) {\n await fs.unlink(file);\n print(`Transcript updated and renamed:`);\n print(` From: ${file}`);\n print(` To: ${result.outputPath}`);\n } else {\n print(`Transcript updated: ${result.outputPath}`);\n }\n }\n } catch (error) {\n print(`Error: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n } else {\n print('Error: Must specify either a file to edit or --combine with files to combine.');\n print('');\n print('Usage:');\n print(' protokoll action --title \"New Title\" /path/to/file.md');\n print(' protokoll action --combine \"/path/to/file1.md\\\\n/path/to/file2.md\"');\n process.exit(1);\n }\n};\n\n/**\n * Register the action command\n */\nexport const registerActionCommands = (program: Command): void => {\n const actionCmd = new Command('action')\n .description('Edit a single transcript or combine multiple transcripts')\n .argument('[file]', 'Transcript file to edit (when not using --combine)')\n .option('-t, --title <title>', 'Set a custom title (also affects filename)')\n .option('-p, --project <projectId>', 'Change to a different project (updates metadata and routing)')\n .option('-c, --combine <files>', 'Combine multiple files (newline-separated list)')\n .option('--dry-run', 'Show what would happen without making changes')\n .option('-v, --verbose', 'Show detailed output')\n .action(executeAction);\n \n program.addCommand(actionCmd);\n};\n","/**\n * Feedback CLI\n * \n * Provides an intelligent feedback system that uses an agentic model to:\n * - Understand natural language feedback about transcripts\n * - Correct spelling/term issues in transcripts\n * - Add terms, people, or companies to context\n * - Change project assignments and move files\n * - Help users understand what feedback they can provide\n * \n * Usage:\n * protokoll feedback /path/to/transcript.md\n * protokoll feedback --help-me\n */\n\nimport { Command } from 'commander';\nimport * as readline from 'readline';\nimport * as fs from 'fs/promises';\nimport * as path from 'node:path';\nimport * as Context from '../context';\nimport * as Reasoning from '../reasoning';\nimport * as Logging from '../logging';\nimport { slugifyTitle, extractTimestampFromFilename } from './action';\nimport { DEFAULT_MODEL } from '../constants';\n\n// CLI output helper\nconst print = (text: string) => process.stdout.write(text + '\\n');\n\n/**\n * Tool definitions for the agentic feedback processor\n */\nexport interface FeedbackTool {\n name: string;\n description: string;\n parameters: Record<string, {\n type: string;\n description: string;\n required?: boolean;\n enum?: string[];\n items?: { type: string };\n }>;\n}\n\nexport const FEEDBACK_TOOLS: FeedbackTool[] = [\n {\n name: 'correct_text',\n description: 'Replace text in the transcript. Use this to fix misspellings, wrong terms, or incorrect names.',\n parameters: {\n find: { type: 'string', description: 'The text to find in the transcript', required: true },\n replace: { type: 'string', description: 'The text to replace it with', required: true },\n replace_all: { type: 'boolean', description: 'Replace all occurrences (default: true)' },\n },\n },\n {\n name: 'add_term',\n description: 'Add a new term to the context so it will be recognized in future transcripts. Use this when you learn about abbreviations, acronyms, or technical terms.',\n parameters: {\n term: { type: 'string', description: 'The correct term/abbreviation', required: true },\n definition: { type: 'string', description: 'What the term means', required: true },\n sounds_like: { type: 'array', items: { type: 'string' }, description: 'Phonetic variations that might be transcribed incorrectly (e.g., [\"W C M P\", \"double u see em pee\"])' },\n context: { type: 'string', description: 'Additional context about when this term is used' },\n },\n },\n {\n name: 'add_person',\n description: 'Add a new person to the context for future name recognition. Use this when you learn about people whose names were transcribed incorrectly.',\n parameters: {\n name: { type: 'string', description: 'The correct full name', required: true },\n sounds_like: { type: 'array', items: { type: 'string' }, description: 'Phonetic variations (e.g., [\"San Jay\", \"Sanjai\", \"Sanjey\"])', required: true },\n role: { type: 'string', description: 'Their role or title' },\n company: { type: 'string', description: 'Company they work for' },\n context: { type: 'string', description: 'Additional context about this person' },\n },\n },\n {\n name: 'change_project',\n description: 'Change the project assignment of this transcript. This updates metadata and may move the file to a new location based on project routing.',\n parameters: {\n project_id: { type: 'string', description: 'The project ID to assign', required: true },\n },\n },\n {\n name: 'change_title',\n description: 'Change the title of this transcript. This updates the document heading and renames the file.',\n parameters: {\n new_title: { type: 'string', description: 'The new title for the transcript', required: true },\n },\n },\n {\n name: 'provide_help',\n description: 'Provide helpful information to the user about what kinds of feedback they can give.',\n parameters: {\n topic: { type: 'string', description: 'The topic to help with', enum: ['terms', 'people', 'projects', 'corrections', 'general'] },\n },\n },\n {\n name: 'complete',\n description: 'Call this when you have finished processing all the feedback and applied all necessary changes.',\n parameters: {\n summary: { type: 'string', description: 'A summary of what was done', required: true },\n },\n },\n];\n\n/**\n * Result of a tool execution\n */\nexport interface ToolResult {\n success: boolean;\n message: string;\n data?: Record<string, unknown>;\n}\n\n/**\n * Feedback processing context\n */\nexport interface FeedbackContext {\n transcriptPath: string;\n transcriptContent: string;\n originalContent: string;\n context: Context.ContextInstance;\n changes: FeedbackChange[];\n verbose: boolean;\n dryRun: boolean;\n}\n\nexport interface FeedbackChange {\n type: 'text_correction' | 'term_added' | 'person_added' | 'project_changed' | 'title_changed';\n description: string;\n details: Record<string, unknown>;\n}\n\n/**\n * Create a readline interface for user input\n */\nconst createReadlineInterface = () => {\n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n};\n\n/**\n * Ask a question and get user input\n */\nconst askQuestion = (rl: readline.Interface, question: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n};\n\n/**\n * Execute a feedback tool\n */\nexport const executeTool = async (\n toolName: string,\n args: Record<string, unknown>,\n feedbackCtx: FeedbackContext\n): Promise<ToolResult> => {\n const logger = Logging.getLogger();\n \n switch (toolName) {\n case 'correct_text': {\n const find = String(args.find);\n const replace = String(args.replace);\n const replaceAll = args.replace_all !== false;\n \n if (!feedbackCtx.transcriptContent.includes(find)) {\n return {\n success: false,\n message: `Text \"${find}\" not found in transcript.`,\n };\n }\n \n const occurrences = feedbackCtx.transcriptContent.split(find).length - 1;\n \n if (replaceAll) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.split(find).join(replace);\n } else {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(find, replace);\n }\n \n const changeCount = replaceAll ? occurrences : 1;\n \n feedbackCtx.changes.push({\n type: 'text_correction',\n description: `Replaced \"${find}\" with \"${replace}\" (${changeCount} occurrence${changeCount > 1 ? 's' : ''})`,\n details: { find, replace, count: changeCount },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Replaced \"${find}\" → \"${replace}\" (${changeCount}x)`);\n }\n \n return {\n success: true,\n message: `Replaced ${changeCount} occurrence(s) of \"${find}\" with \"${replace}\".`,\n };\n }\n \n case 'add_term': {\n const term = String(args.term);\n const definition = String(args.definition);\n const soundsLike = args.sounds_like as string[] | undefined;\n const termContext = args.context as string | undefined;\n \n // Generate ID from term\n const id = term.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n \n // Check if term already exists\n const existing = feedbackCtx.context.getTerm(id);\n if (existing) {\n return {\n success: false,\n message: `Term \"${term}\" already exists in context.`,\n };\n }\n \n const newTerm: Context.Term = {\n id,\n name: term,\n type: 'term',\n expansion: definition,\n sounds_like: soundsLike,\n domain: termContext,\n };\n \n if (!feedbackCtx.dryRun) {\n await feedbackCtx.context.saveEntity(newTerm);\n }\n \n feedbackCtx.changes.push({\n type: 'term_added',\n description: `Added term \"${term}\" to context`,\n details: { term, definition, sounds_like: soundsLike },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Added term: ${term} = \"${definition}\"`);\n if (soundsLike?.length) {\n print(` sounds_like: ${soundsLike.join(', ')}`);\n }\n }\n \n return {\n success: true,\n message: `Added term \"${term}\" to context. It will be recognized in future transcripts.`,\n data: { id, term, definition },\n };\n }\n \n case 'add_person': {\n const name = String(args.name);\n const soundsLike = args.sounds_like as string[];\n const role = args.role as string | undefined;\n const company = args.company as string | undefined;\n const personContext = args.context as string | undefined;\n \n // Generate ID from name\n const id = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n \n // Check if person already exists\n const existing = feedbackCtx.context.getPerson(id);\n if (existing) {\n return {\n success: false,\n message: `Person \"${name}\" already exists in context.`,\n };\n }\n \n const newPerson: Context.Person = {\n id,\n name,\n type: 'person',\n sounds_like: soundsLike,\n role,\n company,\n context: personContext,\n };\n \n if (!feedbackCtx.dryRun) {\n await feedbackCtx.context.saveEntity(newPerson);\n }\n \n feedbackCtx.changes.push({\n type: 'person_added',\n description: `Added person \"${name}\" to context`,\n details: { name, sounds_like: soundsLike, role, company },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Added person: ${name}`);\n print(` sounds_like: ${soundsLike.join(', ')}`);\n if (role) print(` role: ${role}`);\n if (company) print(` company: ${company}`);\n }\n \n return {\n success: true,\n message: `Added person \"${name}\" to context. Their name will be recognized in future transcripts.`,\n data: { id, name, sounds_like: soundsLike },\n };\n }\n \n case 'change_project': {\n const projectId = String(args.project_id);\n \n // Find the project\n const project = feedbackCtx.context.getProject(projectId);\n if (!project) {\n // List available projects\n const available = feedbackCtx.context.getAllProjects().map(p => p.id);\n return {\n success: false,\n message: `Project \"${projectId}\" not found. Available projects: ${available.join(', ')}`,\n };\n }\n \n // Update metadata in transcript\n const metadataRegex = /\\*\\*Project\\*\\*: .+/;\n const projectIdRegex = /\\*\\*Project ID\\*\\*: `.+`/;\n \n if (metadataRegex.test(feedbackCtx.transcriptContent)) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(\n metadataRegex,\n `**Project**: ${project.name}`\n );\n }\n \n if (projectIdRegex.test(feedbackCtx.transcriptContent)) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(\n projectIdRegex,\n `**Project ID**: \\`${project.id}\\``\n );\n }\n \n feedbackCtx.changes.push({\n type: 'project_changed',\n description: `Changed project to \"${project.name}\" (${project.id})`,\n details: { project_id: projectId, project_name: project.name, routing: project.routing },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Changed project to: ${project.name} (${project.id})`);\n if (project.routing?.destination) {\n print(` New destination: ${project.routing.destination}`);\n }\n }\n \n return {\n success: true,\n message: `Changed project to \"${project.name}\". The transcript metadata has been updated.`,\n data: { project_id: projectId, destination: project.routing?.destination },\n };\n }\n \n case 'change_title': {\n const newTitle = String(args.new_title);\n \n // Update title in transcript (first # heading)\n const titleRegex = /^# .+$/m;\n if (titleRegex.test(feedbackCtx.transcriptContent)) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(\n titleRegex,\n `# ${newTitle}`\n );\n }\n \n feedbackCtx.changes.push({\n type: 'title_changed',\n description: `Changed title to \"${newTitle}\"`,\n details: { new_title: newTitle, slug: slugifyTitle(newTitle) },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Changed title to: ${newTitle}`);\n }\n \n return {\n success: true,\n message: `Changed title to \"${newTitle}\". The file will be renamed accordingly.`,\n data: { new_title: newTitle },\n };\n }\n \n case 'provide_help': {\n const topic = String(args.topic || 'general');\n let helpText = '';\n \n switch (topic) {\n case 'terms':\n helpText = `\n**Term Corrections**\n\nYou can teach me about abbreviations, acronyms, and technical terms:\n\n- \"Everywhere it says WCMP, that should be WCNP - Walmart's Native Cloud Platform\"\n- \"YB should be spelled Wibey\"\n- \"API should be written as A.P.I. in this context\"\n\nI'll:\n1. Fix the term in this transcript\n2. Add it to my vocabulary for future transcripts\n`;\n break;\n \n case 'people':\n helpText = `\n**Name Corrections**\n\nYou can teach me about people whose names were transcribed incorrectly:\n\n- \"San Jay Grouper is actually Sanjay Gupta\"\n- \"Priya was transcribed as 'pre a' - please fix\"\n- \"Marie should be spelled Mari (without the e)\"\n\nI'll:\n1. Fix the name everywhere in this transcript\n2. Remember how the name sounds for future transcripts\n`;\n break;\n \n case 'projects':\n helpText = `\n**Project Assignment**\n\nYou can tell me if a transcript belongs to a different project:\n\n- \"This should be in the Quantum Readiness project\"\n- \"Move this to the client-alpha project\"\n- \"This was misclassified - it's a personal note, not work\"\n\nI'll:\n1. Update the project metadata\n2. Move the file to the project's configured location\n`;\n break;\n \n case 'corrections':\n helpText = `\n**General Corrections**\n\nYou can ask me to fix any text in the transcript:\n\n- \"Change 'gonna' to 'going to' everywhere\"\n- \"The date mentioned should be January 15th, not January 5th\"\n- \"Remove the paragraph about lunch - that was a tangent\"\n\nI'll make the corrections while preserving the rest of the transcript.\n`;\n break;\n \n default:\n helpText = `\n**What I Can Help With**\n\nI can process your feedback to:\n\n1. **Fix Terms & Abbreviations**: \"WCMP should be WCNP\"\n2. **Correct Names**: \"San Jay Grouper is Sanjay Gupta\"\n3. **Change Projects**: \"This belongs in the Quantum project\"\n4. **Update Title**: \"Change the title to 'Q1 Planning Session'\"\n5. **General Corrections**: \"Replace X with Y everywhere\"\n\nJust describe what's wrong in natural language, and I'll figure out what to do!\n\nAsk about specific topics:\n- \"How do I correct terms?\"\n- \"How do I fix names?\"\n- \"How do I change the project?\"\n`;\n }\n \n print(helpText);\n \n return {\n success: true,\n message: helpText,\n };\n }\n \n case 'complete': {\n const summary = String(args.summary);\n return {\n success: true,\n message: summary,\n data: { complete: true },\n };\n }\n \n default:\n logger.warn('Unknown tool: %s', toolName);\n return {\n success: false,\n message: `Unknown tool: ${toolName}`,\n };\n }\n};\n\n/**\n * Build the system prompt for the feedback agent\n */\nexport const buildFeedbackSystemPrompt = (\n transcriptPreview: string,\n availableProjects: string[]\n): string => {\n const toolDescriptions = FEEDBACK_TOOLS.map(t => \n `- ${t.name}: ${t.description}`\n ).join('\\n');\n \n return `You are an intelligent feedback processor for a transcription system. Your job is to understand user feedback about transcripts and take appropriate actions.\n\n## Current Transcript Preview\n${transcriptPreview.substring(0, 1000)}${transcriptPreview.length > 1000 ? '...' : ''}\n\n## Available Projects\n${availableProjects.length > 0 ? availableProjects.join(', ') : '(no projects configured)'}\n\n## Available Tools\n${toolDescriptions}\n\n## How to Process Feedback\n\n1. **Understand the feedback**: What is the user asking for?\n2. **Identify actions**: What tools do you need to use?\n3. **Execute in order**: \n - First, make text corrections (correct_text)\n - Then, add context entities (add_term, add_person)\n - Finally, change metadata if needed (change_project, change_title)\n4. **Summarize**: Call 'complete' with a summary when done\n\n## Important Rules\n\n- If the user asks for help or seems unsure, use provide_help first\n- For name corrections: BOTH fix the text AND add the person to context\n- For term corrections: BOTH fix the text AND add the term to context\n- When fixing names/terms, use correct_text with replace_all=true\n- Be thorough - if \"San Jay Grouper\" should be \"Sanjay Gupta\", also consider variations like \"San jay\", \"Sanjay Grouper\", etc.\n- Always call 'complete' when finished, with a summary of what you did\n\n## Example Interactions\n\nUser: \"YB should be Wibey\"\n→ Use correct_text to replace \"YB\" with \"Wibey\"\n→ Use add_term to add \"Wibey\" with sounds_like [\"YB\", \"Y B\"]\n→ Use complete to summarize\n\nUser: \"San Jay Grouper is actually Sanjay Gupta\"\n→ Use correct_text to replace \"San Jay Grouper\" with \"Sanjay Gupta\"\n→ Use correct_text to replace any other variations like \"San jay Grouper\"\n→ Use add_person to add \"Sanjay Gupta\" with sounds_like [\"San Jay Grouper\", \"Sanjay Grouper\"]\n→ Use complete to summarize\n\nUser: \"This should be in the Quantum Readiness project\"\n→ Use change_project with project_id matching \"Quantum Readiness\" or similar\n→ Use complete to summarize\n\nRespond with tool calls to process the feedback.`;\n};\n\n/**\n * Process feedback using the agentic model\n */\nexport const processFeedback = async (\n feedback: string,\n feedbackCtx: FeedbackContext,\n reasoning: Reasoning.ReasoningInstance\n): Promise<void> => {\n const logger = Logging.getLogger();\n \n // Get available projects\n const projects = feedbackCtx.context.getAllProjects().map(p => `${p.id} (${p.name})`);\n \n // Build the prompt\n const systemPrompt = buildFeedbackSystemPrompt(\n feedbackCtx.transcriptContent,\n projects\n );\n \n // Convert tools to OpenAI format\n const tools = FEEDBACK_TOOLS.map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n Object.entries(t.parameters).map(([key, param]) => [\n key,\n {\n type: param.type,\n description: param.description,\n ...(param.enum ? { enum: param.enum } : {}),\n ...(param.items ? { items: param.items } : {}),\n },\n ])\n ),\n required: Object.entries(t.parameters)\n .filter(([_, p]) => p.required)\n .map(([key]) => key),\n },\n },\n }));\n \n // Process with reasoning model\n let iterations = 0;\n const maxIterations = 10;\n const conversationHistory: Array<{\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{ id: string; function: { name: string; arguments: string } }>;\n }> = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: feedback },\n ];\n \n while (iterations < maxIterations) {\n iterations++;\n \n logger.debug('Feedback processing iteration %d', iterations);\n \n try {\n const response = await reasoning.completeWithTools({\n messages: conversationHistory,\n tools,\n });\n \n // Check for tool calls\n if (response.tool_calls && response.tool_calls.length > 0) {\n // Add assistant message with tool calls\n conversationHistory.push({\n role: 'assistant',\n content: response.content || '',\n tool_calls: response.tool_calls.map(tc => ({\n id: tc.id,\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n })),\n });\n \n // Execute each tool call\n for (const toolCall of response.tool_calls) {\n const toolName = toolCall.function.name;\n let args: Record<string, unknown>;\n \n try {\n args = JSON.parse(toolCall.function.arguments);\n } catch {\n args = {};\n }\n \n if (feedbackCtx.verbose) {\n print(`\\n[Executing: ${toolName}]`);\n }\n \n const result = await executeTool(toolName, args, feedbackCtx);\n \n // Add tool result to conversation\n conversationHistory.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: toolCall.id,\n });\n \n // Check if complete\n if (toolName === 'complete') {\n if (feedbackCtx.verbose) {\n print(`\\n${result.message}`);\n }\n return;\n }\n }\n } else {\n // No tool calls - model is done or confused\n if (response.content) {\n print(`\\n${response.content}`);\n }\n return;\n }\n } catch (error) {\n logger.error('Error during feedback processing', { error });\n throw error;\n }\n }\n \n logger.warn('Feedback processing reached max iterations');\n};\n\n/**\n * Apply changes and save the transcript\n */\nexport const applyChanges = async (\n feedbackCtx: FeedbackContext\n): Promise<{ newPath: string; moved: boolean }> => {\n const logger = Logging.getLogger();\n \n let newPath = feedbackCtx.transcriptPath;\n let moved = false;\n \n // Check if we need to rename the file (title changed)\n const titleChange = feedbackCtx.changes.find(c => c.type === 'title_changed');\n if (titleChange) {\n const slug = titleChange.details.slug as string;\n const timestamp = extractTimestampFromFilename(feedbackCtx.transcriptPath);\n const dir = path.dirname(feedbackCtx.transcriptPath);\n \n if (timestamp) {\n const timeStr = `${timestamp.hour.toString().padStart(2, '0')}${timestamp.minute.toString().padStart(2, '0')}`;\n newPath = path.join(dir, `${timestamp.day}-${timeStr}-${slug}.md`);\n } else {\n newPath = path.join(dir, `${slug}.md`);\n }\n }\n \n // Check if we need to move the file (project changed)\n const projectChange = feedbackCtx.changes.find(c => c.type === 'project_changed');\n if (projectChange && projectChange.details.routing) {\n const routing = projectChange.details.routing as { destination?: string; structure?: string };\n if (routing.destination) {\n // Expand ~ to home directory\n let dest = routing.destination;\n if (dest.startsWith('~')) {\n dest = path.join(process.env.HOME || '', dest.slice(1));\n }\n \n // Get date from transcript metadata or use current date\n const now = new Date();\n const year = now.getFullYear().toString();\n const month = (now.getMonth() + 1).toString().padStart(2, '0');\n \n // Build path based on structure\n let structuredPath = dest;\n const structure = routing.structure || 'month';\n if (structure === 'year') {\n structuredPath = path.join(dest, year);\n } else if (structure === 'month') {\n structuredPath = path.join(dest, year, month);\n } else if (structure === 'day') {\n const day = now.getDate().toString().padStart(2, '0');\n structuredPath = path.join(dest, year, month, day);\n }\n \n // Update path\n const filename = path.basename(newPath);\n newPath = path.join(structuredPath, filename);\n moved = true;\n }\n }\n \n // Ensure directory exists\n await fs.mkdir(path.dirname(newPath), { recursive: true });\n \n // Write the updated content\n if (!feedbackCtx.dryRun) {\n await fs.writeFile(newPath, feedbackCtx.transcriptContent, 'utf-8');\n \n // Delete original if moved/renamed\n if (newPath !== feedbackCtx.transcriptPath) {\n await fs.unlink(feedbackCtx.transcriptPath);\n }\n }\n \n logger.info('Applied %d changes to transcript', feedbackCtx.changes.length);\n \n return { newPath, moved };\n};\n\n/**\n * Run the feedback command\n */\nexport const runFeedback = async (\n transcriptPath: string,\n options: {\n feedback?: string;\n model?: string;\n dryRun?: boolean;\n verbose?: boolean;\n }\n): Promise<void> => {\n // Verify file exists\n try {\n await fs.access(transcriptPath);\n } catch {\n print(`Error: File not found: ${transcriptPath}`);\n process.exit(1);\n }\n \n // Read transcript\n const transcriptContent = await fs.readFile(transcriptPath, 'utf-8');\n \n // Initialize context\n const context = await Context.create();\n \n // Initialize reasoning\n const reasoning = Reasoning.create({ model: options.model || DEFAULT_MODEL });\n \n // Create feedback context\n const feedbackCtx: FeedbackContext = {\n transcriptPath,\n transcriptContent,\n originalContent: transcriptContent,\n context,\n changes: [],\n verbose: options.verbose || false,\n dryRun: options.dryRun || false,\n };\n \n // Get feedback from user if not provided\n let feedback = options.feedback;\n if (!feedback) {\n const rl = createReadlineInterface();\n \n print('\\n' + '─'.repeat(60));\n print(`[Feedback for: ${path.basename(transcriptPath)}]`);\n print('─'.repeat(60));\n print('\\nDescribe what needs to be corrected in natural language.');\n print('Examples:');\n print(' - \"YB should be Wibey\"');\n print(' - \"San Jay Grouper is actually Sanjay Gupta\"');\n print(' - \"This should be in the Quantum Readiness project\"');\n print(' - \"What feedback can I give?\" (for help)\\n');\n \n feedback = await askQuestion(rl, 'What is your feedback? ');\n rl.close();\n \n if (!feedback) {\n print('No feedback provided.');\n return;\n }\n }\n \n if (options.verbose) {\n print('\\n[Processing feedback...]');\n }\n \n // Process feedback with agentic model\n await processFeedback(feedback, feedbackCtx, reasoning);\n \n // Apply changes\n if (feedbackCtx.changes.length > 0) {\n if (options.dryRun) {\n print('\\n[Dry Run] Would apply the following changes:');\n for (const change of feedbackCtx.changes) {\n print(` - ${change.description}`);\n }\n } else {\n const { newPath, moved } = await applyChanges(feedbackCtx);\n \n print('\\n' + '─'.repeat(60));\n print('[Changes Applied]');\n print('─'.repeat(60));\n \n for (const change of feedbackCtx.changes) {\n print(` ✓ ${change.description}`);\n }\n \n if (newPath !== feedbackCtx.transcriptPath) {\n if (moved) {\n print(`\\nFile moved to: ${newPath}`);\n } else {\n print(`\\nFile renamed to: ${path.basename(newPath)}`);\n }\n } else {\n print(`\\nFile updated: ${transcriptPath}`);\n }\n }\n } else {\n print('\\nNo changes were made.');\n }\n};\n\n/**\n * Register the feedback command\n */\nexport const registerFeedbackCommands = (program: Command): void => {\n const feedbackCmd = new Command('feedback')\n .description('Provide natural language feedback to correct transcripts and improve context')\n .argument('[file]', 'Transcript file to provide feedback on')\n .option('-f, --feedback <text>', 'Feedback text (if not provided, will prompt interactively)')\n .option('-m, --model <model>', 'Reasoning model to use', DEFAULT_MODEL)\n .option('--dry-run', 'Show what would happen without making changes')\n .option('-v, --verbose', 'Show detailed output')\n .option('--help-me', 'Show examples of feedback you can provide')\n .action(async (file: string | undefined, options: {\n feedback?: string;\n model?: string;\n dryRun?: boolean;\n verbose?: boolean;\n helpMe?: boolean;\n }) => {\n if (options.helpMe) {\n print(`\n╔════════════════════════════════════════════════════════════╗\n║ PROTOKOLL FEEDBACK - EXAMPLES ║\n╠════════════════════════════════════════════════════════════╣\n║ ║\n║ CORRECTING TERMS & ABBREVIATIONS ║\n║ ───────────────────────────────── ║\n║ \"Everywhere it says WCMP, that should be WCNP\" ║\n║ \"YB should be spelled Wibey\" ║\n║ \"API should be written as A-P-I\" ║\n║ ║\n║ FIXING NAMES ║\n║ ──────────── ║\n║ \"San Jay Grouper is actually Sanjay Gupta\" ║\n║ \"Priya was transcribed as 'pre a' - please fix\" ║\n║ \"Marie should be spelled Mari\" ║\n║ ║\n║ CHANGING PROJECT ASSIGNMENT ║\n║ ─────────────────────────── ║\n║ \"This should be in the Quantum Readiness project\" ║\n║ \"Move this to client-alpha\" ║\n║ \"This was misclassified - should be personal\" ║\n║ ║\n║ GENERAL CORRECTIONS ║\n║ ─────────────────── ║\n║ \"Change the title to 'Q1 Planning Session'\" ║\n║ \"Replace 'gonna' with 'going to' everywhere\" ║\n║ ║\n╚════════════════════════════════════════════════════════════╝\n\nUsage:\n protokoll feedback /path/to/transcript.md\n protokoll feedback /path/to/transcript.md -f \"YB should be Wibey\"\n protokoll feedback /path/to/transcript.md --dry-run -v\n`);\n return;\n }\n \n if (!file) {\n print('Error: A transcript file is required.');\n print('Usage: protokoll feedback /path/to/transcript.md');\n print('Run \"protokoll feedback --help-me\" for examples.');\n process.exit(1);\n }\n \n await runFeedback(file, options);\n });\n \n program.addCommand(feedbackCmd);\n};\n","/**\n * Transcript CLI Commands\n * \n * Commands for working with transcripts, including comparing against\n * raw Whisper output and reanalyzing.\n */\n\n/* eslint-disable no-console */\nimport { Command } from 'commander';\nimport * as fs from 'fs/promises';\nimport * as path from 'node:path';\nimport { glob } from 'glob';\nimport { RawTranscriptData } from '../output/types';\nimport * as Metadata from '../util/metadata';\n\n/**\n * Get the raw transcript path for a given final transcript path\n */\nexport const getRawTranscriptPath = (finalPath: string): string => {\n const dir = path.dirname(finalPath);\n const basename = path.basename(finalPath, path.extname(finalPath));\n return path.join(dir, '.transcript', `${basename}.json`);\n};\n\n/**\n * Read raw transcript data from the .transcript/ directory\n */\nexport const readRawTranscript = async (finalPath: string): Promise<RawTranscriptData | null> => {\n const rawPath = getRawTranscriptPath(finalPath);\n try {\n const content = await fs.readFile(rawPath, 'utf-8');\n return JSON.parse(content) as RawTranscriptData;\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n};\n\n/**\n * Read final transcript content\n */\nexport const readFinalTranscript = async (finalPath: string): Promise<string | null> => {\n try {\n return await fs.readFile(finalPath, 'utf-8');\n } catch (error: unknown) {\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n};\n\n/**\n * Format a side-by-side comparison of raw and enhanced transcripts\n */\nexport const formatComparison = (raw: string, enhanced: string, width: number = 80): string => {\n const halfWidth = Math.floor(width / 2) - 2;\n const lines: string[] = [];\n \n // Header\n lines.push('╔' + '═'.repeat(halfWidth) + '╦' + '═'.repeat(halfWidth) + '╗');\n lines.push('║' + ' RAW WHISPER OUTPUT'.padEnd(halfWidth) + '║' + ' ENHANCED TRANSCRIPT'.padEnd(halfWidth) + '║');\n lines.push('╠' + '═'.repeat(halfWidth) + '╬' + '═'.repeat(halfWidth) + '╣');\n \n // Split into paragraphs and display\n const rawParagraphs = raw.split('\\n\\n');\n const enhancedParagraphs = enhanced.split('\\n\\n');\n const maxParagraphs = Math.max(rawParagraphs.length, enhancedParagraphs.length);\n \n for (let i = 0; i < maxParagraphs; i++) {\n const rawPara = rawParagraphs[i] || '';\n const enhancedPara = enhancedParagraphs[i] || '';\n \n // Word wrap each paragraph\n const rawLines = wrapText(rawPara, halfWidth - 1);\n const enhancedLines = wrapText(enhancedPara, halfWidth - 1);\n const maxLines = Math.max(rawLines.length, enhancedLines.length);\n \n for (let j = 0; j < maxLines; j++) {\n const rawLine = (rawLines[j] || '').padEnd(halfWidth);\n const enhancedLine = (enhancedLines[j] || '').padEnd(halfWidth);\n lines.push('║' + rawLine + '║' + enhancedLine + '║');\n }\n \n // Add separator between paragraphs\n if (i < maxParagraphs - 1) {\n lines.push('║' + '─'.repeat(halfWidth) + '║' + '─'.repeat(halfWidth) + '║');\n }\n }\n \n lines.push('╚' + '═'.repeat(halfWidth) + '╩' + '═'.repeat(halfWidth) + '╝');\n \n return lines.join('\\n');\n};\n\n/**\n * Word wrap text to a maximum width\n */\nexport const wrapText = (text: string, maxWidth: number): string[] => {\n const words = text.replace(/\\n/g, ' ').split(' ');\n const lines: string[] = [];\n let currentLine = '';\n \n for (const word of words) {\n if (!word) continue;\n if (currentLine.length + word.length + 1 <= maxWidth) {\n currentLine += (currentLine ? ' ' : '') + word;\n } else {\n if (currentLine) lines.push(currentLine);\n currentLine = word.length > maxWidth ? word.slice(0, maxWidth) : word;\n }\n }\n if (currentLine) lines.push(currentLine);\n \n return lines.length > 0 ? lines : [''];\n};\n\n/**\n * Compare command - show raw vs enhanced side-by-side\n */\nexport const compareCommand = async (transcriptPath: string, options: { raw?: boolean; enhanced?: boolean; diff?: boolean }): Promise<void> => {\n // Resolve the path\n const absolutePath = path.isAbsolute(transcriptPath) \n ? transcriptPath \n : path.resolve(process.cwd(), transcriptPath);\n \n // Read both transcripts\n const rawData = await readRawTranscript(absolutePath);\n const finalContent = await readFinalTranscript(absolutePath);\n \n if (!rawData) {\n console.error(`No raw transcript found for: ${transcriptPath}`);\n console.error(`Expected at: ${getRawTranscriptPath(absolutePath)}`);\n console.error('\\nThe raw transcript may not have been saved during transcription.');\n process.exit(1);\n return;\n }\n \n if (!finalContent) {\n console.error(`Final transcript not found: ${transcriptPath}`);\n process.exit(1);\n return;\n }\n \n // Show metadata about the raw transcript\n console.log('\\n📋 Raw Transcript Info:');\n console.log(` Model: ${rawData.model}`);\n console.log(` Duration: ${(rawData.duration / 1000).toFixed(1)}s`);\n console.log(` Audio: ${rawData.audioFile}`);\n console.log(` Transcribed: ${new Date(rawData.transcribedAt).toLocaleString()}`);\n console.log(` Characters: ${rawData.text.length} (raw) → ${finalContent.length} (enhanced)`);\n console.log('');\n \n if (options.raw) {\n // Show only raw transcript\n console.log('═══════════════════════════════════════════════════════════════');\n console.log('RAW WHISPER OUTPUT');\n console.log('═══════════════════════════════════════════════════════════════');\n console.log(rawData.text);\n } else if (options.enhanced) {\n // Show only enhanced transcript \n console.log('═══════════════════════════════════════════════════════════════');\n console.log('ENHANCED TRANSCRIPT');\n console.log('═══════════════════════════════════════════════════════════════');\n console.log(finalContent);\n } else {\n // Show side-by-side comparison\n const termWidth = process.stdout.columns || 160;\n const comparison = formatComparison(rawData.text, finalContent, Math.min(termWidth, 160));\n console.log(comparison);\n }\n};\n\n/**\n * Info command - show info about raw transcript\n */\nexport const infoCommand = async (transcriptPath: string): Promise<void> => {\n const absolutePath = path.isAbsolute(transcriptPath) \n ? transcriptPath \n : path.resolve(process.cwd(), transcriptPath);\n \n const rawData = await readRawTranscript(absolutePath);\n \n if (!rawData) {\n console.error(`No raw transcript found for: ${transcriptPath}`);\n console.error(`Expected at: ${getRawTranscriptPath(absolutePath)}`);\n process.exit(1);\n return;\n }\n \n console.log('\\n📋 Raw Transcript Information:');\n console.log('═══════════════════════════════════════════════════════════════');\n console.log(` 📁 Final transcript: ${absolutePath}`);\n console.log(` 📁 Raw transcript: ${getRawTranscriptPath(absolutePath)}`);\n console.log('');\n console.log(` 🎤 Audio file: ${rawData.audioFile}`);\n console.log(` 🔑 Audio hash: ${rawData.audioHash}`);\n console.log(` 🤖 Model: ${rawData.model}`);\n console.log(` ⏱️ Duration: ${(rawData.duration / 1000).toFixed(1)} seconds`);\n console.log(` 📅 Transcribed: ${new Date(rawData.transcribedAt).toLocaleString()}`);\n console.log('');\n console.log(` 📝 Raw text length: ${rawData.text.length} characters`);\n console.log(` 📝 Raw word count: ~${rawData.text.split(/\\s+/).length} words`);\n console.log('═══════════════════════════════════════════════════════════════\\n');\n};\n\n/**\n * Extract title from markdown content\n */\nexport const extractTitle = (content: string): string => {\n // Look for first # heading\n const match = content.match(/^#\\s+(.+)$/m);\n if (match) {\n return match[1].trim();\n }\n \n // Fall back to first line\n const firstLine = content.split('\\n')[0];\n return firstLine ? firstLine.trim().substring(0, 100) : 'Untitled';\n};\n\n/**\n * Extract date and time from filename\n * Supports formats like: 2026-01-18_Meeting_Notes.md or 2026-01-18-1430_Notes.md\n */\nexport const extractDateTimeFromFilename = (filename: string): { date: string; time?: string } | null => {\n // Try YYYY-MM-DD-HHMM pattern\n const withTimeMatch = filename.match(/(\\d{4}-\\d{2}-\\d{2})-(\\d{4})/);\n if (withTimeMatch) {\n const [, date, time] = withTimeMatch;\n const hours = time.substring(0, 2);\n const minutes = time.substring(2, 4);\n return { date, time: `${hours}:${minutes}` };\n }\n \n // Try YYYY-MM-DD pattern\n const dateMatch = filename.match(/(\\d{4}-\\d{2}-\\d{2})/);\n if (dateMatch) {\n return { date: dateMatch[1] };\n }\n \n return null;\n};\n\nexport interface TranscriptListItem {\n path: string;\n filename: string;\n date: string;\n time?: string;\n title: string;\n hasRawTranscript: boolean;\n createdAt: Date;\n entities?: {\n people?: Array<{ id: string; name: string }>;\n projects?: Array<{ id: string; name: string }>;\n terms?: Array<{ id: string; name: string }>;\n companies?: Array<{ id: string; name: string }>;\n };\n}\n\nexport interface ListTranscriptsOptions {\n directory: string;\n limit?: number;\n offset?: number;\n sortBy?: 'date' | 'filename' | 'title';\n startDate?: string;\n endDate?: string;\n search?: string;\n}\n\nexport interface ListTranscriptsResult {\n transcripts: TranscriptListItem[];\n total: number;\n hasMore: boolean;\n limit: number;\n offset: number;\n}\n\n/**\n * List transcripts with pagination, filtering, and search\n */\nexport const listTranscripts = async (options: ListTranscriptsOptions): Promise<ListTranscriptsResult> => {\n const {\n directory,\n limit = 50,\n offset = 0,\n sortBy = 'date',\n startDate,\n endDate,\n search,\n } = options;\n \n const absoluteDir = path.isAbsolute(directory) \n ? directory \n : path.resolve(process.cwd(), directory);\n \n // Find all .md files recursively\n const pattern = path.join(absoluteDir, '**/*.md');\n const files = await glob(pattern, { \n ignore: ['**/node_modules/**', '**/.git/**', '**/.transcript/**'],\n });\n \n // Build transcript list\n const transcripts: TranscriptListItem[] = [];\n \n for (const filePath of files) {\n const filename = path.basename(filePath);\n const dateTime = extractDateTimeFromFilename(filename);\n \n // Apply date filtering\n if (startDate && dateTime && dateTime.date < startDate) continue;\n if (endDate && dateTime && dateTime.date > endDate) continue;\n \n // Verify it's actually a file (not a directory)\n let stats;\n try {\n stats = await fs.stat(filePath);\n if (!stats.isFile()) {\n continue; // Skip directories and other non-files\n }\n } catch {\n continue; // Skip if we can't stat it\n }\n \n // Read content for title extraction and search\n let content: string;\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n // Skip files we can't read (permissions, encoding issues, etc.)\n continue;\n }\n \n // Apply search filtering\n if (search) {\n const searchLower = search.toLowerCase();\n if (!content.toLowerCase().includes(searchLower) && \n !filename.toLowerCase().includes(searchLower)) {\n continue;\n }\n }\n \n const title = extractTitle(content);\n const rawData = await readRawTranscript(filePath);\n \n // Parse entity metadata from transcript\n const entities = Metadata.parseEntityMetadata(content);\n \n transcripts.push({\n path: filePath,\n filename,\n date: dateTime?.date || stats.birthtime.toISOString().split('T')[0],\n time: dateTime?.time,\n title,\n hasRawTranscript: !!rawData,\n createdAt: stats.birthtime,\n entities: entities ? {\n people: entities.people?.map(e => ({ id: e.id, name: e.name })),\n projects: entities.projects?.map(e => ({ id: e.id, name: e.name })),\n terms: entities.terms?.map(e => ({ id: e.id, name: e.name })),\n companies: entities.companies?.map(e => ({ id: e.id, name: e.name })),\n } : undefined,\n });\n }\n \n // Sort\n transcripts.sort((a, b) => {\n switch (sortBy) {\n case 'date': {\n // Sort by date descending (newest first), then by time if available\n const dateCompare = b.date.localeCompare(a.date);\n if (dateCompare !== 0) return dateCompare;\n if (a.time && b.time) return b.time.localeCompare(a.time);\n return b.createdAt.getTime() - a.createdAt.getTime();\n }\n case 'filename':\n return a.filename.localeCompare(b.filename);\n case 'title':\n return a.title.localeCompare(b.title);\n default:\n return 0;\n }\n });\n \n // Apply pagination\n const total = transcripts.length;\n const paginatedTranscripts = transcripts.slice(offset, offset + limit);\n const hasMore = offset + limit < total;\n \n return {\n transcripts: paginatedTranscripts,\n total,\n hasMore,\n limit,\n offset,\n };\n};\n\n/**\n * List command - list all transcripts with pagination and filtering\n */\nexport const listCommand = async (\n directory: string,\n options?: {\n limit?: number;\n offset?: number;\n sortBy?: 'date' | 'filename' | 'title';\n startDate?: string;\n endDate?: string;\n search?: string;\n }\n): Promise<void> => {\n const result = await listTranscripts({\n directory,\n ...options,\n });\n \n console.log(`\\n📂 Transcripts in: ${directory}`);\n if (options?.search) {\n console.log(`🔍 Search: \"${options.search}\"`);\n }\n if (options?.startDate || options?.endDate) {\n console.log(`📅 Date range: ${options?.startDate || 'any'} to ${options?.endDate || 'any'}`);\n }\n console.log(`📊 Showing ${result.offset + 1}-${result.offset + result.transcripts.length} of ${result.total} total\\n`);\n \n if (result.transcripts.length === 0) {\n console.log(' No transcripts found.\\n');\n return;\n }\n \n for (const transcript of result.transcripts) {\n const timeStr = transcript.time ? ` ${transcript.time}` : '';\n const hasRaw = transcript.hasRawTranscript ? '✅' : ' ';\n console.log(`${hasRaw} ${transcript.date}${timeStr} - ${transcript.title}`);\n console.log(` ${transcript.filename}`);\n }\n \n console.log('');\n if (result.hasMore) {\n const nextOffset = result.offset + result.limit;\n console.log(`💡 More results available. Use --offset ${nextOffset} to see the next page.\\n`);\n }\n};\n\n/**\n * Register transcript commands with the CLI\n */\nexport const registerTranscriptCommands = (program: Command): void => {\n const transcript = program\n .command('transcript')\n .description('Work with transcripts and raw Whisper output');\n \n transcript\n .command('compare <file>')\n .description('Compare enhanced transcript with raw Whisper output')\n .option('--raw', 'Show only the raw Whisper output')\n .option('--enhanced', 'Show only the enhanced transcript')\n .option('--diff', 'Show a unified diff (requires diff command)')\n .action(compareCommand);\n \n transcript\n .command('info <file>')\n .description('Show information about a transcript\\'s raw source')\n .action(infoCommand);\n \n transcript\n .command('list <directory>')\n .description('List transcripts with pagination, filtering, and search')\n .option('--limit <number>', 'Maximum number of results to return', '50')\n .option('--offset <number>', 'Number of results to skip for pagination', '0')\n .option('--sort-by <field>', 'Sort by: date (default), filename, or title', 'date')\n .option('--start-date <YYYY-MM-DD>', 'Filter transcripts from this date onwards')\n .option('--end-date <YYYY-MM-DD>', 'Filter transcripts up to this date')\n .option('--search <text>', 'Search for transcripts containing this text')\n .action((directory, options) => {\n listCommand(directory, {\n limit: parseInt(options.limit),\n offset: parseInt(options.offset),\n sortBy: options.sortBy,\n startDate: options.startDate,\n endDate: options.endDate,\n search: options.search,\n });\n });\n};\n"],"names":["os","level","create","path","fs","Overcontext.create","Overcontext.loadHierarchicalConfig","expandPath","Classifier.create","Router.create","Logging.getLogger","Storage.create","createReadlineInterface","askQuestion","OpenAI.createCompletion","ContentFetcher.create","Sound.create","response","Handler.create","Onboarding.create","formatMetadataMarkdown","Metadata.formatMetadataMarkdown","Metadata.formatEntityMetadataMarkdown","Manager.create","Collector.create","Reporter.create","Media.create","OpenAI","Service.create","Client.create","Strategy.createStrategy","Strategy.getRecommendedStrategy","allProjects","LookupPerson.create","LookupProject.create","VerifySpelling.create","RouteNote.create","StoreContext.create","Registry.create","Executor.create","Context.create","Routing.create","Interactive.create","Output.create","Reflection.create","Transcription.create","Reasoning.create","CompletePhase.create","Agentic.create","Metadata.createRoutingMetadata","Metadata.extractTagsFromSignals","Orchestrator.create","print","Metadata.parseEntityMetadata"],"mappings":"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"}
|