@redaksjon/protokoll 0.0.15 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/no-auto-summary-files.md +43 -0
- package/README.md +603 -31
- package/dist/main.js +750 -231
- package/dist/main.js.map +1 -1
- package/dist/mcp/server.js +1363 -39
- package/dist/mcp/server.js.map +1 -1
- package/dist/term-assist.js +274 -0
- package/dist/term-assist.js.map +1 -0
- package/dist/term-context.js +146 -0
- package/dist/term-context.js.map +1 -0
- package/dist/{feedback.js → transcript.js} +1623 -155
- package/dist/transcript.js.map +1 -0
- package/docs/entity-metadata.md +416 -0
- package/docs/examples.md +21 -0
- package/docs/transcript-listing.md +371 -0
- package/guide/action.md +266 -4
- package/guide/context-commands.md +413 -93
- package/guide/feedback.md +1 -1
- package/guide/index.md +65 -2
- package/guide/interactive.md +224 -9
- package/guide/mcp-integration.md +66 -19
- package/guide/transcript-listing.md +444 -0
- package/package.json +17 -8
- package/scripts/test-mcp-compliance.js +97 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/feedback.js.map +0 -1
package/dist/feedback.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.js","sources":["../src/constants.ts","../src/logging.ts","../src/util/storage.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/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/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/util/media.ts","../src/cli/action.ts","../src/cli/feedback.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'];\n\nexport const ALLOWED_CONTENT_TYPES = ['log', 'diff'];\nexport const ALLOWED_AUDIO_EXTENSIONS = ['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm'];\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\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 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 \n for (const entityMap of entities.values()) {\n for (const entity of entityMap.values()) {\n if (entity.name.toLowerCase().includes(normalizedQuery)) {\n results.push(entity);\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} from './types';\nimport * as Storage from './storage';\nimport * as Discovery from './discovery';\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 // 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 // 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 * 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 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 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 * 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';\n\nexport interface HandlerInstance {\n startSession(): void;\n endSession(): InteractiveSession;\n handleClarification(request: ClarificationRequest): Promise<ClarificationResponse>;\n isEnabled(): boolean;\n getSession(): InteractiveSession | null;\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// 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\nconst runNewProjectWizard = async (\n rl: readline.Interface,\n term: string,\n context: string | undefined,\n projectOptions: string[] | undefined\n): Promise<NewProjectWizardResult> => {\n write('');\n write('─'.repeat(60));\n write(`[Unknown Project/Term]`);\n write(`Term: \"${term}\"`);\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: Is this a project or a term?\n const entityType = await askQuestion(rl, '\\nIs this a Project or a Term? (P/T/X to ignore, or Enter to skip): ');\n \n if (entityType === '' || entityType.toLowerCase() === 's' || entityType.toLowerCase() === 'skip') {\n return { action: 'skip' };\n }\n \n // IGNORE FLOW - user doesn't want to be asked about this term again\n if (entityType.toLowerCase() === 'x' || entityType.toLowerCase() === 'i' || entityType.toLowerCase() === 'ignore') {\n write(`\\n[Adding \"${term}\" to ignore list - you won't be asked about this again]`);\n return { action: 'ignore', ignoredTerm: term };\n }\n \n // PROJECT FLOW\n if (entityType.toLowerCase() === 'p' || entityType.toLowerCase() === 'project') {\n // Step 2: Project name\n const projectName = await askQuestion(rl, `\\nWhat is this project's name? [${term}]: `);\n const finalName = projectName || term;\n \n // Step 3: Destination\n const destination = await askQuestion(rl, '\\nWhere should output be routed to? (Enter for default): ');\n \n // Step 4: 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: finalName,\n destination: destination || undefined,\n description: description || undefined,\n };\n }\n \n // TERM FLOW\n if (entityType.toLowerCase() === 't' || entityType.toLowerCase() === 'term') {\n // Step 2: Validate spelling\n const termCorrection = await askQuestion(rl, `\\nIs \"${term}\" spelled correctly? (Enter to accept, or type correction): `);\n const finalTermName = termCorrection || term;\n \n if (termCorrection) {\n write(`Term updated to: \"${finalTermName}\"`);\n }\n \n // Step 3: Is this an acronym?\n const expansion = await askQuestion(rl, `\\nIf \"${finalTermName}\" is an acronym, what does it stand for? (Enter to skip): `);\n \n // Step 4: Which project(s) is this term associated with?\n const termProjects: number[] = [];\n let createdProject: NewProjectWizardResult | undefined;\n \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(s) is \"${finalTermName}\" associated with? (Enter numbers separated by commas, N for new, or Enter to skip): `);\n \n if (projectSelection.toLowerCase().includes('n')) {\n // User wants to create a new project to associate with this term\n write('');\n write(`[Create New Project for Term \"${finalTermName}\"]`);\n createdProject = await runCreateProjectFlow(rl, `The term \"${finalTermName}\" will be associated with this new project.`);\n \n if (createdProject.action === 'create' && createdProject.projectName) {\n write(`\\n[Project \"${createdProject.projectName}\" will be created and associated with term \"${finalTermName}\"]`);\n }\n } else if (projectSelection) {\n const indices = projectSelection.split(',').map(s => parseInt(s.trim(), 10) - 1);\n for (const idx of indices) {\n if (!isNaN(idx) && idx >= 0 && idx < projectOptions.length) {\n termProjects.push(idx);\n }\n }\n \n if (termProjects.length > 0) {\n write(`Associated with: ${termProjects.map(i => projectOptions[i].split(' - ')[0]).join(', ')}`);\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 term \"${finalTermName}\"? (Y/N, or Enter to skip): `);\n \n if (createNew.toLowerCase() === 'y' || createNew.toLowerCase() === 'yes') {\n write('');\n write(`[Create New Project for Term \"${finalTermName}\"]`);\n createdProject = await runCreateProjectFlow(rl, `The term \"${finalTermName}\" will be associated with this new project.`);\n \n if (createdProject.action === 'create' && createdProject.projectName) {\n write(`\\n[Project \"${createdProject.projectName}\" will be created and associated with term \"${finalTermName}\"]`);\n }\n }\n }\n \n // Step 5: Description\n const termDesc = await askQuestion(rl, `\\nBrief description of \"${finalTermName}\"? (Enter to skip): `);\n \n return {\n action: 'term',\n termName: finalTermName,\n termExpansion: expansion || undefined,\n termProjects: termProjects.length > 0 ? termProjects : undefined,\n termDescription: termDesc || undefined,\n createdProject,\n };\n }\n \n // Unrecognized input\n write('\\nUnrecognized input. Please enter P for Project, T for Term, or press Enter to skip.');\n return { action: 'skip' };\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 };\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 } 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 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 session.completedAt = new Date();\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 \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 \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 const prompt = formatClarificationPrompt(request);\n const userInput = await askQuestion(rl, prompt);\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 \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 return {\n startSession,\n endSession,\n handleClarification,\n isEnabled,\n getSession,\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 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\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 * 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 */\nexport const extractTagsFromSignals = (signals: Routing.ClassificationSignal[]): string[] => {\n return 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\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 // Prepend metadata if provided\n let finalContent = content;\n if (metadata) {\n const metadataSection = Metadata.formatMetadataMarkdown(metadata);\n finalContent = metadataSection + content;\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","/**\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 { \n TranscriptionRequest, \n TranscriptionResult,\n TranscriptionModel,\n MODEL_CAPABILITIES\n} from './types';\nimport * as Logging from '../logging';\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 \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 const audioStream = await storage.readStream(audioFile);\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 // Look up project by name\n const projects = context.search(args.name);\n const projectMatches = projects.filter(e => e.type === 'project');\n \n if (projectMatches.length > 0) {\n const project = projectMatches[0];\n return {\n success: true,\n data: {\n found: true,\n project,\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\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 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\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\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 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' && 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 }\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 \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 \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\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 state.correctedText = response.content;\n state.confidence = 0.9;\n logger.debug('Final transcript generated: %d characters', response.content.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\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 state.correctedText = finalResponse.content || transcriptText;\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,\n filename_options: project.routing.filename_options,\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 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 };\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","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}\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 return {\n getAudioCreationTime,\n getFileSize,\n splitAudioFile,\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"],"names":["os","level","create","path","fs","Storage.create","Discovery.loadHierarchicalConfig","expandPath","Classifier.create","Router.create","Logging.getLogger","createReadlineInterface","askQuestion","Sound.create","response","Handler.create","Onboarding.create","formatMetadataMarkdown","Metadata.formatMetadataMarkdown","Manager.create","Collector.create","Reporter.create","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"],"mappings":"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"}
|