@redaksjon/protokoll 1.0.12 → 1.0.13

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.
Files changed (36) hide show
  1. package/dist/{index2.js → configDiscovery.js} +909 -3382
  2. package/dist/configDiscovery.js.map +1 -0
  3. package/dist/index.js +3 -31
  4. package/dist/index.js.map +1 -1
  5. package/dist/mcp/server-http.js +84 -45
  6. package/dist/mcp/server-http.js.map +1 -1
  7. package/dist/mcp/server.js +10 -16
  8. package/dist/mcp/server.js.map +1 -1
  9. package/docs/CHANGES_CURSOR_INTEGRATION.md +166 -0
  10. package/docs/CURSOR_INTEGRATION.md +234 -0
  11. package/docs/MCP_SERVER_MODES.md +146 -0
  12. package/docs/QUICK_REFERENCE_AI_ASSISTANTS.md +81 -0
  13. package/package.json +5 -3
  14. package/vite.config.ts +6 -5
  15. package/vitest.config.ts +7 -24
  16. package/BUG_FIX_CONTEXT_DIRECTORY.md +0 -147
  17. package/MIGRATION_2025_SUMMARY.md +0 -215
  18. package/TRANSCRIPT_DATE_CHANGE_IMPLEMENTATION.md +0 -192
  19. package/VALIDATION_TEST_COVERAGE.md +0 -165
  20. package/dist/feedback.js +0 -1999
  21. package/dist/feedback.js.map +0 -1
  22. package/dist/frontmatter.js +0 -517
  23. package/dist/frontmatter.js.map +0 -1
  24. package/dist/index2.js.map +0 -1
  25. package/dist/scripts/fix-duplicate-delimiters.js +0 -78
  26. package/dist/scripts/fix-duplicate-delimiters.js.map +0 -1
  27. package/dist/scripts/migrate-titles-to-frontmatter.js +0 -88
  28. package/dist/scripts/migrate-titles-to-frontmatter.js.map +0 -1
  29. package/dist/scripts/migrate-transcripts-2025.js +0 -276
  30. package/dist/scripts/migrate-transcripts-2025.js.map +0 -1
  31. package/dist/scripts/verify-migration-2025.js +0 -122
  32. package/dist/scripts/verify-migration-2025.js.map +0 -1
  33. package/scripts/fix-duplicate-delimiters.ts +0 -112
  34. package/scripts/migrate-titles-to-frontmatter.ts +0 -129
  35. package/scripts/migrate-transcripts-2025.ts +0 -415
  36. package/scripts/verify-migration-2025.ts +0 -158
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback.js","sources":["../src/overcontext/adapter.ts","../src/overcontext/discovery.ts","../src/overcontext/helpers.ts","../src/constants.ts","../src/context/types.ts","../src/context/discovery.ts","../src/context/index.ts","../src/routing/router.ts","../src/routing/classifier.ts","../src/routing/index.ts","../src/utils/entityFinder.ts","../src/transcript/operations.ts","../src/logging.ts","../src/transcript/feedback.ts"],"sourcesContent":["import { \n discoverOvercontext, \n OvercontextAPI,\n} from '@utilarium/overcontext';\nimport {\n redaksjonSchemas,\n redaksjonPluralNames,\n Person,\n Project,\n Company,\n Term,\n IgnoredTerm,\n RedaksjonEntity,\n RedaksjonEntityType,\n} from '@redaksjon/context';\n// eslint-disable-next-line no-restricted-imports\nimport { existsSync, statSync } from 'node:fs';\nimport * as path from 'node:path';\n\n// Re-export types for backwards compatibility\nexport type { Person, Project, Company, Term, IgnoredTerm, RedaksjonEntity };\nexport type EntityType = RedaksjonEntityType;\nexport type Entity = RedaksjonEntity;\n\n/**\n * StorageInstance interface - matches protokoll's current API.\n */\nexport interface StorageInstance {\n load(contextDirs: string[]): Promise<void>;\n save(entity: Entity, targetDir: string, allowUpdate?: boolean): Promise<void>;\n delete(type: EntityType, id: string, targetDir: string): Promise<boolean>;\n get<T extends Entity>(type: EntityType, id: string): T | undefined;\n getAll<T extends Entity>(type: EntityType): T[];\n search(query: string): Entity[];\n findBySoundsLike(phonetic: string): Entity | undefined;\n clear(): void;\n getEntityFilePath(type: EntityType, id: string, contextDirs: string[]): string | undefined;\n}\n\n/**\n * Create a storage instance backed by overcontext.\n * Maintains API compatibility with protokoll's existing storage.\n */\n// Map entity types to their directory names\nconst TYPE_TO_DIRECTORY: Record<EntityType, string> = {\n person: 'people',\n project: 'projects',\n company: 'companies',\n term: 'terms',\n ignored: 'ignored',\n};\n\nexport const create = (): StorageInstance => {\n // In-memory cache for sync access (matching original behavior)\n const cache = new Map<EntityType, Map<string, Entity>>();\n let api: OvercontextAPI<typeof redaksjonSchemas> | undefined;\n let loadedContextDirs: string[] = [];\n \n const initCache = () => {\n cache.set('person', new Map());\n cache.set('project', new Map());\n cache.set('company', new Map());\n cache.set('term', new Map());\n cache.set('ignored', new Map());\n };\n \n initCache();\n \n return {\n async load(contextDirs: string[]): Promise<void> {\n initCache();\n loadedContextDirs = contextDirs;\n \n // If no context directories, leave API undefined (empty context)\n if (contextDirs.length === 0) {\n api = undefined;\n return;\n }\n \n try {\n // contextDirs are already resolved paths (e.g., /path/to/context or /path/to/.protokoll/context)\n // We need to determine the parent directory to start overcontext discovery from\n // The context directory could be at different levels depending on configuration\n \n // Take the last (most specific) context dir\n const lastContextDir = contextDirs[contextDirs.length - 1];\n \n // Get the parent directory of the context directory\n // This will be the directory containing the context/ folder\n const startDir = path.dirname(lastContextDir);\n \n // Create overcontext API with hierarchical discovery\n // Note: We use 'context' as contextDirName since we're starting from the parent\n // Use maxLevels: 1 to limit discovery - we've already done hierarchical discovery\n // in loadHierarchicalConfig and are passing the specific contextDirs we want.\n // maxLevels: 1 prevents walking too far up the tree in CI environments where\n // parent directories might contain unrelated context data.\n api = await discoverOvercontext({\n schemas: redaksjonSchemas,\n pluralNames: redaksjonPluralNames, // Use standard names without context/ prefix\n startDir,\n contextDirName: path.basename(lastContextDir), // Use actual context dir name\n maxLevels: 1, // Limit discovery to prevent finding unrelated parent contexts\n });\n \n // Load all entities into cache\n for (const type of ['person', 'project', 'company', 'term', 'ignored'] as EntityType[]) {\n const entities = await api.getAll(type);\n for (const entity of entities) {\n cache.get(type)?.set(entity.id, entity as Entity);\n }\n }\n } catch (error) {\n // If no context directory found, leave API undefined (empty context)\n if (error instanceof Error && error.message.includes('No context directory found')) {\n api = undefined;\n } else {\n throw error;\n }\n }\n },\n \n async save(entity: Entity, _targetDir: string, allowUpdate = false): Promise<void> {\n // Check if entity already exists (for duplicate detection)\n const existing = cache.get(entity.type)?.get(entity.id);\n if (existing && !allowUpdate) {\n throw new Error(`Entity with id \"${entity.id}\" already exists`);\n }\n\n // If no API (empty context), just update cache (in-memory only)\n if (!api) {\n cache.get(entity.type)?.set(entity.id, entity);\n return;\n }\n \n // Save via overcontext (upsert will create or update)\n const saved = await api.upsert(entity.type, entity);\n \n // Update cache\n cache.get(entity.type)?.set(saved.id, saved as Entity);\n },\n \n async delete(type: EntityType, id: string, _targetDir: string): Promise<boolean> {\n if (!api) return false;\n \n const deleted = await api.delete(type, id);\n if (deleted) {\n cache.get(type)?.delete(id);\n }\n return deleted;\n },\n \n get<T extends Entity>(type: EntityType, id: string): T | undefined {\n return cache.get(type)?.get(id) as T | undefined;\n },\n \n getAll<T extends Entity>(type: EntityType): T[] {\n return Array.from(cache.get(type)?.values() ?? []) as T[];\n },\n \n search(query: string): Entity[] {\n const normalizedQuery = query.toLowerCase();\n const results: Entity[] = [];\n const seen = new Set<string>();\n \n for (const entityMap of cache.values()) {\n for (const entity of entityMap.values()) {\n if (seen.has(entity.id)) continue;\n \n // Check name\n if (entity.name.toLowerCase().includes(normalizedQuery)) {\n results.push(entity);\n seen.add(entity.id);\n continue;\n }\n \n // Check sounds_like\n const sounds = (entity as Entity & { sounds_like?: string[] }).sounds_like;\n if (sounds?.some((s: string) => s.toLowerCase().includes(normalizedQuery))) {\n results.push(entity);\n seen.add(entity.id);\n }\n }\n }\n \n return results;\n },\n \n findBySoundsLike(phonetic: string): Entity | undefined {\n const normalized = phonetic.toLowerCase().trim();\n \n for (const entityMap of cache.values()) {\n for (const entity of entityMap.values()) {\n const sounds = (entity as Entity & { sounds_like?: string[] }).sounds_like;\n if (sounds?.some((s: string) => s.toLowerCase() === normalized)) {\n return entity;\n }\n }\n }\n \n return undefined;\n },\n \n clear(): void {\n initCache();\n api = undefined;\n },\n \n getEntityFilePath(type: EntityType, id: string, contextDirs: string[]): string | undefined {\n const dirName = TYPE_TO_DIRECTORY[type];\n const dirsToSearch = contextDirs.length > 0 ? contextDirs : loadedContextDirs;\n \n // Search in reverse order (closest first) to find where the entity is defined\n for (const contextDir of [...dirsToSearch].reverse()) {\n const possiblePaths = [\n path.join(contextDir, dirName, `${id}.yaml`),\n path.join(contextDir, dirName, `${id}.yml`),\n ];\n \n for (const filePath of possiblePaths) {\n // Use sync access check - this is only for CLI, not hot path\n if (existsSync(filePath)) {\n const stat = statSync(filePath);\n if (stat.isFile()) {\n return filePath;\n }\n }\n }\n }\n \n return undefined;\n },\n };\n};\n","import {\n discoverContextRoot,\n} from '@utilarium/overcontext';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport * as yaml from 'js-yaml';\n\n/**\n * Discovered context directory (backwards compatible).\n */\nexport interface DiscoveredContextDir {\n path: string;\n level: number;\n}\n\n/**\n * Hierarchical context result (backwards compatible).\n */\nexport interface HierarchicalContextResult {\n config: Record<string, unknown>;\n discoveredDirs: DiscoveredContextDir[];\n contextDirs: string[];\n}\n\n/**\n * Discovery options (backwards compatible).\n */\nexport interface ContextDiscoveryOptions {\n configDirName: string;\n configFileName: string;\n maxLevels?: number;\n startingDir?: string;\n}\n\n/**\n * Discover configuration directories by walking up the directory tree.\n * Wrapper around overcontext's discovery.\n */\nexport const discoverConfigDirectories = async (\n options: ContextDiscoveryOptions\n): Promise<DiscoveredContextDir[]> => {\n const contextRoot = await discoverContextRoot({\n startDir: options.startingDir || process.cwd(),\n contextDirName: options.configDirName,\n maxLevels: options.maxLevels || 10,\n });\n \n return contextRoot.directories.map(dir => ({\n path: dir.path,\n level: dir.level,\n }));\n};\n\n/**\n * Resolve context directory path based on configuration.\n * Priority:\n * 1. Explicit contextDirectory in config.yaml\n * 2. ./context/ at repository root (sibling to .protokoll/)\n * 3. .protokoll/context/ (backward compatibility)\n * \n * @param protokollDirPath - Path to the .protokoll directory\n * @param config - Parsed config.yaml content (if exists)\n */\nconst resolveContextDirectory = async (\n protokollDirPath: string,\n config: Record<string, unknown> | null\n): Promise<string | null> => {\n // Get repository root (parent of .protokoll/)\n const repoRoot = path.dirname(protokollDirPath);\n \n // If config specifies a contextDirectory, use it\n if (config && typeof config.contextDirectory === 'string') {\n const explicitPath = path.isAbsolute(config.contextDirectory)\n ? config.contextDirectory\n : path.resolve(repoRoot, config.contextDirectory);\n \n try {\n const stat = await fs.stat(explicitPath);\n if (stat.isDirectory()) {\n return explicitPath;\n }\n } catch {\n // Explicit path doesn't exist, continue to defaults\n }\n }\n \n // Default: Look for ./context/ at repository root (sibling to .protokoll/)\n const rootContextDir = path.join(repoRoot, 'context');\n \n try {\n const stat = await fs.stat(rootContextDir);\n if (stat.isDirectory()) {\n return rootContextDir;\n }\n } catch {\n // Root context doesn't exist, try fallback\n }\n \n // Fallback: .protokoll/context/ (backward compatibility)\n const legacyContextDir = path.join(protokollDirPath, 'context');\n \n try {\n const stat = await fs.stat(legacyContextDir);\n if (stat.isDirectory()) {\n return legacyContextDir;\n }\n } catch {\n // No context directory found\n }\n \n return null;\n};\n\n/**\n * Load and merge hierarchical configuration.\n * Wrapper around overcontext's discovery.\n */\nexport const loadHierarchicalConfig = async (\n options: ContextDiscoveryOptions\n): Promise<HierarchicalContextResult> => {\n const discovered = await discoverConfigDirectories(options);\n \n if (discovered.length === 0) {\n return {\n config: {},\n discoveredDirs: [],\n contextDirs: [],\n };\n }\n \n // Load config files and merge\n const sortedDirs = [...discovered].sort((a, b) => b.level - a.level);\n const configs: Record<string, unknown>[] = [];\n const contextDirs: string[] = [];\n \n for (const dir of sortedDirs) {\n const configPath = path.join(dir.path, options.configFileName);\n let parsedConfig: Record<string, unknown> | null = null;\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 parsedConfig = parsed as Record<string, unknown>;\n configs.push(parsedConfig);\n }\n } catch {\n // No config file\n }\n \n // Resolve context directory using new logic\n const contextDir = await resolveContextDirectory(dir.path, parsedConfig);\n if (contextDir) {\n contextDirs.push(contextDir);\n }\n }\n \n // Merge configs\n const mergedConfig = configs.reduce(\n (acc, curr) => ({ ...acc, ...curr }),\n {} as Record<string, unknown>\n );\n \n return {\n config: mergedConfig,\n discoveredDirs: discovered,\n contextDirs,\n };\n};\n","import { Term, Project } from '@redaksjon/context';\n\n/**\n * Check if a term is associated with a given project.\n */\nexport const isTermAssociatedWithProject = (term: Term, projectId: string): boolean => {\n return term.projects?.includes(projectId) ?? false;\n};\n\n/**\n * Add a project association to a term.\n */\nexport const addProjectToTerm = (term: Term, projectId: string): Term => {\n const projects = term.projects || [];\n if (projects.includes(projectId)) {\n return term;\n }\n return {\n ...term,\n projects: [...projects, projectId],\n updatedAt: new Date(),\n };\n};\n\n/**\n * Remove a project association from a term.\n */\nexport const removeProjectFromTerm = (term: Term, projectId: string): Term => {\n const projects = term.projects || [];\n return {\n ...term,\n projects: projects.filter((id: string) => id !== projectId),\n updatedAt: new Date(),\n };\n};\n\n/**\n * Check if projectA is a parent of projectB.\n */\nexport const isParentProject = (projectA: Project, projectB: Project): boolean => {\n // Check new format\n const parentRel = projectB.relationships?.find(\n r => r.relationship === 'parent' || r.relationship === 'child_of' || r.relationship === 'part_of'\n );\n if (parentRel) {\n const parentId = parentRel.uri.split('/').pop();\n return parentId === projectA.id;\n }\n \n return false;\n};\n\n/**\n * Check if projectA is a child of projectB.\n */\nexport const isChildProject = (projectA: Project, projectB: Project): boolean => {\n // Check new format\n const parentRel = projectA.relationships?.find(\n r => r.relationship === 'parent' || r.relationship === 'child_of' || r.relationship === 'part_of'\n );\n if (parentRel) {\n const parentId = parentRel.uri.split('/').pop();\n return parentId === projectB.id;\n }\n \n return false;\n};\n\n/**\n * Check if two projects are siblings.\n */\nexport const areSiblingProjects = (projectA: Project, projectB: Project): boolean => {\n // Check new format\n const aSiblingRels = projectA.relationships?.filter(r => r.relationship === 'sibling') || [];\n const bSiblingRels = projectB.relationships?.filter(r => r.relationship === 'sibling') || [];\n \n for (const rel of aSiblingRels) {\n const siblingId = rel.uri.split('/').pop();\n if (siblingId === projectB.id) return true;\n }\n \n for (const rel of bSiblingRels) {\n const siblingId = rel.uri.split('/').pop();\n if (siblingId === projectA.id) return true;\n }\n \n return false;\n};\n\n/**\n * Get relationship distance between two projects.\n * Returns: 0 = same, 1 = parent/child, 2 = siblings/cousins, -1 = unrelated\n */\nexport const getProjectRelationshipDistance = (projectA: Project, projectB: Project): number => {\n if (projectA.id === projectB.id) return 0;\n if (isParentProject(projectA, projectB) || isChildProject(projectA, projectB)) return 1;\n if (areSiblingProjects(projectA, projectB)) return 2;\n \n // Check if they share a parent (new format)\n const aParentRel = projectA.relationships?.find(r => r.relationship === 'parent' || r.relationship === 'child_of' || r.relationship === 'part_of');\n const bParentRel = projectB.relationships?.find(r => r.relationship === 'parent' || r.relationship === 'child_of' || r.relationship === 'part_of');\n \n if (aParentRel && bParentRel) {\n const aParentId = aParentRel.uri.split('/').pop();\n const bParentId = bParentRel.uri.split('/').pop();\n if (aParentId === bParentId) {\n return 2;\n }\n }\n \n return -1;\n};\n","import os from 'node:os';\nimport { FilenameOption } from '@utilarium/dreadcabinet';\nimport { FilesystemStructure } from '@utilarium/dreadcabinet';\n\nexport const VERSION = '__VERSION__ (__GIT_BRANCH__/__GIT_COMMIT__ __GIT_TAGS__ __GIT_COMMIT_DATE__) __SYSTEM_INFO__';\nexport const PROGRAM_NAME = 'protokoll';\nexport const DEFAULT_CHARACTER_ENCODING = 'utf-8';\nexport const DEFAULT_BINARY_TO_TEXT_ENCODING = 'base64';\nexport const DEFAULT_DIFF = true;\nexport const DEFAULT_LOG = false;\nexport const DEFAULT_TIMEZONE = 'Etc/UTC';\nexport const DATE_FORMAT_MONTH_DAY = 'M-D';\nexport const DATE_FORMAT_YEAR = 'YYYY';\nexport const DATE_FORMAT_YEAR_MONTH = 'YYYY-M';\nexport const DATE_FORMAT_YEAR_MONTH_DAY = 'YYYY-M-D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = 'YYYY/M/D';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = 'YYYY-M-D-HHmm';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = 'YYYY-M-D-HHmmss';\nexport const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-M-D-HHmmss.SSS';\nexport const DATE_FORMAT_MONTH = 'M';\nexport const DATE_FORMAT_DAY = 'D';\nexport const DATE_FORMAT_HOURS = 'HHmm';\nexport const DATE_FORMAT_MINUTES = 'mm';\nexport const DATE_FORMAT_SECONDS = 'ss';\nexport const DATE_FORMAT_MILLISECONDS = 'SSS';\nexport const DEFAULT_VERBOSE = false;\nexport const DEFAULT_DRY_RUN = false;\nexport const DEFAULT_DEBUG = false;\nexport const DEFAULT_CONTENT_TYPES = ['diff'];\nexport const DEFAULT_RECURSIVE = false;\nexport const DEFAULT_INPUT_DIRECTORY = './';\nexport const DEFAULT_OUTPUT_DIRECTORY = './';\n\nexport const DEFAULT_AUDIO_EXTENSIONS = ['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm', 'qta'];\n\nexport const ALLOWED_CONTENT_TYPES = ['log', 'diff'];\nexport const ALLOWED_AUDIO_EXTENSIONS = ['mp3', 'mp4', 'mpeg', 'mpga', 'm4a', 'wav', 'webm', 'qta'];\n\nexport const DEFAULT_OUTPUT_STRUCTURE = 'month' as FilesystemStructure;\nexport const DEFAULT_OUTPUT_FILENAME_OPTIONS = ['date', 'time', 'subject'] as FilenameOption[];\n\nexport const ALLOWED_OUTPUT_STRUCTURES = ['none', 'year', 'month', 'day'] as FilesystemStructure[];\nexport const ALLOWED_OUTPUT_FILENAME_OPTIONS = ['date', 'time', 'subject'] as FilenameOption[];\n\nexport const DEFAULT_CONFIG_DIR = `./.${PROGRAM_NAME}`;\nexport const DEFAULT_PROCESSED_DIR = './processed';\n\n// Context System Constants\nexport const DEFAULT_CONTEXT_DIR_NAME = '.protokoll';\nexport const DEFAULT_CONTEXT_NAMESPACE = 'redaksjon';\nexport const DEFAULT_CONTEXT_CONFIG_FILE_NAME = 'config.yaml';\nexport const DEFAULT_MAX_DISCOVERY_LEVELS = 10;\n\nexport const CONTEXT_SUBDIRECTORIES = {\n people: 'people',\n projects: 'projects',\n companies: 'companies',\n terms: 'terms',\n} as const;\n\nexport const DEFAULT_PERSONAS_DIR = `/personas`;\n\nexport const DEFAULT_PERSONA_TRANSCRIBER_FILE = `${DEFAULT_PERSONAS_DIR}/transcriber.md`;\n\nexport const DEFAULT_INSTRUCTIONS_DIR = `/instructions`;\n\nexport const DEFAULT_INSTRUCTIONS_TRANSCRIBE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/transcribe.md`;\n\n// Note: We no longer maintain a static allowlist of models\n// This allows for dynamic model discovery and future model additions\n// Users can specify any model supported by their OpenAI API\n\nexport const DEFAULT_TRANSCRIPTION_MODEL = 'whisper-1';\nexport const DEFAULT_MODEL = 'gpt-5.2';\nexport const DEFAULT_REASONING_LEVEL = 'medium';\n\n// Smart Assistance Constants\nexport const DEFAULT_PHONETIC_MODEL = 'gpt-5-nano';\nexport const DEFAULT_ANALYSIS_MODEL = 'gpt-5-mini';\nexport const DEFAULT_SMART_ASSISTANCE = true;\n\n// Project-specific smart assistance\nexport const DEFAULT_SOUNDS_LIKE_ON_ADD = true; // Generate phonetic variants\nexport const DEFAULT_TRIGGER_PHRASES_ON_ADD = true; // Generate content-matching phrases\nexport const DEFAULT_PROMPT_FOR_SOURCE = true;\n\n// Term-specific smart assistance\nexport const DEFAULT_TERMS_ENABLED = true;\nexport const DEFAULT_TERM_SOUNDS_LIKE_ON_ADD = true;\nexport const DEFAULT_TERM_DESCRIPTION_ON_ADD = true;\nexport const DEFAULT_TERM_TOPICS_ON_ADD = true;\nexport const DEFAULT_TERM_PROJECT_SUGGESTIONS = true;\n\n// Content limits\nexport const MAX_CONTENT_LENGTH = 15000; // Max characters to send to LLM\nexport const MAX_TERM_CONTEXT_LENGTH = 10000; // Max characters for term context\nexport const ASSIST_TIMEOUT_MS = 30000; // 30 second timeout for LLM calls\nexport const TERM_ASSIST_TIMEOUT_MS = 20000; // 20 second timeout for term LLM calls\n\nexport const DEFAULT_OVERRIDES = false;\nexport const DEFAULT_MAX_AUDIO_SIZE = 26214400; // 25MB in bytes\nexport const DEFAULT_TEMP_DIRECTORY = os.tmpdir(); // Use OS default temp directory\nexport const DEFAULT_INTERACTIVE = true; // Interactive prompts enabled by default\nexport const DEFAULT_SELF_REFLECTION = true;\nexport const DEFAULT_SILENT = false; // Sound notifications enabled by default\n\n// Output Management Constants\nexport const DEFAULT_INTERMEDIATE_DIRECTORY = './output/protokoll';\nexport const DEFAULT_KEEP_INTERMEDIATES = true;\nexport const OUTPUT_FILE_TYPES = [\n 'transcript',\n 'context',\n 'request',\n 'response',\n 'reflection',\n 'session',\n] as const;\n\n// Define Protokoll-specific defaults\nexport const PROTOKOLL_DEFAULTS = {\n dryRun: DEFAULT_DRY_RUN,\n verbose: DEFAULT_VERBOSE,\n debug: DEFAULT_DEBUG,\n diff: DEFAULT_DIFF,\n log: DEFAULT_LOG,\n transcriptionModel: DEFAULT_TRANSCRIPTION_MODEL,\n model: DEFAULT_MODEL,\n reasoningLevel: DEFAULT_REASONING_LEVEL,\n contentTypes: DEFAULT_CONTENT_TYPES,\n overrides: DEFAULT_OVERRIDES,\n maxAudioSize: DEFAULT_MAX_AUDIO_SIZE,\n tempDirectory: DEFAULT_TEMP_DIRECTORY || os.tmpdir(),\n configDirectory: DEFAULT_CONFIG_DIR,\n interactive: DEFAULT_INTERACTIVE,\n selfReflection: DEFAULT_SELF_REFLECTION,\n silent: DEFAULT_SILENT,\n};\n","/**\n * Context System Types\n *\n * Types for storing knowledge about entities that appear in transcripts:\n * - People: Named individuals the user frequently mentions\n * - Projects: Work contexts that affect routing and understanding\n * - Companies: Organizations referenced in notes\n * - Terms: Domain-specific terminology and acronyms\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nexport type EntityType = 'person' | 'project' | 'company' | 'term' | 'ignored';\n\nexport interface BaseEntity {\n id: string; // Unique identifier (slug)\n name: string; // Display name (always the preferred/correct spelling)\n type: EntityType;\n createdAt?: Date;\n updatedAt?: Date;\n notes?: string;\n}\n\nexport interface Person extends BaseEntity {\n type: 'person';\n firstName?: string;\n lastName?: string;\n company?: string; // DEPRECATED: Use relationships instead\n role?: string; // e.g., \"Manager\", \"Developer\"\n sounds_like?: string[]; // Common mishearings: \"a nil\", \"a nill\"\n context?: string; // How user knows them\n relationships?: EntityRelationship[]; // Relationships to other entities\n content?: EntityContentItem[]; // Attached content\n}\n\n/**\n * Entity Relationship\n * Represents a typed relationship between entities using URIs\n */\nexport interface EntityRelationship {\n uri: string; // redaksjon://{type}/{id}\n relationship: string; // Relationship type (freeform)\n notes?: string; // Optional notes\n metadata?: Record<string, unknown>; // Optional metadata\n}\n\n/**\n * Entity Content Item\n * Structured content attached to an entity\n */\nexport interface EntityContentItem {\n type: string; // url, text, markdown, code, document, etc.\n title?: string; // Title or label\n content: string; // The actual content\n mimeType?: string; // MIME type\n source?: string; // Source or origin\n timestamp?: string; // ISO 8601 datetime\n notes?: string; // Optional notes\n metadata?: Record<string, unknown>; // Optional metadata\n}\n\nexport interface ProjectClassification {\n context_type: 'work' | 'personal' | 'mixed';\n associated_people?: string[]; // Person IDs\n associated_companies?: string[]; // Company IDs\n topics?: string[]; // Topic keywords\n explicit_phrases?: string[]; // High-confidence trigger phrases\n}\n\nexport interface ProjectRouting {\n destination?: string; // Optional - if omitted, uses global default\n structure: 'none' | 'year' | 'month' | 'day';\n filename_options: Array<'date' | 'time' | 'subject'>;\n auto_tags?: string[];\n}\n\nexport interface Project extends BaseEntity {\n type: 'project';\n description?: string;\n \n // Classification signals (not just triggers)\n classification: ProjectClassification;\n \n // Routing configuration (uses Dreadcabinet structures)\n routing: ProjectRouting;\n \n // Phonetic variants for when Whisper mishears the project name\n // Useful for non-English names (Norwegian, etc.) that may be transcribed differently\n sounds_like?: string[];\n \n // Unified relationships to other entities\n relationships?: EntityRelationship[];\n \n // Attached content\n content?: EntityContentItem[];\n \n active?: boolean;\n}\n\nexport interface Company extends BaseEntity {\n type: 'company';\n fullName?: string;\n industry?: string;\n sounds_like?: string[];\n relationships?: EntityRelationship[]; // Relationships to other entities\n content?: EntityContentItem[]; // Attached content\n}\n\nexport interface Term extends BaseEntity {\n type: 'term';\n expansion?: string; // Full form if it's an acronym\n domain?: string; // E.g., \"engineering\", \"finance\", \"devops\"\n sounds_like?: string[];\n projects?: string[]; // DEPRECATED: Use relationships instead\n \n // Smart assistance fields\n description?: string; // Clear explanation of what the term means\n topics?: string[]; // Thematic keywords related to this term\n \n // Unified relationships and content\n relationships?: EntityRelationship[]; // Relationships to other entities\n content?: EntityContentItem[]; // Attached content\n}\n\n/**\n * Ignored terms - phrases the user doesn't want to be prompted about.\n * These are common phrases that aren't worth defining as proper terms.\n */\nexport interface IgnoredTerm extends BaseEntity {\n type: 'ignored';\n reason?: string; // Optional note about why it's ignored\n ignoredAt?: string; // ISO date when it was ignored\n}\n\nexport type Entity = Person | Project | Company | Term | IgnoredTerm;\n\nexport interface ContextStore {\n people: Map<string, Person>;\n projects: Map<string, Project>;\n companies: Map<string, Company>;\n terms: Map<string, Term>;\n ignored: Map<string, IgnoredTerm>;\n}\n\n/**\n * Hierarchical configuration following Cardigantime pattern.\n * Config is discovered by walking up the directory tree.\n */\nexport interface ContextDiscoveryOptions {\n configDirName: string; // '.protokoll'\n configFileName: string; // 'config.yaml'\n maxLevels?: number; // How far up to search (default: 10)\n startingDir?: string; // Where to start (default: process.cwd())\n}\n\nexport interface DiscoveredContextDir {\n path: string;\n level: number; // 0 = closest, higher = further up\n}\n\nexport interface HierarchicalContextResult {\n config: Record<string, unknown>;\n discoveredDirs: DiscoveredContextDir[];\n contextDirs: string[]; // All context subdirectories to load\n}\n\n/**\n * Smart Assistance Configuration\n * Controls LLM-assisted project and term metadata generation\n */\nexport interface SmartAssistanceConfig {\n enabled: boolean;\n phoneticModel: string; // Fast model for phonetic variants (e.g., gpt-5-nano)\n analysisModel: string; // More capable model for content analysis (e.g., gpt-5-mini)\n \n // Project-specific settings\n soundsLikeOnAdd: boolean; // Generate phonetic variants for project name\n triggerPhrasesOnAdd: boolean; // Generate content-matching phrases\n promptForSource: boolean;\n \n // Term-specific settings\n termsEnabled?: boolean; // Enable smart assistance for terms\n termSoundsLikeOnAdd?: boolean; // Generate phonetic variants for terms\n termDescriptionOnAdd?: boolean; // Generate term descriptions\n termTopicsOnAdd?: boolean; // Generate related topics\n termProjectSuggestions?: boolean; // Suggest relevant projects based on topics\n \n timeout?: number;\n}\n\n/**\n * Protokoll Configuration\n * Top-level configuration structure\n */\nexport interface ProtokollConfig {\n version?: number;\n smartAssistance?: SmartAssistanceConfig;\n // Other config fields can be added here as needed\n}\n\n/**\n * Helper functions for Term type\n */\n\n/**\n * Check if a term is associated with a given project\n */\nexport const isTermAssociatedWithProject = (term: Term, projectId: string): boolean => {\n return term.projects?.includes(projectId) ?? false;\n};\n\n/**\n * Add a project association to a term\n */\nexport const addProjectToTerm = (term: Term, projectId: string): Term => {\n const projects = term.projects || [];\n if (projects.includes(projectId)) {\n return term;\n }\n return {\n ...term,\n projects: [...projects, projectId],\n updatedAt: new Date(),\n };\n};\n\n/**\n * Remove a project association from a term\n */\nexport const removeProjectFromTerm = (term: Term, projectId: string): Term => {\n const projects = term.projects || [];\n return {\n ...term,\n projects: projects.filter(id => id !== projectId),\n updatedAt: new Date(),\n };\n};\n\n/**\n * Helper functions for Project Relationships\n */\n\n/**\n * Get entity ID from a relationship URI\n */\nconst getIdFromUri = (uri: string): string | null => {\n const match = uri.match(/^redaksjon:\\/\\/[^/]+\\/(.+)$/);\n return match ? match[1] : null;\n};\n\n/**\n * Get relationships by type from an array\n */\nconst getRelationshipsByType = (relationships: EntityRelationship[] | undefined, relationshipType: string): EntityRelationship[] => {\n if (!relationships) return [];\n return relationships.filter(r => r.relationship === relationshipType);\n};\n\n/**\n * Get entity IDs from relationships by type\n */\nconst getEntityIdsByRelationshipType = (relationships: EntityRelationship[] | undefined, relationshipType: string): string[] => {\n return getRelationshipsByType(relationships, relationshipType)\n .map(r => getIdFromUri(r.uri))\n .filter((id): id is string => id !== null);\n};\n\n/**\n * Get parent project ID from relationships\n */\nconst getParentId = (relationships: EntityRelationship[] | undefined): string | undefined => {\n const parentRels = getRelationshipsByType(relationships, 'parent');\n if (parentRels.length === 0) return undefined;\n return getIdFromUri(parentRels[0].uri) || undefined;\n};\n\n/**\n * Check if projectA is a parent of projectB\n */\nexport const isParentProject = (projectA: Project, projectB: Project): boolean => {\n const parentId = getParentId(projectB.relationships);\n return parentId === projectA.id;\n};\n\n/**\n * Check if projectA is a child of projectB\n */\nexport const isChildProject = (projectA: Project, projectB: Project): boolean => {\n const parentId = getParentId(projectA.relationships);\n return parentId === projectB.id;\n};\n\n/**\n * Check if two projects are siblings\n */\nexport const areSiblingProjects = (projectA: Project, projectB: Project): boolean => {\n const aSiblings = getEntityIdsByRelationshipType(projectA.relationships, 'sibling');\n const bSiblings = getEntityIdsByRelationshipType(projectB.relationships, 'sibling');\n return aSiblings.includes(projectB.id) || bSiblings.includes(projectA.id);\n};\n\n/**\n * Get relationship distance between two projects (lower = closer)\n * Returns: 0 = same, 1 = parent/child, 2 = siblings/cousins, -1 = unrelated\n */\nexport const getProjectRelationshipDistance = (projectA: Project, projectB: Project): number => {\n if (projectA.id === projectB.id) return 0;\n if (isParentProject(projectA, projectB) || isChildProject(projectA, projectB)) return 1;\n if (areSiblingProjects(projectA, projectB)) return 2;\n \n // Check if they share a parent (cousins)\n const aParent = getParentId(projectA.relationships);\n const bParent = getParentId(projectB.relationships);\n if (aParent && bParent && aParent === bParent) {\n return 2;\n }\n \n return -1; // unrelated\n};\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 * Resolve context directory path based on configuration.\n * Priority:\n * 1. Explicit contextDirectory in config.yaml\n * 2. ./context/ at repository root (sibling to .protokoll/)\n * 3. .protokoll/context/ (backward compatibility)\n * \n * @param protokollDirPath - Path to the .protokoll directory\n * @param config - Parsed config.yaml content (if exists)\n */\nconst resolveContextDirectory = async (\n protokollDirPath: string,\n config: Record<string, unknown> | null\n): Promise<string | null> => {\n // Get repository root (parent of .protokoll/)\n const repoRoot = path.dirname(protokollDirPath);\n \n // If config specifies a contextDirectory, use it\n if (config && typeof config.contextDirectory === 'string') {\n const explicitPath = path.isAbsolute(config.contextDirectory)\n ? config.contextDirectory\n : path.resolve(repoRoot, config.contextDirectory);\n \n try {\n const stat = await fs.stat(explicitPath);\n if (stat.isDirectory()) {\n return explicitPath;\n }\n } catch {\n // Explicit path doesn't exist, continue to defaults\n }\n }\n \n // Default: Look for ./context/ at repository root (sibling to .protokoll/)\n const rootContextDir = path.join(repoRoot, 'context');\n \n try {\n const stat = await fs.stat(rootContextDir);\n if (stat.isDirectory()) {\n return rootContextDir;\n }\n } catch {\n // Root context doesn't exist, try fallback\n }\n \n // Fallback: .protokoll/context/ (backward compatibility)\n const legacyContextDir = path.join(protokollDirPath, 'context');\n \n try {\n const stat = await fs.stat(legacyContextDir);\n if (stat.isDirectory()) {\n return legacyContextDir;\n }\n } catch {\n // No context directory found\n }\n \n return null;\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 let parsedConfig: Record<string, unknown> | null = null;\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 parsedConfig = parsed as Record<string, unknown>;\n configs.push(parsedConfig);\n }\n } catch {\n // No config file in this directory\n }\n \n // Resolve context directory using new logic\n const contextDir = await resolveContextDirectory(dir.path, parsedConfig);\n if (contextDir) {\n contextDirs.push(contextDir);\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 * This module now uses overcontext under the hood for storage and discovery.\n */\n\nimport { \n Entity, \n Person, \n Project, \n Company, \n Term,\n IgnoredTerm,\n ContextDiscoveryOptions,\n DiscoveredContextDir,\n HierarchicalContextResult,\n SmartAssistanceConfig,\n} from './types';\nimport * as Overcontext from '../overcontext';\nimport { getProjectRelationshipDistance } from '../overcontext/helpers';\nimport {\n DEFAULT_PHONETIC_MODEL,\n DEFAULT_ANALYSIS_MODEL,\n DEFAULT_SMART_ASSISTANCE,\n DEFAULT_SOUNDS_LIKE_ON_ADD,\n DEFAULT_TRIGGER_PHRASES_ON_ADD,\n DEFAULT_PROMPT_FOR_SOURCE,\n DEFAULT_TERMS_ENABLED,\n DEFAULT_TERM_SOUNDS_LIKE_ON_ADD,\n DEFAULT_TERM_DESCRIPTION_ON_ADD,\n DEFAULT_TERM_TOPICS_ON_ADD,\n DEFAULT_TERM_PROJECT_SUGGESTIONS,\n ASSIST_TIMEOUT_MS\n} from '../constants';\n\nexport interface ContextInstance {\n // Initialization\n load(): Promise<void>;\n reload(): Promise<void>;\n \n // Discovery info\n getDiscoveredDirs(): DiscoveredContextDir[];\n getConfig(): Record<string, unknown>;\n getContextDirs(): string[];\n \n // Smart Assistance config\n getSmartAssistanceConfig(): SmartAssistanceConfig;\n \n // Entity access\n getPerson(id: string): Person | undefined;\n getProject(id: string): Project | undefined;\n getCompany(id: string): Company | undefined;\n getTerm(id: string): Term | undefined;\n getIgnored(id: string): IgnoredTerm | undefined;\n \n getAllPeople(): Person[];\n getAllProjects(): Project[];\n getAllCompanies(): Company[];\n getAllTerms(): Term[];\n getAllIgnored(): IgnoredTerm[];\n \n // Check if a term is ignored\n isIgnored(term: string): boolean;\n \n // Search\n search(query: string): Entity[];\n findBySoundsLike(phonetic: string): Entity | undefined;\n \n // Advanced search with context awareness\n searchWithContext(query: string, contextProjectId?: string): Entity[];\n getRelatedProjects(projectId: string, maxDistance?: number): Project[];\n \n // Modification\n saveEntity(entity: Entity, allowUpdate?: boolean): Promise<void>;\n deleteEntity(entity: Entity): Promise<boolean>;\n getEntityFilePath(entity: Entity): string | undefined;\n \n // Check if context is available\n hasContext(): boolean;\n}\n\nexport interface CreateOptions {\n startingDir?: string;\n configDirName?: string;\n configFileName?: string;\n}\n\n/**\n * Get smart assistance configuration with defaults\n */\nconst getSmartAssistanceConfig = (config: Record<string, unknown>): SmartAssistanceConfig => {\n const smartConfig = config.smartAssistance as Partial<SmartAssistanceConfig> | undefined;\n \n return {\n enabled: smartConfig?.enabled ?? DEFAULT_SMART_ASSISTANCE,\n phoneticModel: smartConfig?.phoneticModel ?? DEFAULT_PHONETIC_MODEL,\n analysisModel: smartConfig?.analysisModel ?? DEFAULT_ANALYSIS_MODEL,\n \n // Project settings\n soundsLikeOnAdd: smartConfig?.soundsLikeOnAdd ?? DEFAULT_SOUNDS_LIKE_ON_ADD,\n triggerPhrasesOnAdd: smartConfig?.triggerPhrasesOnAdd ?? DEFAULT_TRIGGER_PHRASES_ON_ADD,\n promptForSource: smartConfig?.promptForSource ?? DEFAULT_PROMPT_FOR_SOURCE,\n \n // Term settings\n termsEnabled: smartConfig?.termsEnabled ?? DEFAULT_TERMS_ENABLED,\n termSoundsLikeOnAdd: smartConfig?.termSoundsLikeOnAdd ?? DEFAULT_TERM_SOUNDS_LIKE_ON_ADD,\n termDescriptionOnAdd: smartConfig?.termDescriptionOnAdd ?? DEFAULT_TERM_DESCRIPTION_ON_ADD,\n termTopicsOnAdd: smartConfig?.termTopicsOnAdd ?? DEFAULT_TERM_TOPICS_ON_ADD,\n termProjectSuggestions: smartConfig?.termProjectSuggestions ?? DEFAULT_TERM_PROJECT_SUGGESTIONS,\n \n timeout: smartConfig?.timeout ?? ASSIST_TIMEOUT_MS,\n };\n};\n\n/**\n * Create a new context instance using overcontext\n */\nexport const create = async (options: CreateOptions = {}): Promise<ContextInstance> => {\n const discoveryOptions: ContextDiscoveryOptions = {\n configDirName: options.configDirName ?? '.protokoll',\n configFileName: options.configFileName ?? 'config.yaml',\n startingDir: options.startingDir,\n };\n\n const storage = Overcontext.create();\n let discoveryResult: HierarchicalContextResult = {\n config: {},\n discoveredDirs: [],\n contextDirs: [],\n };\n\n const loadContext = async (): Promise<void> => {\n discoveryResult = await Overcontext.loadHierarchicalConfig(discoveryOptions);\n storage.clear();\n await storage.load(discoveryResult.contextDirs);\n };\n\n // Initial load\n await loadContext();\n\n return {\n load: loadContext,\n \n reload: async () => {\n storage.clear();\n await storage.load(discoveryResult.contextDirs);\n },\n \n getDiscoveredDirs: () => discoveryResult.discoveredDirs,\n getConfig: () => discoveryResult.config,\n getContextDirs: () => discoveryResult.contextDirs,\n \n getSmartAssistanceConfig: () => getSmartAssistanceConfig(discoveryResult.config),\n \n getPerson: (id) => storage.get<Person>('person', id),\n getProject: (id) => storage.get<Project>('project', id),\n getCompany: (id) => storage.get<Company>('company', id),\n getTerm: (id) => storage.get<Term>('term', id),\n getIgnored: (id) => storage.get<IgnoredTerm>('ignored', id),\n \n getAllPeople: () => storage.getAll<Person>('person'),\n getAllProjects: () => storage.getAll<Project>('project'),\n getAllCompanies: () => storage.getAll<Company>('company'),\n getAllTerms: () => storage.getAll<Term>('term'),\n getAllIgnored: () => storage.getAll<IgnoredTerm>('ignored'),\n \n isIgnored: (term: string) => {\n const normalizedTerm = term.toLowerCase().replace(/[^a-z0-9]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n const ignoredTerms = storage.getAll<IgnoredTerm>('ignored');\n return ignoredTerms.some(ignored => \n ignored.id === normalizedTerm || \n ignored.name.toLowerCase() === term.toLowerCase()\n );\n },\n \n search: (query) => storage.search(query),\n findBySoundsLike: (phonetic) => storage.findBySoundsLike(phonetic),\n \n searchWithContext: (query, contextProjectId) => {\n const results = storage.search(query);\n \n if (!contextProjectId) {\n return results;\n }\n \n const contextProject = storage.get<Project>('project', contextProjectId);\n if (!contextProject) {\n return results;\n }\n \n const scoredResults = results.map(entity => {\n let score = 0;\n \n if (entity.type === 'project') {\n const distance = getProjectRelationshipDistance(contextProject, entity as Project);\n if (distance >= 0) {\n score += (3 - distance) * 50;\n }\n }\n \n if (entity.type === 'term') {\n const term = entity as Term;\n if (term.projects?.includes(contextProjectId)) {\n score += 100;\n }\n }\n \n return { entity, score };\n });\n \n return scoredResults\n .sort((a, b) => b.score - a.score)\n .map(r => r.entity);\n },\n \n getRelatedProjects: (projectId, maxDistance = 2) => {\n const project = storage.get<Project>('project', projectId);\n if (!project) return [];\n \n const allProjects = storage.getAll<Project>('project');\n const related: Array<{ project: Project; distance: number }> = [];\n \n for (const otherProject of allProjects) {\n if (otherProject.id === projectId) continue;\n \n const distance = getProjectRelationshipDistance(project, otherProject);\n if (distance >= 0 && distance <= maxDistance) {\n related.push({ project: otherProject, distance });\n }\n }\n \n return related\n .sort((a, b) => a.distance - b.distance)\n .map(r => r.project);\n },\n \n saveEntity: async (entity, allowUpdate = false) => {\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, allowUpdate);\n },\n \n deleteEntity: async (entity) => {\n const filePath = storage.getEntityFilePath(entity.type, entity.id, discoveryResult.contextDirs);\n if (!filePath) {\n return false;\n }\n \n const contextDir = discoveryResult.contextDirs.find(dir => filePath.startsWith(dir));\n if (!contextDir) {\n return false;\n }\n \n return storage.delete(entity.type, entity.id, contextDir);\n },\n \n getEntityFilePath: (entity) => {\n return storage.getEntityFilePath(entity.type, entity.id, discoveryResult.contextDirs);\n },\n \n hasContext: () => discoveryResult.discoveredDirs.length > 0,\n };\n};\n\n// Re-export types (includes helper functions)\nexport * from './types';\n\n// Re-export discovery utilities\nexport { discoverConfigDirectories, loadHierarchicalConfig } from '../overcontext';\n\n// Re-export deepMerge from old discovery for backwards compatibility\nexport { deepMerge } from './discovery';\n","/**\n * Router\n * \n * Handles routing decisions and path building using Dreadcabinet patterns.\n * Takes classification results and builds output paths with appropriate\n * directory structure and filenames.\n * \n * Design Note: This module is designed to be self-contained and may be\n * extracted for use in other tools (kronologi, observasjon) in the future.\n */\n\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { \n RoutingContext, \n RouteDecision,\n RoutingConfig,\n FilesystemStructure\n} from './types';\nimport * as Classifier from './classifier';\n\nexport interface RouterInstance {\n route(context: RoutingContext): RouteDecision;\n buildOutputPath(decision: RouteDecision, context: RoutingContext): string;\n}\n\nexport const create = (\n config: RoutingConfig,\n classifier: Classifier.ClassifierInstance\n): RouterInstance => {\n \n const route = (context: RoutingContext): RouteDecision => {\n const results = classifier.classify(context, config.projects);\n \n if (results.length === 0) {\n return {\n projectId: null,\n destination: config.default,\n confidence: 1.0,\n signals: [],\n reasoning: 'No project matches found, using default routing',\n };\n }\n \n const bestMatch = results[0];\n const matchedProject = config.projects.find(p => p.projectId === bestMatch.projectId)!;\n \n // Handle conflict resolution if multiple high-confidence matches\n const highConfidenceMatches = results.filter(r => r.confidence > 0.5);\n \n if (highConfidenceMatches.length > 1 && config.conflict_resolution !== 'primary') {\n // Return best with alternates noted\n return {\n projectId: bestMatch.projectId,\n destination: matchedProject.destination,\n confidence: bestMatch.confidence,\n signals: bestMatch.signals,\n reasoning: bestMatch.reasoning,\n auto_tags: matchedProject.auto_tags,\n alternateMatches: highConfidenceMatches.slice(1),\n };\n }\n \n return {\n projectId: bestMatch.projectId,\n destination: matchedProject.destination,\n confidence: bestMatch.confidence,\n signals: bestMatch.signals,\n reasoning: bestMatch.reasoning,\n auto_tags: matchedProject.auto_tags,\n };\n };\n \n const buildOutputPath = (decision: RouteDecision, context: RoutingContext): string => {\n const { destination } = decision;\n \n // Expand ~ to home directory\n const basePath = expandPath(destination.path);\n \n // Build directory structure using Dreadcabinet patterns\n const directoryPath = buildDirectoryPath(basePath, destination.structure, context.audioDate);\n \n // Build filename using Dreadcabinet patterns\n // Pass structure so filename doesn't repeat info already in path\n const filename = buildFilename(destination.filename_options, context, destination.structure);\n \n return path.join(directoryPath, filename + '.md');\n };\n \n return { route, buildOutputPath };\n};\n\n// Dreadcabinet-style directory building\nfunction buildDirectoryPath(\n basePath: string, \n structure: FilesystemStructure, \n date: Date\n): string {\n const year = date.getFullYear().toString();\n const month = (date.getMonth() + 1).toString();\n const day = date.getDate().toString();\n \n switch (structure) {\n case 'none':\n return basePath;\n case 'year':\n return path.join(basePath, year);\n case 'month':\n return path.join(basePath, year, month);\n case 'day':\n return path.join(basePath, year, month, day);\n }\n}\n\n// Dreadcabinet-style filename building\n// The date portion is adjusted based on what's already in the directory path\nfunction buildFilename(\n options: Array<'date' | 'time' | 'subject'>,\n context: RoutingContext,\n structure: FilesystemStructure\n): string {\n const parts: string[] = [];\n const date = context.audioDate;\n const pad = (n: number) => n.toString().padStart(2, '0');\n \n for (const option of options) {\n switch (option) {\n case 'date': {\n // Adjust date format based on directory structure\n // Don't repeat info already in the path\n const day = pad(date.getDate());\n const month = pad(date.getMonth() + 1);\n const year = date.getFullYear().toString().slice(2);\n \n switch (structure) {\n case 'day':\n // Path has year/month/day - no date needed in filename\n break;\n case 'month':\n // Path has year/month - only day in filename\n parts.push(day);\n break;\n case 'year':\n // Path has year - month+day in filename\n parts.push(`${month}-${day}`);\n break;\n case 'none':\n // No date in path - full date in filename (YYMMDD)\n parts.push(`${year}${month}${day}`);\n break;\n }\n break;\n }\n case 'time': {\n const hours = pad(date.getHours());\n const minutes = pad(date.getMinutes());\n parts.push(`${hours}${minutes}`);\n break;\n }\n case 'subject': {\n const subject = extractSubject(context.transcriptText, context.sourceFile, context.subjectOverride);\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, subjectOverride?: string): string {\n // Use override if provided (e.g., LLM-generated title)\n if (subjectOverride && subjectOverride.length > 0) {\n return slugify(subjectOverride);\n }\n \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 * Resilient Entity Finder\n * \n * Provides case-insensitive and fuzzy matching for all entity types.\n * Handles typos, capitalization differences, and matches by both ID and name.\n */\n\nimport * as Context from '../context';\nimport type { Entity, Person, Project, Company, Term, IgnoredTerm } from '../context/types';\n\n/**\n * Calculate Levenshtein distance between two strings\n * Returns the minimum number of single-character edits needed to transform str1 into str2\n */\nfunction levenshteinDistance(str1: string, str2: string): number {\n const s1 = str1.toLowerCase();\n const s2 = str2.toLowerCase();\n \n if (s1 === s2) return 0;\n if (s1.length === 0) return s2.length;\n if (s2.length === 0) return s1.length;\n \n const matrix: number[][] = [];\n \n // Initialize first row and column\n for (let i = 0; i <= s2.length; i++) {\n matrix[i] = [i];\n }\n for (let j = 0; j <= s1.length; j++) {\n matrix[0][j] = j;\n }\n \n // Fill the matrix\n for (let i = 1; i <= s2.length; i++) {\n for (let j = 1; j <= s1.length; j++) {\n if (s2.charAt(i - 1) === s1.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n \n return matrix[s2.length][s1.length];\n}\n\n/**\n * Calculate similarity score (0-1) based on Levenshtein distance\n * 1.0 = identical, 0.0 = completely different\n */\nfunction similarityScore(str1: string, str2: string): number {\n const distance = levenshteinDistance(str1, str2);\n const maxLength = Math.max(str1.length, str2.length);\n if (maxLength === 0) return 1.0;\n return 1 - (distance / maxLength);\n}\n\ninterface EntityMatch<T extends Entity> {\n entity: T;\n score: number;\n matchType: 'exact_id' | 'exact_name' | 'fuzzy_id' | 'fuzzy_name';\n}\n\n/**\n * Generic resilient entity finder\n * Works for any entity type that has id and name properties\n */\nfunction findEntityResilient<T extends Entity>(\n allEntities: T[],\n query: string,\n entityTypeName: string\n): T {\n const queryLower = query.toLowerCase();\n const matches: EntityMatch<T>[] = [];\n \n for (const entity of allEntities) {\n const idLower = entity.id.toLowerCase();\n const nameLower = entity.name.toLowerCase();\n \n // 1. Exact ID match\n if (idLower === queryLower) {\n return entity; // Return immediately for exact match\n }\n \n // 2. Exact name match\n if (nameLower === queryLower) {\n matches.push({ entity, score: 1.0, matchType: 'exact_name' });\n continue;\n }\n \n // 3. Fuzzy ID match\n const idSimilarity = similarityScore(query, entity.id);\n if (idSimilarity >= 0.7) {\n matches.push({ entity, score: idSimilarity, matchType: 'fuzzy_id' });\n }\n \n // 4. Fuzzy name match\n const nameSimilarity = similarityScore(query, entity.name);\n if (nameSimilarity >= 0.7) {\n matches.push({ entity, score: nameSimilarity, matchType: 'fuzzy_name' });\n }\n }\n \n // If we found matches, return the best one\n if (matches.length > 0) {\n matches.sort((a, b) => {\n // Prefer exact matches over fuzzy\n if (a.matchType === 'exact_name' && b.matchType !== 'exact_name') return -1;\n if (b.matchType === 'exact_name' && a.matchType !== 'exact_name') return 1;\n // Then sort by score\n return b.score - a.score;\n });\n return matches[0].entity;\n }\n \n // No match found - build helpful error message\n const entityList = allEntities\n .map(e => ` - ${e.id} (${e.name})`)\n .join('\\n');\n \n throw new Error(\n `${entityTypeName} not found: \"${query}\"\\n\\n` +\n `Available ${entityTypeName.toLowerCase()}s:\\n${entityList}\\n\\n` +\n `Note: Matching is case-insensitive and supports fuzzy matching. ` +\n `Try using the ${entityTypeName.toLowerCase()} ID or name exactly as shown above.`\n );\n}\n\n/**\n * Find a project using resilient matching\n */\nexport function findProjectResilient(\n context: Context.ContextInstance,\n query: string\n): Project {\n const allProjects = context.getAllProjects();\n return findEntityResilient(allProjects, query, 'Project');\n}\n\n/**\n * Find a person using resilient matching\n */\nexport function findPersonResilient(\n context: Context.ContextInstance,\n query: string\n): Person {\n const allPeople = context.getAllPeople();\n return findEntityResilient(allPeople, query, 'Person');\n}\n\n/**\n * Find a company using resilient matching\n */\nexport function findCompanyResilient(\n context: Context.ContextInstance,\n query: string\n): Company {\n const allCompanies = context.getAllCompanies();\n return findEntityResilient(allCompanies, query, 'Company');\n}\n\n/**\n * Find a term using resilient matching\n */\nexport function findTermResilient(\n context: Context.ContextInstance,\n query: string\n): Term {\n const allTerms = context.getAllTerms();\n return findEntityResilient(allTerms, query, 'Term');\n}\n\n/**\n * Find an ignored term using resilient matching\n */\nexport function findIgnoredResilient(\n context: Context.ContextInstance,\n query: string\n): IgnoredTerm {\n const allIgnored = context.getAllIgnored();\n return findEntityResilient(allIgnored, query, 'Ignored term');\n}\n","/**\n * Transcript Operations\n * \n * Core business logic for transcript parsing, listing, editing, and combining.\n * Extracted from CLI modules to provide reusable functions for MCP tools.\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'node:path';\nimport { glob } from 'glob';\nimport * as Context from '../context';\nimport * as Routing from '../routing';\nimport * as Metadata from '../util/metadata';\nimport * as Frontmatter from '../util/frontmatter';\nimport { Project } from '../context/types';\nimport { findProjectResilient } from '../utils/entityFinder';\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 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 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\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 while (contentStartIndex < lines.length && lines[contentStartIndex].trim() === '') {\n contentStartIndex++;\n }\n result.content = lines.slice(contentStartIndex).join('\\n').trim();\n } else {\n result.content = rawText.trim();\n }\n \n return result;\n};\n\n/**\n * Extract the timestamp from a transcript filename\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 * 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, '-')\n .replace(/--+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 50);\n};\n\n/**\n * Parse duration string to seconds\n */\nconst parseDuration = (duration: string): number => {\n const match = duration.match(/(\\d+):(\\d+)/);\n if (match) {\n const [, minutes, seconds] = match;\n return parseInt(minutes, 10) * 60 + parseInt(seconds, 10);\n }\n return 0;\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 = seconds % 60;\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n};\n\n/**\n * Expand ~ in paths\n */\nconst expandPath = (p: string): string => {\n if (p.startsWith('~')) {\n return path.join(process.env.HOME || '', p.slice(1));\n }\n return p;\n};\n\n/**\n * Extract date from metadata\n */\nconst extractDateFromMetadata = (metadata: TranscriptMetadata, filePath: string): Date => {\n if (metadata.date) {\n return new Date(metadata.date);\n }\n const timestamp = extractTimestampFromFilename(filePath);\n if (timestamp) {\n const now = new Date();\n return new Date(now.getFullYear(), now.getMonth(), timestamp.day, timestamp.hour, timestamp.minute);\n }\n return new Date();\n};\n\n/**\n * Build 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 const resolveRoutingPath = (routingPath: string | undefined): string => {\n if (!routingPath) {\n return defaultPath;\n }\n const expanded = expandPath(routingPath);\n if (!expanded.startsWith('/') && !expanded.match(/^[A-Za-z]:/)) {\n return path.resolve(defaultPath, expanded);\n }\n return expanded;\n };\n\n return {\n default: {\n path: resolveRoutingPath(undefined),\n structure: 'month',\n filename_options: ['date', 'time', 'subject'],\n },\n projects: context.getAllProjects()\n .filter(p => p.active !== false)\n .map(p => ({\n projectId: p.id,\n destination: {\n path: resolveRoutingPath(p.routing?.destination),\n structure: p.routing?.structure || 'month',\n filename_options: p.routing?.filename_options || ['date', 'time', 'subject'],\n },\n classification: p.classification,\n // priority: p.priority, // Not in Project type\n active: p.active,\n })),\n conflict_resolution: 'primary' as const,\n };\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 contextDirectory?: string;\n } = {}\n): Promise<{ outputPath: string; content: string }> => {\n if (filePaths.length === 0) {\n throw new Error('No transcript files provided');\n }\n \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 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 const firstTranscript = transcripts[0];\n const baseMetadata = { ...firstTranscript.metadata };\n \n const context = await Context.create({\n startingDir: options.contextDirectory || path.dirname(firstTranscript.filePath),\n });\n let targetProject: Project | undefined;\n \n if (options.projectId) {\n targetProject = findProjectResilient(context, options.projectId);\n baseMetadata.project = targetProject.name;\n baseMetadata.projectId = targetProject.id;\n \n if (targetProject.routing?.destination) {\n const config = context.getConfig();\n const defaultPath = expandPath((config.outputDirectory as string) || '~/notes');\n const routingPath = expandPath(targetProject.routing.destination);\n const resolvedPath = !routingPath.startsWith('/') && !routingPath.match(/^[A-Za-z]:/)\n ? path.resolve(defaultPath, routingPath)\n : routingPath;\n baseMetadata.destination = resolvedPath;\n }\n }\n \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 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 const combinedTitle = options.title \n ? options.title\n : (firstTranscript.title \n ? `${firstTranscript.title} (Combined)`\n : 'Combined Transcript');\n \n const contentParts: string[] = [];\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 const fullMetadata: Metadata.TranscriptMetadata = {\n title: combinedTitle,\n date: baseMetadata.date ? new Date(baseMetadata.date) : undefined,\n recordingTime: baseMetadata.time,\n project: targetProject?.name || baseMetadata.project,\n projectId: targetProject?.id || baseMetadata.projectId,\n tags: baseMetadata.tags,\n duration: baseMetadata.duration,\n entities: targetProject ? {\n people: [],\n projects: [{\n id: targetProject.id,\n name: targetProject.name,\n type: 'project' as const,\n }],\n terms: [],\n companies: [],\n } : undefined,\n status: 'reviewed' as const,\n };\n \n const combinedContent = contentParts.join('\\n');\n const finalContent = Frontmatter.stringifyTranscript(fullMetadata, combinedContent);\n \n let outputPath: string;\n \n if (targetProject?.routing?.destination) {\n const routingConfig = buildRoutingConfig(context, targetProject);\n const routing = Routing.create(routingConfig, context);\n \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 const firstDir = path.dirname(firstTranscript.filePath);\n const timestamp = extractTimestampFromFilename(firstTranscript.filePath);\n \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 * Edit transcript metadata and content\n */\nexport const editTranscript = async (\n filePath: string,\n options: {\n title?: string;\n projectId?: string;\n tagsToAdd?: string[];\n tagsToRemove?: string[];\n dryRun?: boolean;\n verbose?: boolean;\n contextDirectory?: string;\n }\n): Promise<{ outputPath: string; content: string }> => {\n const transcript = await parseTranscript(filePath);\n \n const context = await Context.create({\n startingDir: options.contextDirectory || path.dirname(filePath),\n });\n let targetProject: Project | undefined;\n \n if (options.projectId) {\n targetProject = findProjectResilient(context, options.projectId);\n }\n \n const newTitle = options.title || transcript.title || 'Untitled';\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 const config = context.getConfig();\n const defaultPath = expandPath((config.outputDirectory as string) || '~/notes');\n const routingPath = expandPath(targetProject.routing.destination);\n const resolvedPath = !routingPath.startsWith('/') && !routingPath.match(/^[A-Za-z]:/)\n ? path.resolve(defaultPath, routingPath)\n : routingPath;\n updatedMetadata.destination = resolvedPath;\n }\n }\n \n if (options.tagsToAdd || options.tagsToRemove) {\n const currentTags = new Set(updatedMetadata.tags || []);\n \n if (options.tagsToRemove) {\n for (const tag of options.tagsToRemove) {\n currentTags.delete(tag);\n }\n }\n \n if (options.tagsToAdd) {\n for (const tag of options.tagsToAdd) {\n currentTags.add(tag);\n }\n }\n \n updatedMetadata.tags = Array.from(currentTags).sort();\n }\n \n const parsed = Frontmatter.parseTranscriptContent(transcript.rawText);\n const existingEntities = parsed.metadata.entities;\n \n let updatedEntities = existingEntities;\n if (options.projectId && targetProject) {\n updatedEntities = {\n people: existingEntities?.people || [],\n projects: [{\n id: targetProject.id,\n name: targetProject.name,\n type: 'project' as const,\n }],\n terms: existingEntities?.terms || [],\n companies: existingEntities?.companies || [],\n };\n }\n \n const entitiesToInclude = updatedEntities || existingEntities;\n \n const entityRefsIndex = transcript.rawText.indexOf('## Entity References');\n let contentWithoutEntityRefs: string;\n \n if (entityRefsIndex >= 0) {\n const metadataEndIndex = transcript.rawText.indexOf('---');\n if (metadataEndIndex >= 0) {\n let contentStart = metadataEndIndex + '---'.length;\n while (contentStart < transcript.rawText.length && \n (transcript.rawText[contentStart] === '\\n' || \n transcript.rawText[contentStart] === '\\r' || \n transcript.rawText[contentStart] === ' ')) {\n contentStart++;\n }\n contentWithoutEntityRefs = transcript.rawText\n .substring(contentStart, entityRefsIndex)\n .trimEnd();\n } else {\n const contentEndIndex = transcript.content.indexOf('## Entity References');\n contentWithoutEntityRefs = contentEndIndex >= 0 \n ? transcript.content.substring(0, contentEndIndex).trimEnd()\n : transcript.content;\n }\n } else {\n contentWithoutEntityRefs = transcript.content;\n }\n \n const fullMetadata: Metadata.TranscriptMetadata = {\n ...parsed.metadata,\n title: newTitle,\n entities: entitiesToInclude,\n date: parsed.metadata.date || (updatedMetadata.date ? new Date(updatedMetadata.date) : undefined),\n recordingTime: parsed.metadata.recordingTime || updatedMetadata.time,\n project: parsed.metadata.project || updatedMetadata.project,\n projectId: parsed.metadata.projectId || updatedMetadata.projectId,\n tags: parsed.metadata.tags || updatedMetadata.tags,\n duration: parsed.metadata.duration || updatedMetadata.duration,\n status: parsed.metadata.status || 'reviewed',\n };\n \n if (targetProject) {\n fullMetadata.project = targetProject.name;\n fullMetadata.projectId = targetProject.id;\n }\n \n if (options.tagsToAdd || options.tagsToRemove) {\n fullMetadata.tags = updatedMetadata.tags;\n }\n \n const finalContent = Frontmatter.stringifyTranscript(fullMetadata, contentWithoutEntityRefs);\n \n let outputPath: string;\n \n if (targetProject?.routing?.destination) {\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 (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 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 outputPath = filePath;\n }\n }\n \n return { outputPath, content: finalContent };\n};\n\n/**\n * Transcript list item\n */\nexport interface TranscriptListItem {\n path: string;\n filename: string;\n date: string;\n time?: string;\n title: string;\n hasRawTranscript: boolean;\n createdAt: Date;\n status?: 'initial' | 'enhanced' | 'reviewed' | 'in_progress' | 'closed' | 'archived';\n openTasksCount?: number;\n contentSize?: number;\n entities?: {\n people?: Array<{ id: string; name: string }>;\n projects?: Array<{ id: string; name: string }>;\n terms?: Array<{ id: string; name: string }>;\n companies?: Array<{ id: string; name: string }>;\n };\n}\n\nexport interface ListTranscriptsOptions {\n directory: string;\n limit?: number;\n offset?: number;\n sortBy?: 'date' | 'filename' | 'title';\n startDate?: string;\n endDate?: string;\n search?: string;\n projectId?: string;\n}\n\nexport interface ListTranscriptsResult {\n transcripts: TranscriptListItem[];\n total: number;\n hasMore: boolean;\n limit: number;\n offset: number;\n}\n\n/**\n * Get raw transcript path\n */\nconst getRawTranscriptPath = (finalPath: string): string => {\n const dir = path.dirname(finalPath);\n const basename = path.basename(finalPath, path.extname(finalPath));\n return path.join(dir, '.transcript', `${basename}.json`);\n};\n\n/**\n * Check if raw transcript exists\n */\nconst hasRawTranscript = async (finalPath: string): Promise<boolean> => {\n try {\n await fs.access(getRawTranscriptPath(finalPath));\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * Extract title from content\n */\nconst extractTitle = (content: string): string => {\n const match = content.match(/^#\\s+(.+)$/m);\n if (match) {\n return match[1].trim();\n }\n const firstLine = content.split('\\n')[0];\n return firstLine ? firstLine.trim().substring(0, 100) : 'Untitled';\n};\n\n/**\n * Extract date from filename\n */\nconst extractDateTimeFromFilename = (filename: string): { date: string; time?: string } | null => {\n const withTimeMatch = filename.match(/(\\d{4}-\\d{2}-\\d{2})-(\\d{4})/);\n if (withTimeMatch) {\n const [, date, time] = withTimeMatch;\n const hours = time.substring(0, 2);\n const minutes = time.substring(2, 4);\n return { date, time: `${hours}:${minutes}` };\n }\n \n const dateMatch = filename.match(/(\\d{4}-\\d{2}-\\d{2})/);\n if (dateMatch) {\n return { date: dateMatch[1] };\n }\n \n return null;\n};\n\n/**\n * List transcripts with filtering and pagination\n */\nexport const listTranscripts = async (options: ListTranscriptsOptions): Promise<ListTranscriptsResult> => {\n const {\n directory,\n limit = 50,\n offset = 0,\n sortBy = 'date',\n startDate,\n endDate,\n search,\n projectId,\n } = options;\n \n const absoluteDir = path.isAbsolute(directory) \n ? directory \n : path.resolve(process.cwd(), directory);\n \n const pattern = path.join(absoluteDir, '**/*.md');\n const files = await glob(pattern, { ignore: ['**/node_modules/**', '**/.transcript/**'] });\n \n const transcripts: TranscriptListItem[] = [];\n \n for (const file of files) {\n try {\n const content = await fs.readFile(file, 'utf-8');\n const stats = await fs.stat(file);\n const parsed = Frontmatter.parseTranscriptContent(content);\n \n const dateTime = extractDateTimeFromFilename(path.basename(file));\n const date = dateTime?.date || parsed.metadata.date?.toISOString().split('T')[0] || '';\n \n if (startDate && date < startDate) continue;\n if (endDate && date > endDate) continue;\n \n if (projectId && parsed.metadata.projectId !== projectId) continue;\n \n if (search) {\n const searchLower = search.toLowerCase();\n const title = extractTitle(content).toLowerCase();\n if (!title.includes(searchLower) && !content.toLowerCase().includes(searchLower)) {\n continue;\n }\n }\n \n const openTasks = parsed.metadata.tasks?.filter(t => !t.completed).length || 0;\n \n transcripts.push({\n path: file,\n filename: path.basename(file),\n date,\n time: dateTime?.time || parsed.metadata.recordingTime,\n title: extractTitle(content),\n hasRawTranscript: await hasRawTranscript(file),\n createdAt: stats.birthtime,\n status: parsed.metadata.status,\n openTasksCount: openTasks,\n contentSize: content.length,\n entities: parsed.metadata.entities,\n });\n } catch {\n // Skip files that can't be parsed\n continue;\n }\n }\n \n // Sort\n transcripts.sort((a, b) => {\n if (sortBy === 'date') {\n return b.date.localeCompare(a.date);\n } else if (sortBy === 'filename') {\n return a.filename.localeCompare(b.filename);\n } else {\n return a.title.localeCompare(b.title);\n }\n });\n \n const total = transcripts.length;\n const paginatedTranscripts = transcripts.slice(offset, offset + limit);\n \n return {\n transcripts: paginatedTranscripts,\n total,\n hasMore: offset + limit < total,\n limit,\n offset,\n };\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; ","/**\n * Feedback Operations\n * \n * Core business logic for processing natural language feedback on transcripts.\n * Extracted from CLI to provide reusable functions for MCP tools.\n */\n\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 './operations';\n\n/**\n * Tool definitions for 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.',\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' },\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.',\n parameters: {\n name: { type: 'string', description: 'The correct full name', required: true },\n sounds_like: { type: 'array', items: { type: 'string' }, description: 'Phonetic variations', 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.',\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.',\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.',\n parameters: {\n summary: { type: 'string', description: 'A summary of what was done', required: true },\n },\n },\n];\n\n/**\n * Tool execution result\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 * 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 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 const id = term.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n \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 return {\n success: true,\n message: `Added term \"${term}\" to context.`,\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 const id = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n \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 return {\n success: true,\n message: `Added person \"${name}\" to context.`,\n data: { id, name, sounds_like: soundsLike },\n };\n }\n \n case 'change_project': {\n const projectId = String(args.project_id);\n \n const project = feedbackCtx.context.getProject(projectId);\n if (!project) {\n const available = feedbackCtx.context.getAllProjects().map(p => p.id);\n return {\n success: false,\n message: `Project \"${projectId}\" not found. Available: ${available.join(', ')}`,\n };\n }\n \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 return {\n success: true,\n message: `Changed project to \"${project.name}\".`,\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 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 return {\n success: true,\n message: `Changed title to \"${newTitle}\".`,\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 = 'You can teach me about abbreviations, acronyms, and technical terms.';\n break;\n case 'people':\n helpText = 'You can teach me about people whose names were transcribed incorrectly.';\n break;\n case 'projects':\n helpText = 'You can tell me if a transcript belongs to a different project.';\n break;\n case 'corrections':\n helpText = 'You can ask me to fix any text in the transcript.';\n break;\n default:\n helpText = 'I can help with terms, names, projects, and general corrections.';\n }\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 system prompt for 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.\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## Rules\n- Understand the feedback and identify necessary actions\n- Execute tools in order: text corrections, then context entities, then metadata\n- Always call 'complete' when finished with a summary\n- For name/term corrections: BOTH fix the text AND add to context`;\n};\n\n/**\n * Process feedback using 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 const projects = feedbackCtx.context.getAllProjects().map(p => `${p.id} (${p.name})`);\n const systemPrompt = buildFeedbackSystemPrompt(feedbackCtx.transcriptContent, projects);\n \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 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 logger.debug('Feedback processing iteration %d', iterations);\n \n try {\n const response = await reasoning.completeWithTools({\n messages: conversationHistory,\n tools,\n });\n \n if (response.tool_calls && response.tool_calls.length > 0) {\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 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 const result = await executeTool(toolName, args, feedbackCtx);\n \n conversationHistory.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: toolCall.id,\n });\n \n if (toolName === 'complete') {\n return;\n }\n }\n } else {\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 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 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 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 let dest = routing.destination;\n if (dest.startsWith('~')) {\n dest = path.join(process.env.HOME || '', dest.slice(1));\n }\n \n const now = new Date();\n const year = now.getFullYear().toString();\n const month = (now.getMonth() + 1).toString().padStart(2, '0');\n \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 const filename = path.basename(newPath);\n newPath = path.join(structuredPath, filename);\n moved = true;\n }\n }\n \n await fs.mkdir(path.dirname(newPath), { recursive: true });\n \n if (!feedbackCtx.dryRun) {\n await fs.writeFile(newPath, feedbackCtx.transcriptContent, 'utf-8');\n \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"],"names":["create","isParentProject","isChildProject","areSiblingProjects","getProjectRelationshipDistance","os","Overcontext.create","Overcontext.loadHierarchicalConfig","expandPath","Classifier.create","Router.create","fs","Context.create","Frontmatter.stringifyTranscript","Routing.create","Frontmatter.parseTranscriptContent","level","Logging.getLogger"],"mappings":"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"}